Files
gtav-src/script/dev_ng/singleplayer/scripts/Minigames/Assassinations/Assassin_Valet.sc
T
2025-09-29 00:52:08 +02:00

7497 lines
246 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//Compile out Title Update changes to header functions.
//Must be before includes.
CONST_INT USE_TU_CHANGES 1
// Always include these two files at the top of each script
USING "script_player.sch"
USING "controller_assassination_lib.sch"
USING "Assassination_briefing_lib.sch"
USING "script_oddjob_funcs.sch"
USING "building_control_public.sch"
USING "assassination_support_lib.sch"
USING "Assassin_shared.sch"
USING "Chase_hint_cam.sch"
USING "shared_hud_displays.sch"
USING "script_oddjob_funcs.sch"
USING "taxi_functions.sch"
USING "oddjob_aggro.sch"
USING "completionpercentage_public.sch"
USING "replay_public.sch"
USING "clearMissionArea.sch"
USING "minigame_big_message.sch"
USING "replay_private.sch"
USING "commands_recording.sch"
#IF IS_DEBUG_BUILD
USING "shared_debug.sch"
USING "script_debug.sch"
USING "select_mission_stage.sch"
#ENDIF
CONST_INT NUM_LIMO_GUARDS 3
CONST_INT NUM_GUARDS 5 //bad name for this but it is used in other places in teh script so I dont want to remove entirely
CONST_INT NUM_ESCORT_PEDS 2
CONST_INT NUM_BODYGUARDS 2
CONST_INT NUM_POLICE_BLOCKADE_POSITIONS 7
CONST_INT NUM_AIRLOCK_SPAWN_LOCATIONS 3
ENUM Assassin_Stages
STAGE_BRIEF_INIT,
STAGE_BRIEF_UPDATE,
STAGE_BRIEF_EXIT,
STAGE_INTRO_CUTSCENE,
STAGE_INIT,
STAGE_STREAMING,
STAGE_SPAWNING,
STAGE_GET_TO_HOTEL,
STAGE_GUARD_CUTSCENE,
STAGE_PLANT_BOMB,
STAGE_GUARDS_GO_TO_POSTS,
STAGE_TARGET_LEAVE_LOBBY,
STAGE_ENTER_LIMO,
STAGE_LEAVE_HOTEL,
STAGE_ESCAPING,
STAGE_KILL_CAM,
STAGE_EVADE_POLICE,
STAGE_LEAVE_AREA,
STAGE_MISSION_PASSED
ENDENUM
Assassin_Stages MainStage = STAGE_INTRO_CUTSCENE
//kill types
ENUM eKillType
KT_STANDARD,
KT_BONUS
ENDENUM
eKillType killType = KT_STANDARD
//Limo Guard states
ENUM assLimoGuardState
LGS_WALK_TO_POSTS = 0,
LGS_STAND_GUARD,
LGS_WARNING_CHECK,
LGS_RESPOND_TO_PLAYER,
LGS_ENTER_LIMO,
LGS_LEAVE_IN_LIMO,
LGS_DRIVE_TO_END,
LGS_DRIVING,
LGS_ALERTED,
LGS_ALERTED2,
LGS_PANIC,
LGS_ATTACKING
ENDENUM
assLimoGuardState LimoGuardState[NUM_LIMO_GUARDS]
//Motorcade ped states
ENUM assEscortState
ES_WAITING = 0,
ES_DRIVE_TO_LIMO,
ES_DRIVING_TO_LIMO,
ES_PROTECT,
ES_RESPOND_TO_PLAYER,
ES_WARNING_CHECK,
ES_ALERTED,
ES_ALERTED2,
ES_PANIC,
ES_ATTACKING
ENDENUM
assEscortState EscortState[NUM_ESCORT_PEDS]
//Target State
ENUM assTargetState
TS_ENTER_LIMO = 0,
TS_LEAVE_IN_LIMO,
TS_ALERTED,
TS_ALERTED2,
TS_FLEE
ENDENUM
assTargetState TargetState
ENUM assBodyGuardState
BS_WALK_WITH_TARGET = 0,
BS_ENTER_VEHICLE,
BS_RIDE_IN_VEHICLE,
BS_ALERTED,
BS_ALERTED2,
BS_PANIC,
BS_ATTACKING
ENDENUM
assBodyGuardState BodyGuardState[NUM_BODYGUARDS]
//kill types
ENUM eFailType
FT_FAILED,
FT_VEHICLE,
FT_BLOWN_COVER,
FT_BLOWN_COVER_WANTED,
FT_BLOWN_COVER_HIT_PARKED_CAR,
FT_DISREGARDED_WARNINGS,
FT_ESCAPED,
FT_ABANDONED,
FT_STICKY,
FT_LESTER_ATTACKED
ENDENUM
eFailType failType = FT_FAILED
// -----------------------------------
// VARIABLES
// -----------------------------------
PED_INDEX Player
PED_INDEX piTarget
PED_INDEX piBodyguard[NUM_BODYGUARDS]
PED_INDEX piLimoGuard[NUM_LIMO_GUARDS]
PED_INDEX piEscortPed[NUM_ESCORT_PEDS]
//PED_INDEX piCutsceneGuard[NUM_LIMO_GUARDS]
PED_INDEX piWalkingGuard
PED_INDEX piLester
ENTITY_INDEX LesterCane
AI_BLIP_STRUCT blipCombatLimoGuards[NUM_LIMO_GUARDS]
AI_BLIP_STRUCT blipCombatEscort[NUM_ESCORT_PEDS]
AI_BLIP_STRUCT blipBodyguard[NUM_BODYGUARDS]
BLIP_INDEX bHotelBlip
BLIP_INDEX bTargetBlip
BLIP_INDEX bLimoGuardBlip[NUM_LIMO_GUARDS]
BLIP_INDEX bEscortBlip[NUM_ESCORT_PEDS]
SCENARIO_BLOCKING_INDEX sbiHotel, sbiHotel01
STREAMVOL_ID svIntroCutscene
BOOL bGuardAttendingTarget = FALSE
BOOL bLoadSceneRequested = FALSE
BOOL bObjectivePrinted
BOOL bPanicking
BOOL bWarned
BOOL bGuardWalkingTowardsPlayer
BOOL bLeftHotel
BOOL bWarningLinePlayed
BOOL bFailMissionForCloseVehicle
BOOL bHotelTimerStarted
BOOL bHotelTimerExpired
BOOL bReplaying = FALSE
BOOL bMissionFailed = FALSE
BOOL bPlayerInTowTruck = FALSE
//BOOL bLimoDestroyed = FALSE
BOOL bLeaveInLimo
BOOL bLimoStuck
BOOL bDriveToLimo
BOOL bCombatSubtaskSet
BOOL bLimoCruisingStreets
BOOL bTargetDead = FALSE
BOOL bPlayerIsInFlyingVehicle = FALSE
//BOOL bFirstCheckpointSceneLoad = FALSE
//BOOL bSecondCheckpointSceneLoad = FALSE
//BOOL bThirdCheckpointSceneLoad = FALSE
//BOOL bFourthCheckpointSceneLoad = FALSE
BOOL bIsPlayerInHotelArea = FALSE
BOOL bReplayVehicleAvailable = FALSE
BOOL bTaxiLeave = FALSE
BOOL bLimoGuardsTaskedToEnterVehicle = FALSE
BOOL bPlayerUsedSniperRifle = FALSE
BOOL bPlayerUsedStickyBomb = FALSE
BOOL bAlerted = FALSE
BOOL bAlertedSpecial = FALSE
BOOL bPlayedTargetLine = FALSE
BOOL bTargetLeaving = FALSE
BOOL bInPursuit = FALSE
//BOOL bDebugSkipping = FALSE
BOOL bPathIsBlocked = FALSE
BOOL bTargetFleeing = FALSE
BOOL bTriggerAlertMusic = FALSE
BOOL bTriggerAlertMessage = FALSE
//BOOL bPlayedCellPhoneCall = FALSE
BOOL bLeftArea = FALSE
//BOOL bGaveSecondWarning = FALSE
//BOOL bDoNotRunPanicCheck = FALSE
BOOL bTriggerGuardWalk = FALSE
BOOL bPanickedExtras = FALSE
BOOL bTaskedGuyToAim = FALSE
BOOL bPlayedSearchDialogue = FALSE
BOOL bPrintLastObjective = FALSE
BOOL bPlayIntialDialogue = FALSE
BOOL bEnterVehicle = FALSE
BOOL bPrepareLostCue = FALSE
BOOL bTriggeredLastCue = FALSE
BOOL bGuardsTellExtrasToLeave = FALSE
BOOL bBufferHit = FALSE
BOOL bTargetPanicLinePlayed = FALSE
BOOL bGuardPanicLinePlayed = FALSE
BOOL bTargetDeadLinePlayed = FALSE
BOOL bGaveAbandondedWarning = FALSE
BOOL bPrintLoseWantedLevel = FALSE
BOOL bTargetKillLinePlayed = FALSE
BOOL bSkippedEndingScreen = FALSE
BOOL bResetAbandonCheck = FALSE
BOOL bPlayMusic = FALSE
BOOL bPlayerTriggeredExplosionFromParkingGarage = FALSE
BOOL bPlayerParkedCarInAlley = FALSE
BOOL bDoFlash = FALSE
INT iLesterUpdateStages = 0
INT i
INT iStageNum
INT iCutsceneStage
INT iNumSafeLocations
INT iGuardAnim[NUM_GUARDS]
INT iTargetAirlockSpawn
INT iHotelTimerStart
//INT iTimeSoFar
//INT iBombCount
INT iFrameCountAsn
INT iExtraCreationStages
INT iExtraUpdateStages
INT iHandleSniperAttackStages
INT iGuardAimingState
INT iStageToUse
INT iGuardTimeToTellExtrasToLeave = 37000
INT iNumVehiclesInArea = 0
INT iNumVehiclesFound = 0
INT iTimeRemaining = 0
INT iTargetPanicLine = 0
INT iEndingScreenStages = 0
INT iLastStoredVehicleIdx = -1
INT iTimeToCut
FLOAT fBombTime = 90000
FLOAT fTargetCarHeading
FLOAT fTargetCarLobbyHead
FLOAT fGuardHead[NUM_GUARDS]
FLOAT fWarnTime[NUM_GUARDS]
FLOAT fEscortCarHead
FLOAT fSightDist
FLOAT fAirlockHead[NUM_AIRLOCK_SPAWN_LOCATIONS]
FLOAT fAirlockSpawnHead[NUM_AIRLOCK_SPAWN_LOCATIONS]
FLOAT fAreaWidth = 135.000
//FLOAT fEscortCarHeading = 256.543091
FLOAT fPanicTime
FLOAT fToHotelDistance = 0
INT iIndexToUse
FLOAT fClosestVector = 0
VECTOR vAirlockPos[NUM_AIRLOCK_SPAWN_LOCATIONS]
VECTOR vAirlockSpawnPos[NUM_AIRLOCK_SPAWN_LOCATIONS]
//VECTOR vHotelStart
VECTOR vGuardPos[NUM_GUARDS]
VECTOR vEscortCarPos
VECTOR vTargetCarPos
VECTOR vTargetCarLobbyPos
VECTOR vAreaCoord01 = << -1162.985, -161.715, -38.221 >>
VECTOR vAreaCoord02 = << -1327.630, -266.202, 38.221 >>
VECTOR vCenterPoint = << -1236.6611, -197.3160, 39.6313 >>
VECTOR vNewBlipPosition = << -1266.02734, -218.98291, 41.44594 >> //<<-1261.5192, -225.5875, 41.4460>>
//VECTOR vEscortCarPosition = << -1230.39, -182.561, 38.726 >>
VECTOR vTargetLastPosition
VECTOR vHotelCenterPos = << -1237.73145, -189.54518, 40.63728 >>
FLOAT fHotelCenterRadius = 40
VEHICLE_INDEX viTargetCar
VEHICLE_INDEX viEscortCar
VEHICLE_INDEX viCarThatTriggeredAlert
VEHICLE_INDEX vehPlaneVehicle // if the player is in a plane or heli when triggering cutscene
VEHICLE_INDEX viParkedCar[2]
VEHICLE_INDEX viReplayVehicle
VEHICLE_INDEX viLastDriven[3]
SEQUENCE_INDEX seqIndex
MODEL_NAMES TargetModel = A_M_Y_BEACHVESP_02
MODEL_NAMES TargetCarModel = FBI2
MODEL_NAMES GuardModel = S_M_M_HIGHSEC_01
MODEL_NAMES GuardModel_01 = S_M_M_HIGHSEC_02
MODEL_NAMES EscortCarModel = WASHINGTON
CAMERA_INDEX camInit
CAMERA_INDEX camDest
REL_GROUP_HASH relGroupGuards
structTimer warnTimer
structTimer tMissionTimer
structTimer tBufferTimer
structTimer tTargetSpeakTimer
structTimer tBlockingTimer
structTimer tExtrasTimer
structTimer tCheckoutTimer
structTimer tFailTimer
structTimer tLesterTimer
//structTimer tAudioCueTimer
structTimer tBeepTimer
BOOL bLoadedSoundSet = FALSE
structPedsForConversation hotelConv
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
SIMPLE_USE_CONTEXT cucEndScreen
VECTOR vCheckpointRetryPosition = <<-1263.6769, -222.2767, 41.4460>>
FLOAT fCheckpointRetryHeading = 304.2010
// Lead In variables
VECTOR vWaitingPosition = <<-1507.2521, -934.3307, 8.6562>>
FLOAT fWaitingHeading = 137.9228
CAMERA_INDEX camLeadIn01, camLeadIn02
VECTOR vCameraPosition01 = <<-1510.733276,-935.959961,10.902136>>
VECTOR vCameraRotation01 = <<15.074911,-0.024198,-71.861885>>
VECTOR vCameraPosition02 = <<-1510.877563,-936.115479,9.798549>>
VECTOR vCameraRotation02 = <<4.686822,-0.024198,-72.459717>>
structTimer tLeadinTimer
OBJECT_INDEX oFailSafeBench
#IF IS_DEBUG_BUILD
BOOL bDoingPSkip
BOOL bDoingJSkip
DEBUG_POS_DATA myDebugData
MissionStageMenuTextStruct sSkipMenu[2]
INT iDebugJumpStage = 0
#ENDIF
STRUCT STRUCT_EXTRAS
PED_INDEX pedTaxiGuys[2]
PED_INDEX pedTaxiDriver
VEHICLE_INDEX vehTaxi
PED_INDEX pedSmokers[2]
PED_INDEX pedTalkers[2]
BOOL bGuysCreated
ENDSTRUCT
STRUCT_EXTRAS stExtras
PROC SETUP_DEBUG()
#IF IS_DEBUG_BUILD
sSkipMenu[0].sTxtLabel = "TRAVEL_STAGE"
sSkipMenu[1].sTxtLabel = "ASSASSINATION_STAGE"
#ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the entity exists and is not dead.
/// PARAMS:
/// mEntity - the entity we are checking.
/// RETURNS:
/// True if the entity exists and is not dead.
FUNC BOOL IS_ENTITY_ALIVE(ENTITY_INDEX mEntity)
IF DOES_ENTITY_EXIST(mEntity)
IF NOT IS_ENTITY_DEAD(mEntity)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC CREATE_EXTRAS()
SEQUENCE_INDEX iSeq
SWITCH iExtraCreationStages
CASE 0
REQUEST_MODEL(A_M_M_BEVHILLS_01)
REQUEST_MODEL(A_F_M_BEVHILLS_01)
REQUEST_MODEL(A_F_M_BEVHILLS_02)
REQUEST_MODEL(A_M_Y_HIPSTER_01)
REQUEST_MODEL(TAXI)
REQUEST_WAYPOINT_RECORDING("OJAS_HotelTaxi01")
PRINTLN("REQUESTING EXTRAS")
REQUEST_ANIM_DICT("oddjobs@assassinate@hotel@")
IF HAS_MODEL_LOADED(A_M_M_BEVHILLS_01)
AND HAS_MODEL_LOADED(A_F_M_BEVHILLS_01)
AND HAS_MODEL_LOADED(A_F_M_BEVHILLS_02)
AND HAS_MODEL_LOADED(TAXI)
AND HAS_MODEL_LOADED(A_M_Y_HIPSTER_01)
AND HAS_ANIM_DICT_LOADED("oddjobs@assassinate@hotel@")
AND GET_IS_WAYPOINT_RECORDING_LOADED("OJAS_HotelTaxi01")
iExtraCreationStages++
PRINTLN("iExtraCreationStages = ", iExtraCreationStages)
ELSE
PRINTLN("WAITING ON EXTRAS")
ENDIF
BREAK
//=======================================================================================================================
CASE 1
stExtras.pedTaxiGuys[0] = CREATE_PED(PEDTYPE_CIVMALE, A_F_M_BEVHILLS_01, << -1220.6788, -203.2689, 38.3251 >>, 321.2841)
stExtras.pedTaxiGuys[1] = CREATE_PED(PEDTYPE_CIVMALE, A_F_M_BEVHILLS_02, << -1219.5959, -201.3663, 38.3251 >>, 110.7199)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stExtras.pedTaxiGuys[0], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stExtras.pedTaxiGuys[1], TRUE)
OPEN_SEQUENCE_TASK(iSeq)
TASK_LOOK_AT_ENTITY(NULL, stExtras.pedTaxiGuys[1], -1)
// TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@hotel@", "idle_a", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
TASK_START_SCENARIO_AT_POSITION(NULL, "WORLD_HUMAN_TOURIST_MOBILE", << -1220.6788, -203.2689, 38.3251 >>, 321.2841)
CLOSE_SEQUENCE_TASK(iSeq)
IF NOT IS_ENTITY_DEAD(stExtras.pedTaxiGuys[0])
TASK_PERFORM_SEQUENCE(stExtras.pedTaxiGuys[0], iSeq)
ENDIF
CLEAR_SEQUENCE_TASK(iSeq)
OPEN_SEQUENCE_TASK(iSeq)
TASK_LOOK_AT_ENTITY(NULL, stExtras.pedTaxiGuys[0], -1)
TASK_START_SCENARIO_AT_POSITION(NULL, "WORLD_HUMAN_TOURIST_MAP", << -1219.5959, -201.3663, 38.3251 >>, 110.7199)
CLOSE_SEQUENCE_TASK(iSeq)
IF NOT IS_ENTITY_DEAD(stExtras.pedTaxiGuys[1])
TASK_PERFORM_SEQUENCE(stExtras.pedTaxiGuys[1], iSeq)
ENDIF
CLEAR_SEQUENCE_TASK(iSeq)
stExtras.vehTaxi = CREATE_VEHICLE(TAXI, << -1221.7302, -199.0665, 38.1751 >>, 152.5038)
SET_VEHICLE_ON_GROUND_PROPERLY(stExtras.vehTaxi)
// SET_VEHICLE_DOORS_LOCKED(stExtras.vehTaxi, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
stExtras.pedTaxiDriver = CREATE_PED_INSIDE_VEHICLE(stExtras.vehTaxi, PEDTYPE_CIVMALE, A_M_Y_HIPSTER_01)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stExtras.pedTaxiDriver, TRUE)
TASK_LOOK_AT_ENTITY(stExtras.pedTaxiDriver, stExtras.pedTaxiGuys[0], -1)
stExtras.pedTalkers[0] = CREATE_PED(PEDTYPE_CIVMALE, A_M_M_BEVHILLS_01, << -1211.5972, -184.5331, 38.3255 >>, 4.5193)
stExtras.pedTalkers[1] = CREATE_PED(PEDTYPE_CIVMALE, A_M_Y_HIPSTER_01, << -1211.6544, -182.7625, 38.3255 >>, 166.2532)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stExtras.pedTalkers[0], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stExtras.pedTalkers[1], TRUE)
TASK_PLAY_ANIM(stExtras.pedTalkers[0], "oddjobs@assassinate@hotel@", "idle_a", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
TASK_PLAY_ANIM(stExtras.pedTalkers[1], "oddjobs@assassinate@hotel@", "argue_b", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
stExtras.pedSmokers[0] = CREATE_PED(PEDTYPE_CIVMALE, A_M_M_BEVHILLS_01, << -1229.0994, -176.3197, 38.3255 >>, 231.8036)
stExtras.pedSmokers[1] = CREATE_PED(PEDTYPE_CIVMALE, A_F_M_BEVHILLS_02, << -1249.7793, -162.4767, 39.4131 >>, 220.1651)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stExtras.pedSmokers[0], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stExtras.pedSmokers[1], TRUE)
TASK_PLAY_ANIM(stExtras.pedSmokers[0], "oddjobs@assassinate@hotel@","base", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
TASK_PLAY_ANIM(stExtras.pedSmokers[1], "oddjobs@assassinate@hotel@","base", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
stExtras.bGuysCreated = TRUE
SET_MODEL_AS_NO_LONGER_NEEDED(A_M_M_BEVHILLS_01)
SET_MODEL_AS_NO_LONGER_NEEDED(A_F_M_BEVHILLS_01)
SET_MODEL_AS_NO_LONGER_NEEDED(A_F_M_BEVHILLS_02)
SET_MODEL_AS_NO_LONGER_NEEDED(A_M_Y_HIPSTER_01)
SET_MODEL_AS_NO_LONGER_NEEDED(TAXI)
iExtraCreationStages++
PRINTLN("iExtraCreationStages = ", iExtraCreationStages)
BREAK
//=======================================================================================================================
CASE 2
BREAK
ENDSWITCH
ENDPROC
PROC REMOVE_PED(PED_INDEX& pedToRemove)
IF DOES_ENTITY_EXIST(pedToRemove)
IF IS_ENTITY_OCCLUDED(pedToRemove)
DELETE_PED(pedToRemove)
PRINTLN("DELETING PED")
ELSE
SET_PED_AS_NO_LONGER_NEEDED(pedToRemove)
PRINTLN("SETTING PED AS NO LONGER NEEDED")
ENDIF
ENDIF
ENDPROC
PROC REMOVE_VEHICLE(VEHICLE_INDEX& vehToRemove)
IF DOES_ENTITY_EXIST(vehToRemove)
IF IS_ENTITY_OCCLUDED(vehToRemove)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehToRemove)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED")
// ELSE
// DELETE_VEHICLE(vehToRemove)
// PRINTLN("DELETING VEHICLE")
ENDIF
ENDIF
ENDPROC
PROC CLEANUP_EXTRAS()
REMOVE_VEHICLE(stExtras.vehTaxi)
REMOVE_PED(stExtras.pedTaxiGuys[0])
REMOVE_PED(stExtras.pedTaxiGuys[1])
REMOVE_PED(stExtras.pedTalkers[0])
REMOVE_PED(stExtras.pedTalkers[1])
REMOVE_PED(stExtras.pedSmokers[0])
REMOVE_PED(stExtras.pedSmokers[1])
REMOVE_PED(stExtras.pedTaxiDriver)
ENDPROC
/// PURPOSE:
/// Called when the mission is failed.
/// Sets the fail reason and tells replay controller to start setting up the replay
/// (showing fail reason, fading out etc)
PROC SET_MISSION_FAILED(eFailType eFail)
IF bMissionFailed = FALSE // (should only do this failed stuff once)
failType = eFail
KILL_ANY_CONVERSATION()
CLEAR_PRINTS()
TRIGGER_MUSIC_EVENT("ASS1_FAIL")
PRINTLN("TRIGGERING MUSIC - ASS1_FAIL - 01")
IF DOES_PLAYER_NEED_SAFE_WARP()
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-1698.5100, -1067.7682, 12.1417>>, 316.3502)
ENDIF
//to fix bug 1212108 - Starting on foot having driven there in previous attempt- (3/23/13)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
g_replay.iReplayInt[0] = 1 //set this integer to true that we will check later in GO_TO_CHECKPOINT_X
ELSE
g_replay.iReplayInt[0] = 0 //reset this value
ENDIF
STRING strFailReason
SWITCH failType
CASE FT_FAILED
strFailReason = "ASS_VA_FAILED"
PRINTLN("FAIL REASON - FT_FAILED")
BREAK
CASE FT_VEHICLE
strFailReason = "ASS_VA_VEHICLE"
PRINTLN("FAIL REASON - FT_VEHICLE")
BREAK
CASE FT_BLOWN_COVER
CASE FT_DISREGARDED_WARNINGS
strFailReason = "ASS_VA_COVER"
PRINTLN("FAIL REASON - FT_BLOWN_COVER")
BREAK
CASE FT_STICKY
strFailReason = "ASS_VA_COVER"
PRINTLN("FAIL REASON - FT_STICKY")
BREAK
CASE FT_BLOWN_COVER_WANTED
strFailReason = "ASS_VA_WANTED"
PRINTLN("FAIL REASON - ASS_VA_WANTED")
BREAK
CASE FT_ESCAPED
strFailReason = "ASS_VA_ESCAPED"
PRINTLN("FAIL REASON - ASS_VA_ESCAPED")
BREAK
CASE FT_ABANDONED
strFailReason = "ASS_VA_ABAND"
PRINTLN("FAIL REASON - ASS_VA_ABAND")
BREAK
CASE FT_LESTER_ATTACKED
strFailReason = "ASS_VA_LATTACK"
PRINTLN("FAIL REASON - ASS_VA_LATTACK")
BREAK
ENDSWITCH
bMissionFailed = TRUE
ASSASSIN_MISSION_MarkMissionFailed(strFailReason)
MISSION_FLOW_MISSION_FAILED()
ENDIF
ENDPROC
FUNC BOOL CHECK_FOR_PLAYER_RAMMING_VEHICLE(VEHICLE_INDEX vehToCheck)
VEHICLE_INDEX vehTemp
FLOAT fSpeed
IF DOES_ENTITY_EXIST(vehToCheck)
IF IS_VEHICLE_DRIVEABLE(vehToCheck)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehTemp)
AND IS_VEHICLE_DRIVEABLE(vehTemp)
fSpeed = GET_ENTITY_SPEED(vehTemp)
// PRINTLN("PLAYER'S VEHICLE SPEED = ", fSpeed)
IF fSpeed > 7.0
IF IS_ENTITY_TOUCHING_ENTITY(vehTemp, vehToCheck)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehTemp, vehToCheck)
PRINTLN("CHECK_FOR_PLAYER_RAMMING_VEHICLE RETURNED TRUE!")
// IF IS_ENTITY_TOUCHING_ENTITY(vehTemp, vehToCheck)
// PRINTLN("ENTITY TOUCHING ENTITY CHECK RETURNED TRUE")
// ENDIF
// IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehTemp, vehToCheck)
// PRINTLN("ENTITY DAMAGED ENTITY CHECK RETURNED TRUE")
// ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL RUN_AGGRO_CHECK_ON_EXTRAS()
IF NOT IS_ENTITY_DEAD(stExtras.pedTaxiDriver)
IF IS_PED_BEING_JACKED(stExtras.pedTaxiDriver)
IF GET_PEDS_JACKER(stExtras.pedTaxiDriver) = PLAYER_PED_ID()
PRINTLN("RETURNING TRUE, PLAYER IS JACKING TAXI DRIVER")
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(stExtras.vehTaxi)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), stExtras.vehTaxi)
PRINTLN("RETURNING TRUE, PLAYER GOT IN TAXI")
RETURN TRUE
ENDIF
ENDIF
IF DO_AGGRO_CHECK(stExtras.pedTaxiGuys[0], NULL, aggroArgs, aggroReason, FALSE, FALSE, FALSE, TRUE, FALSE)
PRINTLN("AGGRO CHECK RETURNING TRUE ON stExtras.pedTaxiGuys[0]")
RETURN TRUE
ENDIF
IF DO_AGGRO_CHECK(stExtras.pedTaxiGuys[1], NULL, aggroArgs, aggroReason, FALSE, FALSE, FALSE, TRUE, FALSE)
PRINTLN("AGGRO CHECK RETURNING TRUE ON stExtras.pedTaxiGuys[1]")
RETURN TRUE
ENDIF
IF DO_AGGRO_CHECK(stExtras.pedTalkers[0], NULL, aggroArgs, aggroReason, FALSE, FALSE, FALSE, TRUE, FALSE)
PRINTLN("AGGRO CHECK RETURNING TRUE ON stExtras.pedTalkers[0]")
RETURN TRUE
ENDIF
IF DO_AGGRO_CHECK(stExtras.pedTalkers[1], NULL, aggroArgs, aggroReason, FALSE, FALSE, FALSE, TRUE, FALSE)
PRINTLN("AGGRO CHECK RETURNING TRUE ON stExtras.pedTalkers[1]")
RETURN TRUE
ENDIF
IF DO_AGGRO_CHECK(stExtras.pedSmokers[0], NULL, aggroArgs, aggroReason, FALSE, FALSE, FALSE, TRUE, FALSE)
PRINTLN("AGGRO CHECK RETURNING TRUE ON stExtras.pedSmokers[0]")
RETURN TRUE
ENDIF
IF DO_AGGRO_CHECK(stExtras.pedSmokers[1], NULL, aggroArgs, aggroReason, FALSE, FALSE, FALSE, TRUE, FALSE)
PRINTLN("AGGRO CHECK RETURNING TRUE ON stExtras.pedSmokers[1]")
RETURN TRUE
ENDIF
IF CHECK_FOR_PLAYER_RAMMING_VEHICLE(stExtras.vehTaxi)
PRINTLN("AGGRO CHECK RETURNING TRUE ON stExtras.vehTaxi")
RETURN TRUE
ENDIF
//Performance of this?
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, <<-1231.3260, -201.7195, 38.2114>>, 20.0)
// AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DIR_STEAM, <<-1231.3260, -201.7195, 38.2114>>, 20.0)
// AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DIR_WATER_HYDRANT, <<-1231.3260, -201.7195, 38.2114>>, 20.0)
PRINTLN("AGGRO CHECK RETURNING TRUE ON UPDATE PED EXTRAS")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC HANDLE_FLEE()
IF DOES_ENTITY_EXIST(stExtras.pedTaxiDriver)
AND NOT IS_ENTITY_DEAD(stExtras.pedTaxiDriver)
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
TASK_SMART_FLEE_PED(stExtras.pedTaxiDriver, PLAYER_PED_ID(), 1000, -1)
ENDIF
IF DOES_ENTITY_EXIST(stExtras.pedTaxiGuys[0])
AND NOT IS_ENTITY_DEAD(stExtras.pedTaxiGuys[0])
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
TASK_SMART_FLEE_PED(stExtras.pedTaxiGuys[0], PLAYER_PED_ID(), 1000, -1)
SET_PED_FLEE_ATTRIBUTES(stExtras.pedTaxiGuys[0], FA_USE_VEHICLE, FALSE)
ENDIF
IF DOES_ENTITY_EXIST(stExtras.pedTaxiGuys[1])
AND NOT IS_ENTITY_DEAD(stExtras.pedTaxiGuys[1])
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
TASK_SMART_FLEE_PED(stExtras.pedTaxiGuys[1], PLAYER_PED_ID(), 1000, -1)
SET_PED_FLEE_ATTRIBUTES(stExtras.pedTaxiGuys[1], FA_USE_VEHICLE, FALSE)
ENDIF
IF DOES_ENTITY_EXIST(stExtras.pedTalkers[0])
AND NOT IS_ENTITY_DEAD(stExtras.pedTalkers[0])
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
TASK_SMART_FLEE_PED(stExtras.pedTalkers[0], PLAYER_PED_ID(), 1000, -1)
ENDIF
IF DOES_ENTITY_EXIST(stExtras.pedTalkers[1])
AND NOT IS_ENTITY_DEAD(stExtras.pedTalkers[1])
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
TASK_SMART_FLEE_PED(stExtras.pedTalkers[1], PLAYER_PED_ID(), 1000, -1)
ENDIF
IF DOES_ENTITY_EXIST(stExtras.pedSmokers[0])
AND NOT IS_ENTITY_DEAD(stExtras.pedSmokers[0])
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
TASK_SMART_FLEE_PED(stExtras.pedSmokers[0], PLAYER_PED_ID(), 1000, -1)
ENDIF
IF DOES_ENTITY_EXIST(stExtras.pedSmokers[1])
AND NOT IS_ENTITY_DEAD(stExtras.pedSmokers[1])
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
TASK_SMART_FLEE_PED(stExtras.pedSmokers[1], PLAYER_PED_ID(), 1000, -1)
ENDIF
ENDPROC
/// PURPOSE:
/// Loops through LimoGuard, EscortPed, and Bodyguard arrays and returns the closest ped index
/// PARAMS:
/// fDistToCheck - Probe distance around the player
/// RETURNS:
///
FUNC PED_INDEX GET_CLOSEST_GUARD(FLOAT fDistToCheck = 70.0, BOOL bCheckGuysInVehicles = TRUE)
INT tempInt
FLOAT fCurDist
FLOAT fCloseDist = fDistToCheck
PED_INDEX closestPed
FOR tempInt = 0 TO NUM_LIMO_GUARDS - 1
IF NOT IS_PED_INJURED(piLimoGuard[tempInt])
IF bCheckGuysInVehicles
OR ( NOT bCheckGuysInVehicles AND NOT IS_PED_IN_ANY_VEHICLE(piLimoGuard[tempInt]) )
fCurDist = GET_PLAYER_DISTANCE_FROM_ENTITY(piLimoGuard[tempInt], TRUE)
// PRINTLN("LIMO GUARDS: DISTANCE TO PLAYER FOR INDEX: ", tempInt, " DISTANCE = ", fCurDist)
IF fCurDist < fCloseDist
// PRINTLN("BEFORE: fCloseDist = ", fCloseDist)
// PRINTLN("BEFORE: fCurDist = ", fCurDist)
fCloseDist = fCurDist
// PRINTLN("AFTER: fCloseDist = ", fCloseDist)
// PRINTLN("AFTER: fCurDist = ", fCurDist)
closestPed = piLimoGuard[tempInt]
// PRINTLN("CLOSEST piLimoGuard INDEX: ", tempInt)
ENDIF
ENDIF
ENDIF
ENDFOR
FOR tempInt = 0 TO NUM_ESCORT_PEDS - 1
IF NOT IS_PED_INJURED(piEscortPed[tempInt])
IF bCheckGuysInVehicles
OR ( NOT bCheckGuysInVehicles AND NOT IS_PED_IN_ANY_VEHICLE(piEscortPed[tempInt]) )
fCurDist = GET_PLAYER_DISTANCE_FROM_ENTITY(piEscortPed[tempInt], TRUE)
// PRINTLN("ESCORT GUARDS: DISTANCE TO PLAYER FOR INDEX: ", tempInt, " DISTANCE = ", fCurDist)
IF fCurDist < fCloseDist
fCloseDist = fCurDist
closestPed = piEscortPed[tempInt]
// PRINTLN("CLOSEST piEscortPed INDEX: ", tempInt)
ENDIF
ENDIF
ENDIF
ENDFOR
FOR tempInt = 0 TO NUM_BODYGUARDS - 1
IF NOT IS_PED_INJURED(piBodyguard[tempInt])
IF bCheckGuysInVehicles
OR ( NOT bCheckGuysInVehicles AND NOT IS_PED_IN_ANY_VEHICLE(piEscortPed[tempInt]) )
fCurDist = GET_PLAYER_DISTANCE_FROM_ENTITY(piBodyguard[tempInt], TRUE)
// PRINTLN("BODYGUARDS: DISTANCE TO PLAYER FOR INDEX: ", tempInt, " DISTANCE = ", fCurDist)
IF fCurDist < fCloseDist
fCloseDist = fCurDist
closestPed = piBodyguard[tempInt]
// PRINTLN("CLOSEST piBodyguard INDEX: ", tempInt)
ENDIF
ENDIF
ENDIF
ENDFOR
RETURN closestPed
ENDFUNC
FUNC PED_INDEX GET_CLOSEST_GUARD_TO_LIMO(FLOAT fDistToCheck)
INT tempInt
FOR tempInt = 0 TO NUM_LIMO_GUARDS - 1
IF NOT IS_PED_INJURED(piLimoGuard[tempInt])
IF GET_ENTITY_DISTANCE_FROM_LOCATION(piLimoGuard[tempInt], vTargetCarLobbyPos) < fDistToCheck
RETURN piLimoGuard[tempInt]
ENDIF
ENDIF
ENDFOR
FOR tempInt = 0 TO NUM_ESCORT_PEDS - 1
IF NOT IS_PED_INJURED(piEscortPed[tempInt])
IF GET_ENTITY_DISTANCE_FROM_LOCATION(piEscortPed[tempInt], vTargetCarLobbyPos) < fDistToCheck
RETURN piEscortPed[tempInt]
ENDIF
ENDIF
ENDFOR
RETURN NULL
ENDFUNC
/// PURPOSE:
/// Fill ped struct data for dialogue
PROC SETUP_PED_FOR_DIALOGUE(PED_INDEX ped, INT intPedNumber, STRING strVoiceIdentifier)
IF NOT IS_PED_INJURED(ped)
ADD_PED_FOR_DIALOGUE(hotelConv, intPedNumber, ped, strVoiceIdentifier)
ENDIF
ENDPROC
/// PURPOSE:
/// Gives a ped a task sequence to walk to the front of the hotel and wander
/// PARAMS:
/// pedToTask - ped
/// bOnlyTaskIfNotAlreadyUsingSequence - if TRUE will only give the ped a task to do this is not already using a sequence. Set to FALSE to task regardless.
PROC TASK_WALK_TO_HOTEL_ENTRANCE_AND_WANDER(PED_INDEX pedToTask, BOOL bOnlyTaskIfNotAlreadyUsingSequence = TRUE)
SEQUENCE_INDEX tempSeq
IF NOT IS_PED_INJURED(pedToTask)
IF ( bOnlyTaskIfNotAlreadyUsingSequence AND GET_SCRIPT_TASK_STATUS(pedToTask, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK )
OR NOT bOnlyTaskIfNotAlreadyUsingSequence
OPEN_SEQUENCE_TASK(tempSeq)
TASK_GO_TO_COORD_ANY_MEANS(NULL, << -1214.3433, -132.1107, 40.2416 >>, PEDMOVEBLENDRATIO_WALK, NULL)
TASK_WANDER_STANDARD(NULL)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(pedToTask, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks to see if a ped is running a ragdoll task and is not already tasked with TASK_WALK_TO_HOTEL_ENTRANCE_AND_WANDER and tasks them with it if not
/// PARAMS:
/// pedToTask - ped to check/task
/// bForce - defaults to FALSE. Set the TRUE if you want to explicitly give the task without the ped having to ragdoll first
PROC HANDLE_PLAYER_APPROACHING_EXTRA(PED_INDEX pedToTask, BOOL bForce = FALSE)
IF NOT IS_PED_INJURED(pedToTask)
IF GET_SCRIPT_TASK_STATUS(pedToTask, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedToTask, FALSE) < 1.0
OR bForce
TASK_WALK_TO_HOTEL_ENTRANCE_AND_WANDER(pedToTask)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// State machine for controlling teh bahvior of the peds that stand outside the taxi and the taxi driver
PROC UPDATE_TAXI_EXTRAS()
PED_INDEX tempGuard
SWITCH iExtraUpdateStages
CASE 0
IF bTaxiLeave
OR bWarningLinePlayed
OR GET_PLAYER_DISTANCE_FROM_ENTITY(stExtras.pedTaxiGuys[0], FALSE) < 1.0
OR GET_PLAYER_DISTANCE_FROM_ENTITY(stExtras.pedTaxiGuys[1], FALSE) < 1.0
IF NOT IS_ENTITY_DEAD(stExtras.pedTaxiGuys[0]) AND NOT IS_ENTITY_DEAD(stExtras.pedTaxiGuys[1])
TASK_LOOK_AT_ENTITY(stExtras.pedTaxiGuys[0], stExtras.pedTaxiGuys[1], -1)
TASK_LOOK_AT_ENTITY(stExtras.pedTaxiGuys[1], stExtras.pedTaxiGuys[0], -1)
ENDIF
IF DOES_ENTITY_EXIST(stExtras.pedTaxiGuys[1])
AND DOES_ENTITY_EXIST(stExtras.vehTaxi)
AND NOT IS_PED_INJURED(stExtras.pedTaxiGuys[1])
AND IS_VEHICLE_DRIVEABLE(stExtras.vehTaxi)
CLEAR_PED_TASKS(stExtras.pedTaxiGuys[1])
TASK_ENTER_VEHICLE(stExtras.pedTaxiGuys[1], stExtras.vehTaxi, DEFAULT_TIME_BEFORE_WARP, VS_BACK_RIGHT, PEDMOVEBLENDRATIO_WALK)
PRINTLN("UPDATE_EXTRAS: TASKING GUYS TO ENTER VEHICLE - 02")
ENDIF
IF NOT IS_TIMER_STARTED(tExtrasTimer)
START_TIMER_NOW(tExtrasTimer)
PRINTLN("STARTING TIMER - tExtrasTimer")
ENDIF
iExtraUpdateStages++
PRINTLN("iExtraUpdateStages = ", iExtraUpdateStages)
ENDIF
BREAK
//=======================================================================================================================
CASE 1
IF NOT bEnterVehicle
IF IS_TIMER_STARTED(tExtrasTimer)
IF GET_TIMER_IN_SECONDS(tExtrasTimer) > 3.0
IF DOES_ENTITY_EXIST(stExtras.pedTaxiGuys[0])
AND DOES_ENTITY_EXIST(stExtras.vehTaxi)
AND NOT IS_PED_INJURED(stExtras.pedTaxiGuys[0])
AND IS_VEHICLE_DRIVEABLE(stExtras.vehTaxi)
IF GET_SCRIPT_TASK_STATUS(stExtras.pedTaxiGuys[0], SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK
CLEAR_PED_TASKS(stExtras.pedTaxiGuys[0])
TASK_ENTER_VEHICLE(stExtras.pedTaxiGuys[0], stExtras.vehTaxi, DEFAULT_TIME_BEFORE_WARP, VS_BACK_LEFT, PEDMOVEBLENDRATIO_WALK)
PRINTLN("UPDATE_EXTRAS: TASKING GUYS TO ENTER VEHICLE - 01")
bEnterVehicle = TRUE
ENDIF
ENDIF
ENDIF
ELSE
START_TIMER_NOW(tExtrasTimer)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(stExtras.pedTaxiGuys[0]) AND NOT IS_PED_INJURED(stExtras.pedTaxiGuys[1])
IF IS_PED_IN_VEHICLE(stExtras.pedTaxiGuys[0], stExtras.vehTaxi)
AND IS_PED_IN_VEHICLE(stExtras.pedTaxiGuys[1], stExtras.vehTaxi)
IF NOT IS_ENTITY_DEAD(stExtras.pedTaxiDriver) AND NOT IS_ENTITY_DEAD(stExtras.vehTaxi)
TASK_CLEAR_LOOK_AT(stExtras.pedTaxiDriver)
RESTART_TIMER_NOW(tExtrasTimer)
ENDIF
iExtraUpdateStages++
PRINTLN("iExtraUpdateStages = ", iExtraUpdateStages)
ENDIF
ENDIF
BREAK
//=======================================================================================================================
CASE 2
IF IS_TIMER_STARTED(tExtrasTimer)
IF GET_TIMER_IN_SECONDS(tExtrasTimer) > 3.0
IF NOT IS_PED_INJURED(stExtras.pedTaxiDriver)
AND IS_VEHICLE_DRIVEABLE(stExtras.vehTaxi)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(stExtras.pedTaxiDriver, stExtras.vehTaxi,
"OJAS_HotelTaxi01", DRIVINGMODE_AVOIDCARS | DF_SteerAroundPeds, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 10)
iExtraUpdateStages++
PRINTLN("iExtraUpdateStages = ", iExtraUpdateStages)
ENDIF
ENDIF
ENDIF
BREAK
//=======================================================================================================================
CASE 3
IF NOT IS_ENTITY_DEAD(stExtras.pedTaxiDriver) AND NOT IS_ENTITY_DEAD(stExtras.vehTaxi)
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(stExtras.vehTaxi)
OR bGuardsTellExtrasToLeave
TASK_VEHICLE_DRIVE_WANDER(stExtras.pedTaxiDriver, stExtras.vehTaxi, 10.0, DRIVINGMODE_STOPFORCARS)
PRINTLN("TASKING TO WANDER")
iExtraUpdateStages++
PRINTLN("iExtraUpdateStages = ", iExtraUpdateStages)
ENDIF
ENDIF
BREAK
//=======================================================================================================================
CASE 4
IF bGuardsTellExtrasToLeave
IF NOT IS_PED_INJURED(piEscortPed[0])
tempGuard = piEscortPed[0]
ELSE
tempGuard = GET_CLOSEST_GUARD_TO_LIMO(25.0)
ENDIF
IF DOES_ENTITY_EXIST(tempGuard)
IF NOT IS_PED_INJURED(tempGuard)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
SETUP_PED_FOR_DIALOGUE(tempGuard, 5, "OJAvaGUARD")
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_LEAVE", CONV_PRIORITY_VERY_HIGH) //tells extras to leave
ENDIF
ENDIF
ENDIF
RESTART_TIMER_NOW(tExtrasTimer)
iExtraUpdateStages++
PRINTLN("iExtraUpdateStages = ", iExtraUpdateStages)
ENDIF
BREAK
//=======================================================================================================================
CASE 5
//empty - already tasked
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles updating of talker and smoker extra peds
PROC UPDATE_NON_TAXI_EXTRAS()
IF bHotelTimerStarted
IF iTimeRemaining < (iGuardTimeToTellExtrasToLeave - 5.0)
// TALKER PEDS - 2
TASK_WALK_TO_HOTEL_ENTRANCE_AND_WANDER(stExtras.pedTalkers[0])
TASK_WALK_TO_HOTEL_ENTRANCE_AND_WANDER(stExtras.pedTalkers[1])
// SMOKING PEDS - 2
TASK_WALK_TO_HOTEL_ENTRANCE_AND_WANDER(stExtras.pedSmokers[0])
TASK_WALK_TO_HOTEL_ENTRANCE_AND_WANDER(stExtras.pedSmokers[1])
ELSE
//if either one of these peds are approached, we want to force them both to walk away
IF GET_PLAYER_DISTANCE_FROM_ENTITY(stExtras.pedTalkers[0], FALSE) < 1.0
OR GET_PLAYER_DISTANCE_FROM_ENTITY(stExtras.pedTalkers[1], FALSE) < 1.0
OR bWarningLinePlayed
HANDLE_PLAYER_APPROACHING_EXTRA(stExtras.pedTalkers[0], TRUE)
HANDLE_PLAYER_APPROACHING_EXTRA(stExtras.pedTalkers[1], TRUE)
ENDIF
IF NOT bWarningLinePlayed
HANDLE_PLAYER_APPROACHING_EXTRA(stExtras.pedSmokers[0])
HANDLE_PLAYER_APPROACHING_EXTRA(stExtras.pedSmokers[1])
ELSE
HANDLE_PLAYER_APPROACHING_EXTRA(stExtras.pedSmokers[0], TRUE)
HANDLE_PLAYER_APPROACHING_EXTRA(stExtras.pedSmokers[1], TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Main update loop for the extra peds
PROC UPDATE_EXTRAS()
PED_INDEX pedSpeaker
VECTOR vSpeakerPos
IF stExtras.bGuysCreated
IF NOT bPanickedExtras
IF MainStage < STAGE_GUARDS_GO_TO_POSTS
IF RUN_AGGRO_CHECK_ON_EXTRAS()
pedSpeaker = GET_CLOSEST_GUARD()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(pedSpeaker)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedSpeaker, FALSE) < 10
vSpeakerPos = GET_ENTITY_COORDS(pedSpeaker)
vSpeakerPos = vSpeakerPos
PRINTLN("pedSpeaker located at << ", vSpeakerPos.x, ", ", vSpeakerPos.y, ", ", vSpeakerPos.z, " >>.")
ADD_PED_FOR_DIALOGUE(hotelConv, 3, pedSpeaker, "OJAvaGuard")
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_AT_EX", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
HANDLE_FLEE()
PRINTLN("bPanickedExtras = TRUE - 01")
bPanickedExtras = TRUE
ENDIF
IF bPanicking
HANDLE_FLEE()
PRINTLN("bPanickedExtras = TRUE - 02")
bPanickedExtras = TRUE
ELSE
UPDATE_TAXI_EXTRAS()
UPDATE_NON_TAXI_EXTRAS()
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SETUP_UI_LABELS()
endLabel.tlMissionPassed = "ASS_VA_PASSED"
endLabel.tlMissionName = g_sMissionStatsName
endLabel.tlTimeTaken = "ASS_VA_TIMER"
endLabel.tlBaseReward = "ASS_VA_BASE"
endLabel.tlBonusDesc = "ASS_VA_BDESC"
endLabel.tlCashEarned = "ASS_VA_CASH"
endLabel.tlCompletionGold = "ASS_VA_COMP"//"ASS_VA_COMPG"
endLabel.tlCompletionSilver = "ASS_VA_COMP"//"ASS_VA_COMPS"
endLabel.tlCompletionBronze = "ASS_VA_COMP"//"ASS_VA_COMPB"
endLabel.tlCompletionNoMedal = "ASS_VA_COMP"//"ASS_VA_COMPN"
ENDPROC
//set bPanicking to TRUE and set fail type
PROC FAIL_MISSION_FOR_CLOSE_VEHICLE()
// bPanicking = TRUE
failType = FT_VEHICLE
bFailMissionForCloseVehicle = TRUE
PRINTLN("OJASHOTEL - bFailMissionForCloseVehicle = TRUE")
ENDPROC
FUNC BOOL IS_PLAYER_IN_AIR_VEHICLE()
MODEL_NAMES mnAirVehicle
IF IS_PED_INJURED(PLAYER_PED_ID())
RETURN FALSE
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
RETURN FALSE
ENDIF
IF IS_PED_IN_ANY_PLANE(PLAYER_PED_ID()) OR IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
vehPlaneVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
mnAirVehicle = GET_ENTITY_MODEL(vehPlaneVehicle)
IF mnAirVehicle != BLIMP
AND mnAirVehicle != blimp2
bPlayerIsInFlyingVehicle = TRUE
PRINTLN("PLAYER IS IN A PLANE OR HELICOPTER")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC MOVE_PLAYER_AND_PLANE()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
// SET_ENTITY_COORDS(PLAYER_PED_ID(), << -1264.0720, -223.5235, 59.6540 >>)
// SET_ENTITY_HEADING(PLAYER_PED_ID(), 313.420)
SET_ENTITY_COORDS(PLAYER_PED_ID(), vNewBlipPosition)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 299.4985)
PRINTLN("MOVING PLAYER TO CUTSCENE BLIP POSITION FROM MOVE_PLAYER_AND_PLANE")
ENDIF
IF DOES_ENTITY_EXIST(vehPlaneVehicle)
IF IS_VEHICLE_DRIVEABLE(vehPlaneVehicle)
SET_VEHICLE_ENGINE_ON(vehPlaneVehicle, FALSE, TRUE)
SET_ENTITY_COORDS(vehPlaneVehicle, <<-1251.8732, -256.7999, 38.2695>>)
SET_ENTITY_HEADING(vehPlaneVehicle, 296.7603)
SET_VEHICLE_ON_GROUND_PROPERLY(vehPlaneVehicle)
PRINTLN("MOVING PLANE TO POSITION IN WIDE ALLEY ON GROUND")
ENDIF
ENDIF
ENDPROC
PROC REPOSITION_PLAYER_AND_VEHICLE_FOR_GUARD_CUTSCENE()
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1252.462769,-227.589386,39.032867>>, <<-1267.238770,-207.992447,44.673515>>, 17.000000, <<-1266.4049, -219.1991, 41.4459>>, 304.8644, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1266.1729, -214.0011, 41.4459>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 310.0126)
PRINTLN("MOVING PLAYER TO CUTSCENE BLIP POSITION FROM MOVE_PLAYER_AND_PLANE")
ENDIF
ENDPROC
//check if player is withing range of triggering cutscene
FUNC BOOL IS_PLAYER_IN_RANGE_OF_HOTEL()
FLOAT fDistanceToStart
BOOL bTriggerdInFlyingVehicle = FALSE
fDistanceToStart = GET_ENTITY_DISTANCE_FROM_LOCATION(Player, vNewBlipPosition)
IF fDistanceToStart < 200
CREATE_EXTRAS()
ENDIF
IF IS_PLAYER_IN_AIR_VEHICLE()
IF IS_ENTITY_AT_COORD(Player, vNewBlipPosition, <<25,25,90>>, TRUE)
bTriggerdInFlyingVehicle = TRUE
PRINTLN("bTriggerdInFlyingVehicle = TRUE")
ENDIF
ENDIF
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
IF fDistanceToStart < 2
OR IS_ENTITY_AT_COORD(Player, vNewBlipPosition, <<2,2,LOCATE_SIZE_HEIGHT>>, TRUE)
OR bTriggerdInFlyingVehicle
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -1141.085, -192.660, 75.756 >>, << -1246.085, -192.660, 100.756 >>, 115, FALSE, TRUE)
// If the player is in a helicopter or plane and is too close, fail
IF IS_PLAYER_IN_AIR_VEHICLE() AND bTriggerdInFlyingVehicle
PRINTLN("RETURNING TRUE ON IS_PLAYER_IN_RANGE_OF_HOTEL - IN AIR VEHICLE")
RETURN TRUE
ELSE
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
PRINTLN("RETURNING TRUE ON IS_PLAYER_IN_RANGE_OF_HOTEL")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Release all peds
PROC CLEANUP_PEDS()
INT idx
REPEAT NUM_BODYGUARDS idx
IF DOES_ENTITY_EXIST(piBodyguard[idx])
IF NOT IS_PED_INJURED(piBodyguard[idx])
CLEANUP_AI_PED_BLIP(blipBodyguard[idx])
CLEAR_PED_TASKS(piBodyguard[idx])
SET_PED_AS_NO_LONGER_NEEDED(piBodyguard[idx])
PRINTLN("SETTING PED AS NO LONGER NEEDED - piBodyguard[", idx, "].")
ENDIF
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(piTarget)
IF NOT IS_PED_INJURED(piTarget)
CLEAR_PED_TASKS(piTarget)
SET_PED_AS_NO_LONGER_NEEDED(piTarget)
PRINTLN("SETTING PED AS NO LONGER NEEDED - piTarget")
ENDIF
ENDIF
REPEAT NUM_LIMO_GUARDS idx
IF DOES_ENTITY_EXIST(piLimoGuard[idx])
IF NOT IS_PED_INJURED(piLimoGuard[idx])
CLEANUP_AI_PED_BLIP(blipCombatLimoGuards[idx])
CLEAR_PED_TASKS(piLimoGuard[idx])
SET_PED_AS_NO_LONGER_NEEDED(piLimoGuard[idx])
PRINTLN("SETTING PED AS NO LONGER NEEDED - piLimoGuard")
ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_ESCORT_PEDS idx
IF DOES_ENTITY_EXIST(piEscortPed[idx])
IF NOT IS_PED_INJURED(piEscortPed[idx])
CLEANUP_AI_PED_BLIP(blipCombatEscort[idx])
CLEAR_PED_TASKS(piEscortPed[idx])
SET_PED_AS_NO_LONGER_NEEDED(piEscortPed[idx])
PRINTLN("SETTING PED AS NO LONGER NEEDED - piEscortPed[", idx, "].")
ENDIF
ENDIF
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(TargetModel)
ENDPROC
/// PURPOSE:
/// Setup initial camera parameters for intro cutscene
PROC CREATE_CAMERAS()
camInit = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1244.3435, -251.5660, 50.3194>>, <<-9.2001, 0.0498, 6.3064>>, 38.000000)
camDest = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1243.5876, -251.4826, 50.3187>>, <<-9.2001, 0.0498, 6.3064>>, 38.000000)
ENDPROC
/// PURPOSE:
/// Cleanup all enemy ped blips
PROC CLEANUP_PED_BLIPS(BOOL bIncludeTarget = TRUE)
INT idx
IF bIncludeTarget
IF DOES_BLIP_EXIST(bTargetBlip)
REMOVE_BLIP(bTargetBlip)
ENDIF
ENDIF
REPEAT NUM_LIMO_GUARDS idx
IF DOES_BLIP_EXIST(bLimoGuardBlip[idx])
REMOVE_BLIP(bLimoGuardBlip[idx])
ENDIF
ENDREPEAT
REPEAT NUM_ESCORT_PEDS idx
IF DOES_BLIP_EXIST(bEscortBlip[idx])
REMOVE_BLIP(bEscortBlip[idx])
ENDIF
ENDREPEAT
REPEAT NUM_BODYGUARDS idx
IF DOES_BLIP_EXIST(bEscortBlip[idx])
REMOVE_BLIP(bEscortBlip[idx])
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// cleanup all COORD blips
PROC CLEANUP_DEST_BLIPS()
IF DOES_BLIP_EXIST(bHotelBlip)
REMOVE_BLIP(bHotelBlip)
ENDIF
ENDPROC
/// PURPOSE:
/// Release all vehicles
PROC CLEANUP_VEHICLES()
IF DOES_ENTITY_EXIST(viTargetCar)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
SET_VEHICLE_DOORS_LOCKED(viTargetCar, VEHICLELOCK_UNLOCKED)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(viTargetCar)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED: viTargetCar")
ENDIF
IF DOES_ENTITY_EXIST(viEscortCar)
IF NOT IS_ENTITY_DEAD(viEscortCar)
IF IS_ENTITY_ON_SCREEN(viEscortCar) AND NOT IS_ENTITY_OCCLUDED(viEscortCar)
AND NOT IS_SCREEN_FADED_OUT()
SET_VEHICLE_AS_NO_LONGER_NEEDED(viEscortCar)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED: viEscortCar")
ELSE
IF DOES_ENTITY_EXIST(piEscortPed[0]) AND NOT IS_ENTITY_DEAD(piEscortPed[0])
IF NOT IS_ENTITY_DEAD(viEscortCar)
IF IS_PED_IN_VEHICLE(piEscortPed[0], viEscortCar)
CLEAR_PED_TASKS_IMMEDIATELY(piEscortPed[0])
PRINTLN("DETACHING PED FROM WITHIN VEHICLE - piEscortPed[0]")
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(piEscortPed[1]) AND NOT IS_ENTITY_DEAD(piEscortPed[1])
IF NOT IS_ENTITY_DEAD(viEscortCar)
IF IS_PED_IN_VEHICLE(piEscortPed[1], viEscortCar)
CLEAR_PED_TASKS_IMMEDIATELY(piEscortPed[1])
PRINTLN("DETACHING PED FROM WITHIN VEHICLE - piEscortPed[1]")
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viEscortCar)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
PRINTLN("PLAYER IS IN THE ESCORT CAR - CLEARING PED TASKS IMMEDIATELY")
ENDIF
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(viEscortCar)
PRINTLN("SETTING VEHICLE: viEscortCar as no longer needed")
// DELETE_VEHICLE(viEscortCar)
// PRINTLN("DELETING VEHICLE: viEscortCar")
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(viParkedCar[0])
SET_VEHICLE_AS_NO_LONGER_NEEDED(viParkedCar[0])
ENDIF
IF DOES_ENTITY_EXIST(viParkedCar[1])
SET_VEHICLE_AS_NO_LONGER_NEEDED(viParkedCar[1])
ENDIF
IF DOES_ENTITY_EXIST(viReplayVehicle) AND NOT IS_ENTITY_DEAD(viReplayVehicle)
IF IS_ENTITY_A_MISSION_ENTITY(viReplayVehicle) AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(viReplayVehicle)
SET_VEHICLE_AS_NO_LONGER_NEEDED(viReplayVehicle)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Release all vehicle recording requests
PROC CLEANUP_VEH_RECORDINGS()
REMOVE_VEHICLE_RECORDING(102, "ASSOJva")
REMOVE_VEHICLE_RECORDING(107, "ASSOJva")
REMOVE_WAYPOINT_RECORDING("OJASva_101")
REMOVE_WAYPOINT_RECORDING("OJASva_101a")
REMOVE_WAYPOINT_RECORDING("OJASva_104")
ENDPROC
/// PURPOSE:
/// define all the variables
PROC INITIALIZE_VARIABLES()
//important vectors used around the hotel location
// vHotelStart = << -1226.4880, -185.6017, 38.1758 >> // <<-1243.275, -194.76, 39.155>> //hotel circle area
vEscortCarPos = <<-1343.4927, -153.1990, 47.1825>> //location where the motorcade vehicle is spawned
fEscortCarHead = 260.3612 //motorcade car heading
vTargetCarPos = <<-1242.2126, -241.5975, 38.7100>> //spawn location of limo vehicle
fTargetCarHeading = 96.8755 //limo car spawn heading
vTargetCarLobbyPos = <<-1221.631348, -186.881943, 38.799603 >> //location where the limo parks outside of the lobby doors
fTargetCarLobbyHead = 201.076294 //heading of the limo when it is parked outside the lobby doors
fSightDist = 40 //distance that a guard will detect the player (if they have proper LOS)
aggroArgs.fAimRange = 40
// USE FOR 3 AIR LOCK POSITIONS
vAirlockPos[0] = << -1221.1538, -170.9907, 38.3253 >> //left airlock
vAirlockPos[1] = << -1210.5562, -192.8820, 38.3253 >> //center airlock
vAirlockPos[2] = << -1216.3691, -203.6806, 38.3253 >> //right airlock
fAirlockHead[0] = 157.3177
fAirlockHead[1] = 58.3594
fAirlockHead[2] = 65.6443
// 2 AIR LOCK POSITIONS
// vAirlockPos[0] = << -1210.5562, -192.8820, 38.3253 >> //center airlock
// vAirlockPos[1] = << -1216.3691, -203.6806, 38.3253 >> //right airlock
//
// fAirlockHead[0] = 58.3594
// fAirlockHead[1] = 65.6443
//guard post positions / headings
vGuardPos[0] = << -1220.3773, -169.4070, 38.3253 >> //left airlock
vGuardPos[1] = << -1208.9630, -193.8791, 38.3253 >> //center airlock
vGuardPos[2] = << -1214.9547, -205.0824, 38.3253 >> //right airlock
vGuardPos[3] = << -1217.5182, -197.1300, 38.3254 >> //outside lobby doors (left)
vGuardPos[4] = << -1231.8916, -194.3820, 38.1753 >> //near fountain
fGuardHead[0] = 160.0748
fGuardHead[1] = 58.3365
fGuardHead[2] = 58.0214
fGuardHead[3] = 97.6664
fGuardHead[4] = 225.8689
//ped reaction time - randomize these times so that ped's don't all play their alert behavior at the same frame if they detect the player
FOR i = 0 TO 4
fWarnTime[i] = GET_RANDOM_FLOAT_IN_RANGE(0, 2)
ENDFOR
//mission rewards
fBaseReward = 7000
fBonusReward = 2000
failType = FT_FAILED
bGuardPanicLinePlayed = FALSE
bTargetDeadLinePlayed = FALSE
bTriggerAlertMessage = FALSE
bPlayerParkedCarInAlley = FALSE
bPlayerTriggeredExplosionFromParkingGarage = FALSE
ENDPROC
PROC SETUP_MISSION_PARAMS()
VECTOR vOutsideHotel = <<-1220.3440, -193.4014, 38.1754>>
VECTOR vParkingGarage = <<-1279.6578, -222.0533, 41.4460>>
ADD_PED_FOR_DIALOGUE(hotelConv, 1, Player, "FRANKLIN")
SET_WANTED_LEVEL_MULTIPLIER(0.2)
ADD_RELATIONSHIP_GROUP("Guards", relGroupGuards)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_COP, relGroupGuards)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupGuards, RELGROUPHASH_COP)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupGuards, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relGroupGuards)
//clear the area around the hotel of peds
// CLEAR_AREA_OF_PEDS(<<-1220.57, -185.96, 38.40>>, 200)
CLEAR_AREA(<<-1220.57, -185.96, 38.40>>, 200, TRUE)
SET_PED_NON_CREATION_AREA(<< -1298.6843, -324.0442, -35.5780 >>, << -1113.3724, -46.1583, 55.6090 >>)
sbiHotel = ADD_SCENARIO_BLOCKING_AREA( (vOutsideHotel - << 15, 15, 15 >>), (vOutsideHotel + << 15, 15, 15 >>) ) // Removing peds
sbiHotel01 = ADD_SCENARIO_BLOCKING_AREA( (vParkingGarage - << 35, 35, 45 >>), (vParkingGarage + << 35, 35, 45 >>) ) // Parking garage
ENDPROC
/// PURPOSE:
/// do all streaming requests
PROC REQUEST_STREAMS()
REQUEST_MODEL(TargetCarModel)
REQUEST_MODEL(EscortCarModel)
// REQUEST_MODEL(GuardModel)
// REQUEST_MODEL(GuardModel_01)
// REQUEST_MODEL(TargetModel)
REQUEST_ANIM_DICT("ODDJOBS@ASSASSINATE@GUARD")
REQUEST_ANIM_DICT("oddjobs@assassinate@hotel@")
REQUEST_ADDITIONAL_TEXT("ASS_VA", MINIGAME_TEXT_SLOT)
//limo pulling up to the hotel
REQUEST_VEHICLE_RECORDING(102, "ASSOJva")
//limo driving into the hotel
REQUEST_VEHICLE_RECORDING(107, "ASSOJva")
//leaving the hotel
REQUEST_WAYPOINT_RECORDING("OJASva_101")
REQUEST_WAYPOINT_RECORDING("OJASva_101a")
//motorcade pulling up to the limo
REQUEST_WAYPOINT_RECORDING("OJASva_104")
ENDPROC
/// PURPOSE:
/// Returns TRUE when all streaming requests are complete
FUNC BOOL VEHICLES_RECORDINGS_AND_ANIMS_LOADED()
BOOL returnBool = FALSE
IF HAS_MODEL_LOADED(TargetCarModel)
AND HAS_MODEL_LOADED(EscortCarModel)
// AND HAS_MODEL_LOADED(GuardModel)
// AND HAS_MODEL_LOADED(GuardModel_01)
// AND HAS_MODEL_LOADED(TargetModel)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(102, "ASSOJva") //limo pulling up to the hotel lobby
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(107, "ASSOJva") //limo driving up to the hotel
AND GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_101")
AND GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_101a")
AND GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_104")
AND HAS_ANIM_DICT_LOADED("ODDJOBS@ASSASSINATE@GUARD")
AND HAS_ANIM_DICT_LOADED("oddjobs@assassinate@hotel@")
AND HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT)
PRINTLN("OJASHOTEL - Streams loaded")
returnBool = TRUE
ELSE
PRINTLN("OJASHOTEL - Loading Streams")
ENDIF
RETURN returnBool
ENDFUNC
PROC REQUEST_GUARD_MODELS()
REQUEST_MODEL(GuardModel)
REQUEST_MODEL(GuardModel_01)
ENDPROC
FUNC BOOL ARE_MODELS_LOADED_FOR_GUARDS()
BOOL bLoaded
REQUEST_GUARD_MODELS()
IF HAS_MODEL_LOADED(GuardModel)
AND HAS_MODEL_LOADED(GuardModel_01)
PRINTLN("MODELS_LOADED_FOR_GUARDS")
bLoaded = TRUE
ELSE
bLoaded = FALSE
ENDIF
RETURN bLoaded
ENDFUNC
FUNC BOOL ARE_MODELS_LOADED_FOR_TARGET()
BOOL bLoaded
REQUEST_MODEL(TargetModel)
IF HAS_MODEL_LOADED(TargetModel)
PRINTLN("MODELS_LOADED_FOR_TARGET")
bLoaded = TRUE
ELSE
bLoaded = FALSE
ENDIF
RETURN bLoaded
ENDFUNC
PROC UNLOAD_GUARD_MODELS()
SET_MODEL_AS_NO_LONGER_NEEDED(GuardModel)
SET_MODEL_AS_NO_LONGER_NEEDED(GuardModel_01)
ENDPROC
PROC UNLOAD_TARGET_MODEL()
SET_MODEL_AS_NO_LONGER_NEEDED(TargetModel)
ENDPROC
/// PURPOSE:
/// Setup ped attributes for ped
PROC SET_PED_PARAMS(PED_INDEX ped, BOOL bAggressive = TRUE)
IF ped <> piTarget
GIVE_WEAPON_TO_PED(ped, WEAPONTYPE_PISTOL, INFINITE_AMMO)
ENDIF
IF NOT bAggressive
SET_PED_COMBAT_MOVEMENT(ped, CM_DEFENSIVE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_COVER, TRUE)
ELSE
SET_PED_COMBAT_MOVEMENT(ped, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_AGGRESSIVE, TRUE)
ENDIF
SET_PED_ACCURACY(ped, 60)
SET_PED_COMBAT_ABILITY(ped, CAL_PROFESSIONAL)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, TRUE)
SET_PED_AS_ENEMY(ped, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(ped, relGroupGuards)
ENDPROC
/// PURPOSE:
/// Set traffic params around the htoel while the mission is running
PROC SET_LOW_DENSITY_HOTEL_TRAFFIC(BOOL bSet)
IF bSet
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA((<<-1237.3966, -193.9340, 39.1642>> - <<150,150,150>>), (<<-1237.3966, -193.9340, 39.1642>> + <<150,150,150>>), FALSE)
// SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -1272.1578, -207.0374, -100.3460 >>, << -1317.5679, -285.4805, 100.6734 >>, TRUE)
SET_ROADS_IN_AREA(<< -1349.1761, -39.0123, -100.7554 >>, << -1173.2150, -297.7677, 100.8606 >>, FALSE)
PRINTLN("CALLING OFF GENERATORS")
ELSE
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -1340.9053, -68.1138, -100.7554 >>, << -1176.6222, -287.8646, 100.8606 >>, TRUE)
// SET_ROADS_IN_AREA(<< -1349.1761, -39.0123, -100.7554 >>, << -1173.2150, -297.7677, 100.8606 >>, TRUE)
SET_ROADS_BACK_TO_ORIGINAL(<< -1349.1761, -39.0123, -100.7554 >>, << -1173.2150, -297.7677, 100.8606 >>)
ENDIF
ENDPROC
/// PURPOSE:
/// Grab a random animation string (defaults to grabbing an idle animation)
PROC PLAY_RANDOM_ANIM(PED_INDEX ped, INT& iAnimToExclude)
INT tempInt
tempInt = SCRIPT_GET_RANDOM_INT_NOT_LAST(0, 3, iAnimToExclude)
IF tempInt = 0
TASK_PLAY_ANIM(ped, "ODDJOBS@ASSASSINATE@GUARD", "unarmed_earpiece_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE(), TRUE)
ELIF tempInt = 1
TASK_PLAY_ANIM(ped, "ODDJOBS@ASSASSINATE@GUARD", "unarmed_earpiece_b", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE(), TRUE)
ELIF tempInt = 2
TASK_PLAY_ANIM(ped, "ODDJOBS@ASSASSINATE@GUARD", "unarmed_fold_arms", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE(), TRUE)
ELIF tempInt = 3
TASK_PLAY_ANIM(ped, "ODDJOBS@ASSASSINATE@GUARD", "unarmed_look", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE(), TRUE)
ENDIF
iAnimToExclude = tempInt
ENDPROC
/// PURPOSE:
/// Have a ped play an animation (defaults to random idle if not specified)
PROC UPDATE_GUARD_ANIMS(PED_INDEX ped, INT& iAnimToExclude, BOOL idleAnim = TRUE)
IF NOT IS_PED_INJURED(ped)
IF idleAnim
PLAY_RANDOM_ANIM(ped, iAnimToExclude)
ENDIF
ENDIF
ENDPROC
/// PURPOSE: see if the entity passed is in a location deemed "safe" by the script
FUNC BOOL IS_ENTITY_IN_SAFE_LOCATION(ENTITY_INDEX entity)
IF DOES_ENTITY_EXIST(entity)
// IF NOT IS_ENTITY_IN_ANGLED_AREA(entity, <<-1252.143311,-212.687668,35.351608>>, <<-1216.625488,-185.542618,45.424759>>, 63.250000)
IF NOT IS_ENTITY_IN_ANGLED_AREA(entity, <<-1252.301514,-213.903275,35.112217>>, <<-1205.807617,-183.068085,45.325413>>, 51.000000)
AND NOT IS_ENTITY_IN_ANGLED_AREA(entity, <<-1250.809326,-192.521835,35.331249>>, <<-1231.866333,-161.365524,45.025352>>, 12.800000)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_VEHICLE_BLOCKING_THIS_AIRLOCK(INT iAirlockToCheck, FLOAT fDist)
IF IS_ANY_VEHICLE_NEAR_POINT(vAirlockPos[iAirlockToCheck], fDist)
PRINTLN("RETURNING TRUE ON AIRLOCK CHECK")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//RETURNS TRUE if there is a vehicle blocking any of the airlock lobby door locations
FUNC BOOL IS_VEHICLE_BLOCKING_ANY_AIRLOCK(FLOAT fDist)
INT tempInt
REPEAT NUM_AIRLOCK_SPAWN_LOCATIONS tempInt
IF IS_VEHICLE_BLOCKING_THIS_AIRLOCK(tempInt, fDist)
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
//checks to see if any vehicle is inside of the hotel circle area driveway where the target pulls out
FUNC BOOL IS_NON_SCRIPT_CREATED_VEHICLE_IN_HOTEL_AREA(VEHICLE_INDEX& vehToAssign)
VECTOR tempVec
vehToAssign = GET_CLOSEST_VEHICLE(<< -1221.954, -210.746, 38.638 >>, 27.000, DUMMY_MODEL_FOR_SCRIPT, VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES)
IF vehToAssign != NULL
AND (vehToAssign != viTargetCar)
AND (vehToAssign != viEscortCar)
AND (vehToAssign != stExtras.vehTaxi)
IF DOES_ENTITY_EXIST(vehToAssign) AND NOT IS_ENTITY_DEAD(vehToAssign)
IF GET_PED_IN_VEHICLE_SEAT(vehToAssign) = NULL
tempVec = GET_ENTITY_COORDS(vehToAssign)
PRINTLN("CLOSE VEHICLE LOCATED AT: <<", tempVec.x, ", ", tempVec.y, ", ", tempVec.z, ">>.")
tempVec = tempVec
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF viReplayVehicle != NULL
IF DOES_ENTITY_EXIST(viReplayVehicle) AND NOT IS_ENTITY_DEAD(viReplayVehicle)
IF NOT IS_ENTITY_IN_SAFE_LOCATION(viReplayVehicle)
tempVec = GET_ENTITY_COORDS(viReplayVehicle)
PRINTLN("REPLAY VEHICLE LOCATED AT: <<", tempVec.x, ", ", tempVec.y, ", ", tempVec.z, ">>.")
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DID_PLAYER_BLOCK_ALLEY_WITH_A_PARKED_CAR(VEHICLE_INDEX& vehToCheck, BOOL& bBoolToFlip)
IF NOT DOES_ENTITY_EXIST(vehToCheck)
RETURN FALSE
ENDIF
IF NOT DOES_ENTITY_EXIST(viEscortCar)
RETURN FALSE
ENDIF
// IF IS_ENTITY_IN_ANGLED_AREA(vehToCheck, <<-1253.50000, -218.57869,39.329353>>, <<-1288.232178,-172.406372,46.207092>>, 8.000000, FALSE) //main alley
// OR IS_ENTITY_IN_ANGLED_AREA(vehToCheck, <<-1287.918213,-173.088760,41.658070>>, <<-1316.612305,-153.279510,48.951576>>, 8.000000, FALSE) //alley extension
// OR IS_ENTITY_IN_ANGLED_AREA(vehToCheck, <<-1287.918213,-173.088760,41.658070>>, <<-1316.612305,-153.279510,48.951576>>, 8.000000, FALSE) //right near the motorcade
PRINTLN("PLAYER LEFT A PARKED CAR IN THE MOTORCADE ALLEY THAT IS BLOCKING THE ESCORT CAR!!")
IF GET_DISTANCE_BETWEEN_ENTITIES(vehToCheck, viEscortCar) <= 5
viCarThatTriggeredAlert = vehToCheck
bBoolToFlip = TRUE
RETURN TRUE
ENDIF
// ENDIF
RETURN FALSE
ENDFUNC
PROC GRAB_FURTHEST_VECTOR()
INT idx
VECTOR vPlayerPosition
FLOAT fTempDistance
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
REPEAT NUM_AIRLOCK_SPAWN_LOCATIONS idx
fTempDistance = VDIST(vPlayerPosition, vAirlockPos[idx])
PRINTLN("fTempDistance = ", fTempDistance)
PRINTLN("fClosestVector = ", fClosestVector)
IF fTempDistance > fClosestVector
fClosestVector = fTempDistance
iIndexToUse = idx
PRINTLN("iIndexToUse = ", idx)
ENDIF
ENDREPEAT
vAirlockSpawnPos[0] = vAirlockPos[iIndexToUse]
fAirlockSpawnHead[0] = fAirlockHead[iIndexToUse]
ENDPROC
FUNC BOOL IS_PLAYER_WAITING_NEAR_HOTEL_STEPS_FOR_TARGET()
//uses coords from bug 1526664 - (hiding near steps and can see target spawn in)
IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), << -1237.56604, -156.88245, 39.41317 >>) < 13
PRINTLN("IS_PLAYER_WAITING_NEAR_HOTEL_STEPS_FOR_TARGET() RETURNED TRUE")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_IN_PARKING_GARAGE()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1272.181030,-241.254532,62.904064>>, <<-1300.203491,-201.396820,40.404076>>, 44.5, FALSE, FALSE)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1270.125488,-253.932114,62.904072>>, <<-1311.413818,-193.658829,38.232914>>, 44.5, FALSE, FALSE)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Locate safe airlock spawn locations based on checks to make sure the player wont be able to see the target spawn on screen
PROC LOCATE_SAFE_SPAWN_LOCATIONS()
INT tempInt
iNumSafeLocations = 0 //initialize this
REPEAT NUM_AIRLOCK_SPAWN_LOCATIONS tempInt
IF NOT IS_SPHERE_VISIBLE(vAirlockPos[tempInt], 5)
AND NOT IS_VEHICLE_BLOCKING_THIS_AIRLOCK(tempInt, 6.0)
vAirlockSpawnPos[iNumSafeLocations] = vAirlockPos[tempInt]
fAirlockSpawnHead[iNumSafeLocations] = fAirlockHead[tempInt]
iNumSafeLocations++
PRINTLN("OJASHOTEL - vAirlockPos[", tempInt, "]. Is safe - SPHERE NOT VISIBLE.")
ELSE
PRINTLN("OJASHOTEL - vAirlockPos[", tempInt, "]. NOT safe - SPHERE IS VISIBLE or vehicle blocking airlock")
ENDIF
ENDREPEAT
//check to make sure at least one location has been deemed as safe
IF iNumSafeLocations = 0
IF IS_PLAYER_IN_PARKING_GARAGE()
vAirlockSpawnPos[0] = vAirlockPos[1]
fAirlockSpawnHead[0] = fAirlockHead[1]
iNumSafeLocations++
PRINTLN("No safe spawn locations. Player is in parking garage - setting to 1.")
ELIF IS_PLAYER_WAITING_NEAR_HOTEL_STEPS_FOR_TARGET()
vAirlockSpawnPos[0] = vAirlockPos[0]
fAirlockSpawnHead[0] = fAirlockHead[0]
iNumSafeLocations++
PRINTLN("No safe spawn locations. Player is near the steps - setting to 0.")
ELSE
//just do what we always did
REPEAT NUM_AIRLOCK_SPAWN_LOCATIONS tempInt
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vAirlockPos[tempInt]) > 30
AND NOT IS_VEHICLE_BLOCKING_THIS_AIRLOCK(tempInt, 6.0)
vAirlockSpawnPos[iNumSafeLocations] = vAirlockPos[tempInt]
fAirlockSpawnHead[iNumSafeLocations] = fAirlockHead[tempInt]
iNumSafeLocations++
PRINTLN("OJASHOTEL - vAirlockPos[", tempInt, "]. Is safe - DISTANCE.")
ENDIF
ENDREPEAT
ENDIF
ENDIF
//if for some reason we still dont have a safe one, just grab the one furthest from the player
IF iNumSafeLocations = 0
GRAB_FURTHEST_VECTOR()
ENDIF
PRINTLN("OJASHOTEL - Number of safe spawn locations = ", iNumSafeLocations)
ENDPROC
/// PURPOSE:
/// Create the assassination target and setup attributes
PROC CREATE_TARGET()
// iTargetAirlockSpawn = GET_RANDOM_INT_IN_RANGE() % 3
//
// //first try using the airlock based on the player's save data
// IF iTargetAirlockSpawn <> -1 AND NOT IS_SPHERE_VISIBLE(vAirlockPos[iTargetAirlockSpawn], 5) AND NOT IS_VEHICLE_BLOCKING_THIS_AIRLOCK(iTargetAirlockSpawn, 6.0)
// piTarget = CREATE_PED(PEDTYPE_MISSION, TargetModel, vAirlockPos[iTargetAirlockSpawn], fAirlockHead[iTargetAirlockSpawn])
// PRINTLN("OJASHOTEL - CREATING TARGET FROM SAVEDATA AT vAirlockSpawnPos[", iTargetAirlockSpawn, "].")
// ELSE
// //otherwise find a new safe airlock to spawn him
LOCATE_SAFE_SPAWN_LOCATIONS()
iTargetAirlockSpawn = GET_RANDOM_INT_IN_RANGE(0, iNumSafeLocations)
piTarget = CREATE_PED(PEDTYPE_MISSION, TargetModel, vAirlockSpawnPos[iTargetAirlockSpawn], fAirlockSpawnHead[iTargetAirlockSpawn])
PRINTLN("OJASHOTEL - CREATING TARGET SAFE SPAWN LOGIC DATA AT vAirlockSpawnPos[", iTargetAirlockSpawn, "].")
// ENDIF
SET_ENTITY_LOAD_COLLISION_FLAG(piTarget, TRUE)
SET_PED_DEFAULT_COMPONENT_VARIATION(piTarget)
SET_PED_PARAMS(piTarget)
SET_MODEL_AS_NO_LONGER_NEEDED(TargetModel)
//blip the target
IF NOT DOES_BLIP_EXIST(bTargetBlip)
bTargetBlip = CREATE_BLIP_ON_ENTITY(piTarget, FALSE)
ENDIF
SET_BLIP_SCALE(bTargetBlip, 1)
ENDPROC
/// PURPOSE:
/// Create the Limo
PROC CREATE_TARGET_CAR()
IF NOT DOES_ENTITY_EXIST(viTargetCar)
viTargetCar = CREATE_VEHICLE(TargetCarModel, vTargetCarPos, fTargetCarHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(TargetCarModel)
SET_VEHICLE_DISABLE_TOWING(viTargetCar, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(viTargetCar, TRUE)
SET_VEHICLE_PROVIDES_COVER(viTargetCar, TRUE)
ENDIF
ENDPROC
//create peds that drive the limo
PROC CREATE_LIMO_GUARDS()
MODEL_NAMES mnModelToUse
INT idx
REPEAT NUM_LIMO_GUARDS idx
IF NOT DOES_ENTITY_EXIST(piLimoGuard[idx])
IF idx = 2
mnModelToUse = GuardModel_01
PRINTLN("mnModelToUse = GuardModel_01")
ELSE
mnModelToUse = GuardModel
PRINTLN("mnModelToUse = GuardModel")
ENDIF
piLimoGuard[idx] = CREATE_PED(PEDTYPE_MISSION, mnModelToUse, vGuardPos[idx], fGuardHead[idx])
IF idx = 0
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,11), 0, 0, 0) //(jbib)
ELIF idx = 1
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,0), 1, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,11), 0, 2, 0) //(jbib)
ELIF idx = 2
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,0), 1, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(piLimoGuard[idx], INT_TO_ENUM(PED_COMPONENT,11), 1, 1, 0) //(jbib)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(piLimoGuard[idx])
SET_PED_CAN_BE_TARGETTED(piLimoGuard[idx], FALSE) //so player cannot target guards through airlock doors
SET_PED_KEEP_TASK(piLimoGuard[idx], TRUE)
SET_PED_COMBAT_ATTRIBUTES(piLimoGuard[idx], CA_REQUIRES_LOS_TO_SHOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(piLimoGuard[idx], CA_CAN_SHOOT_WITHOUT_LOS , FALSE)
SET_PED_TARGET_LOSS_RESPONSE(piLimoGuard[idx], TLR_SEARCH_FOR_TARGET)
SET_PED_CONFIG_FLAG(piLimoGuard[idx], PCF_OpenDoorArmIK, TRUE)
SET_PED_PARAMS(piLimoGuard[idx], TRUE)
ENDIF
ENDREPEAT
ENDPROC
//creates the limo guards that are used spefically used in the intro cutscene
PROC CREATE_CUTSCENE_PEDS()
IF DOES_ENTITY_EXIST(viTargetCar)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
REPEAT NUM_LIMO_GUARDS i
IF NOT DOES_ENTITY_EXIST(piLimoGuard[i])
IF i = 0
piLimoGuard[i] = CREATE_PED_INSIDE_VEHICLE(viTargetCar, PEDTYPE_MISSION, GuardModel)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,11), 0, 0, 0) //(jbib)
ELIF i = 1
piLimoGuard[i] = CREATE_PED_INSIDE_VEHICLE(viTargetCar, PEDTYPE_MISSION, GuardModel, VS_FRONT_RIGHT)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,0), 1, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,11), 0, 2, 0) //(jbib)
ELIF i = 2
piLimoGuard[i] = CREATE_PED_INSIDE_VEHICLE(viTargetCar, PEDTYPE_MISSION, GuardModel_01, VS_BACK_LEFT)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,0), 1, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(piLimoGuard[i], INT_TO_ENUM(PED_COMPONENT,11), 1, 1, 0) //(jbib)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Create the motorcade car and bike vehicles
PROC CREATE_MOTORCADE_FOLLOW_CAR()
IF NOT DOES_ENTITY_EXIST(viEscortCar)
viEscortCar = CREATE_VEHICLE(EscortCarModel, vEscortCarPos, fEscortCarHead)
SET_VEHICLE_COLOUR_COMBINATION(viEscortCar, 0)
PRINTLN("CREATING ESCORT CAR")
ENDIF
ENDPROC
/// PURPOSE: Create the motorcade peds
PROC CREATE_MOTORCADE_PEDS()
INT tempInt
REPEAT NUM_ESCORT_PEDS tempInt
IF NOT DOES_ENTITY_EXIST(piEscortPed[tempInt])
IF tempInt = 0 //driver
piEscortPed[tempInt] = CREATE_PED_INSIDE_VEHICLE(viEscortCar, PEDTYPE_MISSION, GuardModel)
PRINTLN("CREATING ESCORT PED 01")
ELIF tempInt = 1 //passenger
piEscortPed[tempInt] = CREATE_PED_INSIDE_VEHICLE(viEscortCar, PEDTYPE_MISSION, GuardModel_01, VS_FRONT_RIGHT)
PRINTLN("CREATING ESCORT PED 02")
ELSE
SCRIPT_ASSERT("TRYING TO CREATE A MOTORCADE PED AT A VALUE HIGHER THAN ALLOWED - INCREASE NUM_ESCORT_PEDS!" )
ENDIF
SET_PED_PARAMS(piEscortPed[tempInt], TRUE)
SET_PED_COMBAT_ATTRIBUTES(piEscortPed[tempInt], CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(piEscortPed[tempInt], CA_REQUIRES_LOS_TO_SHOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(piEscortPed[tempInt], CA_CAN_SHOOT_WITHOUT_LOS , FALSE)
SET_PED_TARGET_LOSS_RESPONSE(piEscortPed[tempInt], TLR_SEARCH_FOR_TARGET)
SET_PED_KEEP_TASK(piEscortPed[tempInt], TRUE)
ENDIF
ENDREPEAT
ENDPROC
// creates the vehicle and guards that are in the motorcade follow car
PROC CREATE_MOTORCADE_ACTORS_AND_VEHICLE()
CREATE_MOTORCADE_FOLLOW_CAR()
CREATE_MOTORCADE_PEDS()
SET_MODEL_AS_NO_LONGER_NEEDED(EscortCarModel)
ENDPROC
PROC CREATE_BODYGUARDS()
//grab airlock position that target was created and spawn the bodyguard inside that at an offset to the target
VECTOR tempVec[2]
VECTOR vTargetPosition
FLOAT fTargetHead
IF DOES_ENTITY_EXIST(piTarget) AND NOT IS_ENTITY_DEAD(piTarget)
vTargetPosition = GET_ENTITY_COORDS(piTarget)
PRINTLN("TARGET SPAWN POSITION = ", vTargetPosition)
fTargetHead = GET_ENTITY_HEADING(piTarget)
PRINTLN("TARGET SPAWN HEADING = ", fTargetHead)
ELSE
PRINTLN("TARGET DOES NOT EXIST!!!")
ENDIF
tempVec[0] = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vTargetPosition, fTargetHead, <<1, -1, 0>>)
PRINTLN("BODYGUARD[0] SPAWN POSITION = ", tempVec[0])
tempVec[1] = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vTargetPosition, fTargetHead, <<-1, -1, 0>>)
PRINTLN("BODYGUARD[1] SPAWN POSITION = ", tempVec[1])
INT idx
REPEAT NUM_BODYGUARDS idx
IF idx = 0
piBodyguard[idx] = CREATE_PED(PEDTYPE_MISSION, GuardModel, << tempVec[0].x, tempVec[0].y, 38.3253>>, fAirlockSpawnHead[iTargetAirlockSpawn])
ELSE
piBodyguard[idx] = CREATE_PED(PEDTYPE_MISSION, GuardModel_01, << tempVec[1].x, tempVec[1].y, 38.3253>>, fAirlockSpawnHead[iTargetAirlockSpawn])
ENDIF
SET_ENTITY_LOAD_COLLISION_FLAG(piBodyguard[idx], TRUE)
SET_PED_DEFAULT_COMPONENT_VARIATION(piBodyguard[idx])
SET_PED_COMBAT_ATTRIBUTES(piBodyguard[idx], CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(piBodyguard[idx], CA_REQUIRES_LOS_TO_SHOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(piBodyguard[idx], CA_CAN_SHOOT_WITHOUT_LOS , FALSE)
SET_PED_COMBAT_ATTRIBUTES(piBodyguard[idx], CA_AGGRESSIVE, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(piBodyguard[idx], TLR_SEARCH_FOR_TARGET)
SET_PED_KEEP_TASK(piBodyguard[idx], TRUE)
SET_PED_PARAMS(piBodyguard[idx])
SET_PED_TO_LOAD_COVER(piBodyguard[idx], TRUE)
PRINTLN("CREATING BODYGUARD[", idx, "]")
ENDREPEAT
ENDPROC
PROC REMOVE_STREAMVOL_FOR_INTRO_CUTSCENE()
IF STREAMVOL_IS_VALID(svIntroCutscene)
STREAMVOL_DELETE(svIntroCutscene)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the loading and unloading of the intro cutscene STREAMVOL so that we make sure it is loaded in when close to the hotel and unloads if the player dirves away
PROC HANDLE_STREAMVOL_AND_GUARD_MODEL_LOADING_UNLOADING()
IF NOT bLoadSceneRequested
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vNewBlipPosition) <= DEFAULT_CUTSCENE_LOAD_DIST
REQUEST_GUARD_MODELS()
svIntroCutscene = STREAMVOL_CREATE_FRUSTUM(<<-1244.3435, -251.5660, 50.3194>>, <<-9.2001, 0.0498, 6.3064>>, 80, FLAG_MAPDATA)
bLoadSceneRequested = TRUE
ENDIF
ELSE
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vNewBlipPosition) > DEFAULT_CUTSCENE_UNLOAD_DIST
IF STREAMVOL_IS_VALID(svIntroCutscene)
STREAMVOL_DELETE(svIntroCutscene)
UNLOAD_GUARD_MODELS()
bLoadSceneRequested = FALSE
ENDIF
ELSE
IF NOT STREAMVOL_IS_VALID(svIntroCutscene)
IF NOT IS_PLAYER_A_TAXI_PASSENGER()
bLoadSceneRequested = FALSE
PRINTLN("RESETTING bLoadSceneRequested = FALSE")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_SPECIAL_CASE_AUDIO_CUE()
VEHICLE_INDEX vehTemp
IF NOT bPrepareLostCue
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehTemp) AND NOT IS_ENTITY_DEAD(vehTemp)
IF GET_IS_VEHICLE_ENGINE_RUNNING(vehTemp)
IF PREPARE_MUSIC_EVENT("ASS1_LOST")
PRINTLN("PREPARING MUSIC - ASS1_LOST")
bPrepareLostCue = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_PLAYER_IN_AIRLOCK()
INT idx
REPEAT NUM_AIRLOCK_SPAWN_LOCATIONS idx
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vAirlockPos[idx]) < 5.0
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1223.1853, -185.4723, 38.1753>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 119.5633)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
// Cleanup the script on termination must not include any WAITs
PROC Script_Cleanup()
IF IS_TIMER_STARTED(tMissionTimer)
g_savedGlobals.sAssassinData.fHotelMissionTime = GET_TIMER_IN_SECONDS(tMissionTimer)
PRINTLN("CLEANUP: missionTimer = ", g_savedGlobals.sAssassinData.fHotelMissionTime)
ELSE
PRINTLN("CLEANUP: missionTimer WAS NOT STARTED!!!")
ENDIF
IF NOT bTriggeredLastCue
TRIGGER_MUSIC_EVENT("ASS1_LOST")
PRINTLN("TRIGGERING MUSIC - ASS1_LOST - VIA CLEANUP")
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\ASSASSINATION_MULTI")
PRINTLN("RELEASING AUDIO BANK - SCRIPT\\ASSASSINATION_MULTI")
CLEANUP_EXTRAS()
CLEANUP_PEDS()
CLEANUP_VEHICLES()
CLEANUP_PED_BLIPS()
CLEANUP_DEST_BLIPS()
CLEANUP_VEH_RECORDINGS()
// CLEAR_AREA(<< -1220.57, -185.96, 38.40 >>, 50, TRUE)
SET_LOW_DENSITY_HOTEL_TRAFFIC(FALSE)
KILL_ANY_CONVERSATION()
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.object[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.object[0], TRUE, TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(g_sTriggerSceneAssets.object[0])
ENDIF
REMOVE_SCENARIO_BLOCKING_AREA(sbiHotel)
REMOVE_SCENARIO_BLOCKING_AREA(sbiHotel01)
REMOVE_STREAMVOL_FOR_INTRO_CUTSCENE()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
// SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE)
// PRINTLN("SETTING FLAG TO FALSE - AllowScoreAndRadio")
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
Store_Fail_Weapon(PLAYER_PED_ID(), 1)
PRINTLN("ATTEMPTING TO STORE THE PLAYER'S LAST WEAPON")
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE, -1)
ENDIF
SET_WANTED_LEVEL_MULTIPLIER(1)
CLEAR_PED_NON_CREATION_AREA()
SET_PED_MODEL_IS_SUPPRESSED(GuardModel, FALSE)
SET_PED_MODEL_IS_SUPPRESSED(GuardModel_01, FALSE)
HANDLE_PLAYER_IN_AIRLOCK()
TERMINATE_THIS_THREAD()
ENDPROC
// Perform any special commands if the script passes
// NOTE: This can include WAITs prior to the Mission_Cleanup() call
PROC Script_Passed()
HANDLE_SPECIAL_CASE_AUDIO_CUE()
SWITCH iEndingScreenStages
CASE 0
IF NOT bResultsCreated
IF killType = KT_BONUS
bBonus = TRUE
ASSASSIN_MISSION_MarkMissionPassedWithBonus()
PRINTLN("HOTEL - PLAYER GOT BONUS")
ENDIF
g_savedGlobals.sAssassinData.fHotelMissionTime = GET_TIMER_IN_SECONDS(tMissionTimer)
PRINTLN("GLOBAL HOTEL MISSION TIME = ", g_savedGlobals.sAssassinData.fHotelMissionTime)
fTimeTaken = g_savedGlobals.sAssassinData.fHotelMissionTime
PRINTLN("fTimeTaken = ", fTimeTaken)
SETUP_RESULTS_UI()
bResultsCreated = TRUE
PRINTLN("iEndingScreenStages = 1")
iEndingScreenStages = 1
ENDIF
BREAK
CASE 1
IF NOT bPlayMusic
PLAY_MISSION_COMPLETE_AUDIO("FRANKLIN_BIG_01")
bPlayMusic = TRUE
ENDIF
IF ENDSCREEN_PREPARE(assassinationEndScreen)
AND IS_MISSION_COMPLETE_READY_FOR_UI()
INIT_SIMPLE_USE_CONTEXT(cucEndScreen, FALSE, FALSE, FALSE, TRUE)
ADD_SIMPLE_USE_CONTEXT_INPUT(cucEndScreen, "ASS_VA_CONT", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT)
ADD_SIMPLE_USE_CONTEXT_INPUT(cucEndScreen, "ES_XPAND", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_EXPAND)
SETTIMERA(0)
PRINTLN("iEndingScreenStages = 2")
iEndingScreenStages = 2
ENDIF
BREAK
CASE 2
IF RENDER_ENDSCREEN(assassinationEndScreen, FALSE)
bSkippedEndingScreen = TRUE
ENDIF
IF NOT bSkippedEndingScreen
UPDATE_SIMPLE_USE_CONTEXT(cucEndScreen)
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) // B*2276517 - Player can now press esc to close endscreen, if player control is on during endscreen
IF NOT bSkippedEndingScreen
PRINTLN("bSkippedEndingScreen = TRUE")
bSkippedEndingScreen = TRUE
//Start anim-out
ENDSCREEN_START_TRANSITION_OUT(assassinationEndScreen)
ENDIF
ENDIF
IF bSkippedEndingScreen
//Wait until the end screen stops transition-out
IF RENDER_ENDSCREEN(assassinationEndScreen)
ENDSCREEN_SHUTDOWN(assassinationEndScreen)
++g_savedGlobals.sAssassinData.iCurrentAssassinRank
ASSASSIN_MISSION_MarkMissionPassed()
ASSASSIN_MISSION_AwardAssReward(missionData)
MISSION_FLOW_MISSION_PASSED()
ODDJOB_AUTO_SAVE()
Script_Cleanup()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
// Perform any special commands if the script fails
PROC Script_Failed()
// this is now called once the screen has faded out for the fail screen.
// check if we need to respawn the player in a different position,
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
Script_Cleanup() // must only take 1 frame and terminate the thread
ENDPROC
PROC ADD_PARKED_CARS_TO_GARAGE()
viParkedCar[0] = CREATE_VEHICLE(EscortCarModel , << -1270.0448, -251.4953, 41.4459 >>, 214.63)
viParkedCar[1] = CREATE_VEHICLE(EscortCarModel, << -1265.1992, -218.4823, 45.9981 >>, 127.85)
ENDPROC
/// PURPOSE: Call this before advancing stages
PROC INITIALIZE_NEXT_STAGE()
iStageNum = 0
ENDPROC
//PURPOSE: Skip the intro cutscene and advance to the next stage cleanly
PROC HANDLE_GUARD_CUTSCENE_SKIP(BOOL bDoScreenFadeIn)
// //delete cutscene peds if they still exist
// REPEAT NUM_LIMO_GUARDS i
// IF DOES_ENTITY_EXIST(piCutsceneGuard[i])
// DELETE_PED(piCutsceneGuard[i])
// ENDIF
// ENDREPEAT
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
//setup the limo properly in front of the hotel and exit out of the cutscene
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viTargetCar)
STOP_PLAYBACK_RECORDED_VEHICLE(viTargetCar)
ENDIF
REMOVE_VEHICLE_RECORDING(102, "ASSOJva")
REMOVE_VEHICLE_RECORDING(107, "ASSOJva")
//warp the vehicle to the proper position
SET_ENTITY_COORDS(viTargetCar, vTargetCarLobbyPos)
SET_ENTITY_HEADING(viTargetCar, fTargetCarLobbyHead)
SET_VEHICLE_DOOR_SHUT(viTargetCar, SC_DOOR_FRONT_LEFT)
SET_VEHICLE_DOOR_SHUT(viTargetCar, SC_DOOR_FRONT_RIGHT)
SET_VEHICLE_DOOR_SHUT(viTargetCar, SC_DOOR_REAR_LEFT)
SET_VEHICLE_DOOR_SHUT(viTargetCar, SC_DOOR_REAR_LEFT)
//shut down the cutscene camera and return to gameplay cam
iCutsceneStage = 0 //re-initialize this for the kill camera
CLEAR_PRINTS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ODDJOB_EXIT_CUTSCENE()
IF bDoScreenFadeIn
CUTSCENE_SKIP_FADE_IN()
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Play intro cutscene explaining the mission when the player gets within range of the htoel
FUNC BOOL HAS_INTRO_CUTSCENE_FINISHED()
INT iTemp
SWITCH iCutsceneStage
CASE 0
ODDJOB_ENTER_CUTSCENE()
GET_ASSASSIN_CUTSCENE_START_TIME()
SHAKE_CAM(camInit, "HAND_SHAKE", 0.2)
SHAKE_CAM(camDest, "HAND_SHAKE", 0.2)
SET_CAM_ACTIVE_WITH_INTERP(camDest, camInit, 6000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
CLEAR_HELP()
CLEAR_PRINTS()
PRINT_NOW("ASS_VA_SNIPE1", DEFAULT_GOD_TEXT_TIME, 1)
IF bPlayerIsInFlyingVehicle
MOVE_PLAYER_AND_PLANE()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
PRINTLN("bPlayerIsInFlyingVehicle IS TRUE, NEED TO REPOSITION THE PLAYER")
ELSE
REPOSITION_PLAYER_AND_VEHICLE_FOR_GUARD_CUTSCENE()
PRINTLN("repositioning player and car for guard cutscene")
ENDIF
SETTIMERA(0)
iCutsceneStage++
BREAK
//close up of car pulling up and guys getting out
CASE 1
IF NOT IS_ENTITY_DEAD(viTargetCar)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF TIMERA() > 6000
//Switch back to the original recording of the car parking up.
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viTargetCar)
STOP_PLAYBACK_RECORDED_VEHICLE(viTargetCar)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(viTargetCar, 102, "ASSOJva")
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(viTargetCar, 4500)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(viTargetCar)
PRINT_NOW("ASS_VA_SNIPE2", DEFAULT_GOD_TEXT_TIME, 1)
SET_CAM_PARAMS(camInit, <<-1218.860718,-191.049606,38.836159>>,<<3.519839,-0.000706,42.271080>>,38.000000)
SET_CAM_NEAR_DOF(camInit, 0.5)
SET_CAM_FAR_DOF(camInit, 7.0)
SHAKE_CAM(camInit, "HAND_SHAKE", 0.2)
SET_CAM_PARAMS(camDest, <<-1218.909668,-190.879135,38.845852>>,<<3.519839,-0.000706,43.338146>>,38.000000)
SET_CAM_NEAR_DOF(camDest, 0.7)
SET_CAM_FAR_DOF(camDest, 10.0)
SHAKE_CAM(camDest, "HAND_SHAKE", 0.2)
SET_CAM_ACTIVE_WITH_INTERP(camDest, camInit, 2000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
iCutsceneStage++
ENDIF
ENDIF
ENDIF
BREAK
//have guys leave limo and pause vehicle recording playback when they arrive at the lobby
CASE 2
IF NOT IS_ENTITY_DEAD(viTargetCar)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF GET_TIME_POSITION_IN_RECORDING(viTargetCar) >= 7000.0
//limo pulling up to the hotel
PAUSE_PLAYBACK_RECORDED_VEHICLE(viTargetCar)
//have cutscene peds exit the vehicle
REPEAT NUM_LIMO_GUARDS i
//delay tasking guards to exit all at once so it wont look so robotic - tell em to exit and go to center airlock
IF NOT IS_ENTITY_DEAD(piLimoGuard[i])
IF i = 0
iTemp = 1250
ELIF i = 1
iTemp = 400
ELSE
iTemp = 0
ENDIF
IF GET_SCRIPT_TASK_STATUS(piLimoGuard[i], SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK
CLEAR_SEQUENCE_TASK(seqIndex)
OPEN_SEQUENCE_TASK(seqIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, iTemp)
// TASK_GO_TO_COORD_ANY_MEANS(NULL, vAirlockPos[1], PEDMOVEBLENDRATIO_WALK, NULL)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vAirlockPos[i], PEDMOVEBLENDRATIO_WALK)
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(piLimoGuard[i], seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
ENDIF
ENDIF
ENDREPEAT
SETTIMERA(0)
iCutsceneStage ++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF TIMERA() >= 2000
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
SET_CAM_PARAMS(camInit, <<-1265.5488, -213.4919, 43.0913>>, <<-0.0550, 0.0543, -50.0795>>,38.000000)
SHAKE_CAM(camInit, "HAND_SHAKE", 0.2)
SET_CAM_PARAMS(camDest, <<-1266.0629, -213.9220, 43.0918>>, <<-0.0550, 0.0543, -50.0795>>,38.000000)
SHAKE_CAM(camDest, "HAND_SHAKE", 0.2)
SET_CAM_ACTIVE_WITH_INTERP(camDest, camInit, 4000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
iTimeToCut = 4000
PRINTLN("iTimeToCut = ", iTimeToCut)
ELSE
SET_CAM_PARAMS(camInit, <<-1266.1925, -215.2170, 43.2442>>, <<-3.1088, 0.0498, -48.5594>>,38.000000)
SHAKE_CAM(camInit, "HAND_SHAKE", 0.2)
SET_CAM_PARAMS(camDest, <<-1267.5302, -215.7824, 43.1067>>, <<-9.2365, 0.0498, -48.3561>>,38.000000)
SHAKE_CAM(camDest, "HAND_SHAKE", 0.2)
SET_CAM_ACTIVE_WITH_INTERP(camDest, camInit, 4000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
iTimeToCut = 4000
PRINTLN("iTimeToCut = ", iTimeToCut)
ENDIF
SETTIMERA(0)
iCutsceneStage ++
ENDIF
BREAK
CASE 4
IF NOT bDoFlash
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
IF TIMERA() >= iTimeToCut - 300
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
PRINTLN("bDoFlash = TRUE")
bDoFlash = TRUE
ENDIF
ENDIF
ENDIF
IF TIMERA() >= iTimeToCut
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viTargetCar)
STOP_PLAYBACK_RECORDED_VEHICLE(viTargetCar)
ENDIF
ENDIF
REMOVE_VEHICLE_RECORDING(102, "ASSOJva")
REMOVE_VEHICLE_RECORDING(107, "ASSOJva")
SET_VEHICLE_DOOR_SHUT(viTargetCar, SC_DOOR_FRONT_RIGHT)
SET_VEHICLE_DOOR_SHUT(viTargetCar, SC_DOOR_FRONT_LEFT)
SET_VEHICLE_DOOR_SHUT(viTargetCar, SC_DOOR_REAR_LEFT)
CLEAR_HELP(TRUE)
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
RENDER_SCRIPT_CAMS(FALSE, FALSE)
PRINTLN("CALLING RENDER SCRIPT CAMS - FALSE, TRUE")
ELSE
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP(TRUE, 0, CAM_SPLINE_SLOW_IN_SMOOTH)
PRINTLN("CALLING STOP RENDERING CAMS USING CATCH UP")
ENDIF
ODDJOB_EXIT_CUTSCENE()
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
//handle cutscene skipping and make sure that the player's vehicle doesn't explode in the cutscene if entered while on fire
IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime)
CLEAR_HELP(TRUE)
HANDLE_GUARD_CUTSCENE_SKIP(TRUE)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_BODYGUARDS_IN_VEHICLES()
INT idx
BOOL bInVehicles = TRUE
FOR idx = 0 TO NUM_BODYGUARDS - 1
IF NOT IS_PED_INJURED(piBodyguard[idx])
IF NOT IS_PED_IN_ANY_VEHICLE(piBodyguard[idx])
bInVehicles = FALSE
ENDIF
ENDIF
ENDFOR
RETURN bInVehicles
ENDFUNC
/// PURPOSE: RETURN true if the target is in the limo
FUNC BOOL IS_TARGET_IN_LIMO()
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF NOT IS_PED_INJURED(piTarget)
IF NOT bPanicking
IF IS_PED_IN_VEHICLE(piTarget, viTargetCar)
AND ARE_BODYGUARDS_IN_VEHICLES()
RETURN TRUE
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(piTarget, viTargetCar)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Tell ped to exit a vehicle if they are in one and aim at the player
PROC EXIT_VEHICLE_AND_AIM_GUN_AT_PLAYER(PED_INDEX ped)
SEQUENCE_INDEX tempSeq
IF NOT IS_PED_INJURED(Player)
AND NOT IS_PED_INJURED(ped)
IF NOT IS_ENTITY_DEAD(ped)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_LEAVE_VEHICLES, TRUE)
ENDIF
CLEAR_SEQUENCE_TASK(tempSeq)
OPEN_SEQUENCE_TASK(tempSeq)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR)
TASK_AIM_GUN_AT_ENTITY(NULL, Player, -1)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(ped, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
PRINTLN("Tasking ped to exit vehicle and aim gun at player!")
ENDIF
ENDPROC
/// PURPOSE: Tell ped to exit a vehicle if they are in one and attack the player
PROC EXIT_VEHICLE_AND_ATTACK_PLAYER(PED_INDEX ped)
IF NOT IS_ENTITY_DEAD(Player)
IF NOT IS_PED_IN_ANY_VEHICLE(Player)
IF NOT IS_ENTITY_DEAD(ped)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_LEAVE_VEHICLES, TRUE)
ENDIF
CLEAR_SEQUENCE_TASK(seqIndex)
OPEN_SEQUENCE_TASK(seqIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR)
TASK_COMBAT_PED(NULL, Player)
CLOSE_SEQUENCE_TASK(seqIndex)
IF NOT IS_ENTITY_DEAD(ped)
TASK_PERFORM_SEQUENCE(ped, seqIndex)
ENDIF
CLEAR_SEQUENCE_TASK(seqIndex)
PRINTLN("THE PLAYER IS NOT IN A CAR, WE SHOULD BE LEAVING!!!")
ELSE
IF NOT IS_PED_INJURED(ped)
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_COMBAT) <> PERFORMING_TASK
CLEAR_PED_TASKS(ped)
TASK_COMBAT_PED(ped, Player)
PRINTLN("TASKING TO USE COMBAT - PLAYER MUST BE IN A CAR")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_VEHICLE_STUCK(VEHICLE_INDEX veh, INT iStuckTimeToCheck)
IF IS_VEHICLE_DRIVEABLE(veh)
IF IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_ROOF, iStuckTimeToCheck)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_HUNG_UP, iStuckTimeToCheck)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_JAMMED, iStuckTimeToCheck)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_SIDE, iStuckTimeToCheck )
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// limo is not driveable - guards should fight the player and target should flee
FUNC BOOL CHECK_FOR_DESTROYED_LIMO()
IF ( DOES_ENTITY_EXIST(viTargetCar) AND NOT IS_VEHICLE_DRIVEABLE(viTargetCar) )
OR ( DOES_ENTITY_EXIST(piLimoGuard[0]) AND IS_PED_INJURED(piLimoGuard[0]) ) //driver has been killed
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_BOTH_ESCORT_PEDS_IN_VEHICLE()
IF NOT IS_PED_INJURED(piEscortPed[0])
AND NOT IS_PED_INJURED(piEscortPed[1])
IF IS_PED_IN_VEHICLE(piEscortPed[0], viEscortCar)
AND IS_PED_IN_VEHICLE(piEscortPed[1], viEscortCar)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: RETURN handle the escape behavior of the peds entering the limo
FUNC BOOL HAS_HOTEL_TARGET_ESCAPED(eFailType& fail)
FLOAT fDistToCheck
BOOL bCheckCarVisibility
//check to see if the target is in the vehicle
IF MainStage > STAGE_TARGET_LEAVE_LOBBY
IF NOT IS_PED_INJURED(piTarget)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF IS_PED_IN_VEHICLE(piTarget, viTargetCar)
bCheckCarVisibility = TRUE
ENDIF
ENDIF
ENDIF
//alter distances to check based on whether the target is in a vehicle or not
IF bTargetFleeing
fDistToCheck = 100
ELSE
fDistToCheck = 200
ENDIF
//check to see if target escaped
IF DOES_ENTITY_EXIST(piTarget)
IF NOT IS_PED_INJURED(piTarget)
IF GET_DISTANCE_BETWEEN_ENTITIES (Player, piTarget) >= fDistToCheck
IF bCheckCarVisibility
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF IS_ENTITY_OCCLUDED(viTargetCar)
OR NOT IS_ENTITY_ON_SCREEN(viTargetCar)
fail = FT_ESCAPED
PRINTLN("Lost target in vehicle")
RETURN TRUE
ENDIF
ENDIF
ELSE
IF IS_ENTITY_OCCLUDED(piTarget)
fail = FT_ESCAPED
PRINTLN("Lost target on foot")
RETURN TRUE
// ELSE
// PRINTLN("TARGET CAN BE SEEN")
ENDIF
ENDIF
ELSE
IF DOES_BLIP_EXIST(bTargetBlip)
IF GET_DISTANCE_BETWEEN_ENTITIES (Player, piTarget) >= fDistToCheck * 0.5
IF NOT IS_BLIP_FLASHING(bTargetBlip)
SET_BLIP_FLASHES(bTargetBlip, TRUE)
ENDIF
ELSE
IF IS_BLIP_FLASHING(bTargetBlip)
SET_BLIP_FLASHES(bTargetBlip, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// //fail the player if they abandon the hotel area after the intro cutscene has played
// IF MainStage >= STAGE_PLANT_BOMB
// IF HAS_PLAYER_ABANDONED_ASSASSINATION_AREA(bWarningHelp, vHotelStart, "ASS_VA_RETURN", 175)
// fail = FT_ABANDONED
// RETURN TRUE
// ENDIF
// ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Fail the mission if the target escapes
PROC FAIL_IF_TARGET_ESCAPES()
IF HAS_HOTEL_TARGET_ESCAPED(failType)
SET_MISSION_FAILED(FT_ESCAPED)
PRINTLN("OJASHOTEL - Target escaped")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks to see if the player alerted the guards but was not seen and sets the appropriate bool if we detect that alert state should be set
/// PARAMS:
/// vPositionToCheck - Vector to check player's distance away from
PROC DO_ALERTED_CHECK(VECTOR vPositionToCheck, FLOAT fKillDistanceAlerted = 15.0, FLOAT fKillDistanceAlertedSpecial = 70.0)
BOOL bShotAlerted
FLOAT fKillDistance
IF NOT DOES_ENTITY_EXIST(piTarget)
EXIT
ENDIF
IF NOT DOES_ENTITY_EXIST(viTargetCar)
EXIT
ENDIF
IF IS_ENTITY_DEAD(viTargetCar)
OR bPlayerTriggeredExplosionFromParkingGarage
bPlayerUsedStickyBomb = TRUE
PRINTLN("bPlayerUsedStickyBomb = TRUE")
ENDIF
IF DOES_ENTITY_EXIST(piTarget)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(piTarget, WEAPONTYPE_SNIPERRIFLE)
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(piTarget, WEAPONTYPE_HEAVYSNIPER)
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(piTarget, WEAPONTYPE_REMOTESNIPER)
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(piTarget, WEAPONTYPE_DLC_MARKSMANRIFLE)
DEBUG_MESSAGE("BONUS AWARDED - SNIPER KILL")
bPlayerUsedSniperRifle = TRUE
PRINTLN("bPlayerUsedSniperRifle = TRUE")
killType = KT_BONUS
ENDIF
ENDIF
IF aggroReason = EAggro_ShotNear
OR aggroReason = EAggro_HeardShot
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(viTargetCar) //only go to alert state if the car hasn't left yet
fKillDistanceAlerted *= 2 //double the distance to check for alerted
bShotAlerted = TRUE
PRINTLN("bShotAlerted = TRUE")
ENDIF
ENDIF
//set the appropriate bool if we detect that alert state should be set
IF NOT bPanicking
IF bPlayerUsedSniperRifle
OR bPlayerUsedStickyBomb
OR bShotAlerted
fKillDistance = GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vPositionToCheck)
PRINTLN("fKillDistance = ", fKillDistance)
IF fKillDistance > fKillDistanceAlerted
bAlerted = TRUE
PRINTLN("bAlerted = TRUE")
IF fKillDistance > fKillDistanceAlertedSpecial
bAlertedSpecial = TRUE
PRINTLN("bAlertedSpecial = TRUE")
ENDIF
ENDIF
ENDIF
ELSE
PRINTLN("WE PANICKED EARLY, SOMEHOW")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks to see if the player alerted the guards but they do not know the player's position
/// RETURNS:
/// TRUE if bAlertedor bAlertedSpecial has been set
FUNC BOOL SHOULD_TRIGGER_ALERT()
IF bAlerted
OR bAlertedSpecial
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Check for Target Kill
PROC CHECK_FOR_TARGET_KILL()
// VECTOR vTempCamPos
IF DOES_ENTITY_EXIST(piTarget)
IF IS_PED_INJURED(piTarget)
//award a bonus if the player killed via sniper rifle
IF IS_ENTITY_DEAD(piTarget)
bTargetDead = TRUE
PRINTLN("bTargetDead = TRUE")
IF DOES_BLIP_EXIST(bTargetBlip)
REMOVE_BLIP(bTargetBlip)
PRINTLN("REMOVING TARGETS BLIP")
ENDIF
//check to see how we should respond
DO_ALERTED_CHECK(vTargetLastPosition)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(3.0)
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_KILL_CAM
PRINTLN("OJASHOTEL - MainStage = STAGE_KILL_CAM")
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks to see if bGuardPanicLinePlayed is set to FALSE and if so plays the appropriate panic line
/// PARAMS:
/// ped - speaker
PROC PLAY_GUARD_PANIC_LINE(PED_INDEX ped)
TEXT_LABEL_23 tlCurrentConvoRoot
IF NOT bGuardPanicLinePlayed
IF DOES_ENTITY_EXIST(ped) AND NOT IS_PED_INJURED(ped)
AND GET_PLAYER_DISTANCE_FROM_ENTITY(ped) < 50
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF failType = FT_BLOWN_COVER_HIT_PARKED_CAR
SETUP_PED_FOR_DIALOGUE(ped, 3, "OJAvaGUARD")
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_LIMO", CONV_PRIORITY_VERY_HIGH)
PRINTLN("OJASHOTEL - PLAY_GUARD_PANIC_LINE - OJASva_LIMO")
ELIF failType = FT_STICKY
SETUP_PED_FOR_DIALOGUE(GET_CLOSEST_GUARD_TO_LIMO(25.0), 6, "OJAvaGUARD2")
PLAY_SINGLE_LINE_FROM_CONVERSATION (hotelConv, "OJASAUD", "OJASva_CAR3", "OJASva_CAR3_1", CONV_PRIORITY_VERY_HIGH)
ELSE
SETUP_PED_FOR_DIALOGUE(ped, 3, "OJAvaGUARD")
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_GTFO3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("OJASHOTEL - PLAY_GUARD_PANIC_LINE - GTFO3")
ENDIF
bGuardPanicLinePlayed = TRUE
ELSE
tlCurrentConvoRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT ARE_STRINGS_EQUAL(tlCurrentConvoRoot, "OJAS_FEED")
KILL_ANY_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks to see if bGuardPanicLinePlayed is set to FALSE and if so plays the appropriate panic line
/// PARAMS:
/// ped - speaker
PROC PLAY_TARGET_DEAD_LINE(PED_INDEX ped)
IF NOT bTargetDeadLinePlayed
IF DOES_ENTITY_EXIST(piTarget)
AND IS_PED_INJURED(piTarget)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF DOES_ENTITY_EXIST(ped) AND NOT IS_PED_INJURED(ped)
AND GET_PLAYER_DISTANCE_FROM_ENTITY(ped) < 75
SETUP_PED_FOR_DIALOGUE(ped, 3, "OJAvaGUARD")
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJAS_FEED", CONV_PRIORITY_VERY_HIGH)
PRINTLN("OJASHOTEL - PLAY_GUARD_PANIC_LINE - OJAS_FEED")
bTargetDeadLinePlayed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: instantly trigger panic if these conditions are true
PROC TRIGGER_PANIC_NEAR_GUARDS_IF_PREV_WARNED(PED_INDEX testPed, VECTOR vGuardDistance)
IF NOT bPanicking
IF NOT IS_PED_INJURED(testPed)
IF IS_ENTITY_AT_ENTITY(Player, testPed, vGuardDistance)
IF IS_PED_FACING_PED(testPed, Player, 160)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(testPed, Player)
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(testPed, Player, Player, PEDMOVE_WALK, FALSE, -1)
failType = FT_DISREGARDED_WARNINGS
bPanicking = TRUE
PRINTLN("OJASHOTEL - TRIGGERING PANIC - PLAYER HAS DISREGARDED PREVIOUS WARNINGS - FT_DISREGARDED_WARNINGS")
// PLAY_GUARD_PANIC_LINE(testPed)
ENDIF
ENDIF
ELSE
IF NOT IS_PED_IN_ANY_VEHICLE(testPed)
IF GET_SCRIPT_TASK_STATUS(testPed, SCRIPT_TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY) != PERFORMING_TASK
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(testPed, Player, Player, PEDMOVE_WALK, FALSE, -1)
PRINTLN("OJASHOTEL - TRIGGER_PANIC_NEAR_GUARDS_IF_PREV_WARNED - Walk while aiming!")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Ped should warn the player if they are seen
FUNC BOOL IS_PLAYER_SEEN_BY_HOTEL_PED(PED_INDEX testPed, FLOAT fDistToSee)
IF NOT bPanicking
IF NOT IS_ENTITY_IN_SAFE_LOCATION(Player)
IF DOES_ENTITY_EXIST(testPed)
IF NOT IS_PED_INJURED(testPed)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(testPed, FALSE) <= fDistToSee
IF IS_PED_FACING_PED(testPed, Player, 120)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(testPed, Player/*, LOS_FLAGS_BOUNDING_BOX*/)
//TODO - Ask Dave if he knows what these angled areas are (2/19/13 - MB)
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -1251.791, -147.043, 42.679 >>, << -1197.245, -212.232, 50.679 >>, 35.000, TRUE, TRUE)
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -1259.282, -204.172, -60.654 >>, << -1304.335, -235.719, 60.654 >>, 85.000, TRUE, TRUE)
PRINTLN("TRIGGERING IS_PLAYER_SEEN_BY_HOTEL_PED 01")
// PRINTLN("fDistToSee = ", fDistToSee)
RETURN TRUE
ELSE
PRINTLN("PLAYER IS IN ANGLED AREA")
ENDIF
ELSE
PRINTLN("LOS CHECK HAS FAILED IN CHECK 01")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(testPed)
IF NOT IS_PED_INJURED(testPed)
IF IS_ENTITY_AT_ENTITY(Player, testPed, << 5, 5, 1 >>)
// OR IS_NON_SCRIPT_CREATED_VEHICLE_IN_HOTEL_AREA(viCarThatTriggeredAlert) AND IS_PED_ON_SPECIFIC_VEHICLE(Player, viCarThatTriggeredAlert) AND GET_PLAYER_DISTANCE_FROM_ENTITY(testPed, FALSE) <= fDistToSee
IF IS_PED_FACING_PED(testPed, Player, 120)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(testPed, Player)
PRINTLN("TRIGGERING IS_PLAYER_SEEN_BY_HOTEL_PED 02")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DID_PED_SEE_PLAYER_PLANTING_BOMB(PED_INDEX testPed)
//do these checks if after the player has been warned or the guards are leaving the lobby
IF bWarningLinePlayed OR MainStage >= STAGE_GUARDS_GO_TO_POSTS
IF IS_PED_PLANTING_BOMB(Player)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(testPed) < 10
IF IS_PED_FACING_PED(testPed, Player, 90)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(testPed, Player)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Event trap to see if the player is attacking the target, guards, or the target's escort
FUNC BOOL HAS_PLAYER_AGGROED_HOTEL_PED(PED_INDEX testPed)
VEHICLE_INDEX tempVehicle
IF NOT bPanicking
IF DOES_ENTITY_EXIST(testPed)
IF NOT IS_PED_INJURED(testPed)
IF IS_PED_IN_ANY_VEHICLE(testPed)
tempVehicle = GET_VEHICLE_PED_IS_IN(testPed)
ELSE
tempVehicle = NULL
ENDIF
ENDIF
IF DO_AGGRO_CHECK(testPed, tempVehicle, aggroArgs, aggroReason, FALSE, FALSE)
OR IS_PED_RAGDOLL(testPed) AND GET_PLAYER_DISTANCE_FROM_ENTITY(testPed) < 1.5
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC DETACH_TOW_TRUCK_FROM_LIMO_IF_ATTACHED()
VEHICLE_INDEX tempVeh
//checks to see if player is trying to mess with the target car in a tow truck
IF IS_PED_IN_ANY_VEHICLE(Player)
tempVeh = GET_VEHICLE_PED_IS_IN(Player)
IF GET_ENTITY_MODEL(tempVeh) = TOWTRUCK
OR GET_ENTITY_MODEL(tempVeh) = TOWTRUCK2
bPlayerInTowTruck = TRUE
ENDIF
ELSE
bPlayerInTowTruck = FALSE
ENDIF
IF bPlayerInTowTruck
IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(tempVeh, viTargetCar)
DETACH_VEHICLE_FROM_TOW_TRUCK(tempVeh, viTargetCar)
ENDIF
ENDIF
ENDPROC
// Stickybomb checks on the limo while parked
FUNC BOOL IS_STICKYBOMB_VISIBLE_ON_PARKED_LIMO(eFailType& failReason)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF HAS_VEHICLE_GOT_PROJECTILE_ATTACHED(PLAYER_PED_ID(), viTargetCar, WEAPONTYPE_STICKYBOMB)
// checks the entire limo area above the bumper to the roof
IF IS_PROJECTILE_TYPE_IN_ANGLED_AREA(<<-1223.024170,-187.307602,39.025375>>, <<-1220.311157,-186.248093,40.425377>>, 6.500000, WEAPONTYPE_STICKYBOMB)
// excludes the front/rear bumpers - checks the limo area from the bottom of the limo to the roof
OR IS_PROJECTILE_TYPE_IN_ANGLED_AREA(<<-1223.024170,-187.307602,38.025375>>, <<-1220.311157,-186.248093,40.425377>>, 4.500000, WEAPONTYPE_STICKYBOMB)
PRINTLN("Projectile detected in obvious location on limo.")
failReason = FT_STICKY
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//FUNC BOOL IS_PLAYER_THROWING_STICKYBOMBS_AT_VEHICLE(VEHICLE_INDEX vehToCheck)
// WEAPON_TYPE wtReturn
// ENTITY_INDEX entFreeAim
//
// IF DOES_ENTITY_EXIST(vehToCheck)
// IF IS_VEHICLE_DRIVEABLE(vehToCheck)
// IF GET_PED_IN_VEHICLE_SEAT(vehToCheck) != NULL //make sure there are peds inside
// IF GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtReturn)
// IF wtReturn = WEAPONTYPE_STICKYBOMB
// IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vehToCheck) < 40 //player throwing range
// IF GET_ENTITY_PLAYER_IS_FREE_AIMING_AT(PLAYER_ID(), entFreeAim)
// IF IS_ENTITY_A_VEHICLE(entFreeAim)
// AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(entFreeAim) = vehToCheck
// OR GET_PED_INDEX_FROM_ENTITY_INDEX(entFreeAim) = GET_PED_IN_VEHICLE_SEAT(vehToCheck)
// IF ( IS_PED_ON_FOOT(PLAYER_PED_ID()) AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_ATTACK) )
// OR ( IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK) )
// PRINTLN("IS_PLAYER_THROWING_STICKYBOMBS_AT_VEHICLE - RETURNED TRUE!")
// RETURN TRUE
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ENDIF
//
// RETURN FALSE
//ENDFUNC
FUNC BOOL IS_PLAYER_ATTEMPTING_JACK_ON_LOCKED_CAR(VEHICLE_INDEX vehToCheck)
IF DOES_ENTITY_EXIST(vehToCheck)
IF IS_VEHICLE_DRIVEABLE(vehToCheck)
IF GET_VEHICLE_DOOR_LOCK_STATUS(vehToCheck) = VEHICLELOCK_LOCKOUT_PLAYER_ONLY
AND GET_VEHICLE_PED_IS_ENTERING(Player) = vehToCheck
PRINTLN("PLAYER ATTEMPTING JACK ON CAR RETURNING TRUE")
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//Set panic states for each ped group
FUNC BOOL DO_ADDITIONAL_HOTEL_PANIC_CHECKS(eFailType & failReason)
VEHICLE_INDEX tempVeh
FLOAT fShootDistance
WEAPON_TYPE wtReturn
IF NOT bPanicking
//check to see if the guards noticed C4 on the car
IF bTriggerGuardWalk
AND NOT bLeftHotel
//maybe add a bool here to only check once so that it doesn't try to check this every frame?
IF IS_STICKYBOMB_VISIBLE_ON_PARKED_LIMO(failType)
failReason = FT_STICKY
PRINTLN("IS_STICKYBOMB_VISIBLE_ON_PARKED_LIMO IS RETURNING TRUE")
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_ARMED(Player, ENUM_TO_INT(WF_INCLUDE_GUN))
IF IS_PED_SHOOTING(Player)
fShootDistance = GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), <<-1230.5994, -196.5408, 38.1528>>) //next to fountain
PRINTLN("fShootDistance = ", fShootDistance)
GET_CURRENT_PED_WEAPON(Player, wtReturn)
IF fShootDistance > 15 AND (wtReturn = WEAPONTYPE_SNIPERRIFLE) OR (wtReturn = WEAPONTYPE_HEAVYSNIPER) OR (wtReturn = WEAPONTYPE_REMOTESNIPER) OR (wtReturn = WEAPONTYPE_DLC_MARKSMANRIFLE)
IF DOES_ENTITY_EXIST(piTarget)
bAlerted = TRUE
bPlayerUsedSniperRifle = TRUE
PRINTLN("SETTING bAlerted AND bPlayerUsedSniperRifle BECAUSE PLAYER IS FIRING WITH A SNIPER RIFLE")
ENDIF
ELSE
IF fShootDistance < 50
PRINTLN("OJASHOTEL - Ped panicking because player is shooting near lobby!")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PLAYER_THROWING_STICKYBOMBS_AT_VEHICLE(viTargetCar)
OR IS_PLAYER_ATTEMPTING_JACK_ON_LOCKED_CAR(viTargetCar)
OR ( DOES_ENTITY_EXIST(viTargetCar) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(viTargetCar, Player) )
PRINTLN("ADDITONAL PANIC CHECKS ON LIMO RETURNED TRUE")
RETURN TRUE
ENDIF
IF IS_PLAYER_THROWING_STICKYBOMBS_AT_VEHICLE(viEscortCar)
OR ( DOES_ENTITY_EXIST(viEscortCar) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(viEscortCar, Player) )
PRINTLN("ADDITONAL PANIC CHECKS ON ESCORT CAR RETURNED TRUE")
RETURN TRUE
ENDIF
IF DOES_ENTITY_EXIST(viTargetCar) AND NOT IS_ENTITY_DEAD(viTargetCar)
IF IS_PED_IN_VEHICLE(Player, viTargetCar)
SET_VEHICLE_ALARM(viTargetCar, TRUE)
START_VEHICLE_ALARM(viTargetCar)
PRINTLN("TRIGGERING PANIC, BECAUSE THE PLAYER IS IN THE TARGET CAR")
RETURN TRUE
ENDIF
ENDIF
//check to see if player is messing with target's vehicle
IF DOES_ENTITY_EXIST(viTargetCar)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF IS_PED_IN_ANY_VEHICLE(Player)
tempVeh = GET_VEHICLE_PED_IS_IN(Player)
IF IS_ENTITY_TOUCHING_ENTITY(tempVeh, viTargetCar)
OR ( bPlayerInTowTruck AND IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(tempVeh, viTargetCar) )
failReason = FT_BLOWN_COVER_HIT_PARKED_CAR
PRINTLN("OJASHOTEL - Ped panicking because player is touching the target's car or has attaching a tow truck to it")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//stage where target is told to enter limo
IF MainStage = STAGE_ENTER_LIMO
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF GET_DISTANCE_BETWEEN_ENTITIES(Player, viTargetCar) <= 15
PRINTLN("OJASHOTEL - PANIC - Player approached the limo after target has left - immedidately trigger panic")
RETURN TRUE
ENDIF
ENDIF
ENDIF
//check to see if the player is throwing stickybombs inside of the hotel area after being warned by one of the limo guards
//we need to run this check here to ensure that it gets hit every frame since it does a check for just pressed
IF LimoGuardState[0] = LGS_WARNING_CHECK
OR LimoGuardState[1] = LGS_WARNING_CHECK
OR LimoGuardState[2] = LGS_WARNING_CHECK
IF IS_PLAYER_THROWING_STICKYBOMBS()
PRINTLN("OJASHOTEL - PANIC - PLAYER THROWING STICKYBOMBS AFTER BEING WARNED IN THE HOTEL AREA")
RETURN TRUE
ENDIF
ENDIF
//check the hotel area for an explosion and don't worry about the alert state if an explosion happens prior to the target exiting
IF Mainstage < STAGE_TARGET_LEAVE_LOBBY
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vHotelCenterPos, fHotelCenterRadius)
PRINTLN("OJASHOTEL - PANIC - Explosion near the hotel!!")
RETURN TRUE
ENDIF
ELSE
//otherwise if the player is inside of the parking garage and causes an explosion after the target leaves, lets set a bool to make the alerted check kick in
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vHotelCenterPos, fHotelCenterRadius)
IF IS_PLAYER_IN_PARKING_GARAGE()
bPlayerTriggeredExplosionFromParkingGarage = TRUE
PRINTLN("bPlayerTriggeredExplosionFromParkingGarage = TRUE")
ELSE
//if the player isnt in the parking garage trigger straight up panic
PRINTLN("OJASHOTEL - PANIC - Explosion near the hotel and player not in the garage!")
RETURN TRUE
ENDIF
ENDIF
ENDIF
// //check a central vector near the fountain
// IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vHotelStart, 30)
// AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DIR_STEAM, vHotelStart, 45)
// AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DIR_WATER_HYDRANT, vHotelStart, 45)
// PRINTLN("OJASHOTEL - PANIC - Explosion near the hotel!!")
// RETURN TRUE
// ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Remove an enemy's blip if he is killed
PROC REMOVE_ENEMY_BLIP_IF_KILLED(PED_INDEX ped, BLIP_INDEX blip)
IF DOES_ENTITY_EXIST(ped)
IF IS_PED_INJURED(ped)
IF DOES_BLIP_EXIST(blip)
REMOVE_BLIP(blip)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC VECTOR GET_RANDOM_COORDINATE()
VECTOR vToReturn
INT iRand
iRand = GET_RANDOM_INT_IN_RANGE() % 3
SWITCH iRand
CASE 0
vToReturn = <<-1270.2063, -200.3586, 40.8333>>
PRINTLN("vToReturn = ", vToReturn)
BREAK
CASE 1
vToReturn = <<-1268.4390, -215.9683, 59.6540>>
PRINTLN("vToReturn = ", vToReturn)
BREAK
CASE 2
vToReturn = <<-1241.5585, -239.3237, 38.7884>>
PRINTLN("vToReturn = ", vToReturn)
BREAK
ENDSWITCH
RETURN vToReturn
ENDFUNC
/// PURPOSE: Switch the ped's move state to run if panic is triggered while walking to the limo or if the player has been warned and is not in a safe location
FUNC BOOL MAKE_PED_RUN_IF_PANICKING(PED_INDEX ped)
SEQUENCE_INDEX iSeq
// IF DO_AGGRO_CHECK(ped, NULL, aggroArgs, aggroReason, TRUE, FALSE)
IF bPanicking
OR bAlerted
OR bAlertedSpecial
IF NOT IS_PED_INJURED(ped)
PRINTLN("SETTING PEDMOVEBLENDRATIO_RUN ON PED")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
STOP_SCRIPTED_CONVERSATION(FALSE)
PRINTLN("STOPPING CONVERSATIONS VIA MAKE_PED_RUN_IF_PANICKING")
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(ped)
IF NOT bTargetFleeing
CLEAR_SEQUENCE_TASK(iSeq)
OPEN_SEQUENCE_TASK(iSeq)
TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@hotel@", "alert_gunshot", NORMAL_BLEND_IN, SLOW_BLEND_OUT, 1000)
TASK_SMART_FLEE_PED(NULL, Player, 200, -1)
CLOSE_SEQUENCE_TASK(iSeq)
IF NOT IS_ENTITY_DEAD(piTarget)
TASK_PERFORM_SEQUENCE(piTarget, iSeq)
PRINTLN("TASKING TARGET TO PERFORM SEQUENCE VIA MAKE_PED_RUN_IF_PANICKING")
ENDIF
CLEAR_SEQUENCE_TASK(iSeq)
bTargetFleeing = TRUE
RETURN TRUE
ENDIF
ELSE
PRINTLN("OUR PED IS NOT IN A VEHICLE")
ENDIF
ENDIF
ELSE
// PRINTLN("OUR CHECKS ARE FAILING!!")
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_NEAR_CAR()
VECTOR vPlayerPosition, vCarPosition
FLOAT fDistanceToCar
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(viTargetCar)
vCarPosition = GET_ENTITY_COORDS(viTargetCar)
ENDIF
fDistanceToCar = VDIST2(vPlayerPosition, vCarPosition)
PRINTLN("fDistanceToCar = ", fDistanceToCar)
IF fDistanceToCar <= 25 // 5m
PRINTLN("RETURNING TRUE - IS_PLAYER_NEAR_CAR")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC PLAY_SINGLE_LINE_WARNING()
PED_INDEX pedSpeaker
IF NOT bWarningLinePlayed
IF NOT bLimoCruisingStreets
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
pedSpeaker = GET_CLOSEST_GUARD()
SETUP_PED_FOR_DIALOGUE(pedSpeaker, 3, "OJAvaGUARD")
IF IS_PLAYER_NEAR_CAR()
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_CAR", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING LINE TO GET AWAY FROM THE CAR")
bWarningLinePlayed = TRUE
ELSE
PLAY_SINGLE_LINE_FROM_CONVERSATION (hotelConv, "OJASAUD", "OJASva_GTFO2", "OJASva_GTFO2_1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING LINE TO LEAVE THE AREA")
bWarningLinePlayed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//tell guard to exit a vehicle if in one and warn the player by aiming their gun and possibly approaching them
PROC WARN_PLAYER_AND_WALK_TOWARDS(PED_INDEX& ped)
SEQUENCE_INDEX iSeq
IF piWalkingGuard = NULL
piWalkingGuard = GET_CLOSEST_GUARD(70, FALSE)
ENDIF
IF NOT IS_PED_INJURED(ped)
IF NOT IS_PED_IN_ANY_VEHICLE(ped)
IF NOT bGuardWalkingTowardsPlayer //we only want one guard to walk towards the player
IF ped = piWalkingGuard
CLEAR_SEQUENCE_TASK(iSeq)
OPEN_SEQUENCE_TASK(iSeq)
TASK_GO_TO_ENTITY(NULL, Player, DEFAULT_TIME_BEFORE_WARP, 2.0, PEDMOVEBLENDRATIO_WALK)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, Player, -1)
CLOSE_SEQUENCE_TASK(iSeq)
TASK_PERFORM_SEQUENCE(ped, iSeq)
CLEAR_SEQUENCE_TASK(iSeq)
bGuardWalkingTowardsPlayer = TRUE
VECTOR tempVec = GET_ENTITY_COORDS(ped)
PRINTLN("bGuardWalkingTowardsPlayer = TRUE. Guard located at << ", tempVec.x, ", ", tempVec.y, ", ", tempVec.z, " >>.")
ELSE
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK
TASK_TURN_PED_TO_FACE_ENTITY(ped, Player, -1)
PRINTLN("TASKING PED TO TURN TOWARD THE PLAYER")
ELSE
PRINTLN("PED IS PERFORMING WALK TO TASK")
ENDIF
ENDIF
ELSE
IF ped != piWalkingGuard
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK
TASK_TURN_PED_TO_FACE_ENTITY(ped, Player, -1)
PRINTLN("TASKING PED TO TURN TOWARD THE PLAYER")
ELSE
PRINTLN("PED IS PERFORMING WALK TO TASK")
ENDIF
ENDIF
ENDIF
ENDIF
//sets them targetable
SET_PED_CAN_BE_TARGETTED(ped, TRUE)
//will handle playing of warning line if not already played
PLAY_SINGLE_LINE_WARNING()
ENDIF
ENDPROC
//PURPOSE: Have the motorcade ped return to his vehicle ; 0 = guy in passenger seat, 1 = guy incar
PROC RETASK_MOTORCADE_PED_TO_RETURN_TO_VEHICLE(INT iEscort)
VEHICLE_SEAT vsEscort
//set this to true as player has been warned
bWarned = TRUE
PRINTLN("bWarned = TRUE 02")
IF iEscort = 0
vsEscort = VS_DRIVER
ELIF iEscort = 1
vsEscort = VS_FRONT_RIGHT
ENDIF
IF NOT IS_ENTITY_DEAD(piEscortPed[iEscort])
IF IS_VEHICLE_DRIVEABLE(viEscortCar)
IF NOT IS_PED_IN_VEHICLE(piEscortPed[iEscort], viEscortCar)
IF GET_SCRIPT_TASK_STATUS(piEscortPed[iEscort], SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK
TASK_ENTER_VEHICLE(piEscortPed[iEscort], viEscortCar, DEFAULT_TIME_BEFORE_WARP, vsEscort)
PRINTLN("TASKING PED TO ENTER VEHICLE")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//ensures that the ped that has been tasked to advance on the player while aiming retains their task
PROC RETASK_PED_TO_WALK_WHILE_AIMING_AT_PLAYER(PED_INDEX ped)
IF NOT IS_PED_INJURED(ped)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(ped) < 5
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_AIM_GUN_AT_ENTITY) <> PERFORMING_TASK
TASK_AIM_GUN_AT_ENTITY(ped, Player, -1)
PRINTLN("OJASHOTEL - RETASK_PED_TO_WALK_WHILE_AIMING_AT_PLAYER - RETASKING PED TO STAND AND AIM!")
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY) <> PERFORMING_TASK
//make sure we only have one guy doing this
IF ped = piWalkingGuard
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(ped, Player, Player, PEDMOVE_WALK, FALSE, -1)
ELSE
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_AIM_GUN_AT_ENTITY) <> PERFORMING_TASK
TASK_AIM_GUN_AT_ENTITY(ped, Player, -1)
ENDIF
ENDIF
PRINTLN("OJASHOTEL - RETASK_PED_TO_WALK_WHILE_AIMING_AT_PLAYER - RETASKING PED TO WALK AND AIM")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC TASK_LIMO_GUARDS_TO_ENTER_VEHICLES()
INT idx
REPEAT NUM_LIMO_GUARDS idx
LimoGuardState[idx] = LGS_ENTER_LIMO
ENDREPEAT
PRINTLN("bLimoGuardsTaskedToEnterVehicle = TRUE")
bLimoGuardsTaskedToEnterVehicle = TRUE
ENDPROC
/// PURPOSE:
/// Ensures that the vehicle's driver uses their vehicle to try and attack the player (to help fix a bug about guards not getting to the player fast enough)
/// PARAMS:
/// veh - vehicle to use to combat player with
/// ped - driver of the vehicle
/// fDistFromPlayerBeforeEnteringVeh - Threshold distance that the ped is away from the player before being told to enter the vehicle
/// fDistanceFromVehSafeToEnter - distance between the ped and his vehicle to be safe to enter the vehice
/// fDistToPlayerToExitVehAndAttackOnFoot - once the ped reaches the player (and the player is on foot) exit the vehicle and attack at this distance
PROC UPDATE_PED_ATTACKING_IN_VEHICLE(VEHICLE_INDEX veh, PED_INDEX ped, FLOAT fDistFromPlayerBeforeEnteringVeh = 50.0, FLOAT fDistanceFromVehSafeToEnter = 50.0, FLOAT fDistToPlayerToExitVehAndAttackOnFoot = 10.0)
IF NOT IS_PED_INJURED(ped)
IF IS_VEHICLE_DRIVEABLE(veh)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_DISTANCE_BETWEEN_ENTITIES(ped, veh, FALSE) > fDistFromPlayerBeforeEnteringVeh
AND GET_PLAYER_DISTANCE_FROM_ENTITY(ped) < fDistanceFromVehSafeToEnter
IF NOT IS_PED_IN_VEHICLE(ped, veh)
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(ped, veh)
PRINTLN("OJASHOTEL - UPDATE_PED_ATTACKING_IN_VEHICLE - enter vehicle")
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
TASK_VEHICLE_MISSION(ped, veh, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), MISSION_ATTACK, 35.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ADD_VEHICLE_SUBTASK_ATTACK_PED(ped, PLAYER_PED_ID())
PRINTLN("OJASHOTEL - UPDATE_PED_ATTACKING_IN_VEHICLE - TASK_VEHICLE_MISSION")
ENDIF
ENDIF
ELSE
IF NOT IS_PED_IN_VEHICLE(ped, veh)
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
TASK_COMBAT_PED(ped, PLAYER_PED_ID())
PRINTLN("OJASHOTEL - UPDATE_PED_ATTACKING_IN_VEHICLE - TASK_COMBAT_PED - not far enough away to try and enter vehicle")
ENDIF
ENDIF
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(ped, veh)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(ped) > fDistToPlayerToExitVehAndAttackOnFoot
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
TASK_VEHICLE_MISSION_PED_TARGET(ped, veh, PLAYER_PED_ID(), MISSION_ATTACK, 35.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ADD_VEHICLE_SUBTASK_ATTACK_PED(ped, PLAYER_PED_ID())
PRINTLN("OJASHOTEL - UPDATE_PED_ATTACKING_IN_VEHICLE - TASK_VEHICLE_MISSION_PED_TARGET")
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
TASK_COMBAT_PED(ped, PLAYER_PED_ID())
PRINTLN("OJASHOTEL - UPDATE_PED_ATTACKING_IN_VEHICLE - TASK_COMBAT_PED < fDistToPlayerToExitVehAndAttackOnFoot")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(ped, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
TASK_COMBAT_PED(ped, PLAYER_PED_ID())
PRINTLN("OJASHOTEL - UPDATE_PED_ATTACKING_IN_VEHICLE - TASK_COMBAT_PED")
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Update the target state
PROC UPDATE_ESCORT_STATE(INT iEscort)
PED_INDEX escortPed
escortPed = piEscortPed[iEscort]
SWITCH EscortState[iEscort]
CASE ES_WAITING
IF bDriveToLimo
EscortState[iEscort] = ES_DRIVE_TO_LIMO
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_DRIVE_TO_LIMO")
ELIF bLeaveInLimo
EscortState[iEscort] = ES_PROTECT
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_PROTECT")
// ELSE
// IF bPanicking
// IF NOT IS_ENTITY_DEAD(escortPed)
// IF GET_SCRIPT_TASK_STATUS(escortPed, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
// PRINTLN("OJASHOTEL - TASK LIMO GUARD TO COMBAT IN LGS_LEAVE_IN_LIMO")
// TASK_COMBAT_PED(escortPed, Player)
// ENDIF
// ENDIF
// ENDIF
ENDIF
BREAK
CASE ES_DRIVE_TO_LIMO
//play the vehicle recordings and wait
IF IS_VEHICLE_DRIVEABLE(viEscortCar)
IF ARE_BOTH_ESCORT_PEDS_IN_VEHICLE()
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(viEscortCar)
IF GET_PED_IN_VEHICLE_SEAT(viEscortCar) = piEscortPed[iEscort]
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(piEscortPed[iEscort], viEscortCar, "OJASva_104", DF_SwerveAroundAllCars|DF_StopAtLights|DF_SteerAroundObjects|DF_SteerAroundPeds|DF_GoOffRoadWhenAvoiding|DF_DriveIntoOncomingTraffic, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, 18, 6)
PRINTLN("OJASHOTEL - TASKING piEscortPed[", iEscort, "] TO DRIVE TO LIMO - using AI_SLOWDOWN")
ENDIF
ENDIF
EscortState[iEscort] = ES_DRIVING_TO_LIMO
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_DRIVING_TO_LIMO - TASKED TO FOLLOW WAYPOINT RECORDING")
ELSE
PRINTLN("HERE 02")
RETASK_MOTORCADE_PED_TO_RETURN_TO_VEHICLE(iEscort)
ENDIF
ENDIF
BREAK
CASE ES_DRIVING_TO_LIMO
IF IS_VEHICLE_DRIVEABLE(viEscortCar)
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(viEscortCar)
VECTOR vTemp
FLOAT fTemp
vTemp = GET_ENTITY_COORDS(viEscortCar)
fTemp = GET_ENTITY_HEADING(viEscortCar)
PRINTLN("VECTOR = ", vTemp)
PRINTLN("HEADING = ", fTemp)
bDriveToLimo = FALSE
EscortState[iEscort] = ES_WAITING
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_WAITING 01")
ENDIF
ENDIF
BREAK
CASE ES_PROTECT
//tell the motorcade to escort the limo
IF IS_VEHICLE_DRIVEABLE(viEscortCar)
IF NOT IS_ENTITY_DEAD(piEscortPed[iEscort])
IF IS_PED_IN_VEHICLE(piEscortPed[iEscort], viEscortCar)
AND IS_VEHICLE_DRIVEABLE(viTargetCar)
IF NOT bPanicking
IF GET_PED_IN_VEHICLE_SEAT(viEscortCar) = piEscortPed[iEscort]
IF GET_SCRIPT_TASK_STATUS(piEscortPed[iEscort], SCRIPT_TASK_VEHICLE_MISSION) <> PERFORMING_TASK
// TASK_VEHICLE_MISSION(piEscortPed[iEscort], viEscortCar, viTargetCar, MISSION_ESCORT_REAR, 45, DRIVINGMODE_AVOIDCARS, -1, -1)
TASK_VEHICLE_ESCORT(piEscortPed[iEscort], viEscortCar, viTargetCar, VEHICLE_ESCORT_REAR, 45, DRIVINGMODE_AVOIDCARS|DF_DriveIntoOncomingTraffic, 10, -1, 10)
PRINTLN("TASKING - TASK_VEHICLE_MISSION ON ESCORT PED DRIVER")
ENDIF
ENDIF
ELSE
// Driver only
IF GET_PED_IN_VEHICLE_SEAT(viEscortCar) = piEscortPed[iEscort]
IF NOT bCombatSubtaskSet
IF IS_ENTITY_DEAD(piTarget)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_COMBAT_PED(escortPed, PLAYER_PED_ID())
PRINTLN("PLAYER IS IN A VEHICLE - TASKING ESCORT DRIVER GUARD TO COMBAT")
ELSE
PRINTLN("PLAYER IS NOT IN A VEHICLE - SENDING ESCORT GUARD[", iEscort, "] TO PANIC")
EscortState[iEscort] = ES_PANIC
ENDIF
ELSE
// TASK_VEHICLE_MISSION(escortPed, viEscortCar, viTargetCar, MISSION_ESCORT_REAR, 45, DRIVINGMODE_AVOIDCARS, -1, -1)
TASK_VEHICLE_ESCORT(piEscortPed[iEscort], viEscortCar, viTargetCar, VEHICLE_ESCORT_REAR, 45, DRIVINGMODE_AVOIDCARS|DF_DriveIntoOncomingTraffic, 10, -1, 10)
ADD_VEHICLE_SUBTASK_ATTACK_PED(escortPed, PLAYER_PED_ID())
PRINTLN("TASKING ESCORT GUARD DRIVER TO VEHICLE ESCORT")
bCombatSubtaskSet = TRUE
ENDIF
ENDIF
ELSE
IF NOT bTargetFleeing
IF GET_SCRIPT_TASK_STATUS(piEscortPed[iEscort], SCRIPT_TASK_COMBAT) <> PERFORMING_TASK
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_ENTITY_SPEED(viEscortCar) < 5.0
EscortState[iEscort] = ES_PANIC
PRINTLN("PLAYER IS NOT IN A VEHICLE - SENDING ESCORT GUARD PASSENGER TO PANIC - CAR NOT MOVING FAST")
ENDIF
ENDIF
TASK_COMBAT_PED(escortPed, PLAYER_PED_ID())
PRINTLN("ESCORT: TARGET NOT FLEEING, TASKING ESCORT PED TO COMBAT WITH INDEX = ", iEscort)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(piEscortPed[iEscort], SCRIPT_TASK_COMBAT) <> PERFORMING_TASK
TASK_COMBAT_PED(escortPed, PLAYER_PED_ID())
// PRINTLN("ESCORT: TARGET FLEEING, TASKING TO COMBAT INDEX = ", iEscort)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bAlerted
EscortState[iEscort] = ES_PANIC
PRINTLN("OJASHOTEL - EscortState[", iEscort, "SENDING TO ES_PANIC VIA TARGET CAR IS NOT DRIVEABLE")
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE ES_RESPOND_TO_PLAYER
IF NOT IS_TIMER_STARTED(warnTimer)
RESTART_TIMER_NOW(warnTimer)
PRINTLN("OJASHOTEL - ES_RESPOND_TO_PLAYER - restarting timer")
ENDIF
//peds in vehicles will only play the warning line and not leave their vehicle currently (just say warning line)
WARN_PLAYER_AND_WALK_TOWARDS(piEscortPed[iEscort])
EscortState[iEscort] = ES_WARNING_CHECK
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_WARNING_CHECK")
BREAK
CASE ES_WARNING_CHECK
IF NOT IS_ENTITY_IN_SAFE_LOCATION(Player)
IF GET_TIMER_IN_SECONDS(warnTimer) >= 27
OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF NOT IS_PED_INJURED(escortPed)
IF IS_ENTITY_AT_ENTITY(Player, escortPed, <<5,5,3>>)
PRINTLN("ESCORT STATE - TRIGGERING PANIC")
TRIGGER_PANIC_NEAR_GUARDS_IF_PREV_WARNED(escortPed, <<5,5,3>>)
ELSE
PRINTLN("HERE 03")
RETASK_MOTORCADE_PED_TO_RETURN_TO_VEHICLE(iEscort)
ENDIF
ENDIF
// ELSE
// RETASK_PED_TO_WALK_WHILE_AIMING_AT_PLAYER(escortPed)
ENDIF
ELSE
EscortState[iEscort] = ES_WAITING
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_WAITING 02")
ENDIF
BREAK
CASE ES_ALERTED
// IF NOT IS_PED_INJURED(piEscortPed[iEscort])
// VECTOR vTempPos = GET_ENTITY_COORDS(piEscortPed[iEscort])
// //sets a peds defensive area around the target
// SET_PED_SPHERE_DEFENSIVE_AREA(piEscortPed[iEscort], vTempPos, 15.0)
// SET_PED_COMBAT_MOVEMENT(piEscortPed[iEscort], CM_DEFENSIVE)
// SET_PED_COMBAT_ATTRIBUTES(piEscortPed[iEscort], CA_USE_COVER, TRUE)
// ENDIF
IF bAlertedSpecial
OPEN_SEQUENCE_TASK(seqIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_LOOK_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(1000, 1500), SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_LOOK_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(2000, 2500), SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_GO_TO_ENTITY(NULL, PLAYER_PED_ID(), GET_RANDOM_INT_IN_RANGE(10000, 11000), 30, PEDMOVEBLENDRATIO_WALK)
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_COORD(NULL, PLAYER_PED_ID(), GET_RANDOM_COORDINATE(), PEDMOVEBLENDRATIO_WALK, FALSE)
CLOSE_SEQUENCE_TASK(seqIndex)
IF NOT IS_PED_INJURED(piEscortPed[iEscort])
TASK_PERFORM_SEQUENCE(piEscortPed[iEscort], seqIndex)
ENDIF
CLEAR_SEQUENCE_TASK(seqIndex)
ELSE
OPEN_SEQUENCE_TASK(seqIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
// TASK_SEEK_COVER_FROM_POS(NULL, vTempPos, -1)
TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(3000, 3500), TRUE)
TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(3000, 3500))
TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(3000, 3500))
TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(3000, 3500))
TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), -1)
CLOSE_SEQUENCE_TASK(seqIndex)
IF NOT IS_PED_INJURED(piEscortPed[iEscort])
TASK_PERFORM_SEQUENCE(piEscortPed[iEscort], seqIndex)
ENDIF
CLEAR_SEQUENCE_TASK(seqIndex)
ENDIF
EscortState[iEscort] = ES_ALERTED2
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_ALERTED2")
BREAK
CASE ES_ALERTED2
//ped has been tasked with alert tasks - wait here and retask should he lose his current task (bug 1511746 - 6/25/13 - MB)
IF NOT IS_PED_INJURED(piEscortPed[iEscort])
IF GET_SCRIPT_TASK_STATUS(piEscortPed[iEscort], SCRIPT_TASK_ANY) != PERFORMING_TASK
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(piEscortPed[iEscort], Player, Player, PEDMOVE_WALK, FALSE, -1)
ENDIF
ENDIF
BREAK
//guard is panicked - handle attack response
CASE ES_PANIC
IF failType != FT_BLOWN_COVER_HIT_PARKED_CAR
AND failType != FT_DISREGARDED_WARNINGS
EXIT_VEHICLE_AND_ATTACK_PLAYER(escortPed)
ELSE
EXIT_VEHICLE_AND_AIM_GUN_AT_PLAYER(escortPed)
ENDIF
EscortState[iEscort] = ES_ATTACKING
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_ATTACKING")
BREAK
CASE ES_ATTACKING
IF iEscort = 0
IF failType != FT_BLOWN_COVER_HIT_PARKED_CAR
UPDATE_PED_ATTACKING_IN_VEHICLE(viEscortCar, escortPed)
ENDIF
ELSE
//empty state - ped has already been tasked to combat the player
ENDIF
PLAY_GUARD_PANIC_LINE(escortPed)
PLAY_TARGET_DEAD_LINE(escortPed)
BREAK
ENDSWITCH
/////// ALWAYS RUN THESE PANIC/WARNING CHECKS
IF NOT bPanicking
IF bAlerted
IF EscortState[iEscort] <> ES_ALERTED
AND EscortState[iEscort] <> ES_ALERTED2
EscortState[iEscort] = ES_ALERTED
PRINTLN("OJASHOTEL - EscortState[", iEscort, "] = ES_ALERTED")
ENDIF
ELSE
IF DO_AGGRO_CHECK(escortPed, viEscortCar, aggroArgs, aggroReason, FALSE, FALSE)
OR CHECK_FOR_PLAYER_RAMMING_VEHICLE(viEscortCar)
// OR bPlayerTriggeredExplosionFromParkingGarage
PED_INDEX tempPed = GET_CLOSEST_GUARD()
IF tempPed != NULL
DO_ALERTED_CHECK(GET_ENTITY_COORDS(tempPed))
ENDIF
IF NOT SHOULD_TRIGGER_ALERT()
bPanicking = TRUE
PRINTLN("bPanicking = TRUE VIA HAS_PLAYER_AGGROED_HOTEL_PED - UPDATE_ESCORT_STATE")
// IF NOT IS_PED_INJURED(escortPed)
// PLAY_GUARD_PANIC_LINE(escortPed)
// ENDIF
PRINTLN("OJASHOTEL - PLAYER AGGROED EscortPED")
ENDIF
ELSE
IF NOT bLeftHotel
IF IS_PLAYER_SEEN_BY_HOTEL_PED(escortPed, 10)
IF EscortState[iEscort] <> ES_RESPOND_TO_PLAYER
AND EscortState[iEscort] <> ES_WARNING_CHECK
IF NOT bWarned
CLEAR_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_ShotNear)
// IF NOT DOES_BLIP_EXIST(bEscortBlip[iEscort])
// IF NOT IS_PED_INJURED(escortPed)
// bEscortBlip[iEscort] = CREATE_BLIP_ON_ENTITY(escortPed, FALSE)
// ENDIF
// ENDIF
EscortState[iEscort] = ES_RESPOND_TO_PLAYER
PRINTLN("OJASHOTEL - EscortState[", iEscort, " = ES_RESPOND_TO_PLAYER")
ELSE
IF NOT IS_ENTITY_IN_SAFE_LOCATION(Player)
bPanicking = TRUE
// PLAY_GUARD_PANIC_LINE(escortPed)
IF NOT DOES_ENTITY_EXIST(piTarget)
failType = FT_DISREGARDED_WARNINGS
ENDIF
EscortState[iEscort] = ES_PANIC
PRINTLN("OJASHOTEL - PANIC - IS_PLAYER_SEEN_BY_HOTEL_PED IN ESCORT UPDATE. EscortState[", iEscort, "] = ES_PANIC")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(escortPed)
IF IS_PED_IN_VEHICLE(escortPed, viEscortCar)
IF NOT IS_VEHICLE_DRIVEABLE(viEscortCar)
OR NOT IS_VEHICLE_DRIVEABLE(viTargetCar)
OR bLimoStuck
// OR bLimoDestroyed
OR NOT bLeftHotel
IF EscortState[iEscort] < ES_PANIC
EscortState[iEscort] = ES_PANIC
PRINTLN("OJASHOTEL - EscortState[", iEscort, " = ES_PANIC VIA PANIC BOOL BEING SET")
ENDIF
ENDIF
ELSE
IF EscortState[iEscort] < ES_PANIC
EscortState[iEscort] = ES_PANIC
PRINTLN("OJASHOTEL - EscortState[", iEscort, " = ES_PANIC VIA PANIC BOOL BEING SET")
ENDIF
ENDIF
ENDIF
ENDIF
//handle escort blips
REMOVE_ENEMY_BLIP_IF_KILLED(escortPed, bEscortBlip[iEscort])
ENDPROC
PROC UPDATE_GUARDS_AIMING(PED_INDEX testPed)
SWITCH iGuardAimingState
CASE 0
IF NOT IS_ENTITY_DEAD(testPed)
// AND testPed = piWalkingGuard
IF GET_SCRIPT_TASK_STATUS(testPed, SCRIPT_TASK_AIM_GUN_AT_ENTITY) <> PERFORMING_TASK
TASK_AIM_GUN_AT_ENTITY(testPed, PLAYER_PED_ID(), -1)
PRINTLN("TASKING LIMO GUY TO AIM")
ENDIF
SETUP_PED_FOR_DIALOGUE(testPed, 3, "OJAvaGUARD")
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_FWARN", CONV_PRIORITY_VERY_HIGH)
bWarningLinePlayed = TRUE
PRINTLN("bWarningLinePlayed = TRUE - VIA UPDATE_GUARDS_AIMING")
iGuardAimingState = 1
// bGaveSecondWarning = TRUE
// ELSE
// PRINTLN("STILL PERFORMING AIMING TASK")
// ENDIF
ENDIF
BREAK
CASE 1
RETASK_PED_TO_WALK_WHILE_AIMING_AT_PLAYER(testPed)
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_PATH_BLOCKED()
INT idx
VEHICLE_INDEX vehArray[10]
iNumVehiclesFound = GET_PED_NEARBY_VEHICLES(PLAYER_PED_ID(), vehArray)
iNumVehiclesFound = iNumVehiclesFound
iNumVehiclesFound = COUNT_OF(vehArray)
PRINTLN("iNumVehiclesFound = ", iNumVehiclesFound)
REPEAT COUNT_OF(vehArray) idx
IF DOES_ENTITY_EXIST(vehArray[idx]) AND NOT IS_ENTITY_DEAD(vehArray[idx])
IF IS_ENTITY_IN_ANGLED_AREA(vehArray[idx], <<-1218.843506,-278.622986,36.819595>>, <<-1248.403320,-225.846725,43.156059>>, 8.500000)
iNumVehiclesInArea++
PRINTLN("NUMBER VEHICLES IN AREA = ", iNumVehiclesInArea)
ELSE
PRINTLN("NEARBY VEHICLES NOT IN ANGLED AREA: INDEX = ", idx)
ENDIF
ENDIF
ENDREPEAT
IF iNumVehiclesInArea >= 1
bPathIsBlocked = TRUE
PRINTLN("RETURNING TRUE - IS_PATH_BLOCKED")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_ALL_GUARDS_DEAD_IN_LIMO()
PED_INDEX tempPed
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
tempPed = GET_PED_IN_VEHICLE_SEAT(viTargetCar, VS_DRIVER)
IF tempPed = NULL
OR ( tempPed != NULL AND IS_PED_INJURED(tempPed) )
tempPed = GET_PED_IN_VEHICLE_SEAT(viTargetCar, VS_FRONT_RIGHT)
IF tempPed = NULL
OR ( tempPed != NULL AND IS_PED_INJURED(tempPed) )
tempPed = GET_PED_IN_VEHICLE_SEAT(viTargetCar, VS_BACK_RIGHT)
IF tempPed = NULL
OR ( tempPed != NULL AND IS_PED_INJURED(tempPed) )
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_TARGET_PLAYED_ALL_PANIC_LINES()
SWITCH iTargetPanicLine
CASE 0
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PLAY_SINGLE_LINE_FROM_CONVERSATION(hotelConv, "OJASAUD", "OJASva_PANIC", "OJASva_PANIC_1", CONV_PRIORITY_HIGH)
RESTART_TIMER_NOW(tTargetSpeakTimer)
iTargetPanicLine ++
ENDIF
BREAK
CASE 1
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND GET_TIMER_IN_SECONDS(tTargetSpeakTimer) > 7.0
PLAY_SINGLE_LINE_FROM_CONVERSATION(hotelConv, "OJASAUD", "OJASva_PANIC", "OJASva_PANIC_2", CONV_PRIORITY_HIGH)
RESTART_TIMER_NOW(tTargetSpeakTimer)
iTargetPanicLine ++
ENDIF
BREAK
CASE 2
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND GET_TIMER_IN_SECONDS(tTargetSpeakTimer) > 8.0
PLAY_SINGLE_LINE_FROM_CONVERSATION(hotelConv, "OJASAUD", "OJASva_PANIC", "OJASva_PANIC_3", CONV_PRIORITY_HIGH)
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
/// PURPOSE: State machine for the peds who drive with the target in the SUV(formerly a limo)
PROC UPDATE_LIMO_GUARD_STATE(INT iLimoGuard)
PED_INDEX limoPed
FLOAT fCheckDist
limoPed = piLimoGuard[iLimoGuard]
// // Adding a flag, so if the player is given the final warning... leaves, then returns, we don't care anymore about being seen.
// IF bGaveSecondWarning
// IF IS_ENTITY_IN_SAFE_LOCATION(Player)
// bDoNotRunPanicCheck = TRUE
//// PRINTLN("bDoNotRunPanicCheck = TRUE")
// ENDIF
// ENDIF
SWITCH LimoGuardState[iLimoGuard]
//task limo peds to enter the target vehicle - ensure that one follows the target on his way
//tell the guard to go to their assigned post
CASE LGS_WALK_TO_POSTS
IF NOT IS_PED_INJURED(limoPed)
CLEAR_SEQUENCE_TASK(seqIndex)
OPEN_SEQUENCE_TASK(seqIndex)
TASK_GO_TO_COORD_ANY_MEANS(NULL, vGuardPos[iLimoGuard], PEDMOVE_WALK, NULL)
TASK_ACHIEVE_HEADING(NULL, fGuardHead[iLimoGuard])
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(limoPed, seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
LimoGuardState[iLimoGuard] = LGS_STAND_GUARD
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_STAND_GUARD")
ENDIF
BREAK
//have guards cycle through idle animations when not currently tasked with an anim or sequence task
CASE LGS_STAND_GUARD
IF DOES_ENTITY_EXIST(limoPed)
IF NOT IS_ENTITY_DEAD(limoPed)
IF NOT bPanickedExtras // We're going to fail the player, no need to stay in animation
IF GET_SCRIPT_TASK_STATUS(limoPed, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(limoPed, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK
IF IS_ENTITY_AT_COORD(limoPed, vGuardPos[iLimoGuard], <<3,3,3>>)
UPDATE_GUARD_ANIMS(limoPed, iGuardAnim[iLimoGuard])
ELSE
LimoGuardState[iLimoGuard] = LGS_WALK_TO_POSTS
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_WALK_TO_POSTS")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
//handle guard reaction to spotting the player ped
CASE LGS_RESPOND_TO_PLAYER
// PRINTLN("INSIDE - LGS_RESPOND_TO_PLAYER !!!!!!!!!!")
IF NOT IS_TIMER_STARTED(warnTimer)
RESTART_TIMER_NOW(warnTimer)
PRINTLN("RESTART TIMER NOW - warnTimer")
WARN_PLAYER_AND_WALK_TOWARDS(limoPed)
LimoGuardState[iLimoGuard] = LGS_WARNING_CHECK
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_WARNING_CHECK - Timer not started")
ELSE
//wait until delay time for the ped has been reached if set (we don't want all the guys snapping at once)
IF GET_TIMER_IN_SECONDS(warnTimer) > fWarnTime[iLimoGuard]
OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
WARN_PLAYER_AND_WALK_TOWARDS(limoPed)
LimoGuardState[iLimoGuard] = LGS_WARNING_CHECK
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_WARNING_CHECK")
ENDIF
ENDIF
BREAK
//give player time to get away from the guard and handle the guard's reposnse based on the player's actions
CASE LGS_WARNING_CHECK
IF NOT IS_ENTITY_IN_SAFE_LOCATION(Player)
bInPursuit = TRUE
IF bTargetLeaving
LimoGuardState[iLimoGuard] = LGS_ENTER_LIMO
PRINTLN("SETTING STATE TO LGS_ENTER_LIMO ON GUARD: ", iLimoGuard)
BREAK
ELSE
IF ( GET_TIMER_IN_SECONDS(warnTimer) >= 27 AND bWarningLinePlayed )
TRIGGER_PANIC_NEAR_GUARDS_IF_PREV_WARNED(limoPed, <<15,15,3>>)
PRINTLN("TRIGGERING PANIC - TIME IS UP!")
ELIF GET_TIMER_IN_SECONDS(warnTimer) >= 15
UPDATE_GUARDS_AIMING(limoPed)
PRINTLN("UPDATE_GUARDS_AIMING - LimoGuardState[", iLimoGuard, "].")
// ELSE
// PRINTLN("UPDATE_GUARDS_AIMING - LimoGuardState[", iLimoGuard, "]. Doing nothing")
ENDIF
ENDIF
ELSE
bInPursuit = FALSE
bWarned = TRUE
PRINTLN("bWarned!!!")
IF NOT bLimoGuardsTaskedToEnterVehicle
LimoGuardState[iLimoGuard] = LGS_WALK_TO_POSTS
PRINTLN("SENDING LIMO GUARD[", iLimoGuard, "] TO STATE - LGS_WALK_TO_POSTS")
ELSE
LimoGuardState[iLimoGuard] = LGS_ENTER_LIMO
PRINTLN("SENDING LIMO GUARD[", iLimoGuard, "] TO STATE - LGS_ENTER_LIMO")
ENDIF
ENDIF
BREAK
CASE LGS_ENTER_LIMO
//sets them targetable
IF NOT IS_PED_INJURED(limoPed)
SET_PED_CAN_BE_TARGETTED(limoPed, TRUE)
SET_PED_RESET_FLAG(limoPed, PRF_SearchForClosestDoor, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF NOT IS_PED_INJURED(limoPed)
PRINTLN("OJASHOTEL - TASK_LIMO_PEDS_TO_ENTER_LIMO")
IF iLimoGuard = 0
TASK_LOOK_AT_ENTITY(piLimoGuard[0], piLimoGuard[1], -1)
IF NOT IS_PED_IN_VEHICLE(limoPed, viTargetCar)
TASK_ENTER_VEHICLE(limoPed, viTargetCar, 30000, VS_DRIVER, PEDMOVE_WALK)
PRINTLN("TASKING LIMO GUARD 0 TO ENTER VEHICLE")
ENDIF
ELIF iLimoGuard = 1
TASK_LOOK_AT_ENTITY(piLimoGuard[1], piLimoGuard[0], -1)
IF NOT IS_PED_IN_VEHICLE(limoPed, viTargetCar)
TASK_ENTER_VEHICLE(limoPed, viTargetCar, 30000, VS_FRONT_RIGHT, PEDMOVE_WALK)
PRINTLN("TASKING LIMO GUARD 1 TO ENTER VEHICLE")
ENDIF
ELIF iLimoGuard = 2
IF IS_VEHICLE_DRIVEABLE(viEscortCar)
IF NOT IS_PED_IN_VEHICLE(limoPed, viEscortCar)
TASK_ENTER_VEHICLE(limoPed, viEscortCar, 30000, VS_BACK_LEFT, PEDMOVE_WALK)
PRINTLN("TASKING LIMO GUARD 2 TO ENTER VEHICLE")
ENDIF
ENDIF
ENDIF
ENDIF
LimoGuardState[iLimoGuard] = LGS_LEAVE_IN_LIMO
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_LEAVE_IN_LIMO")
ELSE
LimoGuardState[iLimoGuard] = LGS_PANIC
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_PANIC - from LGS_ENTER_LIMO")
ENDIF
BREAK
//change peds walk speed to run if panicking
CASE LGS_LEAVE_IN_LIMO
//sets them targetable
IF NOT IS_PED_INJURED(limoPed)
SET_PED_RESET_FLAG(limoPed, PRF_SearchForClosestDoor, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(limoPed)
IF GET_SCRIPT_TASK_STATUS(limoPed, SCRIPT_TASK_LOOK_AT_ENTITY) != PERFORMING_TASK
IF iLimoGuard = 0
TASK_LOOK_AT_ENTITY(piLimoGuard[iLimoGuard], piLimoGuard[1], -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
ELIF iLimoGuard = 1
TASK_LOOK_AT_ENTITY(piLimoGuard[iLimoGuard], piLimoGuard[0], -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF NOT IS_TARGET_IN_LIMO()
IF bPanicking
IF NOT IS_PED_INJURED(limoPed)
IF GET_SCRIPT_TASK_STATUS(limoPed, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
IF IS_ENTITY_ALIVE(piLimoGuard[0]) // url:bugstar:2344952
TASK_CLEAR_LOOK_AT(piLimoGuard[0])
ENDIF
IF IS_ENTITY_ALIVE(piLimoGuard[1]) // url:bugstar:2344952
TASK_CLEAR_LOOK_AT(piLimoGuard[1])
ENDIF
PRINTLN("OJASHOTEL - TASK LIMO GUARD TO COMBAT IN LGS_LEAVE_IN_LIMO")
TASK_COMBAT_PED(limoPed, Player)
ENDIF
ENDIF
ENDIF
ELSE
LimoGuardState[iLimoGuard] = LGS_DRIVE_TO_END
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_DRIVE_TO_END 01")
ENDIF
ELSE
LimoGuardState[iLimoGuard] = LGS_PANIC
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_PANIC! - from LGS_LEAVE_IN_LIMO")
ENDIF
IF bTargetDead
IF LimoGuardState[iLimoGuard] <> LGS_PANIC
AND LimoGuardState[iLimoGuard] <> LGS_ATTACKING
LimoGuardState[iLimoGuard] = LGS_PANIC
PRINTLN("TARGET IS DEAD SENDING TO PANIC STATE: ", iLimoGuard)
ENDIF
ENDIF
BREAK
//task the limo driver to exit the hotel area based on whether panic has been triggered or not
CASE LGS_DRIVE_TO_END
IF NOT bPanicking
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF GET_PED_IN_VEHICLE_SEAT(viTargetCar) = limoPed
IF NOT IS_PED_INJURED(limoPed)
SET_VEHICLE_ENGINE_ON(viTargetCar, TRUE, TRUE)
IF IS_PATH_BLOCKED()
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(limoPed, viTargetCar, "OJASva_101a", DF_SwerveAroundAllCars|DF_StopAtLights|DF_SteerAroundObjects|DF_StopForCars|DF_SteerAroundPeds, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 10)
PRINTLN("OJASHOTEL - Tasking driver to drive to end position - path blocked")
ELSE
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(limoPed, viTargetCar, "OJASva_101", DF_SwerveAroundAllCars|DF_StopAtLights|DF_SteerAroundObjects|DF_StopForCars|DF_SteerAroundPeds)
PRINTLN("OJASHOTEL - Tasking driver to drive to end position")
ENDIF
ENDIF
ENDIF
LimoGuardState[iLimoGuard] = LGS_DRIVING
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_DRIVING")
ENDIF
ELSE
IF IS_ENTITY_ALIVE(piLimoGuard[0]) // url:bugstar:2344952
TASK_CLEAR_LOOK_AT(piLimoGuard[0])
ENDIF
IF IS_ENTITY_ALIVE(piLimoGuard[1]) // url:bugstar:2344952
TASK_CLEAR_LOOK_AT(piLimoGuard[1])
ENDIF
LimoGuardState[iLimoGuard] = LGS_DRIVING
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_DRIVE_TO_END 02")
ENDIF
BREAK
//peds have been tasked to drive the streets - monitor for panic and handle response accordingly
CASE LGS_DRIVING
IF bPanicking
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
AND GET_PED_IN_VEHICLE_SEAT(viTargetCar) = limoPed
AND GET_PED_IN_VEHICLE_SEAT(viTargetCar, VS_BACK_LEFT) = piTarget
IF NOT IS_PED_INJURED(limoPed)
IF bLimoCruisingStreets
OR (bPathIsBlocked AND NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(viTargetCar))
CLEAR_PED_TASKS(limoPed)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_SCRIPT_TASK_STATUS(limoPed, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
TASK_VEHICLE_MISSION(limoPed, viTargetCar, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), MISSION_FLEE, 35.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(limoPed, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
TASK_VEHICLE_MISSION_PED_TARGET(limoPed, viTargetCar, PLAYER_PED_ID(), MISSION_FLEE, 35.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(limoPed)
IF GET_SCRIPT_TASK_STATUS(limoPed, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
TASK_COMBAT_PED(limoPed, Player)
PRINTLN("LIMO: TARGET FLEEING, TASKING iLimoGuard TO COMBAT with index = ", iLimoGuard)
ENDIF
ENDIF
ENDIF
ELSE
IF bLimoCruisingStreets
OR (bPathIsBlocked AND NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(viTargetCar))
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF GET_PED_IN_VEHICLE_SEAT(viTargetCar) = limoPed
IF NOT IS_ENTITY_DEAD(limoPed)
IF GET_SCRIPT_TASK_STATUS(limoPed, SCRIPT_TASK_VEHICLE_MISSION) <> PERFORMING_TASK
TASK_VEHICLE_MISSION_COORS_TARGET(limoPed, viTargetCar, vTargetCarLobbyPos, MISSION_FLEE, 25.0, DRIVINGMODE_STOPFORCARS, -1, -1)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE LGS_ALERTED
IF bAlertedSpecial
OPEN_SEQUENCE_TASK(seqIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_LOOK_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(1000, 1500), SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
// TASK_LOOK_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(2000, 2500), SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_GO_TO_ENTITY(NULL, PLAYER_PED_ID(), GET_RANDOM_INT_IN_RANGE(15000, 16000), 30, PEDMOVEBLENDRATIO_WALK)
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_COORD(NULL, PLAYER_PED_ID(), GET_RANDOM_COORDINATE(), PEDMOVEBLENDRATIO_WALK, FALSE)
CLOSE_SEQUENCE_TASK(seqIndex)
IF NOT IS_ENTITY_DEAD(piLimoGuard[iLimoGuard])
TASK_PERFORM_SEQUENCE(piLimoGuard[iLimoGuard], seqIndex)
ENDIF
CLEAR_SEQUENCE_TASK(seqIndex)
ELSE
OPEN_SEQUENCE_TASK(seqIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(3000, 3500), TRUE)
// TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(3000, 3500))
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_COORD(NULL, PLAYER_PED_ID(), GET_RANDOM_COORDINATE(), PEDMOVEBLENDRATIO_WALK, FALSE)
CLOSE_SEQUENCE_TASK(seqIndex)
IF NOT IS_ENTITY_DEAD(piLimoGuard[iLimoGuard])
TASK_PERFORM_SEQUENCE(piLimoGuard[iLimoGuard], seqIndex)
ENDIF
CLEAR_SEQUENCE_TASK(seqIndex)
ENDIF
LimoGuardState[iLimoGuard] = LGS_ALERTED2
PRINTLN("OJASHOTEL - LimoGuardState[ ", iLimoGuard, "] = LGS_ALERTED2")
BREAK
CASE LGS_ALERTED2
//ped has been tasked with alert tasks - wait here and retask should he lose his current task (bug 1511746 - 6/25/13 - MB)
IF NOT IS_PED_INJURED(piLimoGuard[iLimoGuard])
IF GET_SCRIPT_TASK_STATUS(piLimoGuard[iLimoGuard], SCRIPT_TASK_ANY) != PERFORMING_TASK
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(piLimoGuard[iLimoGuard], Player, Player, PEDMOVE_WALK, FALSE, -1)
ENDIF
ENDIF
BREAK
CASE LGS_PANIC
IF failType = FT_BLOWN_COVER_HIT_PARKED_CAR
OR failType = FT_DISREGARDED_WARNINGS
EXIT_VEHICLE_AND_AIM_GUN_AT_PLAYER(limoPed)
ELIF failType <> FT_STICKY
EXIT_VEHICLE_AND_ATTACK_PLAYER(limoPed)
LimoGuardState[iLimoGuard] = LGS_ATTACKING
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_ATTACKING")
ELSE
PRINTLN("FAIL TYPE DOES EQUAL STICKY")
ENDIF
BREAK
CASE LGS_ATTACKING
IF iLimoGuard = 0
UPDATE_PED_ATTACKING_IN_VEHICLE(viTargetCar, limoPed)
ENDIF
PLAY_GUARD_PANIC_LINE(limoPed)
PLAY_TARGET_DEAD_LINE(limoPed)
BREAK
ENDSWITCH
/////// ALWAYS RUN THESE PANIC CHECKS
IF MainStage < STAGE_GUARDS_GO_TO_POSTS
fCheckDist = 5 //so that they can only see in the airlock areas
ELSE
fCheckDist = fSightDist
ENDIF
IF NOT bPanicking
IF bAlerted
IF LimoGuardState[iLimoGuard] <> LGS_ALERTED
AND LimoGuardState[iLimoGuard] <> LGS_ALERTED2
LimoGuardState[iLimoGuard] = LGS_ALERTED
PRINTLN("OJASHOTEL - LimoGuardState[ ", iLimoGuard, "] = LGS_ALERTED")
ENDIF
ELSE
IF HAS_PLAYER_AGGROED_HOTEL_PED(limoPed)
// OR bPlayerTriggeredExplosionFromParkingGarage
PED_INDEX tempPed = GET_CLOSEST_GUARD()
IF tempPed != NULL
DO_ALERTED_CHECK(GET_ENTITY_COORDS(tempPed))
ENDIF
IF NOT SHOULD_TRIGGER_ALERT()
bPanicking = TRUE
PRINTLN("bPanicking = TRUE VIA HAS_PLAYER_AGGROED_HOTEL_PED - UPDATE_LIMO_GUARD_STATE")
ENDIF
//new stuff testing
ELSE
IF NOT bLeftHotel
IF IS_PLAYER_SEEN_BY_HOTEL_PED(limoPed, fCheckDist)
IF LimoGuardState[iLimoGuard] <> LGS_RESPOND_TO_PLAYER
AND LimoGuardState[iLimoGuard] <> LGS_WARNING_CHECK
AND NOT bTargetLeaving
IF NOT bWarned
CLEAR_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_ShotNear)
LimoGuardState[iLimoGuard] = LGS_RESPOND_TO_PLAYER
PRINTLN("OJASHOTEL - LimoGuardState[", iLimoGuard, "] = LGS_RESPOND_TO_PLAYER. ", "fDistToCheck is ", fCheckDist)
ELSE
IF NOT IS_ENTITY_IN_SAFE_LOCATION(Player) // AND NOT bDoNotRunPanicCheck
PRINTLN("OJASHOTEL - PANIC - IS_PLAYER_SEEN_BY_HOTEL_PED - 02")
bPanicking = TRUE
IF NOT DOES_ENTITY_EXIST(piTarget)
failType = FT_DISREGARDED_WARNINGS
ENDIF
PRINTLN("bPanicking = TRUE VIA IS_PLAYER_SEEN_BY_HOTEL_PED - UPDATE_LIMO_GUARD_STATE")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// IF bLimoDestroyed
// IF LimoGuardState[iLimoGuard] < LGS_PANIC
// LimoGuardState[iLimoGuard] = LGS_PANIC
// PRINTLN("OJASHOTEL - LimoGuardState[iLimoGuard] = LGS_PANIC!!!!!")
// ENDIF
// ELSE
IF LimoGuardState[iLimoGuard] <> LGS_PANIC
AND LimoGuardState[iLimoGuard] <> LGS_ATTACKING
AND LimoGuardState[iLimoGuard] <> LGS_DRIVING
LimoGuardState[iLimoGuard] = LGS_PANIC
PRINTLN("GENERAL PANIC CHECK - SENDING TO LGS_PANIC: ", iLimoGuard)
ENDIF
// ENDIF
ENDIF
//blip handling
REMOVE_ENEMY_BLIP_IF_KILLED(limoPed, bLimoGuardBlip[iLimoGuard])
ENDPROC
/// PURPOSE: Update the target state
PROC UPDATE_TARGET_STATE()
SEQUENCE_INDEX iSeq
IF DOES_ENTITY_EXIST(piTarget)
vTargetLastPosition = GET_ENTITY_COORDS(piTarget, FALSE)
ENDIF
SWITCH TargetState
CASE TS_ENTER_LIMO
IF NOT IS_ENTITY_DEAD(piTarget)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
AND NOT IS_ENTITY_DEAD(piLimoGuard[0]) //limo driver
IF NOT IS_PED_IN_VEHICLE(piTarget, viTargetCar)
IF GET_SCRIPT_TASK_STATUS(piTarget, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK
IF NOT bPanicking
AND NOT bAlerted
TASK_ENTER_VEHICLE(piTarget, viTargetCar, 30000, VS_BACK_LEFT, PEDMOVE_WALK)
PRINTLN("piTarget ENTER VEHICLE - WALK!")
ELSE
TASK_ENTER_VEHICLE(piTarget, viTargetCar, 30000, VS_BACK_LEFT, PEDMOVE_RUN)
PRINTLN("PANIC! - TARGET ENTERING VEHICLE!!")
ENDIF
IF NOT IS_TIMER_STARTED(tTargetSpeakTimer)
START_TIMER_NOW(tTargetSpeakTimer)
PRINTLN("STARTING TIMER - tTargetSpeakTimer")
ELSE
RESTART_TIMER_NOW(tTargetSpeakTimer)
PRINTLN("RESTARTING TIMER - tTargetSpeakTimer")
ENDIF
ENDIF
IF NOT bPlayedTargetLine
IF IS_TIMER_STARTED(tTargetSpeakTimer)
IF GET_TIMER_IN_SECONDS(tTargetSpeakTimer) > 3.5
IF NOT IS_PED_INJURED(piTarget)
ADD_PED_FOR_DIALOGUE(hotelConv, 4, piTarget, "OJAva_TARGET")
IF CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_TARG", CONV_PRIORITY_HIGH)
PRINTLN("PLAYING TARGET'S LINE")
bPlayedTargetLine = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF MAKE_PED_RUN_IF_PANICKING(piTarget)
KILL_ANY_CONVERSATION()
TargetState = TS_FLEE
PRINTLN("GOING TO STATE - TS_FLEE VIA TARGET PANIC CHECK - 01")
ENDIF
ELSE
bLeftHotel = TRUE
TargetState = TS_LEAVE_IN_LIMO
PRINTLN("OJASHOTEL - TargetState = TS_LEAVE_IN_LIMO")
ENDIF
ELSE
TargetState = TS_FLEE
PRINTLN("OJASHOTEL - TargetState = TS_FLEE")
ENDIF
ENDIF
BREAK
CASE TS_LEAVE_IN_LIMO
//stay here until the target reaches the destination - he should just be riding until then
//insert panic in car anims here when we get them
IF NOT bPlayedTargetLine
IF NOT IS_PED_INJURED(piTarget)
ADD_PED_FOR_DIALOGUE(hotelConv, 4, piTarget, "OJAva_TARGET")
IF CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_TARG", CONV_PRIORITY_HIGH)
PRINTLN("PLAYING TARGET'S LINE")
bPlayedTargetLine = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bTargetPanicLinePlayed
IF ARE_ALL_GUARDS_DEAD_IN_LIMO()
IF GET_DISTANCE_BETWEEN_ENTITIES(piTarget, PLAYER_PED_ID()) <= 5
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF GET_CLOSEST_GUARD(25.0) = NULL
IF HAS_TARGET_PLAYED_ALL_PANIC_LINES()
bTargetPanicLinePlayed = TRUE
PRINTLN("OJASHOTEL - Played all target panic lines in car")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// IF bLimoDestroyed = TRUE
// TargetState = TS_FLEE
// PRINTLN("OJASHOTEL - bLimoDestroyed - TargetState = TS_FLEE")
// ENDIF
BREAK
CASE TS_FLEE
IF NOT IS_ENTITY_DEAD(piTarget)
IF IS_PED_IN_VEHICLE(piTarget, viTargetCar)
IF GET_SCRIPT_TASK_STATUS(piTarget, SCRIPT_TASK_LEAVE_ANY_VEHICLE) <> PERFORMING_TASK
TASK_LEAVE_ANY_VEHICLE(piTarget, 0, ECF_DONT_CLOSE_DOOR)
ENDIF
ELSE
IF NOT bTargetFleeing
SET_PED_MAX_MOVE_BLEND_RATIO(piTarget, PEDMOVEBLENDRATIO_RUN)
CLEAR_SEQUENCE_TASK(iSeq)
OPEN_SEQUENCE_TASK(iSeq)
TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@hotel@", "alert_gunshot", NORMAL_BLEND_IN, SLOW_BLEND_OUT, 1000)
TASK_SMART_FLEE_PED(NULL, Player, 200, -1)
CLOSE_SEQUENCE_TASK(iSeq)
IF NOT IS_ENTITY_DEAD(piTarget)
TASK_PERFORM_SEQUENCE(piTarget, iSeq)
PRINTLN("TASKING TARGET TO PERFORM SEQUENCE")
ENDIF
CLEAR_SEQUENCE_TASK(iSeq)
bTargetFleeing = TRUE
PRINTLN("bTargetFleeing = TRUE")
ELSE
//safeguard to fix bug 1526704 if bTargetFleeing previously got set to true while the target was entering the vheicle
IF GET_SCRIPT_TASK_STATUS(piTarget, SCRIPT_TASK_ANY) != PERFORMING_TASK
TASK_SMART_FLEE_PED(piTarget, Player, 200, -1)
ENDIF
ENDIF
ENDIF
IF NOT bTargetPanicLinePlayed
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_MESSAGE_BEING_DISPLAYED()
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_TARG2", CONV_PRIORITY_VERY_HIGH)
bTargetPanicLinePlayed = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
/////// ALWAYS RUN THESE PANIC CHECKS
IF NOT bPanicking
IF bAlerted
// handle this
ELSE
IF HAS_PLAYER_AGGROED_HOTEL_PED(piTarget)
OR bPlayerTriggeredExplosionFromParkingGarage //call this here since UPDATE_TARGET_STATE gets called every frame
PED_INDEX tempPed = GET_CLOSEST_GUARD()
IF tempPed != NULL
DO_ALERTED_CHECK(GET_ENTITY_COORDS(tempPed))
ENDIF
IF NOT SHOULD_TRIGGER_ALERT()
bPanicking = TRUE
PRINTLN("TARGET PANICKED!")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Update the target state
PROC UPDATE_BODYGUARD_STATE(INT iBodyGuard)
VEHICLE_INDEX bodyGuardVehicle
VEHICLE_SEAT bodyGuardSeat
SEQUENCE_INDEX tempSeq
FLOAT fAnimTime
IF NOT DOES_ENTITY_EXIST(piBodyguard[iBodyGuard])
EXIT
ENDIF
SWITCH BodyGuardState[iBodyGuard]
CASE BS_WALK_WITH_TARGET
IF NOT IS_ENTITY_DEAD(piTarget)
IF NOT IS_PED_IN_ANY_VEHICLE(piTarget)
IF NOT IS_PED_INJURED(piBodyguard[iBodyGuard])
IF iBodyGuard = 0
TASK_FOLLOW_TO_OFFSET_OF_ENTITY(piBodyguard[iBodyGuard], piTarget, << 1.5, 0, 0 >>, PEDMOVEBLENDRATIO_WALK)
ELIF iBodyGuard = 1
IF IS_VEHICLE_DRIVEABLE(viEscortCar)
OPEN_SEQUENCE_TASK(tempSeq)
TASK_GO_TO_COORD_ANY_MEANS(NULL, << -1222.99207, -191.09319, 38.17538 >>, PEDMOVEBLENDRATIO_WALK, NULL)
TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_GUARD_STAND", 0)
TASK_ENTER_VEHICLE(NULL, viEscortCar, 30000, VS_BACK_RIGHT, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(piBodyguard[iBodyGuard], tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
ENDIF
ENDIF
BodyGuardState[iBodyGuard] = BS_ENTER_VEHICLE
PRINTLN("BodyGuardState[", iBodyGuard, "] = BS_ENTER_VEHICLE")
ENDIF
ENDIF
ENDIF
BREAK
CASE BS_ENTER_VEHICLE
IF iBodyGuard = 0
bodyGuardVehicle = viTargetCar
bodyGuardSeat = VS_BACK_RIGHT
ELIF iBodyGuard = 1
bodyGuardVehicle = viEscortCar
bodyGuardSeat = VS_BACK_RIGHT
ENDIF
IF NOT IS_ENTITY_DEAD(piBodyguard[iBodyGuard])
IF IS_VEHICLE_DRIVEABLE(bodyGuardVehicle)
IF NOT IS_ENTITY_DEAD(piBodyguard[iBodyGuard])
IF NOT IS_PED_IN_VEHICLE(piBodyguard[iBodyGuard], bodyGuardVehicle)
IF IS_PED_IN_ANY_VEHICLE(piTarget)
IF GET_SCRIPT_TASK_STATUS(piBodyguard[iBodyGuard], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(piBodyguard[iBodyGuard], bodyGuardVehicle, 30000, bodyGuardSeat, PEDMOVE_WALK)
ENDIF
ENDIF
ELSE
BodyGuardState[iBodyGuard] = BS_RIDE_IN_VEHICLE
PRINTLN("BodyGuardState[", iBodyGuard, "] = BS_RIDE_IN_VEHICLE")
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE BS_RIDE_IN_VEHICLE
IF iBodyGuard = 0
bodyGuardVehicle = viTargetCar
ELIF iBodyGuard = 1
bodyGuardVehicle = viEscortCar
ENDIF
//tell the motorcade to escort the limo
IF IS_VEHICLE_DRIVEABLE(bodyGuardVehicle)
IF NOT IS_ENTITY_DEAD(piBodyguard[iBodyGuard])
IF IS_PED_IN_VEHICLE(piBodyguard[iBodyGuard], bodyGuardVehicle)
AND IS_VEHICLE_DRIVEABLE(viTargetCar)
IF bPanicking
IF NOT bTargetFleeing
IF GET_SCRIPT_TASK_STATUS(piBodyguard[iBodyGuard], SCRIPT_TASK_COMBAT) <> PERFORMING_TASK
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_ENTITY_SPEED(bodyGuardVehicle) < 5.0
BodyGuardState[iBodyGuard] = BS_PANIC
PRINTLN("PLAYER IS NOT IN A VEHICLE - BodyGuardState[", iBodyGuard, "] = BS_PANIC")
ENDIF
ENDIF
TASK_COMBAT_PED(piBodyguard[iBodyGuard], PLAYER_PED_ID())
PRINTLN("BODYGUARD: TARGET NOT FLEEING, TASKING BODYGUARD TO COMBAT WITH INDEX = ", iBodyGuard)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(piBodyguard[iBodyGuard], SCRIPT_TASK_COMBAT) <> PERFORMING_TASK
TASK_COMBAT_PED(piBodyguard[iBodyGuard], PLAYER_PED_ID())
// PRINTLN("BODYGUARD: TARGET FLEEING, TASKING TO COMBAT INDEX = ", iBodyGuard)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bAlerted
BodyGuardState[iBodyGuard] = BS_PANIC
PRINTLN("BODYGUARD: SENDING TO BS_PANIC VIA TARGET CAR IS NOT DRIVEABLE")
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE BS_ALERTED
IF NOT IS_PED_INJURED(piBodyguard[iBodyGuard])
IF IS_PED_USING_ANY_SCENARIO(piBodyguard[iBodyGuard])
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(piBodyguard[iBodyGuard])
ENDIF
ENDIF
IF bAlertedSpecial
OPEN_SEQUENCE_TASK(seqIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_LOOK_AT_COORD(NULL, GET_RANDOM_COORDINATE(), GET_RANDOM_INT_IN_RANGE(2000, 2500), SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_GO_TO_ENTITY(NULL, PLAYER_PED_ID(), GET_RANDOM_INT_IN_RANGE(15000, 16000), 30, PEDMOVEBLENDRATIO_WALK)
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_COORD(NULL, PLAYER_PED_ID(), GET_RANDOM_COORDINATE(), PEDMOVEBLENDRATIO_WALK, FALSE)
CLOSE_SEQUENCE_TASK(seqIndex)
TASK_PERFORM_SEQUENCE(piBodyguard[iBodyGuard], seqIndex)
CLEAR_SEQUENCE_TASK(seqIndex)
ELSE
IF NOT IS_PED_INJURED(piBodyguard[iBodyGuard])
//sets a peds defensive area around the target
SET_PED_SPHERE_DEFENSIVE_AREA(piBodyguard[iBodyGuard], vTargetLastPosition, 15.0)
SET_PED_COMBAT_MOVEMENT(piBodyguard[iBodyGuard], CM_DEFENSIVE)
SET_PED_COMBAT_ATTRIBUTES(piBodyguard[iBodyGuard], CA_USE_COVER, TRUE)
SET_PED_MAX_MOVE_BLEND_RATIO(piBodyguard[iBodyGuard], PEDMOVEBLENDRATIO_RUN)
IF NOT bGuardAttendingTarget
AND NOT IS_PED_IN_ANY_VEHICLE(piBodyGuard[iBodyGuard])
OPEN_SEQUENCE_TASK(seqIndex)
IF IS_PED_INJURED(piTarget)
TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@hotel@", "alert_gunshot", NORMAL_BLEND_IN, SLOW_BLEND_OUT, 1250)
TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), 3000, FALSE, TRUE)
TASK_AIM_GUN_AT_ENTITY(NULL, PLAYER_PED_ID(), -1)
ELSE
TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@hotel@", "alert_gunshot", NORMAL_BLEND_IN, SLOW_BLEND_OUT, 700)
TASK_FOLLOW_TO_OFFSET_OF_ENTITY(NULL, piTarget, << 1.5, 0, 0 >>, PEDMOVEBLENDRATIO_RUN)
ENDIF
CLOSE_SEQUENCE_TASK(seqIndex)
bGuardAttendingTarget = TRUE
PRINTLN("OJASHOTEL - BodyGuard[", iBodyGuard, " attending target")
ELSE
VECTOR vWheelPos
VECTOR vLimoCoords
IF DOES_ENTITY_EXIST(viTargetCar)
AND IS_VEHICLE_DRIVEABLE(viTargetCar)
vWheelPos = GET_WORLD_POSITION_OF_ENTITY_BONE(viTargetCar, GET_ENTITY_BONE_INDEX_BY_NAME(viTargetCar, "wheel_lr") )
vLimoCoords = GET_ENTITY_COORDS(viTargetCar)
vLimoCoords = vWheelPos - vLimoCoords
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_VEHICLE(piBodyguard[iBodyGuard], viTargetCar, vLimoCoords, 1.5)
PRINTLN("OJASHOTEL - BodyGuard found defensive area position - 1.5 m")
ELSE
PRINTLN("Unable to set ped_defensive_sphere_for ped")
ENDIF
OPEN_SEQUENCE_TASK(seqIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
IF IS_PED_INJURED(piTarget)
AND NOT ARE_VECTORS_EQUAL(NULL_VECTOR(), vWheelPos)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vWheelPos, GET_RANDOM_COORDINATE(), PEDMOVEBLENDRATIO_RUN, FALSE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, vWheelPos, -1, FALSE, SLOW_BLEND_DURATION, FALSE, FALSE, NULL, TRUE)
PRINTLN("OJASHOTEL - BodyGuard[", iBodyGuard, " seeking cover to coords")
ELSE
TASK_AIM_GUN_AT_COORD(NULL, GET_RANDOM_COORDINATE(), 1500, TRUE)
IF NOT IS_ENTITY_DEAD(piTarget)
TASK_FOLLOW_TO_OFFSET_OF_ENTITY(NULL, piTarget, << 0, -1.5, 0 >>, PEDMOVEBLENDRATIO_RUN)
ENDIF
ENDIF
CLOSE_SEQUENCE_TASK(seqIndex)
ENDIF
IF NOT IS_ENTITY_DEAD(piBodyguard[iBodyGuard])
TASK_PERFORM_SEQUENCE(piBodyguard[iBodyGuard], seqIndex)
ENDIF
CLEAR_SEQUENCE_TASK(seqIndex)
ENDIF
ENDIF
BodyGuardState[iBodyGuard] = BS_ALERTED2
PRINTLN("OJASHOTEL - BodyGuardState[", iBodyGuard, "] = BS_ALERTED2")
BREAK
CASE BS_ALERTED2
IF NOT IS_ENTITY_DEAD(piBodyguard[iBodyGuard])
IF IS_ENTITY_PLAYING_ANIM(piBodyguard[iBodyGuard], "oddjobs@assassinate@hotel@", "enter")
fAnimTime = GET_ENTITY_ANIM_CURRENT_TIME(piBodyguard[iBodyGuard], "oddjobs@assassinate@hotel@", "enter")
PRINTLN("fAnimTime = ", fAnimTime)
IF fAnimTime < 0.5
SET_ENTITY_ANIM_SPEED(piBodyguard[iBodyGuard], "oddjobs@assassinate@hotel@", "enter", 3.5)
ELSE
SET_ENTITY_ANIM_SPEED(piBodyguard[iBodyGuard], "oddjobs@assassinate@hotel@", "enter", 1.0)
ENDIF
ENDIF
ENDIF
//note that in UPDATE_PED_STATES() that PRF_BlockWeaponFire is being called every frame so that the ped doesnt try to fire since he has a combat task (but we want him to seek cover
BREAK
CASE BS_PANIC
IF iBodyGuard = 0
bodyGuardVehicle = viTargetCar
ELIF iBodyGuard = 1
bodyGuardVehicle = viEscortCar
ENDIF
IF NOT IS_PED_INJURED(piTarget)
IF NOT IS_PED_INJURED(piBodyguard[iBodyGuard])
IF IS_PED_IN_ANY_VEHICLE(piTarget)
TASK_COMBAT_PED(piBodyguard[iBodyGuard], Player)
ELSE
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(piBodyguard[iBodyGuard], piTarget, PLAYER_PED_ID(), PEDMOVEBLENDRATIO_SPRINT, TRUE, 0.005)
ENDIF
ENDIF
BodyGuardState[iBodyGuard] = BS_ATTACKING
PRINTLN("BodyGuard[", iBodyGuard, "] = BS_ATTACKING - target dead")
ELSE
IF IS_VEHICLE_DRIVEABLE(bodyGuardVehicle)
IF GET_ENTITY_SPEED(bodyGuardVehicle) < 5.0
EXIT_VEHICLE_AND_ATTACK_PLAYER(piBodyguard[iBodyGuard])
BodyGuardState[iBodyGuard] = BS_ATTACKING
PRINTLN("BodyGuard[", iBodyGuard, "] = BS_ATTACKING1")
ELSE
IF GET_SCRIPT_TASK_STATUS(piBodyguard[iBodyGuard], SCRIPT_TASK_COMBAT) != PERFORMING_TASK
TASK_COMBAT_PED(piBodyguard[iBodyGuard], Player)
PRINTLN("BodyGuard[", iBodyGuard, "] - TASK_COMBAT_PED2")
ENDIF
ENDIF
ELSE
EXIT_VEHICLE_AND_ATTACK_PLAYER(piBodyguard[iBodyGuard])
BodyGuardState[iBodyGuard] = BS_ATTACKING
PRINTLN("BodyGuard[", iBodyGuard, "] = BS_ATTACKING - vehicle undriveable")
ENDIF
ENDIF
BREAK
CASE BS_ATTACKING
//ped has been tasked to attack on foot at this point
PLAY_GUARD_PANIC_LINE(piBodyguard[iBodyGuard])
PLAY_TARGET_DEAD_LINE(piBodyguard[iBodyGuard])
BREAK
ENDSWITCH
/////// ALWAYS RUN THESE PANIC CHECKS
IF NOT bPanicking
// AND NOT IS_ENTITY_DEAD(piTarget)
IF bAlerted
IF BodyGuardState[iBodyGuard] <> BS_ALERTED
AND BodyGuardState[iBodyGuard] <> BS_ALERTED2
BodyGuardState[iBodyGuard] = BS_ALERTED
PRINTLN("OJASHOTEL - BodyGuardState[ ", iBodyGuard, "] = BS_ALERTED")
ENDIF
ELSE
IF HAS_PLAYER_AGGROED_HOTEL_PED(piBodyguard[iBodyGuard])
bPanicking = TRUE
PRINTLN("PLAYER AGGROED BODYGUARD!")
ENDIF
ENDIF
ELSE
// IF BodyGuardState[iBodyGuard] < BS_RIDE_IN_VEHICLE
// AND NOT bLeftHotel
IF BodyGuardState[iBodyGuard] < BS_PANIC
IF NOT IS_PED_INJURED(piBodyguard[iBodyGuard])
IF IS_PED_USING_ANY_SCENARIO(piBodyguard[iBodyGuard])
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(piBodyguard[iBodyGuard])
ENDIF
TASK_CLEAR_DEFENSIVE_AREA(piBodyguard[iBodyGuard])
SET_PED_COMBAT_MOVEMENT(piBodyguard[iBodyGuard], CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(piBodyguard[iBodyGuard], CA_AGGRESSIVE, TRUE)
ENDIF
BodyGuardState[iBodyGuard] = BS_PANIC
PRINTLN("BodyGuardState[", iBodyGuard, "] = BS_PANIC")
ENDIF
ENDIF
ENDPROC
//update the hotel timer at the bottom of the screen
PROC UPDATE_HOTEL_TIMER(INT& startTime, FLOAT& fPickupTime, BOOL& bTimerStarted, BOOL& bTimeExpired)
FLOAT fTimer
// Grab starting game time
IF NOT bTimerStarted
startTime = GET_GAME_TIMER()
PRINTLN("startTime = ", startTime)
fPickupTime = (fPickupTime/1000)
PRINTLN("OJASHOTEL - fPickupTime = ", fPickupTime)
IF NOT IS_TIMER_STARTED(tCheckoutTimer)
START_TIMER_NOW(tCheckoutTimer)
PRINTLN("STARTING TIMER - tCheckoutTimer")
ENDIF
bTimerStarted = TRUE
ENDIF
IF IS_TIMER_STARTED(tCheckoutTimer)
fTimer = GET_TIMER_IN_SECONDS(tCheckoutTimer)
// PRINTLN("fTimer = ", fTimer)
IF fTimer >= fPickupTime
bTimeExpired = TRUE
PRINTLN("bTimeExpired = TRUE")
ENDIF
ENDIF
iTimeRemaining = ROUND((fPickupTime - fTimer))
// PRINTLN("iTimeRemaining = ", iTimeRemaining)
iTimeRemaining = iTimeRemaining * 1000
IF iTimeRemaining < 63000
bDriveToLimo = TRUE
// PRINTLN("SETTING bDriveToLimo = TRUE")
ENDIF
IF iTimeRemaining < 65000
bTaxiLeave = TRUE
// PRINTLN("SETTING bTaxiLeave = TRUE")
ENDIF
IF iTimeRemaining < iGuardTimeToTellExtrasToLeave
bGuardsTellExtrasToLeave = TRUE
ENDIF
IF NOT REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\ASSASSINATION_MULTI")
bLoadedSoundSet = FALSE
ELSE
bLoadedSoundSet = TRUE
ENDIF
IF iTimeRemaining < 30000
bTriggerGuardWalk = TRUE
IF bLoadedSoundSet
IF IS_TIMER_STARTED(tBeepTimer)
IF GET_TIMER_IN_SECONDS(tBeepTimer) > 1
PLAY_SOUND_FRONTEND(-1, "ASSASSINATIONS_HOTEL_TIMER_COUNTDOWN", "ASSASSINATION_MULTI")
RESTART_TIMER_NOW(tBeepTimer)
PRINTLN("PLAYING BEEP")
ENDIF
ELSE
PLAY_SOUND_FRONTEND(-1, "ASSASSINATIONS_HOTEL_TIMER_COUNTDOWN", "ASSASSINATION_MULTI")
START_TIMER_NOW(tBeepTimer)
PRINTLN("STARTING TIMER - tBeepTimer - 01")
ENDIF
ENDIF
DRAW_GENERIC_TIMER(iTimeRemaining, "ASS_VA_TIMERED", 0, TIMER_STYLE_DONTUSEMILLISECONDS, -1,
PODIUMPOS_NONE, HUDORDER_DONTCARE, FALSE, HUD_COLOUR_RED)
ELSE
DRAW_GENERIC_TIMER(iTimeRemaining, "ASS_VA_TIMELEFT")
ENDIF
// DRAW_CLOCK("ASS_VA_TIMELEFT", TRUE, iWarningRedTimeHours, iWarningRedTimeMinutes)
ENDPROC
//checks to see if a vehicle has safely exited the hotel area and reached the street
FUNC BOOL IS_CAR_AT_STREET(VEHICLE_INDEX vehToCheck, FLOAT fDistToCheck)
IF DOES_ENTITY_EXIST(vehToCheck)
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehToCheck, << -1217.4419, -281.5099, 36.7495 >>) <= fDistToCheck
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_GUARDS_IN_VEHICLE()
IF DOES_ENTITY_EXIST(piLimoGuard[0]) AND DOES_ENTITY_EXIST(piLimoGuard[1])
AND NOT IS_PED_INJURED(piLimoGuard[0]) AND NOT IS_PED_INJURED(piLimoGuard[1])
IF IS_PED_IN_VEHICLE(piLimoGuard[0], viTargetCar) AND IS_PED_IN_VEHICLE(piLimoGuard[1], viTargetCar)
PRINTLN("GUARDS ARE IN VEHICLE, BRING OUT THE TARGET")
RETURN TRUE
ELSE
PRINTLN("GUARDS ARE NOT IN VEHICLE")
ENDIF
ELSE
PRINTLN("GUARDS DO NOT EXIST OR ARE INJURED")
ENDIF
RETURN FALSE
ENDFUNC
PROC CHECK_FOR_PLAYER_BLOCKING_WITH_VEHICLES()
VEHICLE_INDEX vehTempVehicle
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehTempVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// PRINTLN("PLAYER IS IN A VEHICLE")
ENDIF
IF DOES_ENTITY_EXIST(vehTempVehicle)
IF IS_ENTITY_IN_ANGLED_AREA(vehTempVehicle, << -1214.517, -158.910, -39.165 >>, << -1243.589, -238.784, 39.165 >>, 15.000, FALSE, FALSE)
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehTempVehicle)
// PRINTLN("VEHICLE IS IN ANGLED AREA")
IF GET_ENTITY_SPEED(vehTempVehicle) <= 0.5
IF NOT IS_TIMER_STARTED(tBlockingTimer)
START_TIMER_NOW(tBlockingTimer)
// PRINTLN("STARTING TIMER NOW")
ENDIF
ELSE
IF IS_TIMER_STARTED(tBlockingTimer)
RESTART_TIMER_NOW(tBlockingTimer)
// PRINTLN("PLAYER IS MOVING: RE-STARTING TIMER NOW")
ENDIF
ENDIF
IF IS_TIMER_STARTED(tBlockingTimer)
IF GET_TIMER_IN_SECONDS(tBlockingTimer) > 10.0
PRINTLN("FAILING: PLAYER HAS A VEHICLE IN ANGLED AREA AND IT SEEMS TO BE STOPPED")
SET_MISSION_FAILED(FT_BLOWN_COVER)
ENDIF
ENDIF
ELSE
IF IS_TIMER_STARTED(tBlockingTimer)
RESTART_TIMER_NOW(tBlockingTimer)
// PRINTLN("PLAYER LEFT AREA: RE-STARTING TIMER NOW")
ENDIF
// PRINTLN("VEHICLE IS NOT IN ANGLED AREA")
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL HAS_ENDING_CELL_PHONE_CALL_COMPLETED()
// IF NOT bPlayedCellPhoneCall
// SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
// IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
//// SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
//// PRINTLN("SETTING FLAG - AllowScoreAndRadio")
// ENDIF
// ENDIF
IF bPrepareLostCue
TRIGGER_MUSIC_EVENT("ASS1_LOST")
PRINTLN("TRIGGERING MUSIC - ASS1_LOST")
bTriggeredLastCue = TRUE
ELSE
PRINTLN("UNABLE TO PREPARE MUSIC CUE - ASS1_LOST")
ENDIF
CLEANUP_PEDS()
// ADD_PED_FOR_DIALOGUE(hotelConv, 3, NULL, "LESTER")
//
// ADD_NEXT_MESSAGE_TO_PREVIOUS_BRIEFS(TRUE)
// PLAYER_CALL_CHAR_CELLPHONE(hotelConv, CHAR_LESTER, "OJASAUD", "OJAS_HOTEL_C", CONV_MISSION_CALL)
// PRINTLN("CELL PHONE CALL")
// bPlayedCellPhoneCall = TRUE
// ENDIF
//
// IF bPlayedCellPhoneCall AND HAS_CELLPHONE_CALL_FINISHED()
PRINTLN("RETURNING TRUE - HAS_ENDING_CELL_PHONE_CALL_COMPLETED")
RETURN TRUE
// IF DOES_BLIP_EXIST(blipRadius)
// REMOVE_BLIP(blipRadius)
// PRINTLN("REMOVING blipRadius")
// ENDIF
// IF bPrepareLostCue
// TRIGGER_MUSIC_EVENT("ASS1_LOST")
// PRINTLN("TRIGGERING MUSIC - ASS1_LOST - LATE")
// bTriggeredLastCue = TRUE
// ELSE
// PRINTLN("UNABLE TO PREPARE MUSIC CUE - ASS1_LOST - LATE")
// IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
// IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// TRIGGER_MUSIC_EVENT("ASS1_STOP")
// PRINTLN("TRIGGERING MUSIC - ASS1_STOP")
// bTriggeredLastCue = TRUE
// ENDIF
// ENDIF
// ENDIF
//
// ELSE
// PRINTLN("WAITING FOR CELL PHONE CALL TO FINISH")
// ENDIF
// RETURN FALSE
ENDFUNC
PROC DO_STAGE_INTRO_CUTSCENE()
SWITCH iStageNum
CASE 0
REQUEST_CUTSCENE("ASS_INT_2_ALT1")
REQUEST_MODEL(IG_LESTERCREST)
REQUEST_MODEL(PROP_CS_WALKING_STICK)
REQUEST_ANIM_DICT("oddjobs@assassinate@hotel@leadin")
REQUEST_ANIM_DICT("oddjobs@assassinate@hotel@leaning@")
REQUEST_CLIP_SET("move_lester_CaneUp")
//to fix Bug 1173621 - (3/12/13) - MB
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
IF HAS_MODEL_LOADED(IG_LESTERCREST)
AND HAS_MODEL_LOADED(PROP_CS_WALKING_STICK)
AND HAS_ANIM_DICT_LOADED("oddjobs@assassinate@hotel@leadin")
AND HAS_ANIM_DICT_LOADED("oddjobs@assassinate@hotel@leaning@")
AND HAS_CLIP_SET_LOADED("move_lester_CaneUp")
iStageNum ++
PRINTLN("DO_STAGE_INTRO_CUTSCENE, iStageNum = ", iStageNum)
ELSE
PRINTLN("Requesting model for Lester and his walking stick piLester for Cutscene")
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE 1
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
ODDJOB_ENTER_CUTSCENE(SPC_REMOVE_FIRES|SPC_REMOVE_EXPLOSIONS|SPC_REMOVE_PROJECTILES)
// Do stuff here
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-1514.611450,-927.466675,7.133712>>, <<-1496.948120,-942.223999,16.187229>>, 30.000000, <<-1523.1742, -924.6732, 9.1221>>, 53.0177, TRUE, TRUE, TRUE, TRUE)
CLEAR_AREA(<< -1507.71497, -941.13135, 8.37286 >>, 10, TRUE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), vWaitingPosition)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fWaitingHeading)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
TASK_PLAY_ANIM(PLAYER_PED_ID(), "oddjobs@assassinate@hotel@leaning@", "idle_a", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_TURN_OFF_COLLISION)
IF NOT DOES_CAM_EXIST(camLeadIn01)
camLeadIn01 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCameraPosition01, vCameraRotation01, 42.203197, TRUE)
PRINTLN("CREATING CAMERA - camLeadIn01")
SHAKE_CAM(camLeadIn01, "HAND_SHAKE", 0.3)
ENDIF
IF NOT DOES_CAM_EXIST(camLeadIn02)
camLeadIn02 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCameraPosition02, vCameraRotation02, 42.203197, FALSE)
SET_CAM_ACTIVE_WITH_INTERP(camLeadIn02, camLeadIn01, 5000)
SHAKE_CAM(camLeadIn01, "HAND_SHAKE", 0.3)
ENDIF
RENDER_SCRIPT_CAMS(TRUE, FALSE)
IF IS_REPEAT_PLAY_ACTIVE()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
PRINTLN("REPEAT PLAY ACTIVE - FADING IN")
ENDIF
iStageNum ++
PRINTLN("DO_STAGE_INTRO_CUTSCENE, iStageNum = ", iStageNum)
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE 2
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "oddjobs@assassinate@hotel@leaning@", "idle_a")
IF NOT IS_TIMER_STARTED(tLeadinTimer)
START_TIMER_NOW(tLeadinTimer)
PRINTLN("STARTING TIMER - tLeadinTimer")
ENDIF
ENDIF
// IF HAS_MODEL_LOADED(prop_bench_08)
// IF NOT DOES_ENTITY_EXIST(oFailSafeBench)
// oFailSafeBench = CREATE_OBJECT(prop_bench_08, << -1510.1029, -947.7194, 8.2332 >>)
// SET_ENTITY_HEADING(oFailSafeBench, 142.29)
// SET_ENTITY_COLLISION(oFailSafeBench, FALSE)
// ENDIF
// ENDIF
IF IS_TIMER_STARTED(tLeadinTimer)
IF GET_TIMER_IN_SECONDS(tLeadinTimer) > 6.0
iStageNum ++
PRINTLN("DO_STAGE_INTRO_CUTSCENE, iStageNum = ", iStageNum)
ENDIF
ENDIF
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE 3
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
iStageNum ++
PRINTLN("DO_STAGE_INTRO_CUTSCENE, iStageNum = ", iStageNum)
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE 4
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(piLester, "Lester", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, IG_LESTERCREST)
PRINTLN("REGISTERING LESTER FOR CUTSCENE")
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "WalkingStick_Lester", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_CS_WALKING_STICK)
PRINTLN("REGISTERING LESTER'S CANE")
START_CUTSCENE()
//to fix bug 1528120 - Clear player wanted level
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
// FADE_IN()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iStageNum ++
PRINTLN("DO_STAGE_INTRO_CUTSCENE, iStageNum = ", iStageNum)
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE 5
IF IS_CUTSCENE_PLAYING()
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
iStageNum ++
PRINTLN("DO_STAGE_INTRO_CUTSCENE, iStageNum = ", iStageNum)
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE 6
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
IF NOT DOES_ENTITY_EXIST(piLester)
// PRINTLN("piLester DOES NOT EXIST")
IF DOES_CUTSCENE_ENTITY_EXIST("Lester")
// PRINTLN("CUTSCENE ENTITY - Lester EXISTS")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lester")) //, IG_LESTERCREST))
piLester = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lester"))
PRINTLN("CREATING PED - piLester")
// ELSE
// PRINTLN("NOT FINDING LESTER")
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(LesterCane)
IF DOES_CUTSCENE_ENTITY_EXIST("WalkingStick_Lester")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("WalkingStick_Lester"))
LesterCane = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("WalkingStick_Lester")
PRINTLN("CREATING LESTER'S CANE")
ENDIF
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
// Do other stuff here
ENDIF
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lester"))
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lester") //, IG_LESTERCREST)
IF DOES_ENTITY_EXIST(piLester) AND NOT IS_PED_INJURED(piLester)
SET_ENTITY_COORDS(piLester, << -1509.458, -948.195, 7.750 >>)
SET_ENTITY_HEADING(piLester, -11.000)
TASK_PLAY_ANIM(piLester, "oddjobs@assassinate@hotel@leadin", "lester_leadin", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0, FALSE, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(piLester)
PRINTLN("TASKING LESTER TO PLAY IDLE ANIMATION")
ELSE
PRINTLN("LESTER DOES NOT EXIST")
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lester"))
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("WalkingStick_Lester")
IF DOES_ENTITY_EXIST(piLester)
AND NOT IS_PED_INJURED(piLester)
// re-attach the cane to his hand at an angle that looks good when he walks away
ATTACH_ENTITY_TO_ENTITY(LesterCane, piLester, GET_PED_BONE_INDEX(piLester, BONETAG_PH_R_HAND), << 0,0,0 >>, << 0,0,0 >>)
ENDIF
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
AND NOT IS_CUTSCENE_PLAYING()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF NOT IS_PED_INJURED(piLester)
SET_ENTITY_PROOFS(piLester, FALSE, FALSE, FALSE, FALSE, FALSE)
SET_PED_CAN_RAGDOLL(piLester, TRUE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
IF IS_SCREEN_FADED_OUT()
WAIT(0)
DO_SCREEN_FADE_IN(500)
ENDIF
ODDJOB_EXIT_CUTSCENE()
iStageNum ++
PRINTLN("DO_STAGE_INTRO_CUTSCENE, iStageNum = ", iStageNum)
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE 7
RESTART_TIMER_NOW(tLesterTimer)
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_INIT
PRINTLN("GOING TO STATE - STAGE_INIT")
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_PLAYER_ABANDON_MISSION()
VECTOR vPlayerPos
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
bResetAbandonCheck = TRUE
EXIT
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF bResetAbandonCheck
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
fToHotelDistance = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vNewBlipPosition)
PRINTLN("RESET: HOTEL DISTANCE = ", fToHotelDistance)
bResetAbandonCheck = FALSE
ENDIF
ELSE
IF fToHotelDistance = 0
fToHotelDistance = VDIST(<<-1510.2909, -946.9932, 8.2780>>, vNewBlipPosition)
PRINTLN("HOTEL DISTANCE = ", fToHotelDistance)
ENDIF
ENDIF
IF VDIST(vPlayerPos, vNewBlipPosition) > (fToHotelDistance + 400)
PRINTLN("FAILING - MISSION ABANDONED")
SET_MISSION_FAILED(FT_ABANDONED)
ELIF VDIST(vPlayerPos, vNewBlipPosition) > (fToHotelDistance + 200)
IF NOT bGaveAbandondedWarning
PRINT_NOW("ASS_VA_RHOTEL", DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("bGaveAbandondedWarning = TRUE")
bGaveAbandondedWarning = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handle blip behavior in first stage
PROC DO_STAGE_GET_TO_HOTEL()
VEHICLE_INDEX tempVeh
SWITCH iStageNum
// do wanted checks immediately
CASE 0
FADE_IN()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "assassin_hotel_go_to_hotel")
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
PRINT_NOW("ASS_VA_LOSECOPS", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
CLEAR_AREA_OF_VEHICLES(<< -1220.57, -185.96, 38.40 >>, 50) //area around where the limo pulls up
iStageNum ++
BREAK
//create blip for hotel once player is not wanted
CASE 1
HANDLE_PLAYER_ABANDON_MISSION()
IF NOT DOES_ENTITY_EXIST(viReplayVehicle)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
tempVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF GET_PED_IN_VEHICLE_SEAT(tempVeh, VS_DRIVER) = 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
ENDIF
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF NOT IS_PLAYER_IN_RANGE_OF_HOTEL()
IF NOT DOES_BLIP_EXIST(bHotelBlip)
bHotelBlip = CREATE_BLIP_FOR_COORD(vNewBlipPosition, TRUE)
SET_BLIP_NAME_FROM_TEXT_FILE(bHotelBlip, "ASS_VA_DESTBLIP")
//if the player hails a taxi it will drop them off in front of the hotel
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(bHotelBlip, <<-1234.3065, -250.6783, 38.2238>>, 28.9140)
IF NOT bObjectivePrinted
PRINT_NOW("ASS_VA_GOHOTEL", DEFAULT_GOD_TEXT_TIME, 1)
bObjectivePrinted = TRUE
ELSE
IF IS_THIS_PRINT_BEING_DISPLAYED("ASS_VA_LOSECOPS")
CLEAR_PRINTS()
ENDIF
ENDIF
ENDIF
ELSE
IF STREAMVOL_HAS_LOADED(svIntroCutscene)
AND ARE_MODELS_LOADED_FOR_GUARDS()
CLEANUP_DEST_BLIPS()
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_GUARD_CUTSCENE
PRINTLN("OJASHOTEL - MainStage = STAGE_GUARD_CUTSCENE")
ENDIF
ENDIF
ELSE
IF NOT IS_PLAYER_IN_RANGE_OF_HOTEL()
//remove destination blip and tell player to lose cops again
REMOVE_BLIP_AND_PRINT_OBJECTIVE_MSG_IF_WANTED(bHotelBlip, "ASS_VA_LOSECOPS")
ELSE
//otherwise fail the mission for being wanted near the hotel
PRINTLN("OJASHOTEL - FAILING THE MISSION BECAUSE PLAYER IS WANTED NEAR THE HOTEL PRIOR TO TRIGGERING INTRO CUTSCENE")
SET_MISSION_FAILED(FT_BLOWN_COVER_WANTED)
ENDIF
ENDIF
HANDLE_STREAMVOL_AND_GUARD_MODEL_LOADING_UNLOADING()
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Handle cutscene of guards pulling up to the hotel when player arrives
PROC DO_STAGE_GUARD_CUTSCENE()
SWITCH iStageNum
CASE 0
//bring car to a stop gracefully or wait until player isnt ragdolling to enter the cutscene
IF IS_PLAYER_READY_FOR_ASSASSINATION_CUTSCENE() OR bPlayerIsInFlyingVehicle
AND STREAMVOL_HAS_LOADED(svIntroCutscene)
//clear area around hotel and create limo and limo guards
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-1248.397583,-183.366013,37.728809>>, <<-1216.436768,-196.872726,44.075413>>, 59.250000, vCheckpointRetryPosition, fCheckpointRetryHeading)
CLEAR_AREA_OF_VEHICLES(<< -1220.57, -185.96, 38.40 >>, 50) //area around where the limo pulls up
CLEAR_AREA_OF_PROJECTILES(<< -1220.57, -185.96, 38.40 >>, 50)
CREATE_TARGET_CAR()
CREATE_CUTSCENE_PEDS()
IF NOT IS_ENTITY_DEAD(viTargetCar)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
START_PLAYBACK_RECORDED_VEHICLE(viTargetCar, 107, "ASSOJva")
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(viTargetCar, 2500)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
SET_VEH_RADIO_STATION(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), "OFF")
ENDIF
ENDIF
iStageNum ++
ELSE
IF STREAMVOL_HAS_LOADED(svIntroCutscene)
PRINTLN("STREAMVOL HAS LOADED")
ELSE
PRINTLN("STREAMVOL HAS NOT LOADED")
ENDIF
ENDIF
BREAK
CASE 1
IF HAS_INTRO_CUTSCENE_FINISHED()
//re-initialize iCutsceneStage variable for Kill Camera
iCutsceneStage = 0
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
REMOVE_STREAMVOL_FOR_INTRO_CUTSCENE()
INITIALIZE_NEXT_STAGE()
PRINTLN("OJASHOTEL - MainStage = STAGE_PLANT_BOMB")
MainStage = STAGE_PLANT_BOMB
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Allow the player to place a bomb on the target's vehicle if they arrive before the target exits the hotel
PROC DO_STAGE_PLANT_BOMB()
// IF IS_VEHICLE_BLOCKING_ANY_AIRLOCK(6.0)
// PRINTLN("GOING TO FAIL FOR BLOCKING AIRLOCK")
// FAIL_MISSION_FOR_CLOSE_VEHICLE()
// ENDIF
SWITCH iStageNum
//wait for player to plant a bomb on the limo
CASE 0
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "assassin_hotel_plan_attack")
//re-enable wanted as an aggro check
CLEAR_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
SET_VEHICLE_ENGINE_ON(viTargetCar, FALSE, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(viReplayVehicle) AND NOT IS_ENTITY_DEAD(viReplayVehicle)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(viReplayVehicle)
PRINTLN("OVERRIDING CHECKPOINT VEHICLE IF THE PLAYER WAS IN A VEHICLE BUT NOT AT CHECKPOINT")
ENDIF
ENDIF
ENDIF
//create motorcade peds and peds guarding airlock door positions
CREATE_MOTORCADE_ACTORS_AND_VEHICLE()
CREATE_LIMO_GUARDS()
// CREATE_DOOR_GUARDS()
TRIGGER_MUSIC_EVENT("ASS1_START")
PRINTLN("TRIGGERING MUSIC - ASS1_START")
//don't check this bit until the player has been warned previously or until guards are ready to leave their posts (DO_ADDITIONAL_HOTEL_PANIC_CHECKS should cover shotnear)
//this will allow the player to safely plant a bomb on the targets vehicle
SET_BIT(aggroArgs.iBitFieldDontCheck, ENUM_TO_INT(EAggro_ShotNear))
// //store this number to check if bombs have been planted later in the script
// iBombCount = GET_AMMO_IN_PED_WEAPON(Player, WEAPONTYPE_STICKYBOMB)
PRINT_NOW("ASS_VA_PLANT", DEFAULT_GOD_TEXT_TIME, 1)
iStageNum++
BREAK
CASE 1
//60% of time has passed - start telling the guards to exit the hotel and guard their posts
IF bTriggerGuardWalk
IF NOT IS_NON_SCRIPT_CREATED_VEHICLE_IN_HOTEL_AREA(viCarThatTriggeredAlert)
AND NOT DID_PLAYER_BLOCK_ALLEY_WITH_A_PARKED_CAR(viLastDriven[0], bPlayerParkedCarInAlley)
AND NOT DID_PLAYER_BLOCK_ALLEY_WITH_A_PARKED_CAR(viLastDriven[1], bPlayerParkedCarInAlley)
AND NOT DID_PLAYER_BLOCK_ALLEY_WITH_A_PARKED_CAR(viLastDriven[2], bPlayerParkedCarInAlley)
SETTIMERA(0)
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_GUARDS_GO_TO_POSTS
PRINTLN("OJASHOTEL - MainStage = STAGE_GUARDS_GO_TO_POSTS")
ELSE
PRINTLN("VEHICLES MUST BE IN THE AREA")
FAIL_MISSION_FOR_CLOSE_VEHICLE()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Tell the guards to walk to their guardposts
PROC DO_STAGE_GUARDS_GO_TO_POSTS()
SWITCH iStageNum
CASE 0
IF NOT bInPursuit
CLEAR_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_ShotNear) //re-allow all aggro checks
//Tell guards to enter the limo
TASK_LIMO_GUARDS_TO_ENTER_VEHICLES()
SETTIMERA(0)
iStageNum++
ENDIF
BREAK
CASE 1
//only advance to the next stage once the timer expires and we know that the player hasn't parked their vehicle close enough to fail the mission
IF bHotelTimerExpired
AND NOT bFailMissionForCloseVehicle
AND ARE_GUARDS_IN_VEHICLE()
AND ARE_MODELS_LOADED_FOR_TARGET()
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_TARGET_LEAVE_LOBBY
PRINTLN("OJASHOTEL - MainStage = STAGE_TARGET_LEAVE_LOBBY")
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: have the target and limo guards walk to the limo
PROC DO_STAGE_TARGET_LEAVE_LOBBY()
//remove any existing blips
CLEANUP_PED_BLIPS(FALSE)
//create and blip target, set his update loop to enter the vehicle, and task player to kill him
CREATE_TARGET()
CREATE_BODYGUARDS()
//release models now that they are no longer needed
CLEANUP_EXTRAS()
UNLOAD_GUARD_MODELS()
PRINT_NOW("ASS_VA_KILL", DEFAULT_GOD_TEXT_TIME, -1)
// //check to see if there is undetonated C4 that the player planted so we can properly display help messages to explain how to detonate later
// IF GET_AMMO_IN_PED_WEAPON(Player, WEAPONTYPE_STICKYBOMB) < iBombCount
// IF IS_PROJECTILE_TYPE_IN_AREA(<< -1298.6843, -324.0442, -35.5780 >>, << -1113.3724, -46.1583, 55.6090 >>, WEAPONTYPE_STICKYBOMB)
// bPlantMsg = TRUE
// bPlayerHasPlantedBomb = TRUE
// ENDIF
// ENDIF
SETTIMERA(0)
bTargetLeaving = TRUE
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_ENTER_LIMO
PRINTLN("OJASHOTEL - MainStage = STAGE_ENTER_LIMO")
ENDPROC
/// PURPOSE: Target is escorted to the limo by armed security
PROC DO_STAGE_ENTER_LIMO()
SWITCH iStageNum
CASE 0
//make sure the driver, target, and limo are alive/driveable before leaving the hotel
//otherwise have the surviving peds exit the vehicle, attack the player, and have the target flee on foot
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF IS_TARGET_IN_LIMO()
IF NOT IS_PED_INJURED(piLimoGuard[0]) // Driver ped
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
IF IS_PED_IN_VEHICLE(piLimoGuard[0], viTargetCar)
bLeaveInLimo = TRUE
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_LEAVE_HOTEL
PRINTLN("OJASHOTEL - MainStage = STAGE_LEAVE_HOTEL")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//remind the player how to use stickybombs if they have attached any to the target's car.
// REMIND_PLAYER_HOW_TO_USE_STICKYBOMBS()
ENDPROC
/// PURPOSE: Target drives out of hotel area
PROC DO_STAGE_LEAVE_HOTEL()
IF NOT bLimoCruisingStreets
IF DOES_ENTITY_EXIST(viTargetCar)
IF IS_VEHICLE_DRIVEABLE(viTargetCar)
SET_VEHICLE_DOORS_LOCKED(viTargetCar, VEHICLELOCK_LOCKOUT_PLAYER_ONLY) // To prevent the player from jacking the target car
IF IS_CAR_AT_STREET(viTargetCar, 5)
// OR IS_TARGET_CAR_AT_PLAYER_CAR(5.0)
bLimoCruisingStreets = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bLimoStuck
IF IS_VEHICLE_STUCK(viTargetCar, 10000)
bLimoStuck = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Play a kill camera of the target
PROC DO_STAGE_KILL_CAM()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vAreaCoord01, vAreaCoord02, fAreaWidth, TRUE, FALSE)
PRINTLN("PLAYER IS IN ANGLED AREA")
bIsPlayerInHotelArea = TRUE
ELSE
PRINTLN("PLAYER IS NOT IN ANGLED AREA")
bIsPlayerInHotelArea = FALSE
ENDIF
IF DOES_BLIP_EXIST(bTargetBlip)
REMOVE_BLIP(bTargetBlip)
PRINTLN("REMOVING bTargetBlip IN DO_STAGE_KILL_CAM")
ENDIF
SET_WANTED_LEVEL_MULTIPLIER(0.5)
PRINTLN("SETTING WANTED MULTIPLIER TO 0.5")
IF bIsPlayerInHotelArea
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_LEAVE_AREA
PRINTLN("OJASHOTEL - MainStage = STAGE_LEAVE_AREA")
ELSE
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_EVADE_POLICE
PRINTLN("OJASHOTEL - MainStage = STAGE_EVADE_POLICE")
ENDIF
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
ENDPROC
/// PURPOSE: Target is escaping the player after having been alerted
PROC DO_STAGE_EVADE_POLICE()
// HANDLE_SPECIAL_CASE_AUDIO_CUE()
HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, hotelConv, "OJASAUD", "OJAS_HOCOM", CONV_PRIORITY_VERY_HIGH)
SWITCH iStageNum
CASE 0
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF NOT bPrintLoseWantedLevel
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_MESSAGE_BEING_DISPLAYED()
PRINTLN("EVADE POLICE - PLAYER IS WANTED")
PRINT_NOW("ASS_VA_LOSECOPS", DEFAULT_GOD_TEXT_TIME, 1)
iStageNum++
bPrintLoseWantedLevel = TRUE
ENDIF
ENDIF
ENDIF
ELIF GET_CLOSEST_GUARD() != NULL
IF NOT bPrintLastObjective
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_MESSAGE_BEING_DISPLAYED()
PRINT_NOW("ASS_VA_GO", DEFAULT_GOD_TEXT_TIME, -1)
PRINTLN("EVADE POLICE - LEAVE AREA")
iStageNum++
bPrintLastObjective = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
AND GET_CLOSEST_GUARD(125) = NULL
PRINTLN("FAIL SAFE: EVADE POLICE - GOING TO CASE 1")
iStageNum++
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
AND GET_CLOSEST_GUARD(125.0) = NULL //player has evaded all peds
HANDLE_SPECIAL_CASE_AUDIO_CUE()
CLEANUP_PEDS()
CLEANUP_PED_BLIPS()
CLEANUP_VEHICLES()
PRINTLN("EVADE POLICE - NO LONGER WANTED AND NOT GUARDS AROUND")
iStageNum++
ENDIF
BREAK
CASE 2
HANDLE_SPECIAL_CASE_AUDIO_CUE()
PRINTLN("EVADE POLICE - GOING TO STATE - STAGE_MISSION_PASSED")
MainStage = STAGE_MISSION_PASSED
BREAK
ENDSWITCH
ENDPROC
PROC DO_STAGE_LEAVE_AREA()
FLOAT fDistanceFromLocation
IF NOT bPrintLastObjective
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_NOW("ASS_VA_GO", DEFAULT_GOD_TEXT_TIME, -1)
bPrintLastObjective = TRUE
ENDIF
ENDIF
ENDIF
HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, hotelConv, "OJASAUD", "OJAS_HOCOM", CONV_PRIORITY_VERY_HIGH)
SWITCH iStageNum
CASE 0
PRINTLN("GOING TO STATE 1 IN DO_STAGE_LEAVE_AREA")
iStageNum++
BREAK
CASE 1
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
fDistanceFromLocation = GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCenterPoint)
IF fDistanceFromLocation > 155
AND GET_CLOSEST_GUARD() = NULL //player has evaded all peds
bLeftArea = TRUE
PRINTLN("bLeftArea = TRUE")
CLEANUP_PEDS()
iStageNum++
ELSE
//ensure the player cannot lose their wanted level if they haven't left the area
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
ENDIF
ENDIF
BREAK
CASE 2
// If we're not wanted, go ahead and make the phone call
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF GET_CLOSEST_GUARD() = NULL //player has evaded all peds
HANDLE_SPECIAL_CASE_AUDIO_CUE()
IF HAS_ENDING_CELL_PHONE_CALL_COMPLETED()
PRINTLN("GOING TO STATE - STAGE_MISSION_PASSED")
MainStage = STAGE_MISSION_PASSED
ENDIF
ENDIF
ELSE
// If we're wanted, go to a state and check until we lose it..
IF NOT bPrintLoseWantedLevel
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_MESSAGE_BEING_DISPLAYED()
PRINTLN("WE'RE WANTED - GO TO CASE 3")
PRINT_NOW("ASS_VA_LOSECOPS", DEFAULT_GOD_TEXT_TIME, 1)
iStageNum++
bPrintLoseWantedLevel = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
PRINTLN("WE'RE NO LONGER WANTED, GOING TO CASE 2")
iStageNum = 2
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC DO_STAGE_MISSION_PASSED()
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
Script_Passed()
ENDPROC
PROC TRIGGER_PANIC_IF_BOMB_IN_AIRLOCK_IF_NOT_ALREADY_PANICKED(VECTOR vecAngledAreaPoint1, VECTOR vecAngledAreaPoint2, FLOAT DistanceOfOppositeFace)
IF NOT bPanicking
IF IS_PROJECTILE_TYPE_IN_ANGLED_AREA(vecAngledAreaPoint1, vecAngledAreaPoint2, DistanceOfOppositeFace, WEAPONTYPE_STICKYBOMB)
bPanicking = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Handle all of the enemy ped loops - only check one ped per frame for performance reasons
PROC UPDATE_MISSION_PED_STATES()
INT idx
//check the target every frame
UPDATE_TARGET_STATE()
// IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piLimoGuard[0], Player)
// OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piLimoGuard[1], Player)
// OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piLimoGuard[2], Player)
// SCRIPT_ASSERT("DAMAGED A LIMO GUARD!")
// ELSE
// PRINTLN("PLAYER HAS NOT DAMAGED ANY LIMO GUARDS")
// ENDIF
//TODO - put the loops below into the update states so it isnt doing this every frame?
REPEAT NUM_LIMO_GUARDS idx
IF DOES_ENTITY_EXIST(piLimoGuard[idx])
IF bPanicking AND NOT bLeftArea
UPDATE_AI_PED_BLIP(piLimoGuard[idx], blipCombatLimoGuards[idx], -1, NULL, FALSE, FALSE, 150)
ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_ESCORT_PEDS idx
IF DOES_ENTITY_EXIST(piEscortPed[idx])
IF bPanicking AND NOT bLeftArea
UPDATE_AI_PED_BLIP(piEscortPed[idx], blipCombatEscort[idx], -1, NULL, FALSE, FALSE, 150)
ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_BODYGUARDS idx
IF DOES_ENTITY_EXIST(piBodyguard[idx])
IF bPanicking AND NOT bLeftArea
UPDATE_AI_PED_BLIP(piBodyguard[idx], blipBodyguard[idx], -1, NULL, FALSE, FALSE, 150)
ENDIF
IF NOT IS_PED_INJURED(piBodyguard[idx])
IF BodyGuardState[idx] = BS_ALERTED2
//constantly call this every time since the ped has been tasked to combat BS_ALERTED but we just want them to look like they are in cover, but not shoot
//this needs to be called here bcause UPDATE_BODYGUARD_STATE doesnt get called every frame (see later in this function)
SET_PED_RESET_FLAG(piBodyguard[idx], PRF_BlockWeaponFire, TRUE)
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF iFrameCountAsn = 0
UPDATE_BODYGUARD_STATE(0)
ELIF iFrameCountAsn = 1
UPDATE_BODYGUARD_STATE(1)
ELIF iFrameCountAsn = 2
IF MainStage >= STAGE_PLANT_BOMB
UPDATE_LIMO_GUARD_STATE(0)
ENDIF
ELIF iFrameCountAsn = 3
IF MainStage >= STAGE_PLANT_BOMB
UPDATE_LIMO_GUARD_STATE(1)
ENDIF
ELIF iFrameCountAsn = 4
IF MainStage >= STAGE_PLANT_BOMB
UPDATE_LIMO_GUARD_STATE(2)
TRIGGER_PANIC_IF_BOMB_IN_AIRLOCK_IF_NOT_ALREADY_PANICKED(<<-1222.557617,-173.747086,38.325413>>, <<-1220.101196,-169.053146,42.075413>>, 4.000000)
ENDIF
ELIF iFrameCountAsn = 5
UPDATE_ESCORT_STATE(0)
TRIGGER_PANIC_IF_BOMB_IN_AIRLOCK_IF_NOT_ALREADY_PANICKED(<<-1213.432251,-191.326141,38.325413>>, <<-1208.552856,-193.861816,42.075344>>, 4.000000)
ELIF iFrameCountAsn = 6
UPDATE_ESCORT_STATE(1)
TRIGGER_PANIC_IF_BOMB_IN_AIRLOCK_IF_NOT_ALREADY_PANICKED(<<-1219.140259,-202.312424,38.325344>>, <<-1214.269287,-204.903503,42.075344>>, 4.000000)
ENDIF
//increment it by one - reset it if it exceeds the checks
iFrameCountAsn ++
IF iFrameCountAsn > 6
iFrameCountAsn = 0
ENDIF
IF bPanicking
IF NOT IS_ENTITY_DEAD(piTarget)
SET_PED_RESET_FLAG(piTarget, PRF_PanicInVehicle, TRUE)
// PRINTLN("SETTING PANIC FLAG ON TARGET VIA PANIC CHECK")
ENDIF
ENDIF
ENDPROC
PROC UPDATE_HINT_CAMERAS()
IF DOES_ENTITY_EXIST(piTarget)
IF NOT IS_PED_INJURED(piTarget)
CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, piTarget)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles all ped update states
PROC UPDATE_PED_STATES()
//updates guard states and panic checks for the guards - throttles these to update one ped per frame for performance reasons
UPDATE_MISSION_PED_STATES()
IF NOT bAlerted
IF NOT bPanicking
//check for the player aggressively approaching the limo or setting off explosions around the hotel lobby
IF DO_ADDITIONAL_HOTEL_PANIC_CHECKS(failType)
bPanicking = TRUE
PRINTLN("bPanicking = TRUE VIA DO_ADDITIONAL_HOTEL_PANIC_CHECKS - UPDATE_PED_STATES")
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL CHECK_FOR_PED_SEEING_PLAYER()
INT idx
REPEAT NUM_LIMO_GUARDS idx
IF DOES_ENTITY_EXIST(piLimoGuard[idx]) AND NOT IS_ENTITY_DEAD(piLimoGuard[idx])
SET_PED_RESET_FLAG(piLimoGuard[idx], PRF_IgnoreTargetsCoverForLOS, TRUE)
IF CAN_PED_SEE_HATED_PED(piLimoGuard[idx], PLAYER_PED_ID())
PRINTLN("LIMO GUARD HAS SPOTTED THE PLAYER: ", idx)
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_ESCORT_PEDS idx
IF DOES_ENTITY_EXIST(piEscortPed[idx]) AND NOT IS_ENTITY_DEAD(piEscortPed[idx])
SET_PED_RESET_FLAG(piEscortPed[idx], PRF_IgnoreTargetsCoverForLOS, TRUE)
IF CAN_PED_SEE_HATED_PED(piEscortPed[idx], PLAYER_PED_ID())
PRINTLN("ESCORT GUARD HAS SPOTTED THE PLAYER: ", idx)
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_BODYGUARDS idx
IF DOES_ENTITY_EXIST(piBodyguard[idx]) AND NOT IS_ENTITY_DEAD(piBodyguard[idx])
SET_PED_RESET_FLAG(piBodyguard[idx], PRF_IgnoreTargetsCoverForLOS, TRUE)
IF CAN_PED_SEE_HATED_PED(piBodyguard[idx], PLAYER_PED_ID())
PRINTLN("BODY GUARD HAS SPOTTED THE PLAYER: ", idx)
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC PED_INDEX GRAB_ANY_GUARD()
PED_INDEX pedToSpeak
INT idx
REPEAT NUM_LIMO_GUARDS idx
IF DOES_ENTITY_EXIST(piLimoGuard[idx]) AND NOT IS_PED_INJURED(piLimoGuard[idx])
pedToSpeak = piLimoGuard[idx]
PRINTLN("FOUND PED TO SPEAK, LIMO GUARD INDEX = ", idx)
ENDIF
ENDREPEAT
IF pedToSpeak = NULL
REPEAT NUM_ESCORT_PEDS idx
IF DOES_ENTITY_EXIST(piEscortPed[idx]) AND NOT IS_PED_INJURED(piEscortPed[idx])
pedToSpeak = piEscortPed[idx]
PRINTLN("FOUND PED TO SPEAK, ESCORT GUARD INDEX = ", idx)
ENDIF
ENDREPEAT
ENDIF
IF pedToSpeak = NULL
REPEAT NUM_BODYGUARDS idx
IF DOES_ENTITY_EXIST(piBodyguard[idx]) AND NOT IS_PED_INJURED(piBodyguard[idx])
pedToSpeak = piBodyguard[idx]
PRINTLN("FOUND PED TO SPEAK, BODY GUARD INDEX = ", idx)
ENDIF
ENDREPEAT
ENDIF
RETURN pedToSpeak
ENDFUNC
PROC HANDLE_SNIPER_ATTACK_BUFFER()
// INT idx
PED_INDEX pedToSpeak
SWITCH iHandleSniperAttackStages
CASE 0
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ENTITY_DEAD(piLimoGuard[0])
TASK_CLEAR_LOOK_AT(piLimoGuard[0])
ENDIF
IF NOT IS_ENTITY_DEAD(piLimoGuard[1])
TASK_CLEAR_LOOK_AT(piLimoGuard[1])
ENDIF
pedToSpeak = GRAB_ANY_GUARD()
// Try playing initial dialgoue first here.
IF bPlayerUsedStickyBomb
IF NOT bPlayIntialDialogue
SETUP_PED_FOR_DIALOGUE(pedToSpeak, 3, "OJAvaGUARD")
IF CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_EXPLO", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING EXPLOSION CONVO")
bPlayIntialDialogue = TRUE
ENDIF
ENDIF
ELSE
IF NOT bTargetFleeing AND IS_PED_INJURED(piTarget)
IF NOT bPlayIntialDialogue
SETUP_PED_FOR_DIALOGUE(pedToSpeak, 3, "OJAvaGUARD")
IF CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_SNIPE", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING SNIPE CONVO IN SNIPER ATTACK BUFFER CASE 0")
bPlayIntialDialogue = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_TIMER_STARTED(tBufferTimer)
START_TIMER_NOW(tBufferTimer)
PRINTLN("STARTING TIMER - tBufferTimer")
ELSE
RESTART_TIMER_NOW(tBufferTimer)
PRINTLN("RESTARTING TIMER - tBufferTimer")
ENDIF
PRINTLN("iHandleSniperAttackStages = 1")
iHandleSniperAttackStages = 1
ENDIF
BREAK
//-------------------------------------------------------------------------------------------------------------------
CASE 1
PRINTLN("iHandleSniperAttackStages = 2")
iHandleSniperAttackStages = 2
BREAK
//-------------------------------------------------------------------------------------------------------------------
CASE 2
IF bPlayIntialDialogue OR NOT IS_PED_INJURED(piTarget)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT bPlayerUsedStickyBomb // Dialogue doesn't quite work with stick bomb kill
IF NOT bPlayedSearchDialogue
pedToSpeak = GRAB_ANY_GUARD()
SETUP_PED_FOR_DIALOGUE(pedToSpeak, 3, "OJAvaGUARD")
IF CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_LOOK", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING LOOK CONVO")
bPlayedSearchDialogue = TRUE
ENDIF
ELSE
IF NOT bTargetDeadLinePlayed
AND IS_PED_INJURED(piTarget)
pedToSpeak = GRAB_ANY_GUARD()
PLAY_TARGET_DEAD_LINE(pedToSpeak) //bTargetDeadLinePlayed = TRUE gets set inside this function
ENDIF
ENDIF
ENDIF
ELSE
IF bPlayerUsedStickyBomb
IF NOT bPlayIntialDialogue
SETUP_PED_FOR_DIALOGUE(pedToSpeak, 3, "OJAvaGUARD")
IF CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_EXPLO", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING EXPLOSION CONVO")
bPlayIntialDialogue = TRUE
ENDIF
ENDIF
ELSE
IF NOT bTargetFleeing
IF NOT bPlayIntialDialogue
SETUP_PED_FOR_DIALOGUE(pedToSpeak, 3, "OJAvaGUARD")
IF CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_SNIPE", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING SNIPE CONVO IN SNIPER ATTACK BUFFER CASE 2")
bPlayIntialDialogue = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// IF bAlertedSpecial
// fPanicTime = 22.0
//// PRINTLN("fPanicTime = 22.0")
// ELSE
// fPanicTime = 15.0
//// PRINTLN("fPanicTime = 15.0")
// ENDIF
IF IS_ENTITY_IN_SAFE_LOCATION(Player)
fPanicTime = 2.5
ELSE
fPanicTime = 5.0
ENDIF
IF IS_TIMER_STARTED(tBufferTimer)
IF (GET_TIMER_IN_SECONDS(tBufferTimer) > fPanicTime AND CHECK_FOR_PED_SEEING_PLAYER())
OR IS_PED_SHOOTING(PLAYER_PED_ID())
KILL_ANY_CONVERSATION()
// CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_SPOT", CONV_PRIORITY_VERY_HIGH) //moved this to the part where we trigger the score
IF NOT bPanicking
bPanicking = TRUE
bBufferHit = TRUE
PRINTLN("bPanicking = TRUE VIA - HANDLE_SNIPER_ATTACK_BUFFER")
ENDIF
bAlerted = FALSE
PRINTLN("bAlerted = FALSE")
ENDIF
ENDIF
BREAK
//-------------------------------------------------------------------------------------------------------------------
CASE 3
BREAK
ENDSWITCH
ENDPROC
PROC REMOVE_LIMO_GUARDS()
INT idx
REPEAT NUM_LIMO_GUARDS idx
IF DOES_ENTITY_EXIST(piLimoGuard[idx])
// DELETE_PED(piLimoGuard[idx])
SET_PED_AS_NO_LONGER_NEEDED(piLimoGuard[idx])
PRINTLN("SETTING NO LONGER NEEDED - LIMO PED: ", idx)
ENDIF
ENDREPEAT
ENDPROC
PROC REMOVE_TARGET_CAR()
IF DOES_ENTITY_EXIST(viTargetCar)
// DELETE_VEHICLE(viTargetCar)
SET_VEHICLE_AS_NO_LONGER_NEEDED(viTargetCar)
PRINTLN("SETTING viTargetCar as no longer needed!")
ENDIF
ENDPROC
PROC REMOVE_TARGET_AND_BLIP()
IF DOES_ENTITY_EXIST(piTarget)
// DELETE_PED(piTarget)
SET_PED_AS_NO_LONGER_NEEDED(piTarget)
PRINTLN("SETTING TARGET NO LONGER NEEDED")
ENDIF
IF DOES_BLIP_EXIST(bTargetBlip)
REMOVE_BLIP(bTargetBlip)
PRINTLN("REMOVING bTargetBlip")
ENDIF
ENDPROC
PROC REMOVE_BODYGUARDS()
INT idx
REPEAT NUM_BODYGUARDS idx
IF DOES_ENTITY_EXIST(piBodyguard[idx])
// DELETE_PED(piBodyguard[idx])
SET_PED_TO_LOAD_COVER(piBodyguard[idx], FALSE)
SET_PED_AS_NO_LONGER_NEEDED(piBodyguard[idx])
PRINTLN("SETTING piBodyguard[idx] No Longer Needed!")
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: Create the motorcade car and bike vehicles
PROC REMOVE_MOTORCADE_FOLLOW_CAR()
IF DOES_ENTITY_EXIST(viEscortCar)
// DELETE_VEHICLE(viEscortCar)
SET_VEHICLE_AS_NO_LONGER_NEEDED(viEscortCar)
PRINTLN("SETTING viEscortCar as no longer needed!")
ENDIF
ENDPROC
PROC REMOVE_MOTORCADE_PEDS()
INT tempInt
REPEAT NUM_ESCORT_PEDS tempInt
IF DOES_ENTITY_EXIST(piEscortPed[tempInt])
// DELETE_PED(piEscortPed[tempInt])
SET_PED_AS_NO_LONGER_NEEDED(piEscortPed[tempInt])
PRINTLN("SETTING piEscortPed[idx] No Longer Needed!")
ENDIF
ENDREPEAT
ENDPROC
PROC GO_TO_CHECKPOINT_1()
// If we're skipping to this stage load all that's needed or delete what's not.
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1510.1810, -946.9595, 8.2738>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 325.8271)
PRINTLN("REPOSITIONING PLAYER FOR GO_TO_CHECKPOINT_1")
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
// bDebugSkipping = TRUE
//limo pulling up to the hotel
REQUEST_VEHICLE_RECORDING(102, "ASSOJva")
//limo driving into the hotel
REQUEST_VEHICLE_RECORDING(107, "ASSOJva")
REQUEST_MODEL(FBI2)
INITIALIZE_NEXT_STAGE()
bHotelTimerStarted = FALSE
bHotelTimerExpired = FALSE
bTaxiLeave = FALSE
bDriveToLimo = FALSE
bAlerted = FALSE
bBufferHit = FALSE
bPlayerUsedSniperRifle = FALSE
bGaveAbandondedWarning = FALSE
REMOVE_LIMO_GUARDS()
REMOVE_TARGET_CAR()
REMOVE_TARGET_AND_BLIP()
REMOVE_BODYGUARDS()
REMOVE_MOTORCADE_FOLLOW_CAR()
REMOVE_MOTORCADE_PEDS()
iHandleSniperAttackStages = 0
// IF bFirstCheckpointSceneLoad
// bFirstCheckpointSceneLoad = FALSE
// ENDIF
iCutsceneStage = 0
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(102, "ASSOJva") //limo pulling up to the hotel lobby
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(107, "ASSOJva") //limo driving up to the hotel
OR NOT HAS_MODEL_LOADED(FBI2)
WAIT(0)
PRINTLN("P-SKIPPING: WAITING RECORDING TO LOAD")
ENDWHILE
bDoingPSkip = FALSE
ENDIF
#ENDIF
// HANDLE_REPLAY_WEAPON_EQUIP()
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
//fade in the game from the mission retry screen
FADE_IN()
PRINTLN("GOING TO STAGE - STAGE_GET_TO_HOTEL")
MainStage = STAGE_GET_TO_HOTEL
ENDPROC
PROC GO_TO_CHECKPOINT_2()
INT idx
// If we're skipping to this stage load all that's needed or delete what's not.
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1266.1729, -214.0011, 41.4459>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 310.0126)
PRINTLN("REPOSITIONING PLAYER FOR GO_TO_CHECKPOINT_2")
// bDebugSkipping = TRUE
CLEANUP_DEST_BLIPS()
//limo pulling up to the hotel
REQUEST_WAYPOINT_RECORDING("OJASva_101")
REQUEST_WAYPOINT_RECORDING("OJASva_101a")
REQUEST_WAYPOINT_RECORDING("OJASva_104")
INITIALIZE_NEXT_STAGE()
REMOVE_LIMO_GUARDS()
REMOVE_TARGET_CAR()
REMOVE_TARGET_AND_BLIP()
REMOVE_BODYGUARDS()
REMOVE_MOTORCADE_FOLLOW_CAR()
REMOVE_MOTORCADE_PEDS()
iCutsceneStage = 0
bHotelTimerStarted = FALSE
bHotelTimerExpired = FALSE
bTaxiLeave = FALSE
bDriveToLimo = FALSE
bLeaveInLimo = FALSE
bAlerted = FALSE
bBufferHit = FALSE
bPlayerUsedSniperRifle = FALSE
// bDoNotRunPanicCheck = FALSE
// bGaveSecondWarning = FALSE
bPanickedExtras = FALSE
bPlayedSearchDialogue = FALSE
bPlayIntialDialogue = FALSE
bAlertedSpecial = FALSE
bPrepareLostCue = FALSE
bTriggeredLastCue = FALSE
iHandleSniperAttackStages = 0
iGuardAimingState = 0
iTargetPanicLine = 0
fPanicTime = 0
bPanicking = FALSE
bInPursuit = FALSE
bTargetLeaving = FALSE
TargetState = TS_ENTER_LIMO
REPEAT NUM_LIMO_GUARDS idx
LimoGuardState[idx] = LGS_WALK_TO_POSTS
ENDREPEAT
REPEAT NUM_ESCORT_PEDS idx
EscortState[idx] = ES_WAITING
ENDREPEAT
REPEAT NUM_BODYGUARDS idx
BodyGuardState[idx] = BS_WALK_WITH_TARGET
ENDREPEAT
// IF bSecondCheckpointSceneLoad
// bSecondCheckpointSceneLoad = FALSE
// ENDIF
WHILE NOT ARE_MODELS_LOADED_FOR_GUARDS()
WAIT(0)
ENDWHILE
CLEAR_AREA_OF_VEHICLES(<< -1220.57, -185.96, 38.40 >>, 50) //area around where the limo pulls up
CREATE_TARGET_CAR()
CREATE_CUTSCENE_PEDS()
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_101") //limo pulling up to the hotel lobby
AND NOT GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_101a")
OR iExtraCreationStages < 2
CREATE_EXTRAS()
WAIT(0)
PRINTLN("P-SKIPPING: WAITING FOR SCENE TO LOAD")
ENDWHILE
bDoingPSkip = FALSE
ENDIF
#ENDIF
WHILE iExtraCreationStages < 2
CREATE_EXTRAS()
WAIT(0)
PRINTLN("P-SKIPPING: WAITING FOR SCENE TO LOAD")
ENDWHILE
CREATE_TARGET_CAR()
HANDLE_GUARD_CUTSCENE_SKIP(FALSE)
IF NOT IS_BIT_SET(g_replay.iReplayBits, ENUM_TO_INT(RB_REPLAY_SETUP_STARTED))
REMOVE_STREAMVOL_FOR_INTRO_CUTSCENE()
ENDIF
bPlayedTargetLine = FALSE
bTargetKillLinePlayed = FALSE
// HANDLE_REPLAY_WEAPON_EQUIP()
CLEAR_AREA_OF_VEHICLES(<< -1220.57, -185.96, 38.40 >>, 50)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
TRIGGER_MUSIC_EVENT("ASS1_RESTART1")
PRINTLN("TRIGGERING MUSIC - ASS1_RESTART1")
WHILE NOT ARE_MODELS_LOADED_FOR_GUARDS()
WAIT(0)
ENDWHILE
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
//fade in the game from the mission retry screen
MainStage = STAGE_PLANT_BOMB
PRINTLN("MainStage = STAGE_PLANT_BOMB")
FADE_IN()
ENDPROC
PROC PLACE_TARGET_IN_CAR()
IF DOES_ENTITY_EXIST(piTarget) AND DOES_ENTITY_EXIST(viTargetCar)
IF NOT IS_ENTITY_DEAD(piTarget) AND IS_VEHICLE_DRIVEABLE(viTargetCar)
SET_PED_INTO_VEHICLE(piTarget, viTargetCar, VS_BACK_LEFT)
PRINTLN("PLACING TARGET INTO CAR")
ENDIF
ENDIF
ENDPROC
PROC PLACE_BODYGUARD_IN_CAR()
IF DOES_ENTITY_EXIST(piBodyguard) AND DOES_ENTITY_EXIST(viTargetCar)
IF NOT IS_ENTITY_DEAD(piBodyguard) AND IS_VEHICLE_DRIVEABLE(viTargetCar)
SET_PED_INTO_VEHICLE(piBodyguard, viTargetCar, VS_BACK_RIGHT)
PRINTLN("PLACING BODYGUARD INTO CAR")
ENDIF
ENDIF
ENDPROC
PROC PLACE_ESCORTS_IN_CAR()
IF DOES_ENTITY_EXIST(piEscortPed[0]) AND DOES_ENTITY_EXIST(viEscortCar)
IF NOT IS_ENTITY_DEAD(piEscortPed[0]) AND IS_VEHICLE_DRIVEABLE(viEscortCar)
SET_PED_INTO_VEHICLE(piEscortPed[0], viEscortCar)
PRINTLN("SETTING ESCORT PED 0 INTO VEHICLE")
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(piEscortPed[1]) AND DOES_ENTITY_EXIST(viEscortCar)
IF NOT IS_ENTITY_DEAD(piEscortPed[1]) AND IS_VEHICLE_DRIVEABLE(viEscortCar)
SET_PED_INTO_VEHICLE(piEscortPed[1], viEscortCar, VS_FRONT_RIGHT)
PRINTLN("SETTING ESCORT PED 0 INTO VEHICLE")
ENDIF
ENDIF
ENDPROC
PROC PLACE_LIMO_GUARDS_IN_CAR()
IF DOES_ENTITY_EXIST(piLimoGuard[0]) AND NOT IS_ENTITY_DEAD(piLimoGuard[0])
AND DOES_ENTITY_EXIST(viTargetCar) AND IS_VEHICLE_DRIVEABLE(viTargetCar)
SET_PED_INTO_VEHICLE(piLimoGuard[0], viTargetCar, VS_DRIVER)
PRINTLN("SETTING piLimoGuard[0] INTO VEHICLE")
ENDIF
IF DOES_ENTITY_EXIST(piLimoGuard[1]) AND NOT IS_ENTITY_DEAD(piLimoGuard[1])
AND DOES_ENTITY_EXIST(viTargetCar) AND IS_VEHICLE_DRIVEABLE(viTargetCar)
SET_PED_INTO_VEHICLE(piLimoGuard[1], viTargetCar, VS_FRONT_RIGHT)
PRINTLN("SETTING piLimoGuard[1] INTO VEHICLE")
ENDIF
IF DOES_ENTITY_EXIST(piLimoGuard[2]) AND NOT IS_ENTITY_DEAD(piLimoGuard[2])
AND DOES_ENTITY_EXIST(viEscortCar) AND IS_VEHICLE_DRIVEABLE(viEscortCar)
SET_PED_INTO_VEHICLE(piLimoGuard[2], viEscortCar, VS_BACK_RIGHT)
PRINTLN("SETTING piLimoGuard[3] INTO VEHICLE")
ENDIF
ENDPROC
//PROC GO_TO_CHECKPOINT_3()
// INT idx
//
// SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1262.3417, -245.4084, 41.4460>>)
// SET_ENTITY_HEADING(PLAYER_PED_ID(), 295.7458)
// SET_GAMEPLAY_CAM_RELATIVE_HEADING()
//
// // If we're skipping to this stage load all that's needed or delete what's not.
// #IF IS_DEBUG_BUILD
// IF bDoingPSkip OR bDoingJSkip
//
// bDebugSkipping = TRUE
//
// PRINTLN("INSIDE P-SKIP")
//
// CLEANUP_DEST_BLIPS()
//
// //limo pulling up to the hotel
// REQUEST_WAYPOINT_RECORDING("OJASva_101")
// REQUEST_WAYPOINT_RECORDING("OJASva_101a")
// REQUEST_WAYPOINT_RECORDING("OJASva_104")
// REQUEST_MODEL(FBI2)
//
// INITIALIZE_NEXT_STAGE()
// REMOVE_LIMO_GUARDS()
// REMOVE_TARGET_CAR()
// REMOVE_TARGET_AND_BLIP()
// REMOVE_BODYGUARDS()
// REMOVE_MOTORCADE_FOLLOW_CAR()
// REMOVE_MOTORCADE_PEDS()
// CLEANUP_EXTRAS()
// iCutsceneStage = 0
//
// bHotelTimerExpired = TRUE
// bAlerted = FALSE
// bPlayerUsedSniperRifle = FALSE
//
// iHandleSniperAttackStages = 0
//
// IF bThirdCheckpointSceneLoad
// bThirdCheckpointSceneLoad = FALSE
// ENDIF
//
// CLEAR_AREA_OF_VEHICLES(<< -1220.57, -185.96, 38.40 >>, 50) //area around where the limo pulls up
//
// WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_101") //limo pulling up to the hotel lobby
// AND NOT GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_101a")
// OR NOT HAS_MODEL_LOADED(FBI2)
// WAIT(0)
// PRINTLN("P-SKIPPING: WAITING FOR SCENE TO LOAD")
// ENDWHILE
//
// bDoingPSkip = FALSE
// ENDIF
// #ENDIF
//
// IF NOT bDebugSkipping
// IF NOT bThirdCheckpointSceneLoad
// IF IS_SCREEN_FADED_OUT()
// NEW_LOAD_SCENE_START_SPHERE(<< -635.2563, -1212.3376, 11.4140 >>, 10.0)
// bThirdCheckpointSceneLoad = TRUE
// PRINTLN("ASSASSINATION HOTEL CHECKPOINT 3: CALLING NEW_LOAD_SCENE_START_SPHERE")
// ELSE
// PRINTLN("ASSASSINATION HOTEL CHECKPOINT 3: SCREEN IS NOT FADED OUT")
// ENDIF
// ELSE
// PRINTLN("ASSASSINATION HOTEL CHECKPOINT 3: bFirstCheckpointSceneLoad IS TRUE")
// ENDIF
//
// WHILE NOT IS_NEW_LOAD_SCENE_LOADED()
// WAIT(0)
// PRINTLN("WAITING FOR SCENE TO LOAD - 3")
// ENDWHILE
//
// PRINTLN("ASSASSINATION HOTEL: SCENE HAS LOADED")
// NEW_LOAD_SCENE_STOP()
// ENDIF
//
// // Target
// CREATE_TARGET_CAR()
// SET_ENTITY_COORDS(viTargetCar, vTargetCarLobbyPos)
// SET_ENTITY_HEADING(viTargetCar, fTargetCarLobbyHead)
//
// // Escort Peds
// CREATE_MOTORCADE_ACTORS_AND_VEHICLE()
// SET_ENTITY_COORDS(viEscortCar, vEscortCarPosition)
// SET_ENTITY_HEADING(viEscortCar, fEscortCarHeading)
//
// // Limo Guards
// CREATE_LIMO_GUARDS()
// PLACE_LIMO_GUARDS_IN_CAR()
//
// bPanicking = FALSE
// bAlerted = FALSE
//
// TargetState = TS_ENTER_LIMO
//
// REPEAT NUM_LIMO_GUARDS idx
// LimoGuardState[idx] = LGS_LEAVE_IN_LIMO
// ENDREPEAT
// REPEAT NUM_ESCORT_PEDS idx
// EscortState[idx] = ES_PROTECT
// ENDREPEAT
// REPEAT NUM_BODYGUARDS idx
// BodyGuardState[idx] = BS_WALK_WITH_TARGET
// ENDREPEAT
//
// bLeftHotel = TRUE
//
//// HANDLE_REPLAY_WEAPON_EQUIP()
//
// //fade in the game from the mission retry screen
//
// MainStage = STAGE_TARGET_LEAVE_LOBBY
// PRINTLN("MainStage = STAGE_TARGET_LEAVE_LOBBY")
// FADE_IN()
//ENDPROC
PROC GO_TO_CHECKPOINT_4()
// If we're skipping to this stage load all that's needed or delete what's not.
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1184.2440, -319.2575, 36.7445>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 26.0711)
PRINTLN("REPOSITIONING PLAYER FOR GO_TO_CHECKPOINT_4")
// bDebugSkipping = TRUE
PRINTLN("INSIDE P-SKIP")
CLEANUP_DEST_BLIPS()
//limo pulling up to the hotel
REQUEST_WAYPOINT_RECORDING("OJASva_101")
REQUEST_WAYPOINT_RECORDING("OJASva_101a")
REQUEST_WAYPOINT_RECORDING("OJASva_104")
REQUEST_MODEL(FBI2)
// INITIALIZE_NEXT_STAGE()
REMOVE_LIMO_GUARDS()
REMOVE_TARGET_CAR()
REMOVE_TARGET_AND_BLIP()
REMOVE_BODYGUARDS()
REMOVE_MOTORCADE_FOLLOW_CAR()
REMOVE_MOTORCADE_PEDS()
iCutsceneStage = 0
bHotelTimerExpired = TRUE
bAlerted = FALSE
bPlayerUsedSniperRifle = FALSE
bBufferHit = FALSE
iHandleSniperAttackStages = 0
CLEAR_AREA_OF_VEHICLES(<< -1220.57, -185.96, 38.40 >>, 50) //area around where the limo pulls up
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_101") //limo pulling up to the hotel lobby
AND NOT GET_IS_WAYPOINT_RECORDING_LOADED("OJASva_101a")
OR NOT HAS_MODEL_LOADED(FBI2)
WAIT(0)
PRINTLN("P-SKIPPING: WAITING FOR SCENE TO LOAD")
ENDWHILE
bDoingPSkip = FALSE
ENDIF
#ENDIF
TRIGGER_MUSIC_EVENT("ASS1_STOP")
PRINTLN("TRIGGERING MUSIC - ASS1_STOP")
IF NOT IS_BIT_SET(g_replay.iReplayBits, ENUM_TO_INT(RB_REPLAY_SETUP_STARTED))
REMOVE_STREAMVOL_FOR_INTRO_CUTSCENE()
ENDIF
//fade in the game from the mission retry screen
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
MainStage = STAGE_MISSION_PASSED
PRINTLN("MainStage = STAGE_MISSION_PASSED")
FADE_IN()
ENDPROC
PROC CHECK_FOR_LESTER_DEATH()
IF DOES_ENTITY_EXIST(piLester)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piLester, PLAYER_PED_ID())
// IF IS_ENTITY_DEAD(pedLester) OR IS_PED_INJURED(pedLester)
PRINTLN("FAILING - FT_LESTER_ATTACKED")
SET_MISSION_FAILED(FT_LESTER_ATTACKED)
// ELSE
// PRINTLN("LESTER IS OKAY")
// ENDIF
ELSE
// PRINTLN("PLAYER HAS NOT DAMAGED LESTER")
ENDIF
ELSE
PRINTLN("LESTER DOES NOT EXIST")
ENDIF
ENDPROC
PROC DELETE_LESTER()
IF DOES_ENTITY_EXIST(piLester)
DELETE_PED(piLester)
ENDIF
ENDPROC
PROC UPDATE_LESTER()
SEQUENCE_INDEX tempSeq
IF DOES_ENTITY_EXIST(piLester)
CHECK_FOR_LESTER_DEATH()
IF NOT IS_PED_INJURED(piLester)
FLOAT fLesterDistFromPlayer = GET_PLAYER_DISTANCE_FROM_ENTITY(piLester)
SET_PED_CAN_PLAY_AMBIENT_ANIMS(piLester, FALSE)
SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(piLester, FALSE)
SET_PED_CAN_BE_TARGETTED(piLester, FALSE)
SET_RAGDOLL_BLOCKING_FLAGS(piLester, RBF_PLAYER_IMPACT)
SET_PED_CONFIG_FLAG(piLester, PCF_DisableExplosionReactions, TRUE)
IF fLesterDistFromPlayer < 5
IF IS_TIMER_STARTED(tLesterTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF TIMER_DO_ONCE_WHEN_READY(tLesterTimer, 10)
ADD_PED_FOR_DIALOGUE(hotelConv, 3, piLester, "LESTER")
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJAS_FOLLOW", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
ENDIF
ELIF fLesterDistFromPlayer > 100
IF IS_ENTITY_OCCLUDED(piLester)
OR NOT IS_ENTITY_ON_SCREEN(piLester)
DELETE_LESTER()
ENDIF
ENDIF
SWITCH iLesterUpdateStages
CASE 0
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_SHOOTING(PLAYER_PED_ID())
OR ( DOES_ENTITY_EXIST(piLester) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piLester, PLAYER_PED_ID()) )
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(oFailSafeBench, PLAYER_PED_ID())
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(oFailSafeBench, PLAYER_PED_ID())
PRINTLN("WE DAMAGED THE BENCH")
ENDIF
SET_PED_MOVEMENT_CLIPSET(piLester, "move_lester_CaneUp")
TASK_PLAY_ANIM(piLester, "oddjobs@assassinate@hotel@leadin", "Lester_Getup", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
PRINTLN("iLesterUpdateStages = 1")
iLesterUpdateStages = 1
ENDIF
ENDIF
BREAK
CASE 1
IF IS_ENTITY_PLAYING_ANIM(piLester, "oddjobs@assassinate@hotel@leadin", "Lester_Getup")
IF GET_ENTITY_ANIM_CURRENT_TIME(piLester, "oddjobs@assassinate@hotel@leadin", "Lester_Getup") >= 0.376
OPEN_SEQUENCE_TASK(tempSeq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1502.02856, -948.68701, 7.65061>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 1.0, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1462.3389, -964.1780, 6.3394>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, 1.0, ENAV_NO_STOPPING)
TASK_WANDER_STANDARD(NULL, GET_ENTITY_HEADING(piLester))
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(piLester, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
FORCE_PED_MOTION_STATE(piLester, MS_ON_FOOT_WALK)
PRINTLN("iLesterUpdateStages = 2")
iLesterUpdateStages = 2
ENDIF
ENDIF
BREAK
CASE 2
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
PROC PLAY_SPOTTED_DIALOGUE_FROM_CLOSEST_GUARD()
PED_INDEX pedToSpeak
IF bBufferHit
pedToSpeak = GET_CLOSEST_GUARD()
IF NOT IS_PED_INJURED(pedToSpeak)
SETUP_PED_FOR_DIALOGUE(pedToSpeak, 3, "OJAvaGUARD")
CREATE_CONVERSATION(hotelConv, "OJASAUD", "OJASva_SPOT", CONV_PRIORITY_VERY_HIGH)
ENDIF
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
/// Stores off the last 3 vehicles so that we can also use this function to detect if the player haws parked any cars inside the alley to try and break the escort car pulling up
PROC SAVE_LAST_PLAYER_VEHICLES()
VEHICLE_INDEX vehLast
IF MainStage > STAGE_GET_TO_HOTEL
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehLast = GET_LAST_DRIVEN_VEHICLE()
IF DOES_ENTITY_EXIST(vehLast)
IF IS_VEHICLE_DRIVEABLE(vehLast)
IF vehLast != viLastDriven[0]
AND vehLast != viLastDriven[1]
AND vehLast != viLastDriven[2]
//reset this if we've already stored off 3 vehicles
IF iLastStoredVehicleIdx >= 2
iLastStoredVehicleIdx = -1
ENDIF
viLastDriven[iLastStoredVehicleIdx + 1] = vehLast
SET_ENTITY_AS_MISSION_ENTITY(viLastDriven[iLastStoredVehicleIdx + 1])
SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(viLastDriven[iLastStoredVehicleIdx + 1], FALSE)
PRINTLN("SETTING PLAYERS LAST VEHICLE_AS MISSION ENTITY")
//increment this
iLastStoredVehicleIdx += 1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_FIND_BENCH()
IF NOT DOES_ENTITY_EXIST(oFailSafeBench)
oFailSafeBench = GET_CLOSEST_OBJECT_OF_TYPE(<< -1510.1029, -947.7194, 8.2332 >>, 5, prop_bench_08)
PRINTLN("FOUND BENCH")
ENDIF
ENDPROC
// -----------------------------------
// MAIN SCRIPT
// -----------------------------------
PROC Update_Loop()
//handles triggering of musical score change on target kill
IF NOT bTriggerAlertMusic
IF MainStage > STAGE_KILL_CAM
TRIGGER_MUSIC_EVENT("ASS1_ALERT")
PRINTLN("TRIGGERING MUSIC - ASS1_ALERT")
bTriggerAlertMusic = TRUE
ENDIF
ENDIF
//handles guard line if spotted and triggers musical score change
IF NOT bTriggerAlertMessage
IF bPanicking
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PLAY_SPOTTED_DIALOGUE_FROM_CLOSEST_GUARD()
bTriggerAlertMessage = TRUE
IF NOT bTriggerAlertMusic
TRIGGER_MUSIC_EVENT("ASS1_ALERT")
PRINTLN("TRIGGERING MUSIC - ASS1_ALERT - 1")
bTriggerAlertMusic = TRUE
ENDIF
ENDIF
ENDIF
//handles the saving of vehicles driven by the player so that they don't get aggressively cleaned up while the mission is active (to fix bug 1505704 - 6/24/13 - MB)
//also stores off the last 3 vehicles the player has driven to check if they've parked them in teh alley
SAVE_LAST_PLAYER_VEHICLES()
SWITCH MainStage
CASE STAGE_INTRO_CUTSCENE
IF Is_Replay_In_Progress()
MainStage = STAGE_INIT
BREAK
ENDIF
HANDLE_FIND_BENCH()
DO_STAGE_INTRO_CUTSCENE()
BREAK
CASE STAGE_INIT
IF Is_Replay_In_Progress()
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
PRINTLN("REPLAY VEHICLE IS AVAILABLE - HOTEL")
bReplayVehicleAvailable = TRUE
ELSE
PRINTLN("REPLAY VEHICLE IS NOT AVAILABLE")
ENDIF
bReplaying = TRUE
ENDIF
INITIALIZE_VARIABLES()
SETUP_UI_LABELS()
SETUP_MISSION_PARAMS()
SET_LOW_DENSITY_HOTEL_TRAFFIC(TRUE)
REQUEST_STREAMS()
//don't do wanted checks in aggro en route to the hotel(to fix Bug 1202878 - 3/18/13 - MB)
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
MainStage = STAGE_STREAMING
PRINTLN("OJASHOTEL - MainStage = STAGE_STREAMING")
BREAK
CASE STAGE_STREAMING
IF VEHICLES_RECORDINGS_AND_ANIMS_LOADED()
MainStage = STAGE_SPAWNING
PRINTLN("OJASHOTEL - MainStage = STAGE_SPAWNING")
ENDIF
BREAK
CASE STAGE_SPAWNING
CREATE_CAMERAS()
ADD_PARKED_CARS_TO_GARAGE()
IF bReplaying
IF g_savedGlobals.sAssassinData.fHotelMissionTime <> 0
RESTART_TIMER_AT(tMissionTimer, g_savedGlobals.sAssassinData.fHotelMissionTime)
PRINTLN("RESTARTING TIMER - tMissionTimer AT: ", g_savedGlobals.sAssassinData.fHotelMissionTime)
ENDIF
iStageToUse = Get_Replay_Mid_Mission_Stage()
PRINTLN("iStageToUse = ", iStageToUse)
IF g_bShitskipAccepted
IF iStageToUse <= 2
iStageToUse = (iStageToUse + 1)
PRINTLN("SHIT SKIP: iStageToUse = ", iStageToUse)
ENDIF
ENDIF
//player has accepted package
IF iStageToUse = 0
GO_TO_CHECKPOINT_1()
ELIF iStageToUse = 1
GO_TO_CHECKPOINT_2()
ELIF iStageToUse = 2
GO_TO_CHECKPOINT_4()
ENDIF
ELSE
IF NOT IS_TIMER_STARTED(tMissionTimer)
START_TIMER_NOW(tMissionTimer)
PRINTLN("STARTING TIMER - tMissionTimer")
g_savedGlobals.sAssassinData.fHotelMissionTime = 0
PRINTLN("HOTEL GLOBAL MISSION TIMER = ", g_savedGlobals.sAssassinData.fHotelMissionTime)
ENDIF
MainStage = STAGE_GET_TO_HOTEL
PRINTLN("OJASHOTEL - MainStage = STAGE_GET_TO_HOTEL")
ENDIF
BREAK
CASE STAGE_GET_TO_HOTEL
UPDATE_LESTER()
DO_STAGE_GET_TO_HOTEL()
BREAK
CASE STAGE_GUARD_CUTSCENE
DO_STAGE_GUARD_CUTSCENE()
BREAK
CASE STAGE_PLANT_BOMB
UPDATE_LESTER()
CHECK_FOR_PLAYER_BLOCKING_WITH_VEHICLES()
DO_STAGE_PLANT_BOMB()
BREAK
CASE STAGE_GUARDS_GO_TO_POSTS
CHECK_FOR_PLAYER_BLOCKING_WITH_VEHICLES()
DO_STAGE_GUARDS_GO_TO_POSTS()
BREAK
CASE STAGE_TARGET_LEAVE_LOBBY
DO_STAGE_TARGET_LEAVE_LOBBY()
CHECK_FOR_TARGET_KILL()
BREAK
CASE STAGE_ENTER_LIMO
DO_STAGE_ENTER_LIMO()
CHECK_FOR_TARGET_KILL()
BREAK
CASE STAGE_LEAVE_HOTEL
DO_STAGE_LEAVE_HOTEL()
CHECK_FOR_TARGET_KILL()
BREAK
CASE STAGE_KILL_CAM
DO_STAGE_KILL_CAM()
BREAK
CASE STAGE_EVADE_POLICE
DO_STAGE_EVADE_POLICE()
BREAK
CASE STAGE_LEAVE_AREA
DO_STAGE_LEAVE_AREA()
BREAK
CASE STAGE_MISSION_PASSED
DO_STAGE_MISSION_PASSED()
BREAK
ENDSWITCH
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
PROC JUMP_TO_STAGE(Assassin_Stages stage, BOOL bIsDebugJump = FALSE)
DO_FADE_OUT_WITH_WAIT()
//Update mission checkpoint in case they skipped the stages where it gets set.
IF bIsDebugJump
SWITCH STAGE
CASE STAGE_GET_TO_HOTEL
GO_TO_CHECKPOINT_1()
BREAK
CASE STAGE_PLANT_BOMB
GO_TO_CHECKPOINT_2()
BREAK
CASE STAGE_MISSION_PASSED
GO_TO_CHECKPOINT_4()
BREAK
ENDSWITCH
ENDIF
ENDPROC
// debug only
#IF IS_DEBUG_BUILD
PROC INITIALIZE_JSKIP()
RENDER_SCRIPT_CAMS(FALSE, TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
CLEAR_HELP(TRUE)
ENDPROC
// debug: skips
PROC DO_DEBUG_SKIPS()
Assassin_Stages eStage
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage)
IF iDebugJumpStage = 0
eStage = STAGE_GET_TO_HOTEL
PRINTLN("Z MENU: eStage = STAGE_GET_TO_HOTEL")
ELIF iDebugJumpStage = 1
eStage = STAGE_PLANT_BOMB
PRINTLN("Z MENU: eStage = STAGE_PLANT_BOMB")
ENDIF
bDoingPSkip = TRUE
JUMP_TO_STAGE(eStage, TRUE)
ENDIF
// Debug Key: Check for Pass
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
MainStage = STAGE_MISSION_PASSED
ENDIF
// Debug Key: Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
SET_MISSION_FAILED(FT_ABANDONED)
ENDIF
// skip stage P
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
bDoingPSkip = TRUE
IF MainStage > STAGE_SPAWNING AND MainStage < STAGE_MISSION_PASSED
IF MainStage > STAGE_SPAWNING AND MainStage <= STAGE_GUARDS_GO_TO_POSTS
eStage = STAGE_GET_TO_HOTEL
PRINTLN("eStage = STAGE_GET_TO_HOTEL")
ELIF MainStage > STAGE_GUARDS_GO_TO_POSTS AND MainStage < STAGE_MISSION_PASSED
eStage = STAGE_PLANT_BOMB
PRINTLN("eStage = STAGE_PLANT_BOMB")
ENDIF
//TODO add cleanup
JUMP_TO_STAGE(eStage, TRUE)
ENDIF
ENDIF
// skip stage J
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
bDoingJSkip = TRUE
IF MainStage > STAGE_SPAWNING AND MainStage < STAGE_MISSION_PASSED
IF MainStage = STAGE_GET_TO_HOTEL
eStage = STAGE_PLANT_BOMB
PRINTLN("J-SKIP: eStage = STAGE_PLANT_BOMB")
ELIF MainStage >= STAGE_PLANT_BOMB
eStage = STAGE_MISSION_PASSED
PRINTLN("J-SKIP: eStage = STAGE_MISSION_PASSED")
ENDIF
//TODO add cleanup
JUMP_TO_STAGE(eStage, TRUE)
ENDIF
ENDIF
ENDPROC
#ENDIF
//PROC CHECK_FOR_ACTION_MODE()
// IF NOT bSetActionMode
// IF bPanicking
// IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
// SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
// ENDIF
// PRINTLN("SETTING ACTION MODE ON THE PLAYER")
// bSetActionMode = TRUE
// ENDIF
// ENDIF
//ENDPROC
//FUNC BOOL IS_PLAYER_ARMED()
// WEAPON_TYPE wtCurrentWeapon
//
// IF GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtCurrentWeapon)
// IF wtCurrentWeapon = WEAPONTYPE_UNARMED
// OR wtCurrentWeapon = WEAPONTYPE_INVALID
// PRINTLN("PLAYER IS UNARMED")
// RETURN FALSE
// ELSE
// PRINTLN("PLAYER IS ARMED")
// ENDIF
// ELSE
// PRINTLN("PLAYER HAS NOTHING")
// ENDIF
//
// RETURN TRUE
//ENDFUNC
// Initialisation and the script loop
SCRIPT
// Handles the player being busted or arrested, or if the player
// jumps into Multiplayer from Singleplayer ensures the script
// gets cleaned up properly under the correct circumstances
IF (HAS_FORCE_CLEANUP_OCCURRED())
DEBUG_MESSAGE("FORCE CLEANUP HAS OCCURRED!!!")
TRIGGER_MUSIC_EVENT("ASS1_FAIL")
PRINTLN("TRIGGERING MUSIC - ASS1_FAIL - 02")
SET_BITMASK_AS_ENUM(g_savedGlobals.sAssassinData.iGenericData, ACD_FAILED)
Mission_Flow_Mission_Force_Cleanup()
Script_Cleanup()
ENDIF
SET_MISSION_FLAG(TRUE)
Player = PLAYER_PED_ID()
//to fix bug 1549652 - Clear player wanted level
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
ENDIF
IF Is_Replay_In_Progress()
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
PRINTLN("REPLAY VEHICLE IS AVAILABLE - CONSTRUCTION")
bReplayVehicleAvailable = TRUE
ELSE
PRINTLN("REPLAY VEHICLE IS NOT AVAILABLE - CONSTRUCTION")
ENDIF
bReplaying = TRUE
ELSE
bReplaying = FALSE
ENDIF
#IF IS_DEBUG_BUILD
AddWidgets(myDebugData)
#ENDIF
SETUP_DEBUG()
// Fix Bug # 712684
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
ENDIF
ASSASSINATION_ClearUnneededGenericData()
iCurAssassinRank = ENUM_TO_INT(ASSASSINATION_Hotel) //g_savedGlobals.sAssassinData.iCurrentAssassinRank
missionData = ASSASSINATION_GetMissionData(iCurAssassinRank)
PRINTLN("Current rank is... ", iCurAssassinRank)
SET_PED_MODEL_IS_SUPPRESSED(GuardModel, TRUE)
SET_PED_MODEL_IS_SUPPRESSED(GuardModel_01, TRUE)
PRINTLN("ya it worked.. ", iCurAssassinRank)
INVALIDATE_IDLE_CAM()
//HANDLE STREAMING AROUND REPLAY START POSITION
IF IS_REPLAY_IN_PROGRESS()
bHaveRetryOnce = TRUE
PRINTLN("HOTEL: SETTING - bHaveRetryOnce = TRUE")
iStageToUse = Get_Replay_Mid_Mission_Stage()
PRINTLN("iStageToUse = ", iStageToUse)
IF g_bShitskipAccepted
IF iStageToUse <= 1
iStageToUse = (iStageToUse + 1)
PRINTLN("SHIT SKIP: iStageToUse = ", iStageToUse)
ENDIF
ENDIF
// Due to url:bugstar:2105614, this needs to be called before START_REPLAY_SETUP
REMOVE_STREAMVOL_FOR_INTRO_CUTSCENE()
IF iStageToUse = 0
IF bReplayVehicleAvailable
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
PRINTLN("CONSTRUCTION: Waiting for HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED - 01")
WAIT(0)
ENDWHILE
//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(<<-1523.1742, -924.6732, 9.1221>>, 53.0177)
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))
AND NOT IS_BIG_VEHICLE(vehPlayer)
SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayer)
ELSE
DELETE_VEHICLE(vehPlayer)
ENDIF
ENDIF
START_REPLAY_SETUP(<< -1510.1810, -946.9595, 8.2738 >>, 10.0)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 1
IF bReplayVehicleAvailable
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
PRINTLN("CONSTRUCTION: Waiting for HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED - 02")
WAIT(0)
ENDWHILE
//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(<<-1266.4049, -219.1991, 41.4459>>, 304.8644)
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))
AND NOT IS_BIG_VEHICLE(vehPlayer)
SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayer)
ELSE
DELETE_VEHICLE(vehPlayer)
ENDIF
ENDIF
START_REPLAY_SETUP(<<-1266.1729, -214.0011, 41.4459>>, 310.0126)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 2
IF bReplayVehicleAvailable
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
PRINTLN("CONSTRUCTION: Waiting for HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED - 02")
WAIT(0)
ENDWHILE
//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(<<-1188.4861, -316.9884, 36.6841>>, 29.9702)
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))
AND NOT IS_BIG_VEHICLE(vehPlayer)
SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayer)
ELSE
DELETE_VEHICLE(vehPlayer)
ENDIF
ENDIF
START_REPLAY_SETUP(<<-1184.2440, -319.2575, 36.7445>>, 26.0711)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ENDIF
ENDIF
// The script loop
WHILE (TRUE)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_ASS1")
IF bMissionFailed
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
Script_Failed()
ENDIF
ELIF NOT IS_PED_INJURED(Player)
UPDATE_EXTRAS()
IF MainStage < STAGE_GUARDS_GO_TO_POSTS
aggroArgs.iShotIRange = 1
ELSE
aggroArgs.iShotIRange = 5
ENDIF
//main update loop for script stages
Update_Loop()
UPDATE_PED_STATES()
IF bAlerted
HANDLE_SNIPER_ATTACK_BUFFER()
ENDIF
//update the on screen timer representation
IF NOT bHotelTimerExpired
IF MainStage >= STAGE_PLANT_BOMB
AND MainStage < STAGE_TARGET_LEAVE_LOBBY
UPDATE_HOTEL_TIMER(iHotelTimerStart, fBombTime, bHotelTimerStarted, bHotelTimerExpired)
ENDIF
ENDIF
//handle circle/hint cam cuts throughout the mission
UPDATE_HINT_CAMERAS()
//MISSION FAIL CHECKS
FAIL_IF_TARGET_ESCAPES()
//fail mission if player triggers panic prior to the target leaving the hotel
IF ( bPanicking OR bFailMissionForCloseVehicle ) AND MainStage < STAGE_TARGET_LEAVE_LOBBY
OR (bPanickedExtras AND MainStage < STAGE_TARGET_LEAVE_LOBBY)
IF NOT IS_TIMER_STARTED(tFailTimer)
AND MainStage > STAGE_GUARD_CUTSCENE
START_TIMER_NOW(tFailTimer)
PRINTLN("STARTING TIMER - tFailTimer")
ELSE
IF MainStage < STAGE_GUARD_CUTSCENE //to fix bug 1207388 - need to immediately fail in this case - 3/21/13 MB)
OR GET_TIMER_IN_SECONDS(tFailTimer) > 5.0
IF failType = FT_VEHICLE
SET_MISSION_FAILED(FT_VEHICLE)
ELIF failType = FT_DISREGARDED_WARNINGS
SET_MISSION_FAILED(FT_DISREGARDED_WARNINGS)
ELSE
SET_MISSION_FAILED(FT_BLOWN_COVER)
PRINTLN("OJASHOTEL - FAILING SCRIPT BECAUSE THE PLAYER HAS BLOWN THEIR COVER EARLY")
ENDIF
ELIF GET_TIMER_IN_SECONDS(tFailTimer) > 2.5
IF NOT bTaskedGuyToAim
IF NOT bPlayerParkedCarInAlley
piWalkingGuard = GET_CLOSEST_GUARD(70.0, FALSE)
ELSE
piWalkingGuard = GET_CLOSEST_GUARD(70.0)
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(piWalkingGuard)
CLEAR_PED_TASKS(piWalkingGuard)
IF failType = FT_VEHICLE
IF DOES_ENTITY_EXIST(viCarThatTriggeredAlert)
IF NOT IS_PED_IN_ANY_VEHICLE(piWalkingGuard)
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(piWalkingGuard, viCarThatTriggeredAlert, viCarThatTriggeredAlert, PEDMOVEBLENDRATIO_RUN, FALSE)
ENDIF
ENDIF
// PED_INDEX pedClosest = GET_CLOSEST_GUARD(50.0)
IF DOES_ENTITY_EXIST(piWalkingGuard) AND NOT IS_PED_INJURED(piWalkingGuard)
SETUP_PED_FOR_DIALOGUE(piWalkingGuard, 6, "OJAvaGUARD2")
PLAY_SINGLE_LINE_FROM_CONVERSATION (hotelConv, "OJASAUD", "OJASva_CAR2", "OJASva_CAR2_1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING CONVO - OJASva_CAR2")
ELSE
PRINTLN("WE COULD NOT FIND PED WITH CALL - GET_CLOSEST_GUARD")
ENDIF
PRINTLN("FAIL REASON: failType = FT_VEHICLE")
ELIF failType = FT_STICKY
IF DOES_ENTITY_EXIST(viTargetCar)
AND IS_VEHICLE_DRIVEABLE(viTargetCar)
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(piWalkingGuard, viTargetCar, viTargetCar, PEDMOVEBLENDRATIO_RUN, FALSE)
ENDIF
SETUP_PED_FOR_DIALOGUE(GET_CLOSEST_GUARD_TO_LIMO(25.0), 6, "OJAvaGUARD2")
PLAY_SINGLE_LINE_FROM_CONVERSATION (hotelConv, "OJASAUD", "OJASva_CAR3", "OJASva_CAR3_1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("FAIL REASON: failType = FT_STICKY")
ELSE
TASK_AIM_GUN_AT_ENTITY(piWalkingGuard, PLAYER_PED_ID(), -1)
PRINTLN("TASKING CLOSEST LIMO GUARD TO AIM AT PLAYER")
PLAY_GUARD_PANIC_LINE(piWalkingGuard)
ENDIF
ENDIF
ENDIF
bTaskedGuyToAim = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//handles player trying to mess with the limo with a tow truck vehicle at any point in the mission
DETACH_TOW_TRUCK_FROM_LIMO_IF_ATTACHED()
// IF IS_STICKYBOMB_VISIBLE_ON_PARKED_LIMO(failType)
// SCRIPT_ASSERT("BOMB NOT SAFE!")
// ENDIF
//DEBUG ONLY
#IF IS_DEBUG_BUILD
DO_DEBUG_SKIPS()
#ENDIF
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT