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

7587 lines
246 KiB
Python
Executable File
Raw Permalink 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 0 // Removed by Kenneth R.
// Includes
USING "script_player.sch"
USING "controller_assassination_lib.sch"
USING "cutscene_public.sch"
USING "Assassin_shared.sch"
USING "assassination_support_lib.sch"
USING "Assassination_briefing_lib.sch"
USING "script_oddjob_funcs.sch"
USING "taxi_functions.sch"
USING "oddjob_aggro.sch"
USING "completionpercentage_public.sch"
USING "replay_public.sch"
USING "net_fps_cam.sch"
USING "clearMissionArea.sch"
USING "timelapse.sch"
USING "commands_event.sch"
USING "replay_private.sch"
USING "commands_recording.sch"
//CONST_INT TOTAL_NUM_WORKERS 26 //this is 1 greater than num peds in all waves wave because it is also includeing the target (who isn't assigned to a wave)
CONST_INT NUM_WAVE_1_WORKERS 5
CONST_INT NUM_WAVE_2_WORKERS 3
CONST_INT NUM_WAVE_3_WORKERS 6
CONST_INT NUM_WAVE_4_WORKERS 2
CONST_INT NUM_WAVE_5_WORKERS 4
CONST_INT NUM_WAVE_6_WORKERS 3
CONST_INT NUM_WARNING_GUYS 3
CONST_INT NUM_PATROL_POINTS 20 // patrol path points used for guys patrolling on ground level of the mission
CONST_INT NUM_WORKER_MODELS 2
CONST_INT MAX_NUMBER_COVER_PROPS 5
CONST_FLOAT CHANGE_ACCURACY_TIME 12.0
ENUM Assassin_Stages
STAGE_TIME_LAPSE,
STAGE_BRIEF_INIT,
STAGE_BRIEF_UPDATE,
STAGE_BRIEF_EXIT,
STAGE_INIT,
STAGE_STREAMING,
STAGE_SPAWNING,
STAGE_GET_TO_SITE,
STAGE_PANIC_CUTSCENE,
STAGE_ENTER_SITE,
// STAGE_GET_TO_ELEVATOR,
STAGE_ELEVATOR_CUTSCENE,
STAGE_GET_TO_SECOND_ELEVATOR,
STAGE_SECOND_ELEVATOR_CUTSCENE,
STAGE_ROOFTOP_BATTLE,
STAGE_KILL_CAM,
STAGE_FLEE_POLICE,
STAGE_CLEANUP
ENDENUM
Assassin_Stages MainStage = STAGE_BRIEF_INIT
//kill types
ENUM eKillType
KT_STANDARD,
KT_BONUS
ENDENUM
eKillType killType = KT_STANDARD
//kill types
ENUM eHeliStage
HS_ATTACKING,
HS_FLY_TO_POINT,
HS_FLEE_PLAYER
ENDENUM
eHeliStage heliStage = HS_ATTACKING
ENUM eWorkerState
WS_PATROL = 0,
WS_REACT = 1,
WS_COMBAT
ENDENUM
eWorkerState workerState
// ------------------------------Cutscene variables------------------------------
ENUM PAYPHONE_CUTSCENE
PAYPHONE_CUTSCENE_INIT = 0,
PAYPHONE_CUTSCENE_UPDATE,
PAYPHONE_CUTSCENE_SKIP,
PAYPHONE_CUTSCENE_CLEANUP
ENDENUM
PAYPHONE_CUTSCENE payPhoneCutsceneStages = PAYPHONE_CUTSCENE_INIT
OBJECT_INDEX oPayPhone, oPayPhoneAnimated
CAMERA_INDEX camPayPhoneIntro01
VECTOR vPhoneLocation = <<809.2970, -1075.8088, 27.6534>>
VECTOR vPlayerWarpPosition = <<809.2200, -1075.8560, 27.6541>>
FLOAT fPlayerWarpHeading = 85.4771
FLOAT fCutsceneLength = 45.0
FLOAT fRightX, fRightY
VECTOR vCameraPosition01 = <<810.9202, -1075.5016, 29.1399>>
VECTOR vCameraRotation01 = <<-1.9308, 0.0000, 78.5519>>
structTimer tPayphoneCutsceneTimer
structTimer tPayphoneCameraTimer
BOOL bSkipCutscene = FALSE
BOOL bPlayedPayPhoneConvo = FALSE
BOOL bContinueWithScene = FALSE
//BOOL bTouchedRightStick = FALSE
BOOL bTargetKillLinePlayed = FALSE
BOOL bGuardsCreatedForFirstStage = FALSE
BOOL bSkippedEndingScreen = FALSE
BOOL bPlayMusic = FALSE
BOOL bDoneFlash = FALSE
VECTOR scenePosition = <<0,0,0>>
VECTOR sceneRotation = <<0,0,0>>
INT iSceneId
INT iEndingScreenStages = 0
INT iIntroCameraStages = 0
SIMPLE_USE_CONTEXT cucEndScreen
STREAMVOL_ID svPhoneCutscene
// ------------------------------Cutscene variables------------------------------
STRUCT WORKER_STRUCT // contains details for all mission peds
PED_INDEX ped //Ped Index
// BLIP_INDEX blip //Blip Index
BOOL bDead //Bool used to detect if he has been killed used in HANDLE_ENEMY_BLIPS function
AI_BLIP_STRUCT blipWorker
VECTOR loc //Ped start location
FLOAT head //Ped start heading
WEAPON_TYPE wpn //Ped Weapon type
COMBAT_MOVEMENT move //Ped movement type
COMBAT_RANGE range //Ped combat range
COMBAT_ABILITY_LEVEL ability //Ped combat ability
COMBAT_ATTRIBUTE attribute //Ped combat attribute
ENDSTRUCT
WORKER_STRUCT wave1[NUM_WAVE_1_WORKERS]
WORKER_STRUCT wave2[NUM_WAVE_2_WORKERS]
WORKER_STRUCT wave3[NUM_WAVE_3_WORKERS]
WORKER_STRUCT wave4[NUM_WAVE_4_WORKERS]
WORKER_STRUCT wave5[NUM_WAVE_5_WORKERS]
WORKER_STRUCT wave6[NUM_WAVE_6_WORKERS]
WORKER_STRUCT warningGuys[NUM_WARNING_GUYS]
BOOL bTaskedToAim[NUM_WARNING_GUYS]
// -----------------------------------
// VARIABLES
// -----------------------------------
//FIRST_PERSON_CAM_STRUCT camFirstPerson
BLIP_INDEX bTargetBlip
BLIP_INDEX bElevatorBlip
BLIP_INDEX bSiteBlip
BLIP_INDEX blipRooftop
COVERPOINT_INDEX ciSecondFloorPosition
COVERPOINT_INDEX ciRoofPosition
//STREAMVOL_ID svPanicCutscene
BOOL bWarningHelp
BOOL bPanicking
BOOL bPlayerSpotted
BOOL bWave1Attacking
//BOOL bCheckingWave1ForPanic = TRUE
BOOL bBlipsCleared
BOOL bElevatorAttack
BOOL bPedsOutOfVehicle
BOOL bCarSent
BOOL bCutsceneSkipped
BOOL bCutsceneFading
BOOL bAdvanceOnPlayer
BOOL bLeaveDefensiveArea
BOOL bElevatorMsgPrinted
BOOL bAbandoned
BOOL bReplaying = FALSE
BOOL bRooftopWaveCreated
BOOL bHeliPedsCreated
BOOL bMissionFailed = FALSE
BOOL bHeliAttacking = FALSE
BOOL heliFleeLinePlayed = FALSE
//BOOL bPrintElevatorHelp = FALSE
BOOL bApplyForceToDeadGuy = FALSE
BOOL bTeleportCraneGuy = FALSE
BOOL bEarlyOut = FALSE
BOOL bHeliModelLoaded = FALSE
BOOL bHeliOutOfControl
BOOL bRidingFinalElevator
BOOL bPlayerReachedBottom
BOOL bPlayerInSite = FALSE
BOOL bEarlyAggro = FALSE
BOOL bTriggerRooftop = FALSE
BOOL bLoadSceneRequested = FALSE
BOOL bIntroSceneCreated = FALSE
//BOOL bFirstCheckpointSceneLoad = FALSE
//BOOL bSecondCheckpointSceneLoad = FALSE
//BOOL bThirdCheckpointSceneLoad = FALSE
//BOOL bFourthCheckpointSceneLoad = FALSE
//BOOL bFifthCheckpointSceneLoad = FALSE
//BOOL bDebugSkipping = FALSE
BOOL bPlayedLined = FALSE
BOOL bReplayVehicleAvailable = FALSE
BOOL bSwitchedSeats = FALSE
BOOL bNeedToCheckOnRoof = FALSE
BOOL bSetCheckpoint = FALSE
BOOL bUpdateGuysInCar = FALSE
BOOL bOkayToAttack = FALSE
BOOL bPlayedCellPhoneCall = FALSE
BOOL bPrintLastObjective = FALSE
BOOL bPrintedReminderMessage = FALSE
BOOL bFranklinJumpLinePlayed = FALSE
//CAMERA_INDEX camKillcam
CAMERA_INDEX camIntroA, camIntroB
FLOAT fTruckHead = 140
//INT iCutsceneStage
INT iCurrentPlayerLine = 0
INT iStageNum = 0
INT iElevButtonStage = 0
INT iNumDead
INT iEnemySpeechStage
INT iCoverTime
INT iSoundIdElevator = -1
INT iFrameCountAsn
//INT iNumDeadPedsInElevator = 0
INT iCraneEnemyStage
INT iRoadNode01
INT iFinalElevatorCutsceneStage
INT iWarningGuysUpdate
INT iWarningGuardIndex
INT iFirstTimeWarning = 7
INT iSecondTimeWarning = 5
INT iTriggerEarlyUpdateStages = 0
INT iStageToUse
INT iParachutePickup
INT iElevSyncScene
MODEL_NAMES WorkerModel[NUM_WORKER_MODELS]
MODEL_NAMES TruckModel
MODEL_NAMES CombatCarModel
MODEL_NAMES ElevDoorModel
MODEL_NAMES ElevModel
MODEL_NAMES HeliModel
MODEL_NAMES ElevButtonModel
//OBJECT_INDEX objElevDoorClosed[4]
//OBJECT_INDEX objElevDoorControl[6]
OBJECT_INDEX objElev[3]
OBJECT_INDEX objElevButton[3]
OBJECT_INDEX objCoverProps[MAX_NUMBER_COVER_PROPS]
PED_INDEX Player
PED_INDEX piTarget
PED_INDEX piCutscenePed
PED_INDEX piClosestEnemy
PED_INDEX piDeadElevatorGuys[2]
PED_INDEX pedLeftSide, pedRightSide
PED_INDEX pedSpotted
VECTOR vCraneSpawnPos = << -110.9849, -972.0396, 295.4 >> //<< -117.2265, -975.1129, 295.4 >>
VECTOR vTruckPos = << -134.2935, -982.4351, 26.2731 >>
VECTOR vSitePos = <<-133.51, -997.09, 26.28>>
VECTOR vElev1Bottom = << -184.11, -1015.63, 30.06 >>
//VECTOR vElev1Top = << -182.5666, -1012.135, 113.1590 >>
VECTOR vElev2Bottom = << -158.02, -940.52, 114.25 >>
VECTOR vElev2Top = << -154.6688, -941.5961, 268.2575 >>
//VECTOR vElev1CamRot = << -5.9642, 0.0000, 156.4878 >> //<< -13.29, -0.02, 140.32 >>
//VECTOR vElev2CamRot = << -1.4808, 0.0000, 68.1868 >>
//VECTOR vAttachmentOffset = <<1.0433, -1.7817, -0.8980>>
VECTOR vRooftopPosition = << -152.0844, -943.5401, 268.1324 >>
VECTOR vMyElevRot[3]
//VECTOR vMyElevDoor[4]
VECTOR vMyElevPos[2]
VECTOR vPatrolPathPoint[NUM_PATROL_POINTS]
VECTOR vCranePedPos
VECTOR vButtonOffset = <<-0.469401, -0.863015, -0.6957>>
VECTOR vButtonPressAnimOffset = <<-0.369, -1.705, -1.329>>
VECTOR vAngledAreaMinWarningGuy[NUM_WARNING_GUYS]
VECTOR vAngledAreaMaxWarningGuy[NUM_WARNING_GUYS]
FLOAT fAngledAreaWidthWarningGuy[NUM_WARNING_GUYS]
//VECTOR vPlayerPos
//VECTOR vPlayerRot
//VECTOR vCranePos0 = << -122.8084, -978.1938, 117.8043 >>
//VECTOR vCranePos1 = << -128.9403, -981.0928, 113.1314 >>
VECTOR vIntroCutsceneTriggerPos = << -109.3679, -908.5847, 28.2615 >>
VECTOR vPlayerElevatorOffset = << -0.2, -2.2, -1.3 >>
//VECTOR vCurrentHeliPoint
VECTOR vHeliPos = << -140.2973, -966.4312, 268.1324 >>
FLOAT fHeliHead = 95.6565
VECTOR vTargetPos = << -146.7524, -959.7552, 268.1324 >>
FLOAt fTargetHead = 241.6704
VECTOR vLastStageCoverPosition = << -150.5756, -945.9047, 268.1324 >>
FLOAT fLastStageCoverHeading = 134.4706
VECTOR vMoveVehiclePosition01 = <<797.9703, -1064.6918, 26.7261>>
FLOAT fMoveVehicleHeading01 = 6.2218
VECTOR vMoveVehiclePosition02 = <<-87.0079, -915.3242, 28.1966>>
FLOAT fMoveVehicleHeading02 = 70.2099
VEHICLE_INDEX viTruck
VEHICLE_INDEX viCombatCar
VEHICLE_INDEX viPlayerCar
VEHICLE_INDEX viHeli
VEHICLE_INDEX vehPlayerIsIn
VEHICLE_INDEX viReplayVehicle
REL_GROUP_HASH relEnemies
structTimer missionTimer
structTimer speechTimer
structTimer warningTimer
structTimer spottedTimer
structTimer heliFleeTimer, heliFleeTimer2
structTimer changeAccuracyTimer01
structTimer changeAccuracyTimer02
structTimer tPanicFailSafeTimer
BOOL bChangeAccuracy01 = FALSE
BOOL bChangeAccuracy02 = FALSE
structPedsForConversation siteConv
PICKUP_INDEX pickupHealth
PICKUP_INDEX pickupParachute
PICKUP_INDEX pickupParachuteTable
WEAPON_TYPE wtFailWeapon
WEAPON_TYPE wtElevatorWeapon
VECTOR vTrailEnd = << -132.82999, -981.02496, 26.27540>>
INT iPetrolStage
// -----------------------------------
// DEBUG MODE
// -----------------------------------
#IF IS_DEBUG_BUILD
USING "shared_debug.sch"
USING "script_debug.sch"
USING "select_mission_stage.sch"
#ENDIF
#IF IS_DEBUG_BUILD
// INT iJSkipStage
DEBUG_POS_DATA myDebugData
BOOL bDoingPSkip = FALSE
BOOL bDoingJSkip = FALSE
MissionStageMenuTextStruct sSkipMenu[4]
INT iDebugJumpStage = 0
#ENDIF
// -----------------------------------
// MAIN PROCS/FUNCTIONS
// -----------------------------------
PROC timeLapseCutscene()
IF NOT IS_REPLAY_IN_PROGRESS()
IF DO_TIMELAPSE(SP_MISSION_ASSASSIN_5, sTimelapse, FALSE, FALSE)
MainStage = STAGE_BRIEF_INIT
ENDIF
ELSE
MainStage = STAGE_BRIEF_INIT
ENDIF
ENDPROC
PROC SETUP_UI_LABELS()
endLabel.tlMissionPassed = "ASS_CS_PASSED"
endLabel.tlMissionName = g_sMissionStatsName
endLabel.tlTimeTaken = "ASS_CS_TIMER"
endLabel.tlBaseReward = "ASS_CS_BASE"
endLabel.tlBonusDesc = "ASS_CS_BDESC"
endLabel.tlCashEarned = "ASS_CS_CASH"
endLabel.tlCompletionGold = "ASS_CS_COMP"//"ASS_CS_COMPG"
endLabel.tlCompletionSilver = "ASS_CS_COMP"//"ASS_CS_COMPS"
endLabel.tlCompletionBronze = "ASS_CS_COMP"//"ASS_CS_COMPB"
endLabel.tlCompletionNoMedal = "ASS_CS_COMP"//"ASS_CS_COMPN"
ENDPROC
PROC SETUP_DEBUG()
#IF IS_DEBUG_BUILD
sSkipMenu[0].sTxtLabel = "TRAVEL_STAGE"
sSkipMenu[1].sTxtLabel = "ENTER THE SITE"
sSkipMenu[2].sTxtLabel = "SECOND FLOOR BATTLE"
sSkipMenu[3].sTxtLabel = "ROOFTOP BATTLE"
#ENDIF
ENDPROC
PROC GRAB_RETRY_VEHICLE()
IF NOT DOES_ENTITY_EXIST(viReplayVehicle)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
viReplayVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
PRINTLN("FOUND REPLAY VEHICLE")
IF DOES_ENTITY_EXIST(viReplayVehicle) AND NOT IS_ENTITY_DEAD(viReplayVehicle)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(viReplayVehicle)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CREATE_HEALTH_PACK()
IF NOT DOES_PICKUP_EXIST(pickupHealth)
pickupHealth = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, <<-170.470, -1016.089, 114.537>>, <<0, 0, 65.0>>)
PRINTLN("CREATING HEALTH PICKUP")
ENDIF
ENDPROC
PROC REMOVE_HEALTH_PACK()
IF DOES_PICKUP_EXIST(pickupHealth)
REMOVE_PICKUP(pickupHealth)
PRINTLN("REMOVING HEALTH PACK")
ENDIF
ENDPROC
PROC CREATE_PARACHUTE_PACK()
IF NOT DOES_PICKUP_EXIST(pickupParachute)
iParachutePickup = 0
SET_BIT(iParachutePickup, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
SET_BIT(iParachutePickup, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
pickupParachute = CREATE_PICKUP(PICKUP_PARACHUTE, <<-140.6149, -945.9811, 268.1331>>, iParachutePickup, 1)
IF NOT DOES_PICKUP_EXIST(pickupParachuteTable)
pickupParachuteTable = CREATE_PICKUP_ROTATE(PICKUP_PARACHUTE, <<-149.709, -966.410, 269.230>>, << 87, 22, 90>>)
PRINTLN("CREATING PARACHUTE PICKUP ON TABLE")
ENDIF
ENDIF
ENDPROC
PROC REMOVE_PARACHUTE_PACK()
IF DOES_PICKUP_EXIST(pickupParachute)
REMOVE_PICKUP(pickupParachute)
PRINTLN("REMOVING PARACHUTE PACK")
ENDIF
IF DOES_PICKUP_EXIST(pickupParachuteTable)
REMOVE_PICKUP(pickupParachuteTable)
PRINTLN("REMOVING PARACHUTE PACK FROM TABLE")
ENDIF
ENDPROC
PROC REMOVE_WORKER_WAVE(WORKER_STRUCT& workerStruct[], INT iNumGuysInWave)
INT tempInt
FOR tempInt = 0 TO iNumGuysInWave - 1
IF DOES_ENTITY_EXIST(workerStruct[tempInt].ped)
IF IS_ENTITY_OCCLUDED(workerStruct[tempInt].ped)
DELETE_PED(workerStruct[tempInt].ped)
PRINTLN("REMOVING PED: ", tempInt)
ELSE
//to fix bugs 1114187, 1136149
IF IS_PED_IN_ANY_HELI(workerStruct[tempInt].ped)
IF NOT IS_PED_INJURED(workerStruct[tempInt].ped)
SET_PED_COMBAT_ATTRIBUTES(workerStruct[tempInt].ped, CA_LEAVE_VEHICLES, FALSE)
SET_PED_FLEE_ATTRIBUTES(workerStruct[tempInt].ped, FA_USE_VEHICLE, FALSE)
SET_PED_KEEP_TASK(workerStruct[tempInt].ped, TRUE)
ENDIF
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(workerStruct[tempInt].ped)
PRINTLN("SETTING PED AS NO LONGER NEEDED: ", tempInt)
ENDIF
ENDIF
ENDFOR
ENDPROC
/// PURPOSE:
/// 1 = Ground floor enemies; 2 = guys in car; 3 = mid-level; 4 = guys in elevator; 5 = Rooftop enemies
/// (Does not include Target)
PROC CLEANUP_WORKER_WAVE(WORKER_STRUCT& workerStruct[], INT iNumGuysInWave)
INT tempInt
FOR tempInt = 0 TO iNumGuysInWave - 1
IF DOES_ENTITY_EXIST(workerStruct[tempInt].ped)
IF NOT IS_PED_INJURED(workerStruct[tempInt].ped)
IF IS_ENTITY_OCCLUDED(workerStruct[tempInt].ped)
OR NOT IS_ENTITY_ON_SCREEN(workerStruct[tempInt].ped)
IF NOT IS_PED_INJURED(workerStruct[tempInt].ped)
SET_ENTITY_HEALTH(workerStruct[tempInt].ped, 0)
PRINTLN("SETTING PED HEALTH TO ZERO - WAVE: ", tempInt)
ENDIF
ELSE
SET_PED_AS_NO_LONGER_NEEDED(workerStruct[tempInt].ped)
PRINTLN("SETTING PED AS NO LONGER NEEDED - WAVE: ", tempInt)
ENDIF
ENDIF
ENDIF
// IF DOES_BLIP_EXIST(workerStruct[tempInt].blip)
// REMOVE_BLIP(workerStruct[tempInt].blip)
// ENDIF
ENDFOR
REMOVE_PED_FOR_DIALOGUE(siteConv, 4)
REMOVE_PED_FOR_DIALOGUE(siteConv, 5)
REMOVE_PED_FOR_DIALOGUE(siteConv, 6)
REMOVE_PED_FOR_DIALOGUE(siteConv, 7)
REMOVE_PED_FOR_DIALOGUE(siteConv, 8)
ENDPROC
/// PURPOSE:
/// Setup initial camera parameters for the mission
PROC CREATE_CAMERAS()
// camKillcam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -192.3310, -1018.3026, 30.3871 >>, << -1.5705, 0.0000, -63.3390 >>, 55)
camIntroA = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -150.9599, -944.2627, 114.3693 >>, << 3.6074, -0.2888, 15.6398 >>, 50)
camIntroB = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -150.6499, -945.0825, 114.3487 >>, << 1.2634, -0.2776, 28.5068 >>, 50)
ENDPROC
/// PURPOSE:
/// Cleanup all enemy ped blips
PROC CLEANUP_PED_BLIPS(BOOL bIncludeTarget)
CLEANUP_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
CLEANUP_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
CLEANUP_WORKER_WAVE(wave3, NUM_WAVE_3_WORKERS)
CLEANUP_WORKER_WAVE(wave4, NUM_WAVE_4_WORKERS)
CLEANUP_WORKER_WAVE(wave5, NUM_WAVE_5_WORKERS)
IF bIncludeTarget
IF DOES_ENTITY_EXIST(piTarget)
IF NOT IS_PED_INJURED(piTarget)
IF IS_PED_IN_ANY_HELI(piTarget)
SET_PED_COMBAT_ATTRIBUTES(piTarget, CA_LEAVE_VEHICLES, FALSE)
SET_PED_FLEE_ATTRIBUTES(piTarget, FA_USE_VEHICLE, FALSE)
SET_PED_KEEP_TASK(piTarget, TRUE)
ENDIF
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(piTarget)
ENDIF
IF DOES_BLIP_EXIST(bTargetBlip)
REMOVE_BLIP(bTargetBlip)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// cleanup all COORD blips
PROC CLEANUP_DEST_BLIPS()
IF DOES_BLIP_EXIST(bElevatorBlip)
REMOVE_BLIP(bElevatorBlip)
ENDIF
IF DOES_BLIP_EXIST(bSiteBlip)
REMOVE_BLIP(bSiteBlip)
ENDIF
ENDPROC
/// PURPOSE:
/// remove vehicle requests
PROC CLEANUP_VEHICLES()
IF DOES_ENTITY_EXIST(viTruck)
SET_VEHICLE_AS_NO_LONGER_NEEDED(viTruck)
ENDIF
IF DOES_ENTITY_EXIST(viHeli)
SET_VEHICLE_AS_NO_LONGER_NEEDED(viHeli)
ENDIF
ENDPROC
PROC CLEANUP_WARNING_GUYS()
INT idx
REPEAT NUM_WARNING_GUYS idx
IF DOES_ENTITY_EXIST(warningGuys[idx].ped)
IF IS_ENTITY_OCCLUDED(warningGuys[idx].ped)
DELETE_PED(warningGuys[idx].ped)
PRINTLN("REMOVING WARNING GUYS: ", idx)
ELSE
SET_PED_AS_NO_LONGER_NEEDED(warningGuys[idx].ped)
PRINTLN("SETTING AS NO LONGER NEEDED - WARNING GUYS: ", idx)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC REMOVING_HELI_AND_TARGET()
IF DOES_ENTITY_EXIST(viHeli)
IF IS_ENTITY_OCCLUDED(viHeli)
DELETE_VEHICLE(viHeli)
PRINTLN("REMOVING - viHeli")
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(viHeli)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED - viHeli - 01")
ENDIF
ELSE
PRINTLN("viHeli DOES NOT EXIST")
ENDIF
IF DOES_ENTITY_EXIST(piTarget)
IF IS_ENTITY_OCCLUDED(piTarget)
DELETE_PED(piTarget)
PRINTLN("REMOVING - piTarget")
ELSE
IF NOT IS_PED_INJURED(piTarget)
IF IS_PED_IN_ANY_HELI(piTarget)
SET_PED_COMBAT_ATTRIBUTES(piTarget, CA_LEAVE_VEHICLES, FALSE)
SET_PED_FLEE_ATTRIBUTES(piTarget, FA_USE_VEHICLE, FALSE)
SET_PED_KEEP_TASK(piTarget, TRUE)
ENDIF
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(piTarget)
PRINTLN("SETTING PED AS NO LONGER NEEDED - piTarget")
ENDIF
ELSE
PRINTLN("piTarget DOES NOT EXIST")
ENDIF
ENDPROC
PROC REMOVE_DEAD_ELEVATOR_GUYS()
IF DOES_ENTITY_EXIST(piDeadElevatorGuys[0])
DELETE_PED(piDeadElevatorGuys[0])
PRINTLN("REMOVING PED - piDeadElevatorGuys[0]")
ENDIF
IF DOES_ENTITY_EXIST(piDeadElevatorGuys[1])
DELETE_PED(piDeadElevatorGuys[1])
PRINTLN("REMOVING PED - piDeadElevatorGuys[1]")
ENDIF
ENDPROC
PROC HANDLE_COVER_PROPS(BOOL bCleanup = FALSE)
INT idx
VECTOR vCoverPropPosition[MAX_NUMBER_COVER_PROPS]
FLOAT fCoverPropHeading[MAX_NUMBER_COVER_PROPS]
vCoverPropPosition[0] = <<-113.3033, -958.0001, 26.2774>>
vCoverPropPosition[1] = <<-143.1153, -1007.3051, 26.2751>>
vCoverPropPosition[2] = <<-185.3750, -1036.0153, 26.10>>
vCoverPropPosition[3] = <<-130.0018, -970.9893, 26.3>>
vCoverPropPosition[4] = <<-162.4316, -1039.5804, 26.2758>>
fCoverPropHeading[0] = 160.3873
fCoverPropHeading[1] = 149.8891
fCoverPropHeading[2] = 254.0606
fCoverPropHeading[3] = 353.8129
fCoverPropHeading[4] = 314.2361
REPEAT MAX_NUMBER_COVER_PROPS idx
IF bCleanup
IF DOES_ENTITY_EXIST(objCoverProps[idx])
SET_OBJECT_AS_NO_LONGER_NEEDED(objCoverProps[idx])
// DELETE_OBJECT(objCoverProps[idx])
PRINTLN("SETTING COVER PROP AS NO LONGER NEEDED INDEX: ", vCoverPropPosition[idx])
ENDIF
ELSE
IF NOT DOES_ENTITY_EXIST(objCoverProps[idx])
objCoverProps[idx] = CREATE_OBJECT(prop_conc_blocks01a, vCoverPropPosition[idx])
SET_ENTITY_HEADING(objCoverProps[idx], fCoverPropHeading[idx])
FREEZE_ENTITY_POSITION(objCoverProps[idx], TRUE)
PRINTLN("COVER PROP POSITIONS = ", vCoverPropPosition[idx])
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC CLEANUP_ALL_AUDIO_MIX_SCENES()
IF DOES_ENTITY_EXIST(viCombatCar)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(viCombatCar)
ENDIF
IF DOES_ENTITY_EXIST(viHeli)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(viHeli)
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_CUTSCENE")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_CUTSCENE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_SHOOTOUT_START")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_SHOOTOUT_START")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_CAR_ARRIVES")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_CAR_ARRIVES")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_SHOOTOUT_ROOFTOP")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_SHOOTOUT_ROOFTOP")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_HELICOPTER_SCENE")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_HELICOPTER_SCENE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_LEAVE_THE_AREA")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_LEAVE_THE_AREA")
ENDIF
ENDPROC
// Cleanup the script on termination must not include any WAITs
PROC Script_Cleanup()
IF DOES_ENTITY_EXIST(oPayPhoneAnimated)
SET_MODEL_AS_NO_LONGER_NEEDED(P_PHONEBOX_01B_S)
DELETE_OBJECT(oPayPhoneAnimated)
PRINTLN("DELETING OBJECT - oPayPhoneAnimated")
ENDIF
IF DOES_ENTITY_EXIST(oPayPhone)
SET_ENTITY_VISIBLE(oPayPhone, TRUE)
SET_ENTITY_COLLISION(oPayPhone, TRUE)
PRINTLN("TURNING BACK ON VISIBILITY AND COLLISION")
ENDIF
IF IS_TIMER_STARTED(missionTimer)
g_savedGlobals.sAssassinData.fConstructionMissionTime = GET_TIMER_IN_SECONDS(missionTimer)
PRINTLN("CLEANUP: missionTimer = ", g_savedGlobals.sAssassinData.fConstructionMissionTime)
ELSE
PRINTLN("CLEANUP: missionTimer WAS NOT STARTED!!!")
ENDIF
bHeliModelLoaded = FALSE
PRINTLN("CLEANUP: bHeliModelLoaded = FALSE")
bHeliPedsCreated = FALSE
PRINTLN("CLEANUP: bHeliPedsCreated = FALSE")
HANDLE_COVER_PROPS(TRUE)
REMOVE_HEALTH_PACK()
REMOVE_PARACHUTE_PACK()
// IF STREAMVOL_IS_VALID(svPanicCutscene)
// STREAMVOL_DELETE(svPanicCutscene)
// PRINTLN("REMOVING - svPanicCutscene - 03")
// ENDIF
END_SRL()
// IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
// SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE, -1)
// ENDIF
REMOVE_ROAD_NODE_SPEED_ZONE(iRoadNode01)
REMOVE_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
REMOVE_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
REMOVE_WORKER_WAVE(wave3, NUM_WAVE_3_WORKERS)
REMOVE_WORKER_WAVE(wave4, NUM_WAVE_4_WORKERS)
REMOVE_WORKER_WAVE(wave5, NUM_WAVE_5_WORKERS)
REMOVE_WORKER_WAVE(wave6, NUM_WAVE_6_WORKERS)
REMOVE_DEAD_ELEVATOR_GUYS()
CLEANUP_WARNING_GUYS()
REMOVING_HELI_AND_TARGET()
CLEANUP_PED_BLIPS(TRUE)
CLEANUP_DEST_BLIPS()
CLEANUP_VEHICLES()
SET_CREATE_RANDOM_COPS(TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(WorkerModel[0])
SET_MODEL_AS_NO_LONGER_NEEDED(WorkerModel[1])
SET_MODEL_AS_NO_LONGER_NEEDED(ElevDoorModel)
SET_MODEL_AS_NO_LONGER_NEEDED(ElevModel)
SET_MODEL_AS_NO_LONGER_NEEDED(ElevButtonModel)
SET_PED_MODEL_IS_SUPPRESSED(WorkerModel[0], FALSE)
//make the ground elevators render again
REMOVE_MODEL_HIDE(vElev1Bottom, 5, PROP_CONSLIFT_LIFT)
REMOVE_MODEL_HIDE(vElev2Bottom, 5, PROP_CONSLIFT_LIFT)
REQUEST_IPL("DT1_21_prop_lift_on")
REMOVE_IPL("DT1_21_ConSiteAssass")
//detach the player from any elevator he may be attached to and delete the script created elevators
IF DOES_ENTITY_EXIST(objElev[1])
IF IS_ENTITY_ATTACHED_TO_ENTITY(Player, objElev[1])
DETACH_ENTITY(Player)
ENDIF
// IF IS_ENTITY_AT_COORD(objElev[1], vElev2Bottom, <<5,5,5>>)
// DELETE_OBJECT(objElev[1])
// ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objElev[0])
IF IS_ENTITY_ATTACHED_TO_ENTITY(Player, objElev[0])
DETACH_ENTITY(Player)
ENDIF
ENDIF
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_MAX_WANTED_LEVEL(6)
SET_PLAYER_INVINCIBLE(PLAYER_ID(), FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
KILL_ANY_CONVERSATION()
CLEAR_PED_NON_CREATION_AREA()
CLEANUP_ALL_AUDIO_MIX_SCENES()
RELEASE_SCRIPT_AUDIO_BANK()
REMOVE_DECALS_IN_RANGE(vTrailEnd, 10)
//restore phone stuff
IF DOES_ENTITY_EXIST(oPayPhone)
SET_ENTITY_VISIBLE(oPayPhone, TRUE)
SET_ENTITY_COLLISION(oPayPhone, TRUE)
SET_ENTITY_CAN_BE_DAMAGED(oPayPhone, TRUE)
ENDIF
TERMINATE_THIS_THREAD()
ENDPROC
PROC INIT_MODELS()
WorkerModel[0] = A_M_Y_BUSINESS_01
WorkerModel[1] = S_M_M_HIGHSEC_01
TruckModel = UTILLITRUCK3
CombatCarModel = SEMINOLE
ElevDoorModel = PROP_CONSLIFT_DOOR
ElevModel = PROP_CONSLIFT_LIFT
HeliModel = MAVERICK
ElevButtonModel = PROP_SUB_RELEASE
ENDPROC
PROC SETUP_MISSION_REWARDS()
fBaseReward = 8000
fBonusReward = 2000
ENDPROC
PROC REQUEST_STREAMS_NO_PEDS()
// INIT_ZVOLUME_WIDGETS()
// REQUEST_MODEL(WorkerModel[0])
// REQUEST_MODEL(WorkerModel[1])
REQUEST_MODEL(TruckModel)
REQUEST_MODEL(CombatCarModel)
REQUEST_MODEL(ElevDoorModel)
REQUEST_MODEL(ElevModel)
REQUEST_MODEL(prop_conc_blocks01a)
REQUEST_MODEL(ElevButtonModel)
REQUEST_ANIM_DICT("oddjobs@assassinate@construction@")
REQUEST_WAYPOINT_RECORDING("OJAScs_101")
REQUEST_VEHICLE_RECORDING(102, "OJAScs")
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\ASSASSINATION_MULTI")
REQUEST_ADDITIONAL_TEXT("ASS_CS", MINIGAME_TEXT_SLOT)
ENDPROC
FUNC BOOL ARE_STREAMS_LOADED_NO_PEDS()
BOOL returnBool = FALSE
// IF HAS_MODEL_LOADED(WorkerModel[0])
// AND HAS_MODEL_LOADED(WorkerModel[1])
IF HAS_MODEL_LOADED(TruckModel)
AND HAS_MODEL_LOADED(CombatCarModel)
AND HAS_MODEL_LOADED(ElevDoorModel)
AND HAS_MODEL_LOADED(ElevModel)
AND HAS_MODEL_LOADED(prop_conc_blocks01a)
AND HAS_MODEL_LOADED(ElevButtonModel)
AND HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT)
AND HAS_ANIM_DICT_LOADED("oddjobs@assassinate@construction@")
AND GET_IS_WAYPOINT_RECORDING_LOADED("OJAScs_101")
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(102, "OJAScs")
AND REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
AND REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\ASSASSINATION_MULTI")
// AND REQUEST_SCRIPT_AUDIO_BANK("Security_Camera")
PRINTLN("Streams loaded")
returnBool = TRUE
ELSE
PRINTLN("Loading streams")
ENDIF
RETURN returnBool
ENDFUNC
FUNC BOOL ARE_CONSTRUCTION_PED_MODELS_LOADED()
BOOL bLoaded
REQUEST_MODEL(WorkerModel[0])
REQUEST_MODEL(WorkerModel[1])
IF HAS_MODEL_LOADED(WorkerModel[0])
AND HAS_MODEL_LOADED(WorkerModel[1])
PRINTLN("CONSTRUCTION PED MODELS LOADED")
bLoaded = TRUE
ELSE
bLoaded = FALSE
ENDIF
RETURN bLoaded
ENDFUNC
FUNC BOOL HAS_HELICOPTER_MODEL_LOADED()
BOOL bLoaded
REQUEST_MODEL(HeliModel)
IF HAS_MODEL_LOADED(HeliModel)
PRINTLN("HELI MODEL LOADED!")
bLoaded = TRUE
ELSE
bLoaded = FALSE
ENDIF
RETURN bLoaded
ENDFUNC
PROC SET_ELEVATOR_PARAMS()
// //front door ground elevator
// vMyElevDoor[0]= << -185.04, -1018.39, 31.28 >>
//
// //back door ground elevator
// vMyElevDoor[1] = << -183.15, -1013.12, 29.070 >>
//
// //front door in panic cutscene
// vMyElevDoor[2] = << -155.650, -941.260, 115.420 >>
//
// //back door panic cutscene
// vMyElevDoor[3] = << -160.870, -939.400, 113.020 >>
//ground elevator
vMyElevPos[0] = << -182.24, -1016.44, 28.59 >>
vMyElevRot[0] = <<0,0,250.24>>
//2nd level elevator
vMyElevPos[1] = << -158.840, -942.240, 112.8 >>
vMyElevRot[1] = <<0,0,160.2>>
ENDPROC
/// PURPOSE:
/// Fill ped struct data for construction workers
PROC SETUP_WORKER_PARAMS()
//WAVE 1 - GROUND FLOOR
/* 0 */ wave1[0].loc = << -132.1519, -983.1443, 26.2731 >>
wave1[0].head = 320.6974
wave1[0].wpn = WEAPONTYPE_PISTOL
wave1[0].move = CM_WILLADVANCE
wave1[0].range = CR_MEDIUM
wave1[0].ability = CAL_PROFESSIONAL
wave1[0].attribute = CA_USE_COVER
/* 1 */ wave1[1].loc = << -128.4393, -1007.1317, 26.2731 >>
wave1[1].head = 347.4975
wave1[1].wpn = WEAPONTYPE_PUMPSHOTGUN
wave1[1].move = CM_WILLADVANCE
wave1[1].range = CR_NEAR
wave1[1].ability = CAL_PROFESSIONAL
wave1[1].attribute = CA_USE_COVER
//NEAR ELEVATOR
/* 4 */ wave1[2].loc = <<-170.5017, -969.5618, 28.2893>>
wave1[2].head = 158.0000
wave1[2].wpn = WEAPONTYPE_PISTOL
wave1[2].move = CM_DEFENSIVE
wave1[2].range = CR_MEDIUM
wave1[2].ability = CAL_PROFESSIONAL
wave1[2].attribute = CA_USE_COVER
//GUARDING THE ELEVATOR
/* 5 */ wave1[3].loc = <<-189.2459, -1014.7320, 28.2884>>
wave1[3].head = 238.8071
wave1[3].wpn = WEAPONTYPE_ASSAULTRIFLE
wave1[3].move = CM_DEFENSIVE
wave1[3].range = CR_MEDIUM
wave1[3].ability = CAL_PROFESSIONAL
wave1[3].attribute = CA_AGGRESSIVE
//NEAR THE GROUND FLOOR CRANE
/* 6 */ wave1[4].loc = << -118.25, -1051.072, 27.3 >>
wave1[4].head = 286.9180
wave1[4].wpn = WEAPONTYPE_PISTOL
wave1[4].move = CM_DEFENSIVE
wave1[4].range = CR_MEDIUM
wave1[4].ability = CAL_PROFESSIONAL
wave1[4].attribute = CA_USE_COVER
//WAVE 2 - GUYS IN CAR THAT DRIVE TO ELEVATOR
/* 0 */ wave2[0].loc = << -137.2297, -1095.2305, 20.6838 >>
wave2[0].head = 160
wave2[0].wpn = WEAPONTYPE_PISTOL
wave2[0].move = CM_WILLADVANCE
wave2[0].range = CR_MEDIUM
wave2[0].ability = CAL_PROFESSIONAL
wave2[0].attribute = CA_USE_COVER
/* 1 */ wave2[1].loc = << -135.9752, -1091.7012, 20.6838 >>
wave2[1].head = 160
wave2[1].wpn = WEAPONTYPE_MICROSMG
wave2[1].move = CM_DEFENSIVE
wave2[1].range = CR_MEDIUM
wave2[1].ability = CAL_PROFESSIONAL
wave2[1].attribute = CA_USE_COVER
/* 2 */ wave2[2].loc = << -136.1536, -1092.4149, 20.6838 >>
wave2[2].head = 160
wave2[2].wpn = WEAPONTYPE_PISTOL
wave2[2].move = CM_DEFENSIVE
wave2[2].range = CR_MEDIUM
wave2[2].ability = CAL_PROFESSIONAL
wave2[2].attribute = CA_USE_COVER
//WAVE 3 - 18th Floor - Midlevel
/* 0 */ wave3[0].loc = <<-176.6884, -999.7880, 113.1382>>
wave3[0].head = 165.9047
wave3[0].wpn = WEAPONTYPE_PISTOL
wave3[0].move = CM_DEFENSIVE
wave3[0].range = CR_NEAR
wave3[0].ability = CAL_PROFESSIONAL
wave3[0].attribute = CA_AGGRESSIVE
/* 1 */ wave3[1].loc = << -157.0080, -979.8131, 113.1330 >>
wave3[1].head = 246.3884
wave3[1].wpn = WEAPONTYPE_PISTOL
wave3[1].move = CM_DEFENSIVE
wave3[1].range = CR_NEAR
wave3[1].ability = CAL_PROFESSIONAL
wave3[1].attribute = CA_AGGRESSIVE
/* 2 */ wave3[2].loc = << -154.27, -945.61, 113.1339 >>
wave3[2].head = 160.8846
wave3[2].wpn = WEAPONTYPE_CARBINERIFLE
wave3[2].move = CM_DEFENSIVE
wave3[2].range = CR_NEAR
wave3[2].ability = CAL_PROFESSIONAL
wave3[2].attribute = CA_AGGRESSIVE
/* 3 */ wave3[3].loc = << -145.5338, -986.0398, 113.1282 >>
wave3[3].head = 137
wave3[3].wpn = WEAPONTYPE_MICROSMG
wave3[3].move = CM_DEFENSIVE
wave3[3].range = CR_NEAR
wave3[3].ability = CAL_PROFESSIONAL
wave3[3].attribute = CA_AGGRESSIVE
/* 4 */ wave3[4].loc = << -158.9804, -951.3898, 113.1328 >>
wave3[4].head = 173
wave3[4].wpn = WEAPONTYPE_MICROSMG
wave3[4].move = CM_DEFENSIVE
wave3[4].range = CR_NEAR
wave3[4].ability = CAL_PROFESSIONAL
wave3[4].attribute = CA_AGGRESSIVE
/* 5 */ wave3[5].loc = << -146.8379, -964.5045, 113.1339 >>
wave3[5].head = 156.7863
wave3[5].wpn = WEAPONTYPE_PISTOL
wave3[5].move = CM_DEFENSIVE
wave3[5].range = CR_NEAR
wave3[5].ability = CAL_PROFESSIONAL
wave3[5].attribute = CA_AGGRESSIVE
// //guy hiding behind tarp near elevator
///* 6 */ wave3[6].loc = << -174.748, -989.5677, 114.1327 >>
// wave3[6].head = 154.4059
// wave3[6].wpn = WEAPONTYPE_PISTOL
// wave3[6].move = CM_DEFENSIVE
// wave3[6].range = CR_NEAR
// wave3[6].ability = CAL_PROFESSIONAL
// wave3[6].attribute = CA_AGGRESSIVE
// WAVE 4 THAT ARRIVES FROM TOP ELEVATOR
/* 0 */ wave4[0].loc = << -152.9496, -946.5169, 123.2578 >>
wave4[0].head = 124.2627
wave4[0].wpn = WEAPONTYPE_PUMPSHOTGUN
wave4[0].move = CM_WILLADVANCE
wave4[0].range = CR_NEAR
wave4[0].ability = CAL_PROFESSIONAL
wave4[0].attribute = CA_AGGRESSIVE
/* 1 */ wave4[1].loc = << -151.9618, -945.3404, 123.2578 >>
wave4[1].head = 338.7249
wave4[1].wpn = WEAPONTYPE_PISTOL
wave4[1].move = CM_DEFENSIVE
wave4[1].range = CR_NEAR
wave4[1].ability = CAL_PROFESSIONAL
wave4[1].attribute = CA_AGGRESSIVE
//WAVE 5 - ROOFTOP ENEMIES
/* 0 */ wave5[0].loc = << -147.71979, -952.74762, 268.13504 >>
wave5[0].head = 14.5077
wave5[0].wpn = WEAPONTYPE_PISTOL
wave5[0].move = CM_WILLADVANCE
wave5[0].range = CR_NEAR
wave5[0].ability = CAL_PROFESSIONAL
wave5[0].attribute = CA_AGGRESSIVE
/* 1 */ wave5[1].loc = << -156.95184, -966.8706, 268.2581 >>
wave5[1].head = 336.0895
wave5[1].wpn = WEAPONTYPE_PISTOL
wave5[1].move = CM_WILLADVANCE
wave5[1].range = CR_NEAR
wave5[1].ability = CAL_PROFESSIONAL
wave5[1].attribute = CA_AGGRESSIVE
/* 2 */ wave5[2].loc = << -147.4382, -967.9998, 268.1325 >>
wave5[2].head = 50.9751
wave5[2].wpn = WEAPONTYPE_PISTOL
wave5[2].move = CM_DEFENSIVE
wave5[2].range = CR_MEDIUM
wave5[2].ability = CAL_PROFESSIONAL
wave5[2].attribute = CA_AGGRESSIVE
//guy on crane
/* 3 */ wave5[3].loc = vCraneSpawnPos
wave5[3].head = 90
wave5[3].wpn = WEAPONTYPE_CARBINERIFLE
wave5[3].move = CM_DEFENSIVE
wave5[3].range = CR_FAR
wave5[3].ability = CAL_PROFESSIONAL
wave5[3].attribute = CA_AGGRESSIVE
//add their relationship grounp
ADD_RELATIONSHIP_GROUP("ConstructionEnemies", relEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relEnemies, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relEnemies)
ENDPROC
/// PURPOSE:
/// Set construction worker attributes once they have been created
PROC SET_WORKER_PARAMS(WORKER_STRUCT& workerStruct[], INT idx, BOOL bSetCombatRange = TRUE)
GIVE_WEAPON_TO_PED(workerStruct[idx].ped, workerStruct[idx].wpn , INFINITE_AMMO, TRUE)
SET_PED_AS_ENEMY(workerStruct[idx].ped , TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(workerStruct[idx].ped, relEnemies)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(workerStruct[idx].ped, TRUE)
SET_PED_COMBAT_ABILITY(workerStruct[idx].ped, workerStruct[idx].ability)
IF bSetCombatRange
SET_PED_COMBAT_RANGE(workerStruct[idx].ped, workerStruct[idx].range)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(workerStruct[idx].ped, workerStruct[idx].attribute, TRUE)
SET_PED_COMBAT_MOVEMENT(workerStruct[idx].ped, workerStruct[idx].move)
SET_PED_ACCURACY(workerStruct[idx].ped, 20)
ENDPROC
/// PURPOSE:
/// Create elevator props
//PROC CREATE_ELEVATOR_DOORS()
// //create closed elevator doors for elevator props that never move
// //panic cutscene lift
// IF NOT DOES_ENTITY_EXIST(objElevDoorClosed[0])
// objElevDoorClosed[0] = CREATE_OBJECT(ElevDoorModel, << -179.430, -1014.410, 113 >>)
// SET_ENTITY_ROTATION(objElevDoorClosed[0], <<0,1,70.24>>)
// ENDIF
// IF NOT DOES_ENTITY_EXIST(objElevDoorClosed[1])
// objElevDoorClosed[1] = CREATE_OBJECT(ElevDoorModel, << -181.260, -1019.510, 113 >>)
// SET_ENTITY_ROTATION(objElevDoorClosed[1], <<0,1,70.24>>)
// ENDIF
// //top level elevator
// IF NOT DOES_ENTITY_EXIST(objElevDoorClosed[2])
// objElevDoorClosed[2] = CREATE_OBJECT(ElevDoorModel, << -162.010, -943.190, 268.520 >>)
// SET_ENTITY_ROTATION(objElevDoorClosed[2], << 0, 0, 339 >>)
// ENDIF
// IF NOT DOES_ENTITY_EXIST(objElevDoorClosed[3])
// objElevDoorClosed[3] = CREATE_OBJECT(ElevDoorModel, << -156.850, -945.060, 268.520 >>)
// SET_ENTITY_ROTATION(objElevDoorClosed[3], << 0, 0, 339 >>)
// ENDIF
//
// //create dynamic elevator doors
// //bottom entrance open
// IF NOT DOES_ENTITY_EXIST(objElevDoorControl[0])
// objElevDoorControl[0] = CREATE_OBJECT(ElevDoorModel, vMyElevDoor[0])
// SET_ENTITY_ROTATION(objElevDoorControl[0], <<0,1,70.24>>)
// ENDIF
// //bottom exit
// IF NOT DOES_ENTITY_EXIST(objElevDoorControl[1])
// objElevDoorControl[1] = CREATE_OBJECT(ElevDoorModel, vMyElevDoor[1])
// SET_ENTITY_ROTATION(objElevDoorControl[1], <<0,1,70.24>>)
// ENDIF
//START LOCATION FOR MOVING ELEVATOR
// //second lift open front
// IF NOT DOES_ENTITY_EXIST(objElevDoorControl[2])
// objElevDoorControl[2] = CREATE_OBJECT(ElevDoorModel, vMyElevDoor[2])
// SET_ENTITY_ROTATION(objElevDoorControl[2], <<0,0, 160.2>>)
// ENDIF
// //second lift closed back
// IF NOT DOES_ENTITY_EXIST(objElevDoorControl[3])
// objElevDoorControl[3] = CREATE_OBJECT(ElevDoorModel, vMyElevDoor[3])
// SET_ENTITY_ROTATION(objElevDoorControl[3], <<0,0, 160.2>>)
// ENDIF
//ENDPROC
PROC CREATE_GROUND_ELEVATOR()
objElev[0] = CREATE_OBJECT(ElevModel, vMyElevPos[0])
SET_ENTITY_ROTATION(objElev[0], vMyElevRot[0])
objElevButton[0] = CREATE_OBJECT(ElevButtonModel, vMyElevPos[0])
ATTACH_ENTITY_TO_ENTITY(objElevButton[0], objElev[0], 0, vButtonOffset, <<0,0,0>>)
ENDPROC
PROC REMOVE_SECOND_ELEVATOR()
IF DOES_ENTITY_EXIST(objElev[1])
DELETE_OBJECT(objElev[1])
PRINTLN("REMOVING ELEVATOR")
ENDIF
IF DOES_ENTITY_EXIST(objElevButton[1])
DELETE_OBJECT(objElevButton[1])
PRINTLN("REMOVING ELEVATOR BUTTON")
ENDIF
ENDPROC
PROC CREATE_SECOND_ELEVATOR(BOOL bForCutscene = TRUE)
IF NOT DOES_ENTITY_EXIST(objElev[1])
IF bForCutscene
objElev[1] = CREATE_OBJECT(ElevModel, vMyElevPos[1])
ELSE
objElev[1] = CREATE_OBJECT(ElevModel, vMyElevPos[1])
SET_ENTITY_COORDS(objElev[1], << -158.840, -942.240, 125.8 >>)
// SET_ENTITY_COORDS(objElevDoorControl[2], << -155.650, -941.260, 125.03 >>)
// SET_ENTITY_COORDS(objElevDoorControl[3], << -160.870, -939.400, 125.03 >>)
ENDIF
SET_ENTITY_ROTATION(objElev[1], vMyElevRot[1])
ELSE
SET_ENTITY_COORDS(objElev[1], << -158.840, -942.240, 125.8 >>)
// SET_ENTITY_COORDS(objElevDoorControl[2], << -155.650, -941.260, 125.03 >>)
// SET_ENTITY_COORDS(objElevDoorControl[3], << -160.870, -939.400, 125.03 >>)
SET_ENTITY_ROTATION(objElev[1], vMyElevRot[1])
ENDIF
objElevButton[1] = CREATE_OBJECT(ElevButtonModel, vMyElevPos[01])
ATTACH_ENTITY_TO_ENTITY(objElevButton[1], objElev[1], 0, vButtonOffset, <<0,0,0>>)
ENDPROC
/// PURPOSE: Create work truck and construction worker peds on ground level of site
PROC CREATE_VEHICLES()
IF NOT DOES_ENTITY_EXIST(viTruck)
viTruck = CREATE_VEHICLE(TruckModel, vTruckPos, fTruckHead)
ENDIF
IF NOT DOES_ENTITY_EXIST(viCombatCar)
viCombatCar = CREATE_VEHICLE(CombatCarModel, << -130.3431, -1096.4409, 21.3323 >>, 337)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(viCombatCar, "ASSASSINATION_CONSTRUCT_CAR_GROUP")
ENDIF
ENDPROC
/// PURPOSE: Setup Patrol paths
PROC SETUP_PATROL_PATHS()
vPatrolPathPoint[0] = << -139.78418, -992.19635, 26.27540 >>
vPatrolPathPoint[1] = << -119.22578, -986.67188, 26.28716 >>
vPatrolPathPoint[2] = << -129.02084, -981.08838, 26.27540 >>
OPEN_PATROL_ROUTE("miss_Ass0")
ADD_PATROL_ROUTE_NODE ( 0, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[0], << -139.40767, -993.47321, 26.27540 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 1, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[1], << -116.13918, -987.49841, 26.38541 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 2, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[2], << -128.46848, -979.03406, 26.27540 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_LINK (0, 1)
ADD_PATROL_ROUTE_LINK (1, 2)
ADD_PATROL_ROUTE_LINK (2, 0)
CLOSE_PATROL_ROUTE ()
CREATE_PATROL_ROUTE ()
vPatrolPathPoint[3] = << -138.6994, -979.7902, 27.3835 >>
vPatrolPathPoint[4] = << -168.2610, -970.3499, 28.3159 >>
vPatrolPathPoint[5] = << -150.2031, -982.3716, 27.3835 >>
OPEN_PATROL_ROUTE("miss_Ass1")
ADD_PATROL_ROUTE_NODE ( 0, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[3], << -138.0908, -980.1388, 26.3835 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 1, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[4], << 0,0,0 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 2, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[5], << -150.6753, -982.7073, 26.3835 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_LINK (0, 1)
ADD_PATROL_ROUTE_LINK (1, 2)
ADD_PATROL_ROUTE_LINK (2, 0)
CLOSE_PATROL_ROUTE ()
CREATE_PATROL_ROUTE ()
vPatrolPathPoint[6] = << -119.74, -987.43, 27.2835 >>
vPatrolPathPoint[7] = << -126.7858, -1005.1038, 26.2731 >>
vPatrolPathPoint[8] = << -134.0714, -1033.0955, 26.2731 >>
OPEN_PATROL_ROUTE("miss_Ass2")
ADD_PATROL_ROUTE_NODE ( 0, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[6], << 0,0,0 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 1, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[7], << 0,0,0 >>)
ADD_PATROL_ROUTE_NODE ( 2, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[8], << 0,0,0 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_LINK (0, 1)
ADD_PATROL_ROUTE_LINK (1, 2)
ADD_PATROL_ROUTE_LINK (2, 0)
CLOSE_PATROL_ROUTE ()
CREATE_PATROL_ROUTE ()
vPatrolPathPoint[9] = << -118.0965, -1040.0308, 26.2740 >>
vPatrolPathPoint[10] = << -114.6962, -1053.8435, 26.2942 >>
vPatrolPathPoint[11] = << -143.5082, -1044.1169, 26.2913 >>
OPEN_PATROL_ROUTE("miss_Ass3")
ADD_PATROL_ROUTE_NODE ( 0, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[9], << -108.7927, -1033.7714, 26.2731 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 1, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[10], << -115.0062, -1054.9329, 26.2892 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 2, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[11], << -144.8010, -1043.6625, 26.2912 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_LINK (0, 1)
ADD_PATROL_ROUTE_LINK (1, 2)
ADD_PATROL_ROUTE_LINK (2, 0)
CLOSE_PATROL_ROUTE ()
CREATE_PATROL_ROUTE ()
vPatrolPathPoint[12] = << -129.8310, -1003.8873, 26.2731 >>
vPatrolPathPoint[13] = << -142.1477, -1007.6038, 26.2731 >>
OPEN_PATROL_ROUTE("miss_Ass4")
ADD_PATROL_ROUTE_NODE ( 0, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[12], << -130.3284, -998.4552, 26.2731 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 1, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[13], << -142.5782, -1008.2757, 26.2731 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_LINK (0, 1)
ADD_PATROL_ROUTE_LINK (1, 0)
CLOSE_PATROL_ROUTE ()
CREATE_PATROL_ROUTE ()
vPatrolPathPoint[14] = << -193.2124, -1058.5308, 23.4276 >>
vPatrolPathPoint[15] = << -176.1570, -1028.9437, 27.2832 >>
vPatrolPathPoint[16] = << -170.2736, -1037.5872, 27.280 >>
OPEN_PATROL_ROUTE("miss_Ass5")
ADD_PATROL_ROUTE_NODE ( 0, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[14], << -194.7176, -1062.0897, 21.8847 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 1, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[15], << -167.7465, -1038.0892, 26.2798 >>)
ADD_PATROL_ROUTE_NODE ( 2, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[16], << -194.7176, -1062.0897, 21.8847 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_LINK (0, 1)
ADD_PATROL_ROUTE_LINK (1, 2)
ADD_PATROL_ROUTE_LINK (2, 0)
CLOSE_PATROL_ROUTE ()
CREATE_PATROL_ROUTE ()
vPatrolPathPoint[17] = <<-180.4631, -1022.1616, 28.2893>>
vPatrolPathPoint[18] = <<-188.5225, -1019.4911, 28.2893>>
OPEN_PATROL_ROUTE("miss_Ass6")
ADD_PATROL_ROUTE_NODE ( 0, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[17], << -194.4449, -1017.9739, 28.2895 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_NODE ( 1, "WORLD_HUMAN_GUARD_STAND", vPatrolPathPoint[18], << -182.4519, -1021.0443, 28.2863 >>, GET_RANDOM_INT_IN_RANGE(5000, 10000))
ADD_PATROL_ROUTE_LINK (0, 1)
ADD_PATROL_ROUTE_LINK (1, 0)
CLOSE_PATROL_ROUTE ()
CREATE_PATROL_ROUTE ()
ENDPROC
/// PURPOSE:
/// Task peds on foot on ground level to attack player
PROC WAVE_1_WORKER_ASSAULT()
INT i
FOR i = 0 TO NUM_WAVE_1_WORKERS - 1
IF NOT IS_PED_INJURED(wave1[i].ped)
IF i = 0
SET_PED_COMBAT_MOVEMENT(wave1[i].ped, CM_WILLADVANCE)
PRINTLN("CALLING CM_WILLADVANCE ON PED: ", i)
ELIF i = 1
SET_PED_COMBAT_MOVEMENT(wave1[i].ped, CM_WILLADVANCE)
PRINTLN("CALLING CM_WILLADVANCE ON PED: ", i)
ELIF i = 2
SET_PED_SPHERE_DEFENSIVE_AREA(wave1[i].ped, wave1[i].loc, 10)
PRINTLN("SET_PED_SPHERE_DEFENSIVE_AREA ON PED: ", i)
ELIF i = 3
SET_PED_SPHERE_DEFENSIVE_AREA(wave1[i].ped, wave1[i].loc, 10)
PRINTLN("SET_PED_SPHERE_DEFENSIVE_AREA ON PED: ", i)
ELIF i = 4
SET_PED_COMBAT_MOVEMENT(wave1[i].ped, CM_WILLADVANCE)
PRINTLN("CALLING CM_WILLADVANCE ON PED: ", i)
ELSE
SET_PED_SPHERE_DEFENSIVE_AREA(wave1[i].ped, << -176.2501, -1026.9131, 26.2752 >>, 25)
SET_PED_COMBAT_MOVEMENT(wave1[i].ped, CM_DEFENSIVE)
PRINTLN("CALLING CM_DEFENSIVE ON PED: ", i)
ENDIF
IF GET_SCRIPT_TASK_STATUS(wave1[i].ped, SCRIPT_TASK_PATROL) = PERFORMING_TASK
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(wave1[i].ped)
CLEAR_PED_TASKS(wave1[i].ped)
PRINTLN("CALLING CM_DEFENSIVE ON PED: ", i)
ENDIF
TASK_COMBAT_PED(wave1[i].ped, Player)
SET_PED_KEEP_TASK(wave1[i].ped, TRUE)
// //blip the guys
// IF NOT DOES_BLIP_EXIST(wave1[i].blip)
// wave1[i].blip = CREATE_BLIP_ON_ENTITY(wave1[i].ped, FALSE)
// ENDIF
ENDIF
ENDFOR
ENDPROC
// send group of guys in car on ground level to drive near the elevator and attack the player
PROC WAVE_2_WORKER_ASSAULT()
INT i
IF DOES_ENTITY_EXIST(viCombatCar)
IF IS_VEHICLE_DRIVEABLE(viCombatCar)
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(viCombatCar)
FOR i = 0 TO NUM_WAVE_2_WORKERS - 1
IF NOT IS_PED_INJURED(wave2[i].ped)
// IF NOT DOES_BLIP_EXIST(wave2[i].blip)
// wave2[i].blip = CREATE_BLIP_ON_ENTITY(wave2[i].ped, FALSE)
IF wave2[i].ped = GET_PED_IN_VEHICLE_SEAT(viCombatCar)
IF NOT IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_CAR_ARRIVES")
START_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_CAR_ARRIVES")
ENDIF
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(wave2[i].ped, viCombatCar, "OJAScs_101", DF_SwerveAroundAllCars|DF_SteerAroundObjects|DF_SteerAroundPeds)
SET_PED_KEEP_TASK(wave2[i].ped, TRUE)
bUpdateGuysInCar = TRUE
ELSE
TASK_COMBAT_PED(wave2[i].ped, Player)
SET_PED_KEEP_TASK(wave2[i].ped, TRUE)
bUpdateGuysInCar = TRUE
ENDIF
// ENDIF
ENDIF
ENDFOR
bPanicking = TRUE
bCarSent = TRUE
PRINTLN("WAVE_2_WORKER_ASSAULT()")
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Task peds on second level of site to attack player
PROC WAVE_3_WORKER_ASSAULT()
INT i
SEQUENCE_INDEX tempSeq
FOR i = 0 TO NUM_WAVE_3_WORKERS - 1
IF NOT IS_PED_INJURED(wave3[i].ped)
// CLEAR_PED_TASKS_IMMEDIATELY(wave3[i].ped)
IF GET_SCRIPT_TASK_STATUS(wave3[i].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(wave3[i].ped, wave3[i].loc, 10)
SET_ENTITY_LOAD_COLLISION_FLAG(wave3[i].ped, TRUE)
ELIF i = 1 // guy behind pallets in center of the level as you round the first corner
SET_PED_SPHERE_DEFENSIVE_AREA(wave3[i].ped, wave3[i].loc, 10)
ELIF i = 2 // guy guarding 2nd elevator position
SET_PED_SPHERE_DEFENSIVE_AREA(wave3[i].ped, << -151.3457, -948.0886, 113.1339 >>, 10)
ELIF i = 3 // guy behind pallet prop on opposite corner of the floor
SET_PED_SPHERE_DEFENSIVE_AREA(wave3[i].ped, << -145.5338, -986.0398, 113.1282 >>, 10)
ELIF i = 4 //guy behind guard 3 guarding the area on opposite corner of the building
SET_PED_SPHERE_DEFENSIVE_AREA(wave3[i].ped, << -139.7715, -968.0640, 113.1339 >>, 10)
ELIF i = 5 // guy guarding center of the floor
SET_PED_SPHERE_DEFENSIVE_AREA(wave3[i].ped, << -154.0288, -960.1566, 113.1317 >>, 10)
ENDIF
OPEN_SEQUENCE_TASK(tempSeq)
IF i = 0
// TASK_GO_STRAIGHT_TO_COORD(NULL, <<-162.70424, -999.03363, 113.13822>>, PEDMOVEBLENDRATIO_SPRINT, DEFAULT_TIME_NEVER_WARP, 1.5)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<-162.70424, -999.03363, 113.13822>>, PLAYER_PED_ID(), PEDMOVEBLENDRATIO_RUN, FALSE, 1.5, 1.5, FALSE)
ENDIF
TASK_COMBAT_PED(NULL, Player)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(wave3[i].ped, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
SET_PED_COMBAT_MOVEMENT(wave3[i].ped, CM_WILLADVANCE)
SET_COMBAT_FLOAT(wave3[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3)
SET_PED_KEEP_TASK(wave3[i].ped, TRUE)
PRINTLN("SETTING WAVE 3 PED TO ADVANCE : ", i)
ENDIF
ENDIF
ENDFOR
ENDPROC
//guys in elevator should exit and attack the player when this is called
PROC WAVE_4_WORKER_ASSAULT()
INT i
SEQUENCE_INDEX tempSeq
VECTOR vGoToCoordinate
FOR i = 0 TO NUM_WAVE_4_WORKERS - 1
IF NOT IS_PED_INJURED(wave4[i].ped)
DETACH_ENTITY(wave4[i].ped, FALSE, FALSE)
IF i = 0
SET_PED_SPHERE_DEFENSIVE_AREA(wave4[i].ped, << -145.5655, -941.1028, 113.2452 >>, 10)
ELIF i = 1
SET_PED_SPHERE_DEFENSIVE_AREA(wave4[i].ped, << -152.5679, -947.0895, 113.1339 >>, 10)
ENDIF
SET_PED_KEEP_TASK(wave4[i].ped, TRUE)
//go to the position right outside the elevator doors and attack the player (no navmesh inside of elevator)
CLEAR_SEQUENCE_TASK(tempSeq)
OPEN_SEQUENCE_TASK(tempSeq)
IF i = 0
vGoToCoordinate = <<-153.0079, -944.3201, 113.1388>>
ELSE
vGoToCoordinate = <<-152.1749, -941.6376, 113.1388>>
ENDIF
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vGoToCoordinate, Player, PEDMOVE_RUN, FALSE, 0.5, 0)
TASK_COMBAT_PED(NULL, Player)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(wave4[i].ped, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
ENDIF
ENDFOR
ENDPROC
//task rooftop enemies to fight the player
PROC WAVE_5_WORKER_ASSAULT()
SEQUENCE_INDEX tempSeq
INT i
FOR i = 0 TO NUM_WAVE_5_WORKERS - 1
IF i = 0 //guy should run to position behind the lumber pallet and combat the player
IF NOT IS_PED_INJURED(wave5[i].ped)
IF IS_SCREEN_FADED_IN()
SET_PED_SPHERE_DEFENSIVE_AREA(wave5[i].ped, wave5[i].loc, 15)
CLEAR_SEQUENCE_TASK(tempSeq)
OPEN_SEQUENCE_TASK(tempSeq)
TASK_AIM_GUN_AT_ENTITY(NULL, Player, 250)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, << -141.36034, -946.22839, 268.13504 >>, Player, PEDMOVE_RUN, TRUE)
TASK_COMBAT_PED(NULL, Player)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(wave5[i].ped, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
SET_PED_COMBAT_MOVEMENT(wave5[i].ped, CM_WILLADVANCE)
SET_PED_KEEP_TASK(wave5[i].ped, TRUE)
ENDIF
ENDIF
ELIF i = 1 //guy runs to position outside elevator doors
IF NOT IS_PED_INJURED(wave5[i].ped)
CLEAR_SEQUENCE_TASK(tempSeq)
OPEN_SEQUENCE_TASK(tempSeq)
TASK_GO_TO_COORD_ANY_MEANS(NULL, << -140.1210, -959.6016, 268.2571 >>, PEDMOVE_SPRINT, NULL)
TASK_COMBAT_PED(NULL, Player)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(wave5[i].ped, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
SET_PED_COMBAT_MOVEMENT(wave5[i].ped, CM_WILLADVANCE)
SET_PED_KEEP_TASK(wave5[i].ped, TRUE)
ENDIF
ELIF i = 2
IF NOT IS_PED_INJURED(wave5[i].ped)
TASK_COMBAT_PED(wave5[i].ped, Player)
SET_PED_SPHERE_DEFENSIVE_AREA(wave5[i].ped, wave5[i].loc, 10)
SET_PED_COMBAT_MOVEMENT(wave5[i].ped, CM_WILLADVANCE)
SET_PED_KEEP_TASK(wave5[i].ped, TRUE)
ENDIF
ENDIF
PRINTLN("RAN WORK WAVE ASSAULT 5")
// //blip the guys
// IF NOT DOES_BLIP_EXIST(wave5[i].blip)
// PRINTLN("ADDING BLIP FOR WORKER ", i)
// wave5[i].blip = CREATE_BLIP_ON_ENTITY(wave5[i].ped, FALSE)
// ENDIF
ENDFOR
ENDPROC
FUNC BOOL IS_PLAYER_ARMED()
WEAPON_TYPE wtCurrentPedWeapon
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtCurrentPedWeapon)
IF wtCurrentPedWeapon <> WEAPONTYPE_UNARMED
PRINTLN("PLAYER IS ARMED")
RETURN TRUE
ELSE
PRINTLN("PLAYER IS NOT ARMED")
RETURN FALSE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SETUP_WARNING_GUY_PRE_COMBAT(INT idx)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(warningGuys[idx].ped, TRUE)
GIVE_WEAPON_TO_PED(warningGuys[idx].ped, WEAPONTYPE_MICROSMG, -1, FALSE)
SET_PED_COMBAT_MOVEMENT(warningGuys[idx].ped, CM_WILLADVANCE)
SET_PED_COMBAT_RANGE(warningGuys[idx].ped, CR_FAR)
TASK_PLAY_ANIM(warningGuys[idx].ped, "oddjobs@assassinate@construction@", "unarmed_fold_arms", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
SET_PED_RELATIONSHIP_GROUP_HASH(warningGuys[idx].ped, relEnemies)
ENDPROC
PROC CREATE_WARNING_GUYS()
IF NOT DOES_ENTITY_EXIST(warningGuys[0].ped)
warningGuys[0].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], <<-111.9202, -943.5192, 28.2288>>, 344.7112)
SET_ENTITY_LOAD_COLLISION_FLAG(warningGuys[0].ped, TRUE)
SET_PED_COMBAT_ATTRIBUTES(warningGuys[0].ped, CA_CAN_CHARGE, TRUE)
STOP_PED_WEAPON_FIRING_WHEN_DROPPED(warningGuys[0].ped)
SETUP_WARNING_GUY_PRE_COMBAT(0)
ENDIF
IF NOT DOES_ENTITY_EXIST(warningGuys[1].ped)
warningGuys[1].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], <<-197.8959, -1078.9697, 20.6882>>, 166.4473)
SET_ENTITY_LOAD_COLLISION_FLAG(warningGuys[1].ped, TRUE)
SET_PED_COMBAT_ATTRIBUTES(warningGuys[1].ped, CA_CAN_CHARGE, TRUE)
STOP_PED_WEAPON_FIRING_WHEN_DROPPED(warningGuys[1].ped)
SETUP_WARNING_GUY_PRE_COMBAT(1)
ENDIF
IF NOT DOES_ENTITY_EXIST(warningGuys[2].ped)
warningGuys[2].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], << -82.0262, -1023.1237, 27.3748 >>, 269.8311)
SET_ENTITY_LOAD_COLLISION_FLAG(warningGuys[2].ped, TRUE)
SET_PED_COMBAT_ATTRIBUTES(warningGuys[2].ped, CA_CAN_CHARGE, TRUE)
STOP_PED_WEAPON_FIRING_WHEN_DROPPED(warningGuys[2].ped)
SETUP_WARNING_GUY_PRE_COMBAT(2)
ENDIF
PRINTLN("CREATING WARNING GUYS")
ENDPROC
FUNC BOOL UPDATE_AGGRO_WARNING_GUARDS()
INT idx
REPEAT NUM_WARNING_GUYS idx
IF NOT IS_ENTITY_DEAD(warningGuys[idx].ped)
IF DO_AGGRO_CHECK(warningGuys[idx].ped, NULL, aggroArgs, aggroReason, FALSE, TRUE, FALSE, FALSE)
PRINTLN("RETURNING TRUE ON AGGRO CHECK 01, PED = ", idx)
RETURN TRUE
ENDIF
ELSE
// IF DOES_ENTITY_EXIST(warningGuys[idx].ped)
// IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(warningGuys[idx].ped, PLAYER_PED_ID())
// PRINTLN("RETURNING TRUE ON AGGRO CHECK 02, PED = ", idx)
// RETURN TRUE
// ENDIF
// ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL UPDATE_WARNING_GUARDS()
// VECTOR vPlayerPosition
// VECTOR vGuardPosition[3]
INT idx
IF NOT IS_ENTITY_DEAD(Player)
IF IS_ENTITY_IN_ANGLED_AREA(Player, <<-113.319, -941.315, -100>>, <<-171.373, -1095.764, 100>>, 100, FALSE, FALSE)
OR IS_ENTITY_IN_ANGLED_AREA(Player, vAngledAreaMaxWarningGuy[0], vAngledAreaMinWarningGuy[0], fAngledAreaWidthWarningGuy[0])
OR IS_ENTITY_IN_ANGLED_AREA(Player, vAngledAreaMaxWarningGuy[1], vAngledAreaMinWarningGuy[1], fAngledAreaWidthWarningGuy[1])
OR IS_ENTITY_IN_ANGLED_AREA(Player, vAngledAreaMaxWarningGuy[2], vAngledAreaMinWarningGuy[2], fAngledAreaWidthWarningGuy[2])
bPlayerInSite = TRUE
// PRINTLN("bPlayerInSite = TRUE")
ELSE
bPlayerInSite = FALSE
// PRINTLN("bPlayerInSite = FALSE")
ENDIF
ENDIF
IF NOT bEarlyAggro
IF UPDATE_AGGRO_WARNING_GUARDS() OR bPanicking
IF iWarningGuysUpdate < 5
iWarningGuysUpdate = 5
PRINTLN("bEarlyAggro = TRUE")
bEarlyAggro = TRUE
ENDIF
ENDIF
ENDIF
SWITCH iWarningGuysUpdate
CASE 0
// IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
// vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
// ENDIF
REPEAT NUM_WARNING_GUYS idx
IF NOT IS_PED_INJURED(warningGuys[idx].ped)
// vGuardPosition[idx] = GET_ENTITY_COORDS(warningGuys[idx].ped)
// PRINTLN("vGuardPosition FOR INDEX: ", idx, " IS = ", vGuardPosition[idx])
IF bTaskedToAim[idx]
TASK_PLAY_ANIM(warningGuys[idx].ped, "oddjobs@assassinate@construction@", "unarmed_fold_arms", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
bTaskedToAim[idx] = FALSE
// PRINTLN("SETTING bTaskedToAim TO FALSE, INDEX = ", idx)
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(Player, vAngledAreaMaxWarningGuy[0], vAngledAreaMinWarningGuy[0], fAngledAreaWidthWarningGuy[0], FALSE)
iWarningGuardIndex = 0
ELIF IS_ENTITY_IN_ANGLED_AREA(Player, vAngledAreaMaxWarningGuy[1], vAngledAreaMinWarningGuy[1], fAngledAreaWidthWarningGuy[1], FALSE)
iWarningGuardIndex = 1
ELIF IS_ENTITY_IN_ANGLED_AREA(Player, vAngledAreaMaxWarningGuy[2], vAngledAreaMinWarningGuy[2], fAngledAreaWidthWarningGuy[2], FALSE)
iWarningGuardIndex = 2
ELSE
iWarningGuardIndex = -1
ENDIF
IF iWarningGuardIndex != -1
PRINTLN("PLAYER CLOSE TO GUARD ", iWarningGuardIndex)
IF NOT IS_TIMER_STARTED(warningTimer)
START_TIMER_NOW(warningTimer)
PRINTLN("STARTING TIMER NOW")
ELSE
RESTART_TIMER_NOW(warningTimer)
PRINTLN("RESTARTING TIMER NOW")
ENDIF
IF NOT IS_PED_INJURED(warningGuys[iWarningGuardIndex].ped)
TASK_TURN_PED_TO_FACE_ENTITY(warningGuys[iWarningGuardIndex].ped, PLAYER_PED_ID(), -1)
// TASK_LOOK_AT_ENTITY(warningGuys[idx].ped, PLAYER_PED_ID(), -1)
ENDIF
PRINTLN("GOING TO CASE 1")
iWarningGuysUpdate = 1
BREAK
ENDIF
ENDIF
ENDREPEAT
BREAK
//=========================================================================================================================
CASE 1
// FIRST WARNING
ADD_PED_FOR_DIALOGUE(siteConv, 8, warningGuys[iWarningGuardIndex].ped, "OJAScsWARN1")
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_WRN1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING FIRST CONVERSATION")
PRINTLN("GOING TO CASE 2")
iWarningGuysUpdate = 2
ENDIF
BREAK
//=========================================================================================================================
CASE 2
IF IS_TIMER_STARTED(warningTimer)
IF GET_TIMER_IN_SECONDS(warningTimer) > iFirstTimeWarning
IF NOT IS_PLAYER_ARMED()
AND bPlayerInSite
PRINTLN("GOING TO CASE 3")
iWarningGuysUpdate = 3
ELSE
IF NOT IS_PLAYER_ARMED()
PRINTLN("PLAYER HAS LEFT AREA AND IS NOT ARMED, GOING BACK TO FIRST STATE")
iWarningGuysUpdate = 0
ELSE
PRINTLN("PLAYER IS ARMED: GOING TO CASE 3")
iWarningGuysUpdate = 3
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
//=========================================================================================================================
CASE 3
// SECOND WARNING
IF NOT IS_PED_INJURED(warningGuys[iWarningGuardIndex].ped)
ADD_PED_FOR_DIALOGUE(siteConv, 8, warningGuys[iWarningGuardIndex].ped, "OJAScsWARN1")
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_WRN2", CONV_PRIORITY_VERY_HIGH)
IF NOT IS_PED_INJURED(warningGuys[iWarningGuardIndex].ped)
// CLEAR_PED_TASKS(warningGuys[iWarningGuardIndex].ped)
TASK_AIM_GUN_AT_ENTITY(warningGuys[iWarningGuardIndex].ped, PLAYER_PED_ID(), -1, TRUE)
PRINTLN("TASKING GUY TO AIM AT PLAYER")
bTaskedToAim[iWarningGuardIndex] = TRUE
ENDIF
IF IS_TIMER_STARTED(warningTimer)
RESTART_TIMER_NOW(warningTimer)
PRINTLN("CASE 3 - RESTARTING TIMER NOW")
ENDIF
PRINTLN("GOING TO CASE 4")
iWarningGuysUpdate = 4
ENDIF
ELSE
iWarningGuysUpdate = 0
PRINTLN("GOING BACK TO TO CASE 0")
ENDIF
BREAK
//=========================================================================================================================
CASE 4
IF IS_TIMER_STARTED(warningTimer)
IF GET_TIMER_IN_SECONDS(warningTimer) > iSecondTimeWarning
IF bPlayerInSite
ADD_PED_FOR_DIALOGUE(siteConv, 8, warningGuys[iWarningGuardIndex].ped, "OJAScsWARN1")
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_WRN3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("GOING TO CASE 5")
iWarningGuysUpdate = 5
ELSE
PRINTLN("SECOND WARNING: PLAYER HAS LEFT AREA AND IS NOT ARMED, GOING BACK TO FIRST STATE")
iWarningGuysUpdate = 0
ENDIF
ENDIF
ENDIF
BREAK
//=========================================================================================================================
CASE 5
REPEAT NUM_WARNING_GUYS idx
IF NOT IS_PED_INJURED(warningGuys[idx].ped)
CLEAR_PED_TASKS(warningGuys[idx].ped)
TASK_COMBAT_PED(warningGuys[idx].ped, PLAYER_PED_ID())
PRINTLN("TASKING GUYS TO COMBAT: ", idx)
ENDIF
ENDREPEAT
PRINTLN("bPanicking = TRUE VIA UPDATE_WARNING_GUARDS")
bPanicking = TRUE
PRINTLN("GOING TO CASE 6")
iWarningGuysUpdate = 6
BREAK
//=========================================================================================================================
CASE 6
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC UPDATE_PATROLLING_GUARDS()
SWITCH workerState
CASE WS_PATROL
IF bPlayerSpotted
OR GET_NUMBER_OF_FIRES_IN_RANGE(vTrailEnd, 10) > 0
workerState = WS_REACT
ELSE
//currently they are getting tasked to patrol inside of CREATE_WORKER_WAVE - should maybe eventually move here
ENDIF
BREAK
CASE WS_REACT
IF NOT IS_TIMER_STARTED(spottedTimer)
RESTART_TIMER_NOW(spottedTimer)
IF NOT IS_PED_INJURED(pedSpotted)
ADD_PED_FOR_DIALOGUE(siteConv, 4, pedSpotted, "OJAcsGUARD")
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_ALERT", CONV_PRIORITY_HIGH)
IF GET_SCRIPT_TASK_STATUS(pedSpotted, SCRIPT_TASK_PATROL) = PERFORMING_TASK
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(pedSpotted)
CLEAR_PED_TASKS(pedSpotted)
PRINTLN("spottedTimer STARTED - PLAY LINE!!")
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(pedSpotted)
IF GET_DISTANCE_BETWEEN_ENTITIES(pedSpotted, Player) > 5
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(pedSpotted, Player, Player, PEDMOVEBLENDRATIO_RUN, FALSE)
ELSE
TASK_AIM_GUN_AT_ENTITY(pedSpotted, Player, -1)
ENDIF
ENDIF
ENDIF
ELIF GET_TIMER_IN_SECONDS(spottedTimer) > 0.25
bPanicking = TRUE
workerState = WS_COMBAT
ENDIF
BREAK
CASE WS_COMBAT
//peds have been tasked to combat
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Allows spawning of waves of enemies in sequences
PROC CREATE_WORKER_WAVE(INT waveNumber)
INT i
INT iNumToSubtract
//ground level - create the guys and tell them to patrol their assigned path if they have one
IF waveNumber = 1
FOR i = 0 TO NUM_WAVE_1_WORKERS - 1
IF NOT DOES_ENTITY_EXIST(wave1[i].ped)
AND NOT IS_VECTOR_ZERO(wave1[i].loc)
//mix up enemy enums
IF i % 2 = 0
wave1[i].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[0], wave1[i].loc, wave1[i].head, TRUE)
SET_PED_COMPONENT_VARIATION(wave1[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, GET_RANDOM_INT_IN_RANGE(1, 4), 0) //(uppr) // 0 is reserved for the target
ELSE
wave1[i].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], wave1[i].loc, wave1[i].head, TRUE)
ENDIF
IF i = 0
TASK_PATROL(wave1[i].ped, "miss_Ass0", PAS_ALERT)
ELIF i = 1
TASK_PATROL(wave1[i].ped, "miss_Ass4", PAS_ALERT)
// ELIF i = 2
// TASK_PATROL(wave1[i].ped, "miss_Ass2", PAS_ALERT)
// ELIF i = 3
// TASK_PATROL(wave1[i].ped, "miss_Ass1", PAS_ALERT)
ELIF i = 2
// TASK_PATROL(wave1[i].ped, "miss_Ass5", PAS_ALERT)
TASK_GUARD_CURRENT_POSITION(wave1[i].ped, 10, 10, TRUE)
ELIF i = 3
TASK_PATROL(wave1[i].ped, "miss_Ass6", PAS_ALERT)
ELIF i = 4
TASK_PATROL(wave1[i].ped, "miss_Ass3", PAS_ALERT)
// ELSE
// TASK_GUARD_CURRENT_POSITION(wave1[i].ped, 10, 10, TRUE)
ENDIF
SET_WORKER_PARAMS(wave1, i, FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(wave1[i].ped, TRUE)
SET_PED_COMBAT_ATTRIBUTES(wave1[i].ped, CA_CAN_CHARGE, TRUE)
STOP_PED_WEAPON_FIRING_WHEN_DROPPED(wave1[i].ped)
ENDIF
ENDFOR
ENDIF
//guys in car on ground level - create them inside of their vehicle and have them hang out there until told to attack
IF waveNumber = 2
FOR i = 0 TO NUM_WAVE_2_WORKERS - 1
IF NOT DOES_ENTITY_EXIST(wave2[i].ped)
IF DOES_ENTITY_EXIST(viCombatCar)
IF IS_VEHICLE_DRIVEABLE(viCombatCar)
IF i = 0
wave2[i].ped = CREATE_PED_INSIDE_VEHICLE(viCombatCar, PEDTYPE_MISSION, WorkerModel[0])
SET_PED_COMPONENT_VARIATION(wave2[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, GET_RANDOM_INT_IN_RANGE(1, 4), 0) //(uppr) // 0 is reserved for the target
ELIF i = 1
wave2[i].ped = CREATE_PED_INSIDE_VEHICLE(viCombatCar, PEDTYPE_MISSION, WorkerModel[0], VS_FRONT_RIGHT)
SET_PED_COMPONENT_VARIATION(wave2[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, GET_RANDOM_INT_IN_RANGE(1, 4), 0) //(uppr) // 0 is reserved for the target
ELIF i = 2
wave2[i].ped = CREATE_PED_INSIDE_VEHICLE(viCombatCar, PEDTYPE_MISSION, WorkerModel[1], VS_BACK_LEFT)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(wave2[i].ped, CA_LEAVE_VEHICLES, FALSE)
ENDIF
SET_WORKER_PARAMS(wave2, i)
SET_PED_COMBAT_ATTRIBUTES(wave2[i].ped, CA_CAN_CHARGE, TRUE)
STOP_PED_WEAPON_FIRING_WHEN_DROPPED(wave2[i].ped)
ENDIF
ENDIF
ENDFOR
//mid level enemies - create them at their assigned locations
ELIF waveNumber = 3
FOR i = 0 TO NUM_WAVE_3_WORKERS - 1
IF NOT DOES_ENTITY_EXIST(wave3[i].ped)
IF i % 2 = 0
wave3[i].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[0], wave3[i].loc, wave3[i].head, TRUE)
SET_PED_COMPONENT_VARIATION(wave3[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, GET_RANDOM_INT_IN_RANGE(1, 4), 0) //(uppr) // 0 is reserved for the target
ELSE
wave3[i].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], wave3[i].loc, wave3[i].head, TRUE)
ENDIF
SET_WORKER_PARAMS(wave3, i)
SET_PED_COMBAT_ATTRIBUTES(wave3[i].ped, CA_CAN_CHARGE, TRUE)
STOP_PED_SPEAKING(wave3[i].ped, TRUE)
IF i = 0
IF NOT IS_PED_INJURED(wave3[i].ped)
TASK_PLAY_ANIM(wave3[i].ped, "oddjobs@assassinate@construction@", "unarmed_fold_arms", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
ENDIF
ENDIF
ENDIF
ENDFOR
//group of enemies descending in elevator
ELIF waveNumber = 4
FOR i = 0 TO NUM_WAVE_4_WORKERS - 1
IF NOT DOES_ENTITY_EXIST(wave4[i].ped)
//specifically set these guys uniforms since they will be recreated as corpses later in the script if the player kills them in the elevator
IF i % 2 = 0
wave4[i].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[0], wave4[i].loc, wave4[i].head, TRUE)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, GET_RANDOM_INT_IN_RANGE(1, 4), 0) //(uppr) // 0 is reserved for the target
TASK_AIM_GUN_AT_ENTITY(wave4[i].ped, PLAYER_PED_ID(), -1)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,11), 1, 0, 0) //(jbib)
ELSE
wave4[i].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], wave4[i].loc, wave4[i].head, TRUE)
TASK_AIM_GUN_AT_ENTITY(wave4[i].ped, PLAYER_PED_ID(), -1)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(wave4[i].ped, INT_TO_ENUM(PED_COMPONENT,11), 1, 1, 0) //(jbib)
ENDIF
IF DOES_ENTITY_EXIST(objElev[1])
IF i = 0
ATTACH_ENTITY_TO_ENTITY(wave4[i].ped, objElev[1], 0, vPlayerElevatorOffset, <<0, 0, 84.24 >>)
ADD_PED_FOR_DIALOGUE(siteConv, 4, wave4[i].ped, "OJAcsGUARD")
ELIF i = 1
ATTACH_ENTITY_TO_ENTITY(wave4[i].ped, objElev[1], 0, << -1.34, -2.36, -1.34 >>, <<0, 0, 84.24 >>)
ADD_PED_FOR_DIALOGUE(siteConv, 5, wave4[i].ped, "OJAcsGUARD2")
ENDIF
ENDIF
ENDIF
// //blip the guys when created
// IF NOT DOES_BLIP_EXIST(wave4[i].blip)
// wave4[i].blip = CREATE_BLIP_ON_ENTITY(wave4[i].ped, FALSE)
// SET_BLIP_PRIORITY(wave4[i].blip, BLIPPRIORITY_HIGHEST)
// ENDIF
SET_WORKER_PARAMS(wave4, i)
SET_PED_COMBAT_ATTRIBUTES(wave4[i].ped, CA_CAN_CHARGE, TRUE)
ENDFOR
//create rooftop enemies aqnd have them immedaitely attack after creation
ELIF waveNumber = 5
IF NOT bRooftopWaveCreated
IF bTriggerRooftop
iNumToSubtract = 1
ELSE
iNumToSubtract = 1
ENDIF
FOR i = 0 TO NUM_WAVE_5_WORKERS - iNumToSubtract
IF NOT DOES_ENTITY_EXIST(wave5[i].ped)
IF i % 2 = 0
wave5[i].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[0], wave5[i].loc, wave5[i].head, TRUE)
SET_PED_COMPONENT_VARIATION(wave5[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, GET_RANDOM_INT_IN_RANGE(1, 4), 0) //(uppr) // 0 is reserved for the target
PRINTLN("CREATED PED WITH INDEX = ", i)
ELSE
wave5[i].ped = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], wave5[i].loc, wave5[i].head, TRUE)
PRINTLN("CREATED PED WITH INDEX = ", i)
ENDIF
//guy on crane
// IF NOT bTriggerRooftop
IF i = 3
TASK_AIM_GUN_AT_ENTITY(wave5[i].ped, PLAYER_PED_ID(), -1, TRUE)
FREEZE_ENTITY_POSITION(wave5[i].ped, TRUE)
ENDIF
// ELSE
// PRINTLN("NOT TASKING GUY 3")
// ENDIF
SET_WORKER_PARAMS(wave5, i)
SET_PED_COMBAT_ATTRIBUTES(wave5[i].ped, CA_CAN_CHARGE, TRUE)
ENDIF
// //blip the guys
// IF NOT DOES_BLIP_EXIST(wave5[i].blip)
// wave5[i].blip = CREATE_BLIP_ON_ENTITY(wave5[i].ped, FALSE)
// ENDIF
ENDFOR
bRooftopWaveCreated = TRUE
ENDIF
//guys in back of helictoper
ELIF waveNumber = 6
FOR i = 0 TO NUM_WAVE_6_WORKERS - 1
IF NOT DOES_ENTITY_EXIST(wave6[i].ped)
IF IS_VEHICLE_DRIVEABLE(viHeli)
IF i = 0
wave6[i].ped = CREATE_PED_INSIDE_VEHICLE(viHeli, PEDTYPE_MISSION, WorkerModel[0], VS_DRIVER)
SET_PED_COMPONENT_VARIATION(wave6[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, GET_RANDOM_INT_IN_RANGE(1, 4), 0) //(uppr) // 0 is reserved for the target
GIVE_WEAPON_TO_PED(wave6[0].ped, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO, TRUE)
ELIF i = 1
wave6[1].ped = CREATE_PED_INSIDE_VEHICLE(viHeli, PEDTYPE_MISSION, WorkerModel[1], VS_BACK_RIGHT)
GIVE_WEAPON_TO_PED(wave6[1].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
// TASK_COMBAT_PED(wave6[i].ped, Player)
ELIF i = 2
wave6[2].ped = CREATE_PED_INSIDE_VEHICLE(viHeli, PEDTYPE_MISSION, WorkerModel[0], VS_BACK_LEFT)
SET_PED_COMPONENT_VARIATION(wave6[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, GET_RANDOM_INT_IN_RANGE(1, 4), 0) //(uppr) // 0 is reserved for the target
GIVE_WEAPON_TO_PED(wave6[2].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
// TASK_COMBAT_PED(wave6[i].ped, Player)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(wave6[i].ped, TRUE)
SET_PED_COMBAT_ATTRIBUTES(wave6[i].ped, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_MOVEMENT(wave6[i].ped, CM_WILLADVANCE)
SET_PED_ACCURACY(wave6[i].ped, 0)
SET_PED_RELATIONSHIP_GROUP_HASH(wave6[i].ped, relEnemies)
SET_PED_COMBAT_ATTRIBUTES(wave6[i].ped, CA_CAN_CHARGE, TRUE)
SET_PED_CONFIG_FLAG(wave6[i].ped, PCF_FallsOutOfVehicleWhenKilled, TRUE)
ENDIF
ENDIF
ENDFOR
ENDIF
ENDPROC
/// PURPOSE:
/// Create the assassination target and set up attributes
PROC CREATE_TARGET(BOOL bForIntroCutscene)
IF NOT DOES_ENTITY_EXIST(piTarget)
IF bForIntroCutscene
piTarget = CREATE_PED(PEDTYPE_MISSION, WorkerModel[0], << -153.2591, -941.5044, 113.1339 >>, 263)
SET_PED_DEFAULT_COMPONENT_VARIATION(piTarget)
ADD_PED_FOR_DIALOGUE(siteConv, 3, piTarget, "MAFIABOSS")
piCutscenePed = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], << -153.6352, -942.8479, 113.1339 >>, 66)
SET_PED_RANDOM_COMPONENT_VARIATION(piCutscenePed)
GIVE_WEAPON_TO_PED(piCutscenePed, WEAPONTYPE_SMG, INFINITE_AMMO, TRUE)
ENDIF
IF NOT IS_PED_INJURED(piCutscenePed)
ADD_PED_FOR_DIALOGUE(siteConv, 5, piCutscenePed, "OJAcsGUARD2")
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(piTarget, relEnemies)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piTarget, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the players max wanted level settings during the mission
PROC HANDLE_PLAYER_MAX_WANTED_LEVEL()
IF Mainstage > STAGE_PANIC_CUTSCENE
AND Mainstage < STAGE_CLEANUP
//disable emergency response
IF GET_MAX_WANTED_LEVEL() != 0
SET_MAX_WANTED_LEVEL(0)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
SET_CREATE_RANDOM_COPS(FALSE)
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_HELI_PILOT_ALIVE()
IF DOES_ENTITY_EXIST(wave6[0].ped)
IF NOT IS_PED_INJURED(wave6[0].ped)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_PLAYER_ABANDONED_TARGET(BOOL& bFailType)
VECTOR vTempPosPlayer
IF HAS_TARGET_ESCAPED(piTarget, 250)
OR ( IS_HELI_PILOT_ALIVE() AND HAS_TARGET_ESCAPED(piTarget, 250, 325) ) //to make sure that we dont fail prematurely if the pilot is killed and the heli is falling with the alive target still inside
PRINTLN("HAS_PLAYER_ABANDONED_TARGET - HAS TARGET ESCAPED RETURNED TRUE")
RETURN TRUE
ELSE
IF Mainstage >= STAGE_GET_TO_SECOND_ELEVATOR
// IF Mainstage < STAGE_SECOND_ELEVATOR_CUTSCENE
// vTempPosPlayer = GET_ENTITY_COORDS(Player)
// IF vTempPosPlayer.z < vElev1Top.z - 50
// bFailType = TRUE
// PRINTLN("HAS_PLAYER_ABANDONED_TARGET - vTempPosPlayer.z < vElev1Top.z - 50")
// RETURN TRUE
// ENDIF
// ELSE
IF MainStage = STAGE_ROOFTOP_BATTLE
vTempPosPlayer = GET_ENTITY_COORDS(Player)
// IF bTriggerRooftop
// IF DOES_ENTITY_EXIST(piTarget)
// IF VDIST2(vTempPosPlayer, vElev2Top) > 122500 //350m
// PRINTLN("bTriggerRooftop - HAS_PLAYER_ABANDONED_TARGET")
// RETURN TRUE
// ENDIF
// ELSE
IF NOT bTriggerRooftop
IF vTempPosPlayer.z < vElev2Top.z - 50
AND (DOES_ENTITY_EXIST(piTarget) AND NOT IS_PED_INJURED(piTarget) AND NOT IS_PED_IN_ANY_VEHICLE(piTarget))
PRINTLN("HAS_PLAYER_ABANDONED_TARGET - vTempPosPlayer.z < vElev2Top.z - 50 AND TARGET NOT KILLED")
RETURN TRUE
ENDIF
ENDIF
ENDIF
// ENDIF
ELSE
//only check this when the screen is faded in so it doesn't try and get the player's position while the screen is faded out if they have died
//and are retrying the mission (since they have been warped to a hospital far away while the screen is faded when this is the case)
IF IS_SCREEN_FADED_IN()
IF MainStage < STAGE_PANIC_CUTSCENE
IF HAS_PLAYER_ABANDONED_ASSASSINATION_AREA(bWarningHelp, vSitePos, "ASS_CS_RTNY", 500)
bFailType = TRUE
RETURN TRUE
ENDIF
ELSE
IF HAS_PLAYER_ABANDONED_ASSASSINATION_AREA(bWarningHelp, vSitePos, "ASS_CS_RTNR", 250)
bFailType = TRUE
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_IN_CONSTRUCTION_AREA()
IF IS_ENTITY_IN_ANGLED_AREA(Player, <<-140.629898,-1029.230835,26.298155>>, <<-109.261307,-943.294983,29.229403>>, 107.00, FALSE, FALSE)
OR IS_ENTITY_IN_ANGLED_AREA(Player, <<-169.274902,-1096.598145,18.688881>>, <<-142.460571,-1029.004639,27.310280>>, 99.50, FALSE, FALSE)
// PRINTLN("Player is in Site!")
RETURN TRUE
ELSE
// PRINTLN("Player not in Site!")
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DO_ADDITIONAL_PANIC_CHECKS(PED_INDEX pedToCheck)
FLOAT fDistFromPlayer
IF DOES_ENTITY_EXIST(pedToCheck)
IF NOT IS_PED_INJURED(pedToCheck)
IF IS_PLAYER_IN_CONSTRUCTION_AREA()
// AND CAN_PED_SEE_HATED_PED(pedToCheck, Player)
fDistFromPlayer = GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck, FALSE)
IF ( fDistFromPlayer <= 33 AND CAN_PED_SEE_HATED_PED(pedToCheck, Player) )
OR ( IS_PED_IN_ANY_VEHICLE(Player) AND fDistFromPlayer <= 5 )
PRINTLN("pedWorker freaking out because player is SPOTTED!")
RETURN TRUE
ENDIF
ENDIF
// ELSE
// PRINTLN("panicking because ped is injured!")
// RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC RELOAD_PLAYERS_WEAPON()
WEAPON_TYPE wtReturn
INT iBullets, iMaxAmmo, iTotalAmmo
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtReturn)
IF wtReturn = WEAPONTYPE_UNARMED //we are holstering the weapon prior to using the sync scene now so I added this - 4/20/13 MB)
AND (wtElevatorWeapon != WEAPONTYPE_UNARMED AND wtElevatorWeapon != WEAPONTYPE_INVALID)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtElevatorWeapon, TRUE)
GET_AMMO_IN_CLIP(PLAYER_PED_ID(), wtElevatorWeapon, iBullets)
PRINTLN("AMMO IN CLIP = ", iBullets)
//
iMaxAmmo = GET_MAX_AMMO_IN_CLIP(PLAYER_PED_ID(), wtElevatorWeapon)
PRINTLN("MAX AMMO IN CLIP = ", iMaxAmmo)
iTotalAmmo = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtElevatorWeapon)
PRINTLN("TOTAL AMMO IN INVENTORY = ", iTotalAmmo)
IF iBullets < iMaxAmmo
AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_SYNCHRONIZED_SCENE) != PERFORMING_TASK
AND iTotalAmmo > iBullets
TASK_RELOAD_WEAPON(PLAYER_PED_ID(), TRUE)
PRINTLN("SETTING CLIP TO HAVE MAX AMMO: ", iMaxAmmo)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// do panic checks for enemies on ground level of the site - check one ped per frame since aggro checks are expensive
PROC DO_ENEMY_PANIC_CHECKS()
INT idx
//check one ped per frame - switch between guys on foot and guys in car (waves 1 and 2)
IF NOT bPanicking
//wave 1 guys on foot on ground level
IF iFrameCountAsn = 0
FOR idx = 0 TO 2
IF DO_AGGRO_CHECK(wave1[idx].ped, NULL, aggroArgs, aggroReason, FALSE, TRUE, FALSE, FALSE) //don't instantly return true if the is dead
OR CHECK_ATTACKED_ALLOW_STEALTH(wave1[idx].ped, NULL)
bPanicking = TRUE
PRINTLN("bPanicking = TRUE SET BY WAVE 1 WORKER idx = ", idx)
EXIT
ENDIF
ENDFOR
ELIF iFrameCountAsn = 1
FOR idx = 3 TO NUM_WAVE_1_WORKERS - 1
IF DO_AGGRO_CHECK(wave1[idx].ped, NULL, aggroArgs, aggroReason, FALSE, TRUE, FALSE, FALSE) //don't instantly return true if the is dead
OR CHECK_ATTACKED_ALLOW_STEALTH(wave1[idx].ped, NULL)
bPanicking = TRUE
PRINTLN("bPanicking = TRUE SET BY WAVE 1 WORKER idx = ", idx)
EXIT
ENDIF
ENDFOR
ELIF iFrameCountAsn = 2
FOR idx = 0 TO NUM_WAVE_2_WORKERS - 1
IF DO_AGGRO_CHECK(wave2[idx].ped, NULL, aggroArgs, aggroReason, FALSE, TRUE, FALSE, FALSE) //don't instantly return true if the is dead
OR CHECK_ATTACKED_ALLOW_STEALTH(wave2[idx].ped, NULL)
bPanicking = TRUE
PRINTLN("bPanicking = TRUE SET BY WAVE 2 WORKER idx = ", idx)
EXIT
ENDIF
ENDFOR
ENDIF
//increment frame counter by 1
iFrameCountAsn ++
//once we have checked all the guys in each wave, switch to check the next wave
IF iFrameCountAsn > 2
//re-initialize this
iFrameCountAsn = 0
ENDIF
IF NOT bPlayerSpotted
INT iHatedIdxCheck
//run these for all peds every frame
REPEAT NUM_WAVE_1_WORKERS iHatedIdxCheck
IF DO_ADDITIONAL_PANIC_CHECKS(wave1[iHatedIdxCheck].ped)
pedSpotted = wave1[iHatedIdxCheck].ped
bPlayerSpotted = TRUE
PRINTLN("bPlayerSpotted = TRUE. wave1[", idx)
EXIT
ENDIF
ENDREPEAT
//re-initalize
iHatedIdxCheck = 0
// IF NOT bPlayerSpotted
//run these for all peds every frame
REPEAT NUM_WAVE_2_WORKERS iHatedIdxCheck
IF DO_ADDITIONAL_PANIC_CHECKS(wave2[iHatedIdxCheck].ped)
pedSpotted = wave2[iHatedIdxCheck].ped
bPlayerSpotted = TRUE
PRINTLN("bPlayerSpotted = TRUE. wave2[", idx)
EXIT
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDPROC
///// PURPOSE:
///// Play kill camera of helicopter pilot dying
//FUNC BOOL HAS_HELI_KILL_CAM_FINISHED()
//
// SWITCH iCutsceneStage
// CASE 0
// ODDJOB_ENTER_CUTSCENE()
// GET_ASSASSIN_CUTSCENE_START_TIME()
// CLEAR_PRINTS()
// SET_ENTITY_INVINCIBLE(Player, TRUE)
// IF NOT IS_PED_IN_ANY_VEHICLE(Player)
// FREEZE_ENTITY_POSITION(Player, TRUE)
// ELSE
// VEHICLE_INDEX vehTemp
// vehTemp = GET_VEHICLE_PED_IS_IN(Player)
// FREEZE_ENTITY_POSITION(vehTemp, TRUE)
// ENDIF
// SET_CAM_ACTIVE(camKillcam, TRUE)
// RENDER_SCRIPT_CAMS(TRUE, FALSE)
//
// SET_TIME_SCALE(0.3)
// SETTIMERB(0)
// iCutsceneStage++
// BREAK
//
// CASE 1
// //handle slow motion effect for the split second at the beginning of the kill camera
// float fGameSpeed
// fGameSpeed = TO_FLOAT(TIMERB() - 40) / 220.0
// If fGameSpeed > 1.0
// fGameSpeed = 1.0
// ENDIF
// IF fGameSpeed < 0.3
// fGameSpeed = 0.3
// endif
// SET_TIME_SCALE(fGameSpeed)
//
// IF TIMERB() > 1800
// OR HANDLE_SKIP_CUTSCENE(iCutsceneStartTime)
// OR ( IS_ENTITY_OCCLUDED(viHeli) AND IS_ENTITY_OCCLUDED(piTarget) )
// ODDJOB_EXIT_CUTSCENE()
//// SET_PLAYER_WANTED_LEVEL_NO_DROP_NOW(2)
// SET_ENTITY_INVINCIBLE(Player, FALSE)
// IF NOT IS_PED_IN_ANY_VEHICLE(Player)
// FREEZE_ENTITY_POSITION(Player, FALSE)
// ELSE
// VEHICLE_INDEX vehTemp
// vehTemp = GET_VEHICLE_PED_IS_IN(Player)
// FREEZE_ENTITY_POSITION(vehTemp, FALSE)
// ENDIF
//
// SET_GAMEPLAY_CAM_RELATIVE_HEADING()
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// CLEAR_HELP(TRUE)
// PRINTLN("KILL CAM FINISHED")
//
// CUTSCENE_SKIP_FADE_IN()
// SET_TIME_SCALE(1.0)
//
// RETURN TRUE
// ENDIF
// BREAK
// ENDSWITCH
//
// RETURN FALSE
//ENDFUNC
// Perform any special commands if the script passes
// NOTE: This can include WAITs prior to the Mission_Cleanup() call
PROC Script_Passed()
SWITCH iEndingScreenStages
CASE 0
IF NOT bResultsCreated
IF NOT bRidingFinalElevator
killType = KT_BONUS
killType = killType
bBonus = TRUE
ASSASSIN_MISSION_MarkMissionPassedWithBonus()
PRINTLN("CONSTRUCTION - PLAYER GOT BONUS")
ELSE
killType = KT_STANDARD
bBonus = FALSE
PRINTLN("CONSTRUCTION - NO BONUS AWARDED")
ENDIF
g_savedGlobals.sAssassinData.fConstructionMissionTime = GET_TIMER_IN_SECONDS(missionTimer)
PRINTLN("GLOBAL CONSTRUCTION MISSION TIME = ", g_savedGlobals.sAssassinData.fConstructionMissionTime)
fTimeTaken = g_savedGlobals.sAssassinData.fConstructionMissionTime
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_CS_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
//Only read button input until player presses accept
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
/// PURPOSE:
/// Check to see if the player either killed the target
FUNC BOOL DID_PLAYER_KILL_TARGET(PED_INDEX& ped, VEHICLE_INDEX& veh)
// VECTOR vTempPosTarget
// VECTOR vTempPosPlayer
// VECTOR vKillPos
IF DOES_ENTITY_EXIST(ped)
IF IS_PED_INJURED(ped) OR IS_ENTITY_DEAD(ped)
// vTempPosTarget = GET_ENTITY_COORDS(ped, FALSE)
// vKillPos = << vTempPosTarget.x-5, vTempPosTarget.y+6, vTempPosTarget.z+3>>
// SET_CAM_COORD(camToAttach, vKillPos)
// SET_CAM_FOV(camToAttach, 45)
// POINT_CAM_AT_ENTITY(camToAttach, ped, <<0,0,0>>)
IF DOES_ENTITY_EXIST(veh)
SET_ENTITY_LOD_DIST(veh, 500)
ENDIF
RETURN TRUE
// ELSE
// //blow up the helicopter if it gets 75 m below the player
// vTempPosTarget = GET_ENTITY_COORDS(ped)
// vTempPosPlayer = GET_ENTITY_COORDS(Player)
// IF vTempPosPlayer.z - vTempPosTarget.z > 75
// IF DOES_ENTITY_EXIST(veh)
// SET_ENTITY_LOD_DIST(veh, 500)
// IF IS_PED_IN_VEHICLE(ped, veh)
// vKillPos = << vTempPosTarget.x-5, vTempPosTarget.y+6, vTempPosTarget.z+3>>
// SET_CAM_COORD(camToAttach, vKillPos)
// POINT_CAM_AT_ENTITY(camToAttach, ped, <<0,0,0>>)
// EXPLODE_VEHICLE(veh)
// EXPLODE_VEHICLE_IN_CUTSCENE(veh)
// SET_ENTITY_HEALTH(ped, 0)
// PRINTLN("vTempPosPlayer.z - vTempPosTarget.z > 75 - TARGET IS IN VEHICLE")
// ELSE
// vKillPos = << vTempPosTarget.x-5, vTempPosTarget.y+6, vTempPosTarget.z+3>>
// SET_CAM_COORD(camToAttach, vKillPos)
// POINT_CAM_AT_ENTITY(camToAttach, ped, <<0,0,0>>)
// EXPLODE_VEHICLE(veh)
// EXPLODE_VEHICLE_IN_CUTSCENE(veh)
// SET_ENTITY_HEALTH(ped, 0)
// PRINTLN("vTempPosPlayer.z - vTempPosTarget.z > 75 - TARGET NOT IN VEHICLE")
// ENDIF
// ENDIF
//
// RETURN TRUE
// ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Check to see how many guys are left in the wave.
FUNC INT GET_NUM_ENEMIES_LEFT_IN_WAVE(WORKER_STRUCT& workerStruct[], INT iNumGuysInWave)
INT numGuysLeft
INT i
FOR i = 0 TO iNumGuysInWave - 1
IF DOES_ENTITY_EXIST(workerStruct[i].ped)
IF NOT IS_PED_INJURED(workerStruct[i].ped)
numGuysLeft++
ENDIF
ENDIF
ENDFOR
// PRINTLN("numGuysLeft = ", numGuysLeft)
RETURN numGuysLeft
ENDFUNC
/// PURPOSE: Task any remaning peds in the wave to attack the player
PROC TASK_REMAINING_PEDS_IN_WAVE_TO_ATTACK_PLAYER(WORKER_STRUCT& workerStruct[], INT iNumGuysInWave)
INT i
FOR i = 0 TO iNumGuysInWave - 1
IF NOT IS_PED_INJURED(workerStruct[i].ped)
REMOVE_PED_DEFENSIVE_AREA(workerStruct[i].ped)
SET_PED_COMBAT_MOVEMENT(workerStruct[i].ped, CM_WILLADVANCE)
TASK_CLEAR_DEFENSIVE_AREA(workerStruct[i].ped)
TASK_COMBAT_PED(workerStruct[i].ped, Player)
ENDIF
ENDFOR
ENDPROC
//Grabs the closest enemy within 50 m to the player that is not pedToExclude
FUNC PED_INDEX GET_CLOSEST_LIVING_ENEMY(FLOAT fDistMax)
PED_INDEX tempPed = NULL
VECTOR vTemp
INT tempInt
FLOAT fClosest = fDistMax * fDistMax //square this number since we are calcculating from vDist2
FLOAT tempDist
vTemp = GET_ENTITY_COORDS(Player)
IF MainStage < STAGE_ELEVATOR_CUTSCENE //check guys in wave 1
FOR tempInt = 0 TO NUM_WAVE_1_WORKERS - 1
IF NOT IS_PED_INJURED(wave1[tempInt].ped)
tempDist = VDIST2(vTemp, GET_ENTITY_COORDS(wave1[tempInt].ped))
IF tempDist < fClosest
fClosest = tempDist
tempPed = wave1[tempInt].ped
ENDIF
ENDIF
ENDFOR
ELIF MainStage < STAGE_SECOND_ELEVATOR_CUTSCENE //check guys in wave 3
FOR tempInt = 0 TO NUM_WAVE_3_WORKERS - 1
IF NOT IS_PED_INJURED(wave3[tempInt].ped)
tempDist = VDIST2(vTemp, GET_ENTITY_COORDS(wave3[tempInt].ped))
IF tempDist < fClosest
fClosest = tempDist
tempPed = wave3[tempInt].ped
PRINTLN("CLOSEST PED IN WAVE 3 = ", tempInt)
ENDIF
ENDIF
ENDFOR
ELSE
FOR tempInt = 0 TO NUM_WAVE_5_WORKERS - 1 //check guys in wave 5
IF NOT IS_PED_INJURED(wave5[tempInt].ped)
tempDist = VDIST2(vTemp, GET_ENTITY_COORDS(wave5[tempInt].ped))
IF tempDist < fClosest
fClosest = tempDist
tempPed = wave5[tempInt].ped
ENDIF
ENDIF
ENDFOR
ENDIF
RETURN tempPed
ENDFUNC
//have Trevor play some lines as he is killing bad guys throughout the mission
PROC UPDATE_COMBAT_DIALOGUE_PLAYER()
IF bPanicking
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_MESSAGE_BEING_DISPLAYED()
SWITCH iCurrentPlayerLine
CASE 0
IF iNumDead >= 1
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_TREV5", CONV_PRIORITY_HIGH)
iCurrentPlayerLine ++
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ENDIF
BREAK
CASE 1
IF iNumDead >= 2
IF NOT DOES_ENTITY_EXIST(piTarget)
OR NOT IS_ENTITY_DEAD(piTarget)
AND Mainstage < STAGE_ROOFTOP_BATTLE //line references the player looking for Bonelli
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_TREV1", CONV_PRIORITY_HIGH)
iCurrentPlayerLine ++
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ELSE
iCurrentPlayerLine = 3
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ENDIF
BREAK
CASE 2
IF iNumDead >= 5
IF Mainstage < STAGE_ROOFTOP_BATTLE //line references the player looking for Bonelli
IF NOT DOES_ENTITY_EXIST(piTarget)
OR NOT IS_ENTITY_DEAD(piTarget)
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_TREV2", CONV_PRIORITY_HIGH)
iCurrentPlayerLine ++
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ELSE
iCurrentPlayerLine = 3
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ELSE
iCurrentPlayerLine = 3
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ENDIF
BREAK
CASE 3
IF iNumDead >= 7
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_TREV3", CONV_PRIORITY_HIGH)
iCurrentPlayerLine ++
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ENDIF
BREAK
CASE 4
IF Mainstage < STAGE_ROOFTOP_BATTLE //line references the player looking for Bonelli
IF iNumDead >= 11
IF NOT DOES_ENTITY_EXIST(piTarget)
OR NOT IS_ENTITY_DEAD(piTarget)
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_TREV6", CONV_PRIORITY_HIGH)
iCurrentPlayerLine ++
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ELSE
iCurrentPlayerLine = 6
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
IF iNumDead >= 13
IF NOT DOES_ENTITY_EXIST(piTarget)
OR NOT IS_ENTITY_DEAD(piTarget)
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_TREV4", CONV_PRIORITY_HIGH)
iCurrentPlayerLine ++
ENDIF
ELSE
iCurrentPlayerLine = 6
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ENDIF
BREAK
CASE 6
IF iNumDead >= 15
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_SHIT", CONV_PRIORITY_VERY_HIGH)
iCurrentPlayerLine ++
PRINTLN("iCurrentPlayerLine = ", iCurrentPlayerLine)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC INT GET_NUM_ENEMIES_KILLED_IN_WAVE(WORKER_STRUCT& workerStruct[], INT iNumGuysInWave)
INT iNumKilled, idx
FOR idx = 0 TO iNumGuysInWave - 1
IF DOES_ENTITY_EXIST(workerStruct[idx].ped)
IF IS_PED_INJURED(workerStruct[idx].ped)
iNumKilled++
ENDIF
ENDIF
ENDFOR
// PRINTLN("iNumKilled = ", iNumKilled)
RETURN iNumKilled
ENDFUNC
PROC PLAY_ENEMY_SPOTTED_FRANKLIN_LINE(PED_INDEX pedToPlayLine)
IF NOT IS_PED_INJURED(pedToPlayLine)
ADD_PED_FOR_DIALOGUE(siteConv, 4, pedToPlayLine, "OJAcsGUARD")
IF IS_PED_ARMED(Player, WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
AND NOT IS_PED_IN_ANY_VEHICLE(Player)
//"shoot him he has a gun"
PLAY_SINGLE_LINE_FROM_CONVERSATION(siteConv, "OJASAUD", "OJAScs_SPOT", "OJAScs_SPOT_3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING LINE - OJAScs_SPOT_3")
ELSE
//"this is private property motherfucker"
PLAY_SINGLE_LINE_FROM_CONVERSATION(siteConv, "OJASAUD", "OJAScs_SPOT", "OJAScs_SPOT_1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING LINE - OJAScs_SPOT_1")
ENDIF
ENDIF
ENDPROC
//play enemy combat dialogue at various stages of the mission
PROC UPDATE_COMBAT_DIALOGUE_ENEMY()
// PED_INDEX pedToSpeak
// BLIP_INDEX tempBlip, tempBlip01
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SCREEN_FADED_IN()
AND NOT IS_MESSAGE_BEING_DISPLAYED()
//make sure to advance the speech stage
IF MainStage >= STAGE_ROOFTOP_BATTLE
AND iEnemySpeechStage < 10
iEnemySpeechStage = 10
ELIF MainStage >= STAGE_GET_TO_SECOND_ELEVATOR
AND iEnemySpeechStage < 4
iEnemySpeechStage = 4
ENDIF
SWITCH iEnemySpeechStage
CASE 0
IF bPanicking
IF NOT IS_TIMER_STARTED(speechTimer)
START_TIMER_NOW(speechTimer)
ELIF GET_TIMER_IN_SECONDS(speechTimer) > 2 //add delay so that the player doesn't immediately yell the frame that he is alerted
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(35)
IF piClosestEnemy <> NULL
PLAY_ENEMY_SPOTTED_FRANKLIN_LINE(piClosestEnemy)
iEnemySpeechStage++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
//2 dead
IF iNumDead >= 2
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(35)
IF piClosestEnemy <> NULL
ADD_PED_FOR_DIALOGUE(siteConv, 5, piClosestEnemy, "OJAcsGUARD2")
IF GET_RANDOM_INT_IN_RANGE() % 2 = 0
//"I need backup. Call reinforcements!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G1a", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING CONVO - OJAScs_G1a")
ELSE
//I got him! Over here guys.
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G1c", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING CONVO - OJAScs_G1c")
ENDIF
iEnemySpeechStage++
ENDIF
ENDIF
BREAK
CASE 2
//3 dead
IF iNumDead > 3
OR bPedsOutOfVehicle
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(35)
IF piClosestEnemy <> NULL
ADD_PED_FOR_DIALOGUE(siteConv, 7, piClosestEnemy, "OJAcsGUARD4")
IF GET_RANDOM_INT_IN_RANGE() % 2 = 0
//"No way you're getting by me!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G3a", CONV_PRIORITY_VERY_HIGH)
ELSE
//"Get this son of a bitch! What's wrong with you guys?"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G3c", CONV_PRIORITY_VERY_HIGH)
ENDIF
RESTART_TIMER_NOW(speechTimer)
iEnemySpeechStage++
ENDIF
ENDIF
BREAK
CASE 3
//when near elevator guard on ground
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vElev1Bottom) <= 50
IF IS_TIMER_STARTED(speechTimer)
IF GET_TIMER_IN_SECONDS(speechTimer) > 15
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(15)
IF piClosestEnemy <> NULL
ADD_PED_FOR_DIALOGUE(siteConv, 5, piClosestEnemy, "OJAcsGUARD2")
IF GET_RANDOM_INT_IN_RANGE() % 2 = 0
//"You really think you'll make it to this elevator alive?"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G1d", CONV_PRIORITY_VERY_HIGH)
ELSE
//Your luck streak just ran out. It's too late to go back now!
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G1b", CONV_PRIORITY_VERY_HIGH)
ENDIF
iEnemySpeechStage++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
//after reaching mid level
IF MainStage >= STAGE_GET_TO_SECOND_ELEVATOR
IF IS_TIMER_STARTED(speechTimer)
IF GET_TIMER_IN_SECONDS(speechTimer) > 13
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(50)
IF piClosestEnemy <> NULL
IF CAN_PED_SEE_HATED_PED(piClosestEnemy, PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(siteConv, 7, piClosestEnemy, "OJAcsGUARD4")
//"He's here! Get this motherfucker!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G3d", CONV_PRIORITY_VERY_HIGH)
RESTART_TIMER_NOW(speechTimer)
iEnemySpeechStage++
ENDIF
ENDIF
ENDIF
ELSE
RESTART_TIMER_NOW(speechTimer)
ENDIF
ENDIF
BREAK
CASE 5
//more guard panic/shit talking
IF IS_TIMER_STARTED(speechTimer)
IF GET_TIMER_IN_SECONDS(speechTimer) > 8
IF GET_NUM_ENEMIES_KILLED_IN_WAVE(wave3, NUM_WAVE_3_WORKERS) >= 2
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(50)
IF piClosestEnemy <> NULL
IF CAN_PED_SEE_HATED_PED(piClosestEnemy, PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(siteConv, 6, piClosestEnemy, "OJAcsGUARD3")
IF GET_RANDOM_INT_IN_RANGE() % 2 = 0
//"How the hell did he get up here? Someone stop him!", "I'm not fucking around anymore! This is it!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G2a", CONV_PRIORITY_VERY_HIGH)
ELSE
//"Guard your positions. Do not let him through!", "Let's end this chump!
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G2b", CONV_PRIORITY_VERY_HIGH)
ENDIF
RESTART_TIMER_NOW(speechTimer)
iEnemySpeechStage++
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
START_TIMER_AT(speechTimer, 0)
ENDIF
BREAK
CASE 6
//calling for more support
IF GET_NUM_ENEMIES_KILLED_IN_WAVE(wave3, NUM_WAVE_3_WORKERS) >= 4
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(75)
IF piClosestEnemy <> NULL
IF CAN_PED_SEE_HATED_PED(piClosestEnemy, PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(siteConv, 4, piClosestEnemy, "OJAcsGUARD")
IF GET_RANDOM_INT_IN_RANGE() % 2 = 0
//"We need more support!"
PLAY_SINGLE_LINE_FROM_CONVERSATION(siteConv, "OJASAUD", "OJAScs_GDb", "OJAScs_GDb_1", CONV_PRIORITY_VERY_HIGH)
ELSE
//"Someone help me out over here!"
PLAY_SINGLE_LINE_FROM_CONVERSATION(siteConv, "OJASAUD", "OJAScs_GDb", "OJAScs_GDb_3", CONV_PRIORITY_VERY_HIGH)
ENDIF
RESTART_TIMER_NOW(speechTimer)
iEnemySpeechStage++
ENDIF
ENDIF
ENDIF
BREAK
CASE 7
//if player is hanging out in COVER or less than 5 guys left
IF GET_TIMER_IN_SECONDS(speechTimer) > 12
IF IS_PED_IN_COVER(Player)
OR GET_NUM_ENEMIES_LEFT_IN_WAVE(wave3, NUM_WAVE_3_WORKERS) < 4
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(75)
IF piClosestEnemy <> NULL
IF IS_PED_IN_COVER(Player)
ADD_PED_FOR_DIALOGUE(siteConv, 7, piClosestEnemy, "OJAcsGUARD4")
//"You gonna hide there the whole time? Come and get me!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G3b", CONV_PRIORITY_VERY_HIGH)
ELSE
ADD_PED_FOR_DIALOGUE(siteConv, 5, piClosestEnemy, "OJAcsGUARD2")
//"It's only one man, not an army! Someone put a bullet in him!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G1e", CONV_PRIORITY_VERY_HIGH)
ENDIF
RESTART_TIMER_NOW(speechTimer)
iEnemySpeechStage++
ENDIF
ENDIF
ENDIF
BREAK
CASE 8
//more banter of guy threatening the player
IF GET_NUM_ENEMIES_LEFT_IN_WAVE(wave3, NUM_WAVE_3_WORKERS) <= 2
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(50)
IF piClosestEnemy <> NULL
ADD_PED_FOR_DIALOGUE(siteConv, 8, piClosestEnemy, "OJAcsGUARD5")
IF GET_RANDOM_INT_IN_RANGE() % 2 = 0
//"Surrender and I'll grant you a quick death."
PLAY_SINGLE_LINE_FROM_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G4", "OJAScs_G4_1", CONV_PRIORITY_VERY_HIGH)
ELSE
//"Come at me!"
PLAY_SINGLE_LINE_FROM_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G4", "OJAScs_G4_3", CONV_PRIORITY_VERY_HIGH)
ENDIF
iEnemySpeechStage++
ENDIF
ENDIF
BREAK
CASE 9
//more banter of guys starting to panic
IF GET_NUM_ENEMIES_LEFT_IN_WAVE(wave3, NUM_WAVE_3_WORKERS) <= 1
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(50)
IF piClosestEnemy <> NULL
ADD_PED_FOR_DIALOGUE(siteConv, 4, piClosestEnemy, "OJAcsGUARD")
//"Dammit I need help here!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_GDa", CONV_PRIORITY_VERY_HIGH)
iEnemySpeechStage++
ELIF MainStage = STAGE_ROOFTOP_BATTLE
iEnemySpeechStage++
ENDIF
ENDIF
BREAK
CASE 10
IF DOES_ENTITY_EXIST(wave5[0].ped)
AND DOES_ENTITY_EXIST(piTarget)
IF NOT IS_PED_INJURED(wave5[0].ped)
AND NOT IS_PED_INJURED(piTarget)
ADD_PED_FOR_DIALOGUE(siteConv, 4, wave5[0].ped, "OJAcsGUARD")
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_ROOF", CONV_PRIORITY_VERY_HIGH)
iEnemySpeechStage++
ELSE
iEnemySpeechStage++
ENDIF
ENDIF
BREAK
CASE 11
IF DOES_ENTITY_EXIST(piTarget)
IF NOT IS_PED_INJURED(piTarget)
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_BOSS", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
iEnemySpeechStage++
ELSE
iEnemySpeechStage++
ENDIF
ENDIF
BREAK
CASE 12
//player on rooftop
IF MainStage = STAGE_ROOFTOP_BATTLE
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(35)
IF piClosestEnemy <> NULL
IF piClosestEnemy <> piTarget
ADD_PED_FOR_DIALOGUE(siteConv, 8, piClosestEnemy, "OJAcsGUARD5")
IF GET_RANDOM_INT_IN_RANGE() % 2 = 0
//"I'm gonna toss your body to the street!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G5a", CONV_PRIORITY_VERY_HIGH)
ELSE
//"It's a long way down!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G5b", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
RESTART_TIMER_NOW(speechTimer)
iEnemySpeechStage++
ENDIF
ENDIF
BREAK
CASE 13
IF IS_TIMER_STARTED(speechTimer)
IF NOT IS_PED_INJURED(piTarget)
IF GET_TIMER_IN_SECONDS(speechTimer) > 10
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_BOSS4", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
iEnemySpeechStage++
ENDIF
ELSE
iEnemySpeechStage++
ENDIF
ELSE
START_TIMER_AT(speechTimer, 0)
ENDIF
BREAK
CASE 14
//player on rooftop
IF IS_TIMER_STARTED(speechTimer)
IF GET_TIMER_IN_SECONDS(speechTimer) > 9
piClosestEnemy = GET_CLOSEST_LIVING_ENEMY(35)
IF piClosestEnemy <> NULL
IF piClosestEnemy <> piTarget
ADD_PED_FOR_DIALOGUE(siteConv, 5, piClosestEnemy, "OJAcsGUARD2")
IF GET_RANDOM_INT_IN_RANGE() % 2 = 0
//"This is the end of the line prick!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G6a", CONV_PRIORITY_VERY_HIGH)
ELSE
//"Put him in a bodybag!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_G6b", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
RESTART_TIMER_NOW(speechTimer)
iEnemySpeechStage++
ENDIF
ENDIF
ELSE
START_TIMER_AT(speechTimer, 0)
ENDIF
BREAK
CASE 15
IF NOT IS_PED_INJURED(piTarget)
IF GET_TIMER_IN_SECONDS(speechTimer) > 25
//"I've got all day. I'm not leaving until you're not breathing!"
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_BOSS2", CONV_PRIORITY_VERY_HIGH)
iEnemySpeechStage++
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
//Script-controlled damage effect that are applied to the car when the player fires bullets near the vhiecles tires and windows
PROC UPDATE_SCRIPTED_VEHICLE_DAMAGE(VEHICLE_INDEX vehIndex)
VECTOR vRearRight, vRearLeft, vFrontRight, vFrontLeft
IF NOT IS_ENTITY_DEAD(vehIndex)
IF NOT IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_REAR_RIGHT)
vRearRight = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(vehIndex), GET_ENTITY_HEADING(vehIndex), << 0.660, -1.180, 0.100 >>)
IF IS_BULLET_IN_AREA(vRearRight, 1.0)
SET_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_REAR_RIGHT)
SMASH_VEHICLE_WINDOW(vehIndex, SC_WINDOW_REAR_RIGHT)
SET_VEHICLE_DAMAGE(vehIndex, <<0.5, -0.75, 0.05>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_FRONT_RIGHT)
vFrontRight = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(vehIndex), GET_ENTITY_HEADING(vehIndex), << 0.660, 1.180, 0.100 >>)
IF IS_BULLET_IN_AREA(vFrontRight, 1.0)
SET_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_FRONT_RIGHT)
SMASH_VEHICLE_WINDOW(vehIndex, SC_WINDOW_FRONT_RIGHT)
SET_VEHICLE_DAMAGE(vehIndex, <<0.5, 0.75, 0.05>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_REAR_LEFT)
vRearLeft = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(vehIndex), GET_ENTITY_HEADING(vehIndex), << -0.660, -1.180, 0.100 >>)
IF IS_BULLET_IN_AREA(vRearLeft, 1.0)
SET_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_REAR_LEFT)
SMASH_VEHICLE_WINDOW(vehIndex, SC_WINDOW_REAR_LEFT)
SET_VEHICLE_DAMAGE(vehIndex, <<0.5, 0.75, 0.05>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_FRONT_LEFT)
vFrontLeft = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(vehIndex), GET_ENTITY_HEADING(vehIndex), << -0.660, 1.180, 0.100 >>)
IF IS_BULLET_IN_AREA(vFrontLeft, 1.0)
SET_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_FRONT_LEFT)
SMASH_VEHICLE_WINDOW(vehIndex, SC_WINDOW_FRONT_LEFT)
SET_VEHICLE_DAMAGE(vehIndex, <<0.5, 0.75, 0.05>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Blip enemies cleanup their blips when killed
PROC HANDLE_ENEMY_BLIPS(WORKER_STRUCT& workerStruct[], INT iNumGuysInWave)
INT tempInt
FOR tempInt = 0 TO iNumGuysInWave - 1
IF DOES_ENTITY_EXIST(workerStruct[tempInt].ped)
UPDATE_AI_PED_BLIP(workerStruct[tempInt].ped, workerStruct[tempInt].blipWorker)
IF IS_PED_INJURED(workerStruct[tempInt].ped)
// IF DOES_BLIP_EXIST(workerStruct[tempInt].blip)
IF NOT workerStruct[tempInt].bDead
// REMOVE_BLIP(workerStruct[tempInt].blip)
iNumDead++
PRINTLN("iNumDead = ", iNumDead)
workerStruct[tempInt].bDead = TRUE
ENDIF
ENDIF
ENDIF
ENDFOR
ENDPROC
/// PURPOSE:
/// Call this before advancing stages to initialize stage variables
PROC INITIALIZE_NEXT_STAGE()
iStageNum = 0
iElevButtonStage = 0
iElevSyncScene = 0
// iCutsceneStage = 0
bCutsceneSkipped = FALSE
bCutsceneFading = FALSE
bAdvanceOnPlayer = FALSE
RESTART_TIMER_NOW(speechTimer)
ENDPROC
/// PURPOSE:
/// Determine which Kill camera to use
PROC HANDLE_KILL_CAMERA_LOGIC()
IF MainStage >= STAGE_ROOFTOP_BATTLE
AND MainStage < STAGE_KILL_CAM
IF DID_PLAYER_KILL_TARGET(piTarget, viHeli)
AND IS_PLAYER_READY_FOR_CUTSCENE(PLAYER_ID())
// REMOVE_BLIP(bTargetBlip)
//tell guy on crane to keep shooting at the player if he is still alive
IF NOT IS_PED_INJURED(wave5[3].ped)
SET_PED_COMBAT_ATTRIBUTES(wave5[3].ped, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
SET_ENTITY_COORDS(wave5[3].ped, << -119.0637, -973.7914, 292.04 >>) //position on the crane
TASK_COMBAT_PED(wave5[3].ped, Player)
ENDIF
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_KILL_CAM
PRINTLN("MainStage = STAGE_KILL_CAM")
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PED_ALIVE_AND_IN_VEHICLE(PED_INDEX ped)
IF NOT IS_PED_INJURED(ped)
IF IS_PED_IN_ANY_VEHICLE(ped)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handle enemy response behavior and blip handling
PROC HANDLE_ENEMY_BEHAVIOR()
//Handle the worker's combat response to the player
DO_ENEMY_PANIC_CHECKS()
//handle blipping and unblipping of enemies
// IF MainStage < STAGE_ELEVATOR_CUTSCENE
HANDLE_ENEMY_BLIPS(wave1, NUM_WAVE_1_WORKERS)
IF bUpdateGuysInCar
HANDLE_ENEMY_BLIPS(wave2, NUM_WAVE_2_WORKERS)
ENDIF
HANDLE_ENEMY_BLIPS(warningGuys, NUM_WARNING_GUYS)
// ELIF MainStage < STAGE_SECOND_ELEVATOR_CUTSCENE
HANDLE_ENEMY_BLIPS(wave3, NUM_WAVE_3_WORKERS)
HANDLE_ENEMY_BLIPS(wave4, NUM_WAVE_4_WORKERS)
// ELSE
HANDLE_ENEMY_BLIPS(wave5, NUM_WAVE_5_WORKERS)
IF DOES_ENTITY_EXIST(piTarget)
IF NOT IS_PED_INJURED(piTarget)
HANDLE_ENEMY_BLIPS(wave6, NUM_WAVE_6_WORKERS)
ELSE
//may have to add a condition to re-update the ped blip if the are not in vehicle and useable
IF IS_PED_ALIVE_AND_IN_VEHICLE(wave6[0].ped)
CLEANUP_AI_PED_BLIP(wave6[0].blipWorker)
ELSE
UPDATE_AI_PED_BLIP(wave6[0].ped, wave6[0].blipWorker)
ENDIF
IF IS_PED_ALIVE_AND_IN_VEHICLE(wave6[1].ped)
CLEANUP_AI_PED_BLIP(wave6[1].blipWorker)
ELSE
UPDATE_AI_PED_BLIP(wave6[1].ped, wave6[1].blipWorker)
ENDIF
IF IS_PED_ALIVE_AND_IN_VEHICLE(wave6[2].ped)
CLEANUP_AI_PED_BLIP(wave6[2].blipWorker)
ELSE
UPDATE_AI_PED_BLIP(wave6[2].ped, wave6[2].blipWorker)
ENDIF
ENDIF
ENDIF
// ENDIF
//update franklin speech
UPDATE_COMBAT_DIALOGUE_PLAYER()
//update enemy combat AI
UPDATE_COMBAT_DIALOGUE_ENEMY()
ENDPROC
///// PURPOSE:
///// Creates dead peds inside of an elevator (maximum of 2 peds)
//PROC CREATE_DEAD_PEDS_IN_ELEVATOR(INT iNumPedsToCreate, ENTITY_INDEX elevator)
// INT iTemp
// INT iMaxPedsToCreate = 2
//
// FOR iTemp = 0 TO iNumPedsToCreate - 1
// IF iTemp <= iMaxPedsToCreate
// IF iTemp = 0
// piDeadElevatorGuys[iTemp] = CREATE_PED(PEDTYPE_MISSION, WorkerModel[0], << -159.3574, -939.2502, 268.5 >>, 300)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,11), 1, 0, 0) //(jbib)
// TASK_PLAY_ANIM(piDeadElevatorGuys[iTemp], "mp_common_miss", "dead_ped_idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING) // | AF_PRIORITY_HIGH
// ATTACH_ENTITY_TO_ENTITY(piDeadElevatorGuys[iTemp], elevator, 0, << 2.1, -1.9, -2.1 >>, << 0, 0, 106 >>, TRUE, TRUE, TRUE)
// ELSE
// piDeadElevatorGuys[iTemp] = CREATE_PED(PEDTYPE_MISSION, WorkerModel[1], << -159.9370, -940.4857, 268.5 >>, 350)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
// SET_PED_COMPONENT_VARIATION(piDeadElevatorGuys[iTemp], INT_TO_ENUM(PED_COMPONENT,11), 1, 1, 0) //(jbib)
// TASK_PLAY_ANIM(piDeadElevatorGuys[iTemp], "mp_common_miss", "dead_ped_idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING) // | AF_PRIORITY_HIGH
// ATTACH_ENTITY_TO_ENTITY(piDeadElevatorGuys[iTemp], elevator, 0, << -2, -2.4, -2.1 >>, << 0, 0, 0 >>, TRUE, TRUE, TRUE)
// ENDIF
// SET_PED_CAN_BE_TARGETTED(piDeadElevatorGuys[iTemp], FALSE )
// SET_PED_FLEE_ATTRIBUTES(piDeadElevatorGuys[iTemp], FA_NEVER_FLEE, TRUE )
// SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piDeadElevatorGuys[iTemp], TRUE )
// SET_ENTITY_HEALTH(piDeadElevatorGuys[iTemp], 100)
// DISABLE_PED_INJURED_ON_GROUND_BEHAVIOUR(piDeadElevatorGuys[iTemp])
// SET_PED_DIES_WHEN_INJURED(piDeadElevatorGuys[iTemp], TRUE)
// SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(piDeadElevatorGuys[iTemp], FALSE)
// ENDIF
// ENDFOR
//ENDPROC
//PROC PLAY_ELEVATOR_AUDIO_DOOR_CLOSE(INT& soundID, ENTITY_INDEX door)
// IF soundID = -1
// soundID = GET_SOUND_ID()
// ODDJOB_PLAY_SOUND("FREIGHT_ELEVATOR_01_DOOR_CLOSE", soundID, TRUE, door)
// ENDIF
//ENDPROC
//PROC PLAY_ELEVATOR_AUDIO_DOOR_OPEN(INT& soundID, ENTITY_INDEX door)
// IF soundID = -1
// soundID = GET_SOUND_ID()
// ODDJOB_PLAY_SOUND("FREIGHT_ELEVATOR_01_DOOR_OPEN", soundID, TRUE, door)
// ENDIF
//ENDPROC
///// PURPOSE:
///// Move the elevator updwards at a desired speed
//PROC MOVE_ELEVATOR_DOOR(ENTITY_INDEX door, FLOAT distPerFrame, BOOL bClose)
// VECTOR vDoorPos
//
// IF DOES_ENTITY_EXIST(door)
// vDoorPos = GET_ENTITY_COORDS(door)
// IF bClose
// SET_ENTITY_COORDS(door, <<vDoorPos.x, vDoorPos.y, vDoorPos.z-distPerFrame>>)
// PLAY_ELEVATOR_AUDIO_DOOR_CLOSE(iSoundIdElevator, door)
// ELSE
// SET_ENTITY_COORDS(door, <<vDoorPos.x, vDoorPos.y, vDoorPos.z+distPerFrame>>)
// PLAY_ELEVATOR_AUDIO_DOOR_OPEN(iSoundIdElevator, door)
// ENDIF
// ENDIF
//ENDPROC
PROC PLAY_ELEVATOR_AUDIO_MOTOR(INT& soundID, ENTITY_INDEX elevator)
IF soundID = -1
soundID = GET_SOUND_ID()
ODDJOB_PLAY_SOUND("FREIGHT_ELEVATOR_02_MOTOR", soundID, TRUE, elevator)
ENDIF
ENDPROC
/// PURPOSE:
/// Move the elevator updwards at a desried speed
PROC MOVE_ELEVATOR(ENTITY_INDEX elevator, ENTITY_INDEX frontDoor, ENTITY_INDEX backDoor, FLOAT distPerFrame, BOOL bAttachPlayer = TRUE, BOOL bMoveUp = TRUE, BOOL bMoveDoors = TRUE)
VECTOR vElevPos
FLOAT fTempHead
VEHICLE_INDEX tempVeh
bMoveUp = bMoveUp
frontDoor = frontDoor
backDoor = backDoor
bMoveDoors = bMoveDoors
IF DOES_ENTITY_EXIST(elevator)
vElevPos = GET_ENTITY_COORDS(elevator)
IF IS_HUD_COMPONENT_ACTIVE(NEW_HUD_WEAPON_WHEEL)
distPerFrame /= 5 //make sure the elevator travels slower if the weapon wheel is displayed
ENDIF
IF bMoveUp
SET_ENTITY_COORDS(elevator, <<vElevPos.x, vElevPos.y, vElevPos.z+distPerFrame>>)
ELSE
SET_ENTITY_COORDS(elevator, <<vElevPos.x, vElevPos.y, vElevPos.z-distPerFrame>>)
ENDIF
ENDIF
IF bAttachPlayer
IF IS_PED_IN_ANY_VEHICLE(Player)
tempVeh = GET_VEHICLE_PED_IS_IN(Player)
ENDIF
// CLEAR_PED_TASKS(Player)
IF tempVeh = NULL
IF NOT IS_ENTITY_ATTACHED(Player)
fTempHead = GET_ENTITY_HEADING(Player)
//fix to make sure that player is oriented in the correct heading in the first elevator cutscene(account for elevator rotation)
IF fTempHead + 90 >= 360
fTempHead = (fTempHead + 90) - 360
ELSE
fTempHead += 90
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(Player)
ATTACH_ENTITY_TO_ENTITY(Player, elevator, 0, vPlayerElevatorOffset, <<0, 0, fTempHead >>, FALSE, FALSE, TRUE)
PRINTLN("ATTACHING THE PLAYER TO THE LIFT")
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_ATTACHED(tempVeh)
fTempHead = GET_ENTITY_HEADING(tempVeh)
//fix to make sure that player is oriented in the correct heading in the first elevator cutscene
IF fTempHead + 90 >= 360
fTempHead = (fTempHead + 90) - 360
ELSE
fTempHead += 90
ENDIF
ATTACH_ENTITY_TO_ENTITY(tempVeh, elevator, 0, << 0.4, -2.2, -1.2 >>, <<0, 0, fTempHead >>)
PRINTLN("PLAYER IN A VEHICLE - ATTACHING THE VEHICLE TO THE LIFT")
ENDIF
ENDIF
ENDIF
SET_FOLLOW_CAM_IGNORE_ATTACH_PARENT_MOVEMENT_THIS_UPDATE()
PLAY_ELEVATOR_AUDIO_MOTOR(iSoundIdElevator, elevator)
ENDPROC
/// PURPOSE:
/// Call this function every frame while the elevator is active to get it to gradually come to a stop when it reaches its desired height
/// PARAMS:
/// fCurrentHeight - The elevator's current height (get this every frame)
/// fHeightToStopSlowing - The height at which you want the elevator to be traveling at max speed
/// fMinSpeedHeight - The height at which we want the elevator to be traveling at the minimum speed
/// fMinDistPerFrame - Minimum distance along the z-axis the elevator is allowed to travel per frame
/// fMaxDistPerFrame - Maximum distance along the z-axis the elevator is allowed to travel per frame
/// RETURNS:
/// Distance per frame the elevator should be traveling along the z axis
FUNC FLOAT GET_ELEVATOR_TARGET_MOVE_SPEED_START(FLOAT fCurrentHeight, FLOAT fHeightToStopSlowing, FLOAT fMinSpeedHeight, FLOAT fMinDistPerFrame, FLOAT fMaxDistPerFrame)
//gradually slow down the elevator as it approaches its destination
FLOAT fTotalHeightDelta
FLOAT fCurrentHeightDelta
FLOAT fCurrentPercentage
FLOAT fNewDistPerFrame
IF fCurrentHeight <= fHeightToStopSlowing
//get the total distance between where we want to stop slowing and the fMinSpeedHeight
fTotalHeightDelta = fHeightToStopSlowing - fMinSpeedHeight
//get the distance between the elevators current height and the fHeightToStopSlowing
fCurrentHeightDelta = fHeightToStopSlowing - fCurrentHeight
//get a % of how far along the speed-up distance the elevator is
fCurrentPercentage = fCurrentHeightDelta / fTotalHeightDelta
//calculate the new movespeed
fNewDistPerFrame = (1 - fCurrentPercentage) * fMaxDistPerFrame
ELSE
fNewDistPerFrame = fMaxDistPerFrame
ENDIF
//safeguard to ensure we go no slower than fMinDistPerFrame
IF fNewDistPerFrame < fMinDistPerFrame
fNewDistPerFrame = fMinDistPerFrame
ELIF fNewDistPerFrame > fMaxDistPerFrame
fNewDistPerFrame = fMaxDistPerFrame
ENDIF
RETURN fNewDistPerFrame
ENDFUNC
/// PURPOSE:
/// Call this function every frame while the elevator is active to get it to gradually come to a stop when it reaches its desired height
/// PARAMS:
/// fCurrentHeight - The elevator's current height (get this every frame)
/// fHeightToStartSlowing - The height at which you want the elevator to start slowing down
/// fStopHeight - The height at which you want the elevator to come to a complete stop
/// fMinSpeedHeight - The height at which we want the elevator to be traveling at the minimum speed
/// fMinDistPerFrame - Minimum distance along the z-axis the elevator is allowed to travel per frame
/// fMaxDistPerFrame - Maximum distance along the z-axis the elevator is allowed to travel per frame
/// RETURNS:
/// Distance per frame the elevator should be traveling along the z axis
FUNC FLOAT GET_ELEVATOR_TARGET_MOVE_SPEED_STOP(FLOAT fCurrentHeight, FLOAT fHeightToStartSlowing, FLOAT fStopHeight, FLOAT fMinSpeedHeight, FLOAT fMinDistPerFrame, FLOAT fMaxDistPerFrame)
//gradually slow down the elevator as it approaches its destination
FLOAT fTotalHeightDelta
FLOAT fCurrentHeightDelta
FLOAT fCurrentPercentage
FLOAT fSpeedRange
FLOAT fNewDistPerFrame
IF fCurrentHeight < fStopHeight
IF fCurrentHeight >= fHeightToStartSlowing
//get the total distance between where we want to start slowing and the fMinSpeedHeight
fTotalHeightDelta = fMinSpeedHeight - fHeightToStartSlowing
//get the distance between the elevators current height and the fMinSpeedHeight
fCurrentHeightDelta = fMinSpeedHeight - fCurrentHeight
//get a % of how far along the slowdown distance the elevator is
fCurrentPercentage = fCurrentHeightDelta / fTotalHeightDelta
//establish a min/max value for the possible speeds
fSpeedRange = fMaxDistPerFrame - fMinDistPerFrame
//calculate the new movespeed
fNewDistPerFrame = (fCurrentPercentage * fSpeedRange) + fMinDistPerFrame
ELSE
fNewDistPerFrame = fMaxDistPerFrame
ENDIF
ENDIF
//safeguard to ensure we go no slower than fMinDistPerFrame
IF fNewDistPerFrame < fMinDistPerFrame
fNewDistPerFrame = fMinDistPerFrame
ENDIF
RETURN fNewDistPerFrame
ENDFUNC
/// PURPOSE:
/// Place the first elevator and doors at the top position correctly with the player inside
PROC SET_GROUND_ELEVATOR_TO_TOP(BOOL bAttachPlayer = TRUE)
// VEHICLE_INDEX vehIndex
// IF IS_PED_IN_ANY_VEHICLE(Player)
// vehIndex = GET_VEHICLE_PED_IS_IN(Player)
// DETACH_ENTITY(vehIndex)
// ELSE
DETACH_ENTITY(Player)
// ENDIF
ODDJOB_STOP_SOUND(iSoundIdElevator)
//move the elevator to the top or create it if it doesnt already exist
IF DOES_ENTITY_EXIST(objElev[0])
SET_ENTITY_COORDS(objElev[0], << -182.170, -1016.090, 115.46 >>)
PRINTLN("objElev[0] EXISTS - TELEPORTING TO THE TOP")
ELSE
objElev[0] = CREATE_OBJECT(ElevModel, << -182.170, -1016.090, 115.46 >>)
SET_ENTITY_COORDS(objElev[0], << -182.170, -1016.090, 115.46 >>)
SET_ENTITY_ROTATION(objElev[0], vMyElevRot[0])
SET_ENTITY_LOAD_COLLISION_FLAG(objElev[0], TRUE)
PRINTLN("objElev[0] DOES NOT EXIST - CREATING IT")
ENDIF
IF NOT DOES_ENTITY_EXIST(objElevButton[0]) AND DOES_ENTITY_EXIST(objElev[0])
objElevButton[0] = CREATE_OBJECT(ElevButtonModel, vMyElevPos[0])
ATTACH_ENTITY_TO_ENTITY(objElevButton[0], objElev[0], 0, vButtonOffset, <<0,0,0>>)
PRINTLN("ATTACHING BUTTON TO ELEVATOR")
ENDIF
IF bAttachPlayer
ATTACH_ENTITY_TO_ENTITY(Player, objElev[0], 0, vPlayerElevatorOffset, <<0, 0, 340 >>, FALSE, FALSE, TRUE)
DETACH_ENTITY(Player, FALSE, FALSE)
PRINTLN("Detaching Player from ground elevator")
SET_ENTITY_HEADING(Player, 340.3911)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDIF
ENDPROC
/// PURPOSE:
/// place the second elevator and doors at the very top of the structure with the player inside
PROC SET_SECOND_ELEVATOR_TO_TOP(BOOL bResetElevator = TRUE, BOOL bAttachPlayer = TRUE)
// VEHICLE_INDEX vehIndex
// IF IS_PED_IN_ANY_VEHICLE(Player)
// vehIndex = GET_VEHICLE_PED_IS_IN(Player)
// DETACH_ENTITY(vehIndex)
// ELSE
DETACH_ENTITY(Player)
// ENDIF
ODDJOB_STOP_SOUND(iSoundIdElevator)
//move the elevator to the top or create it if it doesnt already exist
IF bResetElevator
IF DOES_ENTITY_EXIST(objElev[1])
SET_ENTITY_COORDS(objElev[1], << -158.840, -942.240, 270.46 >>)
ELSE
objElev[1] = CREATE_OBJECT(ElevModel, << -158.840, -942.240, 270.46 >>)
SET_ENTITY_COORDS(objElev[1], << -158.840, -942.240, 270.46 >>)
SET_ENTITY_ROTATION(objElev[1], vMyElevRot[1])
ENDIF
ENDIF
IF bAttachPlayer
ATTACH_ENTITY_TO_ENTITY(Player, objElev[1], 0, vPlayerElevatorOffset, <<0, 0, 269 >>, FALSE, FALSE, TRUE)
DETACH_ENTITY(Player, FALSE, FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDIF
IF NOT DOES_ENTITY_EXIST(objElevButton[1])
objElevButton[1] = CREATE_OBJECT(ElevButtonModel, vMyElevPos[1])
ATTACH_ENTITY_TO_ENTITY(objElevButton[1], objElev[1], 0, vButtonOffset, <<0,0,0>>)
ENDIF
ENDPROC
PROC SET_SECOND_ELEVATOR_TO_BOTTOM(BOOL bDoorOpen = TRUE)
VEHICLE_INDEX vehIndex
IF IS_PED_IN_ANY_VEHICLE(Player)
vehIndex = GET_VEHICLE_PED_IS_IN(Player)
DETACH_ENTITY(vehIndex)
ELSE
DETACH_ENTITY(Player)
ENDIF
ODDJOB_STOP_SOUND(iSoundIdElevator)
//move the elevator to the top or create it if it doesnt already exist
IF DOES_ENTITY_EXIST(objElev[1])
SET_ENTITY_COORDS(objElev[1], << -158.840, -942.240, 31.44 >>)
ELSE
objElev[1] = CREATE_OBJECT(ElevModel, << -158.840, -942.240, 31.44 >>)
SET_ENTITY_COORDS(objElev[1], << -158.840, -942.240, 31.44 >>)
SET_ENTITY_ROTATION(objElev[1], vMyElevRot[1])
ENDIF
IF vehIndex = NULL
ATTACH_ENTITY_TO_ENTITY(Player, objElev[1], 0, vPlayerElevatorOffset, <<0, 0, 74.1208 >>, FALSE, FALSE, TRUE)
ELSE
ATTACH_ENTITY_TO_ENTITY(vehIndex, objElev[1], 0, << 0.4, -2.2, -1.2 >>, <<0, 0, 74.1208 >>)
ENDIF
IF bDoorOpen
// SET_ENTITY_COORDS(objElevDoorControl[2], << -155.650, -941.260, 272.21 >>) //272.21
// SET_ENTITY_COORDS(objElevDoorControl[3], << -160.720, -939.380, 269.520 >>)
ELSE
// SET_ENTITY_COORDS(objElevDoorControl[2], << -155.650, -941.260, 269.520>>)
// SET_ENTITY_COORDS(objElevDoorControl[3], << -160.720, -939.380, 269.520>>)
ENDIF
//teleport player to top
IF vehIndex <> NULL
DETACH_ENTITY(vehIndex, FALSE, FALSE)
ELSE
DETACH_ENTITY(Player, FALSE, FALSE)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDPROC
/// PURPOSE:
/// place the second elevator and doors at the very top of the structure with the player inside
PROC SEND_ENEMIES_DOWN_IN_ELEVATOR()
VECTOR tempVector
IF NOT bElevatorAttack
tempVector = GET_ENTITY_COORDS(objElev[1])
IF tempVector.z >= 115.5
MOVE_ELEVATOR(objElev[1], NULL, NULL, 0.2, FALSE, FALSE, FALSE)
// MOVE_ELEVATOR_DOOR(objElevDoorControl[3], 0.2, TRUE)
//stop moving the elevator dooor downwards when the elevator is almost at its destination to simulate it opening just prior reaching the destination
IF tempVector.z >= 117.8
// MOVE_ELEVATOR_DOOR(objElevDoorControl[2], 0.2, TRUE)
ENDIF
ELSE
WAVE_4_WORKER_ASSAULT()
ODDJOB_STOP_SOUND(iSoundIdElevator)
bElevatorAttack = TRUE
ENDIF
ENDIF
ENDPROC
PROC EXIT_VEHICLE_AND_ATTACK_PLAYER()
SEQUENCE_INDEX tempSeq
INT i
FOR i = 0 TO NUM_WAVE_2_WORKERS - 1
IF NOT IS_PED_INJURED(wave2[i].ped)
SET_PED_COMBAT_ATTRIBUTES(wave2[i].ped, CA_LEAVE_VEHICLES, TRUE)
//have one of the car guys go after the player while the other two defend around it
IF i <> 2
SET_PED_SPHERE_DEFENSIVE_AREA(wave2[i].ped, wave1[3].loc, 10)
SET_PED_COMBAT_MOVEMENT(wave2[i].ped, CM_WILLADVANCE)
ENDIF
// CLEAR_PED_TASKS(wave2[i].ped)
CLEAR_SEQUENCE_TASK(tempSeq)
OPEN_SEQUENCE_TASK(tempSeq)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR)
TASK_COMBAT_PED(NULL, Player)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(wave2[i].ped, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
ENDIF
ENDFOR
bUpdateGuysInCar = TRUE
bPedsOutOfVehicle = TRUE
ENDPROC
/// PURPOSE:
/// Send a car ful of enemies to the elevator base
PROC MAKE_CAR_PEDS_ATTACK_PLAYER()
IF NOT bPedsOutOfVehicle
IF IS_VEHICLE_DRIVEABLE(viCombatCar)
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(viCombatCar)
OR IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(viCombatCar))
OR GET_ENTITY_DISTANCE_FROM_LOCATION(viCombatCar, << -177.2643, -1036.0834, 26.2322 >>, FALSE) <= 8 //near the vehicle's drive destination
OR IS_VEHICLE_STUCK_TIMER_UP(viCombatCar, VEH_STUCK_ON_ROOF, 3000)
OR IS_VEHICLE_STUCK_TIMER_UP(viCombatCar, VEH_STUCK_HUNG_UP, 3000)
OR IS_VEHICLE_STUCK_TIMER_UP(viCombatCar, VEH_STUCK_JAMMED, 3000)
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_CAR_ARRIVES")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_CAR_ARRIVES")
ENDIF
EXIT_VEHICLE_AND_ATTACK_PLAYER()
ENDIF
ELSE
EXIT_VEHICLE_AND_ATTACK_PLAYER()
ENDIF
ENDIF
ENDPROC
//Control behavior of wave 2 enemies that attack the player in their car
PROC HANDLE_WAVE_2_ENEMY_ASSAULT()
VECTOR vTempPos
IF NOT bEarlyOut
// To Fix Bug # 654423 - DS
IF DOES_ENTITY_EXIST(viCombatCar) AND NOT IS_ENTITY_DEAD(viCombatCar)
vTempPos = GET_ENTITY_COORDS(viCombatCar)
IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vTempPos, TRUE) <= 5
EXIT_VEHICLE_AND_ATTACK_PLAYER()
bEarlyOut = TRUE
PRINTLN("bEarlyOut = TRUE")
ENDIF
ENDIF
ENDIF
IF NOT bCarSent //AND NOT bEarlyOut
// // send the car to drive to the elevator if the player is near the center of the site or gets near the car after panic is triggered
IF DOES_ENTITY_EXIST(viCombatCar)
IF ( bPanicking AND IS_ENTITY_IN_ANGLED_AREA(Player, << -125.446, -999.097, 27.228 >>, << -173.264, -1095.935, 27.228 >>, 98, FALSE, FALSE) )
OR ( bPanicking AND GET_PLAYER_DISTANCE_FROM_ENTITY(viCombatCar) < 50 )
OR ( bPanicking AND GET_PLAYER_DISTANCE_FROM_LOCATION(vElev1Bottom, FALSE) < 50 )
WAVE_2_WORKER_ASSAULT()
bCarSent = TRUE
PRINTLN("bCarSent = TRUE")
ENDIF
ENDIF
ELSE
//tell guys to exit the car and attack the player once they reach their destination
MAKE_CAR_PEDS_ATTACK_PLAYER()
// //controls script-controlled damage effects applied to the enemies' vehicle (tires, windows, etc)
// UPDATE_SCRIPTED_VEHICLE_DAMAGE(viCombatCar)
ENDIF
ENDPROC
//PURPOSE: Create the peds and helicopter necessary for the rooftop battle section of the mission
PROC CREATE_HELI_PEDS(BOOL bCreateTargetInVehicle = FALSE)
REQUEST_MODEL(HeliModel)
PRINTLN("REQUEST_MODEL- HeliModel")
IF NOT bHeliModelLoaded
IF HAS_MODEL_LOADED(HeliModel)
PRINTLN("bHeliModelLoaded IS TRUE - 01")
bHeliModelLoaded = TRUE
ENDIF
ELSE
PRINTLN("WAITING ON HELI MODEL TO LOAD")
ENDIF
IF bHeliModelLoaded
IF NOT bHeliPedsCreated
//create target
IF NOT DOES_ENTITY_EXIST(viHeli)
viHeli = CREATE_VEHICLE(HeliModel, vHeliPos, fHeliHead)
SET_VEHICLE_ENGINE_ON(viHeli, TRUE, TRUE)
SET_VEHICLE_RADIO_ENABLED(viHeli, FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(viHeli, TRUE)
IF bCreateTargetInVehicle
piTarget = CREATE_PED_INSIDE_VEHICLE(viHeli, PEDTYPE_MISSION, WorkerModel[0], VS_FRONT_RIGHT)
ELSE
piTarget = CREATE_PED(PEDTYPE_MISSION, WorkerModel[0], vTargetPos, fTargetHead)
ENDIF
SET_PED_DEFAULT_COMPONENT_VARIATION(piTarget)
ADD_PED_FOR_DIALOGUE(siteConv, 3, piTarget, "MAFIABOSS")
SET_PED_COMBAT_ATTRIBUTES(piTarget, CA_LEAVE_VEHICLES, FALSE)
GIVE_WEAPON_TO_PED(piTarget, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
SET_PED_COMBAT_MOVEMENT(piTarget, CM_WILLADVANCE)
SET_PED_ACCURACY(piTarget, 10)
SET_ENTITY_LOAD_COLLISION_FLAG(piTarget, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(piTarget, relEnemies)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piTarget, TRUE)
PRINTLN("CREATING TARGET")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(viHeli, "ASSASSINATION_CONSTRUCT_HELI_GROUP")
CREATE_WORKER_WAVE(6)
bHeliPedsCreated = TRUE
ENDIF
ELSE
PRINTLN("bHeliPedsCreated IS TRUE")
ENDIF
//blip the target if this is set
// IF bBlipTarget
// IF NOT DOES_BLIP_EXIST(bTargetBlip)
// IF NOT IS_PED_INJURED(piTarget)
// bTargetBlip = CREATE_BLIP_ON_ENTITY(piTarget, FALSE)
// SET_BLIP_SCALE(bTargetBlip, 1)
// ENDIF
// ENDIF
// ENDIF
ELSE
PRINTLN("bHeliModelLoaded IS FALSE")
ENDIF
ENDPROC
//Have helicopter enemy ped periodically alternate seats in the back of the helictoper if there is only one left
PROC CONTROL_ENEMY_SEAT_SWAPPING_IN_HELICOPTER()
SEQUENCE_INDEX tempSeq
IF NOT bSwitchedSeats
IF DOES_ENTITY_EXIST(viHeli) AND NOT IS_ENTITY_DEAD(viHeli)
IF GET_PED_IN_VEHICLE_SEAT(viHeli, VS_BACK_LEFT) <> NULL
pedLeftSide = GET_PED_IN_VEHICLE_SEAT(viHeli, VS_BACK_LEFT)
pedLeftSide = pedLeftSide
// PRINTLN("FOUND A GUY IN THE LEFT SEAT")
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(viHeli, VS_BACK_RIGHT) <> NULL
pedRightSide = GET_PED_IN_VEHICLE_SEAT(viHeli, VS_BACK_RIGHT)
// PRINTLN("FOUND A GUY IN THE RIGHT SEAT")
ENDIF
IF IS_VEHICLE_SEAT_FREE(viHeli, VS_BACK_LEFT)
CLEAR_SEQUENCE_TASK(tempSeq)
OPEN_SEQUENCE_TASK(tempSeq)
TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT(NULL, viHeli)
TASK_COMBAT_PED(NULL, Player)
CLOSE_SEQUENCE_TASK(tempSeq)
IF NOT IS_ENTITY_DEAD(pedRightSide)
TASK_PERFORM_SEQUENCE(pedRightSide, tempSeq)
ENDIF
CLEAR_SEQUENCE_TASK(tempSeq)
bSwitchedSeats = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
//grabs a random specified point around the rooftop - if it is too close to the player it returns NULL_VECTOR()
FUNC VECTOR PICK_NEXT_HELI_POINT()
VECTOR tempVec
INT tempInt
INT numHeliPoints = 6
// FLOAT fMinHeliDist = 20
tempInt = GET_RANDOM_INT_IN_RANGE() % numHeliPoints
IF tempInt = 0
tempVec = << -153.0297, -939.2963, 278.8077 >>
ELIF tempInt = 1
tempVec = << -135.2749, -946.9122, 278.5359 >>
ELIF tempInt = 2
tempVec = << -139.7467, -970.9389, 278.9403 >>
ELIF tempInt = 3
tempVec = << -143.7813, -982.7974, 278.8965 >>
ELIF tempInt = 4
tempVec = << -168.5419, -975.7294, 279.1384 >>
ELSE
tempVec = << -162.3326, -959.7117, 279.2721 >>
ENDIF
RETURN tempVec
ENDFUNC
PROC CONTROL_HELI_ATTACKING_PLAYER()
// SEQUENCE_INDEX tempSeq
SWITCH heliStage
CASE HS_ATTACKING
// IF NOT IS_TIMER_STARTED(heliAttackTimer)
// RESTART_TIMER_NOW(heliAttackTimer)
IF NOT IS_ENTITY_DEAD(piTarget) AND NOT IS_ENTITY_DEAD(viHeli)
IF IS_PED_IN_VEHICLE(piTarget, viHeli)
SET_HELI_BLADES_SPEED(viHeli, 1.0)
TASK_HELI_MISSION(GET_PED_IN_VEHICLE_SEAT(viHeli), viHeli, NULL, Player, <<0,0,10>>, MISSION_CIRCLE, 20, 30, -1, 325, 40)
PRINTLN("TARGET IS IN THE CHOPPER, GO!")
ELSE
PRINTLN("WAITING ON TARGET TO ENTER HELICOPTER")
ENDIF
ENDIF
RESTART_TIMER_NOW(heliFleeTimer)
heliStage = HS_FLY_TO_POINT
// ELIF GET_TIMER_IN_SECONDS(heliAttackTimer) > 15
// heliStage = HS_FLY_TO_POINT
// ENDIF
BREAK
CASE HS_FLY_TO_POINT
IF NOT IS_PED_INJURED(wave6[0].ped) //pilot
IF DOES_ENTITY_EXIST(piTarget)
IF NOT IS_PED_INJURED(piTarget)
IF IS_PED_INJURED(wave6[1].ped) //guys in back of heli
AND IS_PED_INJURED(wave6[2].ped)
IF NOT IS_TIMER_STARTED(heliFleeTimer2)
RESTART_TIMER_NOW(heliFleeTimer2)
ELSE
IF GET_TIMER_IN_SECONDS(heliFleeTimer2) > 45
TASK_HELI_MISSION(wave6[0].ped, viHeli, NULL, Player, <<0,0,0>>, MISSION_FLEE, 30, 300, -1, 325, 40)
PRINTLN("heliStage = HS_FLEE_PLAYER - guys in back of heli dead")
heliStage = HS_FLEE_PLAYER
ENDIF
ENDIF
ELSE
IF NOT IS_TIMER_STARTED(heliFleeTimer)
RESTART_TIMER_NOW(heliFleeTimer)
ELIF GET_TIMER_IN_SECONDS(heliFleeTimer) > 180
TASK_HELI_MISSION(wave6[0].ped, viHeli, NULL, Player, <<0,0,0>>, MISSION_FLEE, 30, 300, -1, 325, 40)
PRINTLN("heliStage = HS_FLEE_PLAYER - 2 minutes are up")
heliStage = HS_FLEE_PLAYER
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE HS_FLEE_PLAYER
IF NOT heliFleeLinePlayed
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_PED_INJURED(piTarget)
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_BOSS3", CONV_PRIORITY_VERY_HIGH)
heliFleeLinePlayed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC CHECK_FOR_PLAYER_ON_ROOF()
IF NOT bSetCheckpoint
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-160.140701,-981.493591,273.441498>>, <<-144.774521,-941.679199,266.633087>>, 42.000000)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "assassin_construction_rooftop_battle")
PRINTLN("SETTING MISSION STAGE TO 3")
bSetCheckpoint = TRUE
ELSE
// PRINTLN("PLAYER IS NOT ON ROOF AREA")
ENDIF
ELSE
// PRINTLN("PLAYER IS NOT ON FOOT")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC TASK_LIVING_HELI_ENEMIES_TO_EXIT_VEHICLE_AND_ATTACK_PLAYER()
INT idx
REPEAT NUM_WAVE_6_WORKERS idx
IF NOT IS_PED_INJURED(wave6[idx].ped)
SET_PED_COMBAT_ATTRIBUTES(wave6[idx].ped, CA_LEAVE_VEHICLES, TRUE)
TASK_COMBAT_PED(wave6[idx].ped, PLAYER_PED_ID())
PRINTLN("TASK_LIVING_HELI_ENEMIES_TO_EXIT_VEHICLE_AND_ATTACK_PLAYER. Tasking worker :", idx)
ENDIF
ENDREPEAT
ENDPROC
PROC TASK_TARGET_TO_EXIT_HELI_AND_COWER()
SEQUENCE_INDEX tempSeq
IF NOT IS_PED_INJURED(piTarget)
SET_PED_COMBAT_ATTRIBUTES(piTarget, CA_LEAVE_VEHICLES, TRUE)
OPEN_SEQUENCE_TASK(tempSeq)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_COWER(NULL)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(piTarget, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
PRINTLN("TASK_TARGET_TO_EXIT_HELI_AND_COWER - target should be cowering!")
ENDIF
ENDPROC
//PURPOSE: Control the playback of the helicpoter vehicle recording during the rooftop battle
PROC CONTROL_HELICOPTER_BEHAVIOR()
//have enemy ped in back of helictoper move around if there is only one left
CONTROL_ENEMY_SEAT_SWAPPING_IN_HELICOPTER()
IF DOES_ENTITY_EXIST(viHeli)
IF DOES_ENTITY_EXIST(piTarget)
IF NOT IS_VEHICLE_DRIVEABLE(viHeli)
// OR IS_PED_INJURED(piTarget)
OR IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(viHeli))
//make sure any playback stops if the heli is non-driveable or the target is killed
IF NOT bHeliOutOfControl
// IF IS_VEHICLE_DRIVEABLE(viHeli)
// IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viHeli)
// STOP_PLAYBACK_RECORDED_VEHICLE(viHeli)
// ENDIF
// ELSE
IF NOT IS_ENTITY_DEAD(viHeli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viHeli)
STOP_PLAYBACK_RECORDED_VEHICLE(viHeli)
ENDIF
IF IS_ENTITY_IN_AIR(viHeli)
SET_ENTITY_LOAD_COLLISION_FLAG(viHeli, TRUE)
SET_VEHICLE_OUT_OF_CONTROL(viHeli)
SET_VEHICLE_ENGINE_HEALTH(viHeli, 10)
SET_VEHICLE_DOORS_LOCKED(viHeli, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
ELSE
TASK_LIVING_HELI_ENEMIES_TO_EXIT_VEHICLE_AND_ATTACK_PLAYER()
TASK_TARGET_TO_EXIT_HELI_AND_COWER()
ENDIF
bHeliOutOfControl = TRUE
ENDIF
// ENDIF
ENDIF
ELSE
IF bHeliAttacking = FALSE
// IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viHeli)
// IF GET_TIME_POSITION_IN_RECORDING(viHeli) < 104000 //near end of recording path
// IF GET_PED_IN_VEHICLE_SEAT(viHeli, VS_BACK_LEFT) = NULL
// AND GET_PED_IN_VEHICLE_SEAT(viHeli, VS_BACK_RIGHT) = NULL
// STOP_PLAYBACK_RECORDED_VEHICLE(viHeli)
// SET_CURRENT_PED_VEHICLE_WEAPON(piTarget, WEAPONTYPE_VEHICLE_PLAYER_LASER)
// SET_PED_FIRING_PATTERN(piTarget, FIRING_PATTERN_FULL_AUTO)
// bHeliAttacking = TRUE
// ENDIF
// ELSE
// STOP_PLAYBACK_RECORDED_VEHICLE(viHeli)
// SET_CURRENT_PED_VEHICLE_WEAPON(piTarget, WEAPONTYPE_VEHICLE_PLAYER_LASER)
// SET_PED_FIRING_PATTERN(piTarget, FIRING_PATTERN_FULL_AUTO)
// bHeliAttacking = TRUE
// ENDIF
// ENDIF
IF NOT IS_PED_INJURED(piTarget)
IF IS_PED_IN_VEHICLE(piTarget, viHeli)
bHeliAttacking = TRUE
ENDIF
ENDIF
ELSE
CONTROL_HELI_ATTACKING_PLAYER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CONTROL_CRANE_ENEMY_BEHAVIOR()
// VECTOR vShootPos
// SEQUENCE_INDEX tempSeq
IF NOT bApplyForceToDeadGuy
IF NOT IS_ENTITY_DEAD(wave5[3].ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(wave5[3].ped, PLAYER_PED_ID())
OR IS_PED_INJURED(wave5[3].ped)
APPLY_FORCE_TO_ENTITY(wave5[3].ped, APPLY_TYPE_IMPULSE, <<0,-4,2>>, <<0,0.20,0>>, 0, TRUE, TRUE, TRUE)
SET_ENTITY_COLLISION(wave5[3].ped, FALSE)
SET_ENTITY_HAS_GRAVITY(wave5[3].ped, TRUE)
SET_ENTITY_HEALTH(wave5[3].ped, 0)
PRINTLN("PLAYER HAS DAMAGED DUDE ON CRANE")
bApplyForceToDeadGuy = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bTeleportCraneGuy
IF NOT IS_ENTITY_DEAD(wave5[3].ped)
IF NOT IS_PED_INJURED(wave5[3].ped) AND NOT IS_PED_RAGDOLL(wave5[3].ped)
IF NOT IS_ENTITY_AT_COORD(wave5[3].ped, vCraneSpawnPos, <<5,5,5>>)
SET_ENTITY_COORDS(wave5[3].ped, vCraneSpawnPos)
bTeleportCraneGuy = TRUE
PRINTLN("TELEPORTING CRANE DUDE")
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iCraneEnemyStage
CASE 0
IF bOkayToAttack
//unfreeze enemy on crane and tell him to shoot at the player once crane bounds have streamed in around him
IF NOT IS_PED_INJURED(wave5[3].ped)
IF NOT IS_ENTITY_WAITING_FOR_WORLD_COLLISION(wave5[3].ped)
SET_PED_ACCURACY(wave5[3].ped, 0)
FREEZE_ENTITY_POSITION(wave5[3].ped, FALSE)
// SET_ENTITY_INVINCIBLE(wave5[3].ped, FALSE)
IF GET_SCRIPT_TASK_STATUS(wave5[3].ped, SCRIPT_TASK_SHOOT_AT_ENTITY) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(wave5[3].ped, SCRIPT_TASK_SHOOT_AT_ENTITY) <> WAITING_TO_START_TASK
TASK_SHOOT_AT_ENTITY(wave5[3].ped, Player, -1, FIRING_TYPE_CONTINUOUS)
ENDIF
ENDIF
ENDIF
iCoverTime = GET_RANDOM_INT_IN_RANGE(5000, 10000)
iCoverTime = iCoverTime
iCraneEnemyStage++
ENDIF
BREAK
CASE 1
//crane enemy runs back and forth across the crane shooting at the player
IF NOT IS_PED_INJURED(wave5[3].ped)
vCranePedPos = GET_ENTITY_COORDS(wave5[3].ped)
IF vCranePedPos.z > 294
IF NOT IS_ENTITY_AT_COORD(wave5[3].ped, vCraneSpawnPos, <<2,2,2>>)
IF GET_SCRIPT_TASK_STATUS(wave5[3].ped, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(wave5[3].ped, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) <> WAITING_TO_START_TASK
// CLEAR_PED_TASKS(wave5[3].ped)
TASK_GO_STRAIGHT_TO_COORD(wave5[3].ped, vCraneSpawnPos, PEDMOVE_RUN)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(wave5[3].ped, SCRIPT_TASK_SHOOT_AT_ENTITY) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(wave5[3].ped, SCRIPT_TASK_SHOOT_AT_ENTITY) <> WAITING_TO_START_TASK
TASK_SHOOT_AT_ENTITY(wave5[3].ped, Player, -1, FIRING_TYPE_CONTINUOUS)
ENDIF
ENDIF
// //have the target take cover intermittently
// IF TIMERA() >= iCoverTime
// IF GET_RANDOM_BOOL()
// vShootPos = vCranePos0
// ELSE
// vShootPos = vCranePos1
// ENDIF
//
// CLEAR_SEQUENCE_TASK(tempSeq)
// OPEN_SEQUENCE_TASK(tempSeq)
// TASK_GO_STRAIGHT_TO_COORD(NULL, vShootPos, PEDMOVE_RUN)
// TASK_SHOOT_AT_ENTITY(NULL, Player, -1, FIRING_TYPE_CONTINUOUS)
// CLOSE_SEQUENCE_TASK(tempSeq)
// TASK_PERFORM_SEQUENCE(wave5[3].ped, tempSeq)
// CLEAR_SEQUENCE_TASK(tempSeq)
//
// iCoverTime = GET_RANDOM_INT_IN_RANGE(5000, 10000)
// SETTIMERA(0)
// iCraneEnemyStage++
// ENDIF
// ELSE
// //enemy has fallen down to lower crane level but hasn't died - tell him to shoot from there
// IF GET_SCRIPT_TASK_STATUS(wave5[3].ped, SCRIPT_TASK_COMBAT) <> PERFORMING_TASK
// SET_PED_SPHERE_DEFENSIVE_AREA(wave5[3].ped, << -119.3303, -973.5360, 292.8179 >>, 1)
// TASK_COMBAT_PED(wave5[3].ped, Player)
// ENDIF
ENDIF
ENDIF
BREAK
// CASE 2
// IF TIMERA() >= iCoverTime
// iCoverTime = GET_RANDOM_INT_IN_RANGE(10000, 15000)
// SETTIMERA(0)
// iCraneEnemyStage--
// ENDIF
// BREAK
ENDSWITCH
ENDPROC
//grab the player's position when they triggered the intro cutscene.
//if they arrived at the destination in the back of a taxi then just assign the player position at the location of the intro cutscene trigger point
//PROC STORE_PLAYER_POSITION()
// FLOAT fPlayerHeight
//
// IF GET_GROUND_Z_FOR_3D_COORD(vIntroCutsceneTriggerPos, fPlayerHeight)
// vPlayerPos = << vIntroCutsceneTriggerPos.x, vIntroCutsceneTriggerPos.y, fPlayerHeight >>
// ELSE
// vPlayerPos = vIntroCutsceneTriggerPos
// ENDIF
// vPlayerRot = GET_ENTITY_ROTATION(Player)
//ENDPROC
PROC HANDLE_DEBLIP_ROOFTOP_ENEMIES()
VECTOR tempVec
IF NOT bBlipsCleared
tempVec = GET_ENTITY_COORDS(Player)
IF tempVec.z <= 200
CLEANUP_PED_BLIPS(TRUE)
bBlipsCleared = TRUE
ENDIF
ENDIF
ENDPROC
PROC HANDLE_SCRIPT_CAMERA_CONTROL_IN_ELEVATOR(CAMERA_INDEX cam, BOOL bFirstElevator)
FLOAT fRX, fRY // , fLX, fLY
FLOAT fXSpeed
FLOAT fYSpeed
VECTOR vNewCamRot, vRailCamRot, vCurrentCamRot
// BOOL bPlaySound = TRUE
// BOOL bUpdateHorizontal = TRUE //used for checks when to play or not play sounds
fRX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_X)
fRY = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_Y)
//normalize the position of the right analog stick to determine whether or not to adjust on the X or Z axis
IF fRX * fRX > fRY * fRY
fXSpeed = fRX * 3.8 //FIRST_PERSON_CAM_MOVE_SPEED UP/DOWN
// bUpdateHorizontal = FALSE
ELSE
fYSpeed = -fRY * 3.8 //FIRST_PERSON_CAM_MOVE_SPEED LEFT/RIGHT
ENDIF
IF IS_LOOK_INVERTED()
fYSpeed *= -1
ENDIF
//handle camera movement and sound
IF DOES_CAM_EXIST(cam)
// rotation up/down
vRailCamRot.x += fYSpeed
// rotation l/r
vRailCamRot.z -= fXSpeed
vCurrentCamRot = GET_CAM_ROT(cam)
//handle restraints
vNewCamRot.x = vCurrentCamRot.x + vRailCamRot.x
IF vNewCamRot.x > 89.5
vNewCamRot.x = 89.5
// IF bUpdateHorizontal
// bPlaySound = FALSE
// ENDIF
ELIF vNewCamRot.x < -50.5
vNewCamRot.x = -50.5
// IF bUpdateHorizontal
// bPlaySound = FALSE
// ENDIF
ENDIF
//set l/r movement restraints for the first elevator
IF bFirstElevator
vNewCamRot.z = vCurrentCamRot.z + vRailCamRot.z
IF vNewCamRot.z < 80
AND vNewCamRot.z > 0
vNewCamRot.z = 80
// IF NOT bUpdateHorizontal
// bPlaySound = FALSE
// ENDIF
ELIF vNewCamRot.z > -116
AND vNewCamRot.z < 0
vNewCamRot.z = -116
// IF NOT bUpdateHorizontal
// bPlaySound = FALSE
// ENDIF
ENDIF
ELSE
//restraint values for 2nd elevator
vNewCamRot.z = vCurrentCamRot.z + vRailCamRot.z
IF vNewCamRot.z < -35
vNewCamRot.z = -35
// IF NOT bUpdateHorizontal
// bPlaySound = FALSE
// ENDIF
ELIF vNewCamRot.z > 150
vNewCamRot.z = 150
// IF NOT bUpdateHorizontal
// bPlaySound = FALSE
// ENDIF
ENDIF
ENDIF
SET_CAM_ROT(cam, vNewCamRot)
ENDIF
ENDPROC
PROC SETUP_CONSTRUCTION_DESTINATION_BLIP(BOOL bPrintObjective = TRUE)
//add blip for the site
IF NOT DOES_BLIP_EXIST(bSiteBlip)
bSiteBlip = CREATE_BLIP_FOR_COORD(vIntroCutsceneTriggerPos, TRUE)
SET_BLIP_NAME_FROM_TEXT_FILE(bSiteBlip, "ASS_CS_STATION")
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(bSiteBlip, << -79.8767, -917.7642, 28.1898 >>, 269.6892)
IF bPrintObjective
PRINT_NOW("ASS_CS_GOSITE", DEFAULT_GOD_TEXT_TIME, 1)
TRIGGER_MUSIC_EVENT("ASS5_DRIVE")
PRINTLN("TRIGGERING MUSIC EVENT: ASS5_DRIVE")
ENDIF
ENDIF
ENDPROC
PROC PRINT_ELEVATOR_ACTIVATION_HELP()
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_CS_ELEHELP")
// Bug Fix - 553429
// CLEAR_HELP()
PRINT_HELP("ASS_CS_ELEHELP")
ENDIF
ENDPROC
//print help explaining how to activate the elevator
FUNC BOOL CAN_PLAYER_ACTIVATE_ELEVATOR(VECTOR vCoordToCheck)
// FLOAT fTempPos
// fTempPos = GET_ENTITY_DISTANCE_FROM_LOCATION(Player, vCoordToCheck)
// PRINTLN("DISTANCE = ", fTempPos)
IF GET_ENTITY_DISTANCE_FROM_LOCATION(Player, vCoordToCheck) <= 1.65
AND NOT IS_ENTITY_IN_AIR(Player)
AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
AND GET_CLOSEST_LIVING_ENEMY(3.0) = NULL
AND NOT IS_CELLPHONE_ON_HOME_SCREEN()
AND NOT IS_PED_JUMPING(Player)
AND NOT IS_PED_IN_ANY_VEHICLE(Player)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//Handles the loading and unloading of the panic cutscene STREAMVOL so that we make sure it is loaded in when close to the site and unloads if the player dirves away
PROC HANDLE_STREAMVOL_LOADING_UNLOADING()
IF NOT bLoadSceneRequested
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vIntroCutsceneTriggerPos) <= DEFAULT_CUTSCENE_LOAD_DIST
// svPanicCutscene = STREAMVOL_CREATE_FRUSTUM(<< -146.1097, -944.1489, 114.8948 >>, << -7.6114, -0.0000, 0.6829 >>, 125.0, FLAG_MAPDATA)
PREFETCH_SRL("ass_construction")
PRINTLN("CALLING REQUEST TO PREFETCH SRL")
bLoadSceneRequested = TRUE
ENDIF
ELSE
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vIntroCutsceneTriggerPos) > DEFAULT_CUTSCENE_UNLOAD_DIST
// IF STREAMVOL_IS_VALID(svPanicCutscene)
// STREAMVOL_DELETE(svPanicCutscene)
IF IS_SRL_LOADED()
END_SRL()
PRINTLN("CALLING REQUEST TO END_SRL")
bLoadSceneRequested = FALSE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC ALTER_WAVE_ACCURACY(INT iWave, INT iAccuracy)
INT idx
SWITCH iWave
CASE 1
FOR idx = 0 TO NUM_WAVE_1_WORKERS - 1
IF DOES_ENTITY_EXIST(wave1[idx].ped)
IF NOT IS_PED_INJURED(wave1[idx].ped)
SET_PED_ACCURACY(wave1[idx].ped, iAccuracy)
PRINTLN("WAVE 1 - SETTING PED ACCURACY TO: ", iAccuracy, " ON PED: ", idx)
ENDIF
ENDIF
ENDFOR
BREAK
CASE 2
FOR idx = 0 TO NUM_WAVE_2_WORKERS - 1
IF DOES_ENTITY_EXIST(wave2[idx].ped)
IF NOT IS_PED_INJURED(wave2[idx].ped)
SET_PED_ACCURACY(wave2[idx].ped, iAccuracy)
PRINTLN("WAVE 2 - SETTING PED ACCURACY TO: ", iAccuracy, " ON PED: ", idx)
ENDIF
ENDIF
ENDFOR
BREAK
CASE 3
FOR idx = 0 TO NUM_WAVE_3_WORKERS - 1
IF DOES_ENTITY_EXIST(wave3[idx].ped)
IF NOT IS_PED_INJURED(wave3[idx].ped)
SET_PED_ACCURACY(wave3[idx].ped, iAccuracy)
PRINTLN("WAVE 3 - SETTING PED ACCURACY TO: ", iAccuracy, " ON PED: ", idx)
ENDIF
ENDIF
ENDFOR
BREAK
CASE 4
FOR idx = 0 TO NUM_WAVE_4_WORKERS - 1
IF DOES_ENTITY_EXIST(wave4[idx].ped)
IF NOT IS_PED_INJURED(wave4[idx].ped)
SET_PED_ACCURACY(wave4[idx].ped, iAccuracy)
PRINTLN("WAVE 4 - SETTING PED ACCURACY TO: ", iAccuracy, " ON PED: ", idx)
ENDIF
ENDIF
ENDFOR
BREAK
CASE 5
FOR idx = 0 TO NUM_WAVE_5_WORKERS - 1
IF DOES_ENTITY_EXIST(wave5[idx].ped)
IF NOT IS_PED_INJURED(wave5[idx].ped)
SET_PED_ACCURACY(wave5[idx].ped, iAccuracy)
PRINTLN("WAVE 5 - SETTING PED ACCURACY TO: ", iAccuracy, " ON PED: ", idx)
ENDIF
ENDIF
ENDFOR
BREAK
CASE 6
FOR idx = 0 TO NUM_WAVE_6_WORKERS - 1
IF DOES_ENTITY_EXIST(wave6[idx].ped)
IF NOT IS_PED_INJURED(wave6[idx].ped)
SET_PED_ACCURACY(wave6[idx].ped, iAccuracy)
PRINTLN("WAVE 6 - SETTING PED ACCURACY TO: ", iAccuracy, " ON PED: ", idx)
ENDIF
ENDIF
ENDFOR
BREAK
DEFAULT
SCRIPT_ASSERT("INVALID WAVE NUMBER PASSED TO ALTER_WAVE_ACCURACY")
BREAK
ENDSWITCH
ENDPROC
PROC CONTROL_ROOFTOP_ACCURACY()
// Altering accuracy for a few seconds, so the player doesn't get killed right away. Addressing Bug # 734059
IF IS_TIMER_STARTED(changeAccuracyTimer02)
IF NOT bChangeAccuracy02
IF GET_TIMER_IN_SECONDS(changeAccuracyTimer02) >= CHANGE_ACCURACY_TIME
PRINTLN("ROOFTOP: CHANGE_ACCURACY_TIME IS UP, ALTERING ACCURACY")
ALTER_WAVE_ACCURACY(5, 15)
ALTER_WAVE_ACCURACY(6, 15)
bChangeAccuracy02 = TRUE
ENDIF
ENDIF
ELSE
START_TIMER_NOW(changeAccuracyTimer02)
PRINTLN("STARTING TIMER - changeAccuracyTimer02")
ALTER_WAVE_ACCURACY(5, 0)
ALTER_WAVE_ACCURACY(6, 0)
ENDIF
ENDPROC
PROC UPDATE_TRIGGER_EARLY_ROOFTOP_BATTLE()
VECTOR vPlayerPosition
FLOAT fDistance
BOOL bPlayerParachuting
SWITCH iTriggerEarlyUpdateStages
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
// PRINTLN("vPlayerPosition = ", vPlayerPosition)
IF GET_PED_PARACHUTE_STATE(Player) != PPS_INVALID
IF GET_PED_PARACHUTE_STATE(Player) = PPS_DEPLOYING
OR GET_PED_PARACHUTE_STATE(Player) = PPS_PARACHUTING
bPlayerParachuting = TRUE
PRINTLN("bPlayerParachuting = TRUE")
ENDIF
ENDIF
IF IS_PED_IN_ANY_HELI(PLAYER_PED_ID()) OR IS_PED_IN_ANY_PLANE(PLAYER_PED_ID())
OR bPlayerParachuting
OR IS_ENTITY_IN_ANGLED_AREA(Player, <<-117.224998,-977.256531,200.162506>>, <<-135.922775,-971.229309,268.880737>>, 11.000000)
fDistance = VDIST2(vPlayerPosition, vRooftopPosition)
PRINTLN("fDistance = ", fDistance)
IF fDistance < 300 * 300
AND vPlayerPosition.z > 150
bTriggerRooftop = TRUE
PRINTLN("bTriggerRooftop = TRUE")
IF DOES_BLIP_EXIST(bSiteBlip)
REMOVE_BLIP(bSiteBlip)
PRINTLN("bTriggerRooftop: REMOVING BLIP - bSiteBlip")
ENDIF
PRINTLN("iTriggerEarlyUpdateStages = 1")
iTriggerEarlyUpdateStages = 1
ENDIF
ENDIF
ENDIF
BREAK
//======================================================================================================================
CASE 1
IF bTriggerRooftop
REMOVE_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
REMOVE_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
REMOVE_WORKER_WAVE(wave3, NUM_WAVE_3_WORKERS)
CLEANUP_WARNING_GUYS()
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_SHOOTOUT_START")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_SHOOTOUT_START")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_CAR_ARRIVES")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_CAR_ARRIVES")
ENDIF
IF DOES_ENTITY_EXIST(viCombatCar)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(viCombatCar)
ENDIF
iStageNum = 0
MainStage = STAGE_ROOFTOP_BATTLE
PRINTLN("MainStage = STAGE_ROOFTOP_BATTLE - EARLY TRIGGER")
PRINTLN("iTriggerEarlyUpdateStages = 2")
iTriggerEarlyUpdateStages = 2
ENDIF
BREAK
//======================================================================================================================
CASE 2
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_REPLAY_WEAPON_EQUIP()
wtFailWeapon = Get_Fail_Weapon(1)
IF wtFailWeapon <> WEAPONTYPE_INVALID
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), wtFailWeapon, 0, FALSE, FALSE)
PRINTLN("GIVING PLAYER LAST KNOWN WEAPON")
ELSE
PRINTLN("WEAPON IS INVALID")
wtFailWeapon = GET_BEST_PED_WEAPON(PLAYER_PED_ID())
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), wtFailWeapon, 0, FALSE, FALSE)
ENDIF
ENDPROC
PROC GO_TO_CHECKPOINT_1()
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
// bDebugSkipping = TRUE
PRINTLN("GO_TO_CHECKPOINT_1() - bDoingPSkip")
SET_ENTITY_COORDS(Player, << 804.2744, -1077.5593, 27.5087 >>)
SET_ENTITY_HEADING(Player, 129.6961)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
PRINTLN("MOVING PLAYER HERE - << 135.6720, -1059.0262, 28.1924 >>")
REMOVE_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
REMOVE_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
CLEANUP_WARNING_GUYS()
REMOVING_HELI_AND_TARGET()
CLEANUP_DEST_BLIPS()
INITIALIZE_NEXT_STAGE()
REMOVE_SECOND_ELEVATOR()
// IF bFirstCheckpointSceneLoad
// bFirstCheckpointSceneLoad = FALSE
// ENDIF
bPanicking = FALSE
bDoingPSkip = FALSE
bDoingJSkip = FALSE
bLoadSceneRequested = FALSE
bIntroSceneCreated = FALSE
bEarlyAggro = FALSE
bGuardsCreatedForFirstStage = FALSE
iWarningGuysUpdate = 0
ENDIF
#ENDIF
bGuardsCreatedForFirstStage = FALSE
SETUP_CONSTRUCTION_DESTINATION_BLIP()
// CREATE_WORKER_WAVE(1)
// CREATE_WORKER_WAVE(2)
// CREATE_WARNING_GUYS()
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
FADE_IN()
MainStage = STAGE_GET_TO_SITE
PRINTLN("MainStage = STAGE_GET_TO_SITE")
ENDPROC
PROC GO_TO_CHECKPOINT_2()
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
SET_ENTITY_COORDS(Player, << -102.4433, -907.4056, 28.2065 >>)
SET_ENTITY_HEADING(Player, 160.4677)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
PRINTLN("MOVING PLAYER HERE - << 135.6720, -1059.0262, 28.1924 >>")
PRINTLN("GO_TO_CHECKPOINT_2() - bDoingPSkip")
// bDebugSkipping = TRUE
REMOVE_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
REMOVE_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
CLEANUP_WARNING_GUYS()
REMOVING_HELI_AND_TARGET()
CLEANUP_DEST_BLIPS()
REMOVE_SECOND_ELEVATOR()
INITIALIZE_NEXT_STAGE()
// IF bSecondCheckpointSceneLoad
// bSecondCheckpointSceneLoad = FALSE
// ENDIF
bDoingJSkip = FALSE
bDoingPSkip = FALSE
bEarlyAggro = FALSE
iWarningGuysUpdate = 0
ENDIF
#ENDIF
bPanicking = FALSE
WHILE NOT ARE_CONSTRUCTION_PED_MODELS_LOADED()
WAIT(0)
ENDWHILE
CREATE_WORKER_WAVE(1)
CREATE_WORKER_WAVE(2)
CREATE_WARNING_GUYS()
END_SRL()
HANDLE_REPLAY_WEAPON_EQUIP()
TRIGGER_MUSIC_EVENT("ASS5_RESTART1")
PRINTLN("TRIGGERING MUSIC - ASS5_RESTART1")
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
FADE_IN()
MainStage = STAGE_ENTER_SITE
PRINTLN("MainStage = STAGE_ENTER_SITE")
ENDPROC
PROC GO_TO_CHECKPOINT_3()
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
PRINTLN("GO_TO_CHECKPOINT_3() - bDoingPSkip")
// bDebugSkipping = TRUE
REMOVE_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
REMOVE_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
REMOVE_WORKER_WAVE(wave3, NUM_WAVE_3_WORKERS)
CLEANUP_WARNING_GUYS()
REMOVING_HELI_AND_TARGET()
CLEANUP_DEST_BLIPS()
bHeliModelLoaded = FALSE
bHeliPedsCreated = FALSE
bRooftopWaveCreated = FALSE
bElevatorAttack = FALSE
// IF bThirdCheckpointSceneLoad
// bThirdCheckpointSceneLoad = FALSE
// ENDIF
IF DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<-182.0891, -1004.0555, 113.1355>>)
REMOVE_COVER_POINT(ciSecondFloorPosition)
PRINTLN("REMOVING COVER POINT - ciSecondFloorPosition")
ENDIF
ciSecondFloorPosition = ADD_COVER_POINT(<<-182.0891, -1004.0555, 113.1355>>, 341.2941, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180)
SET_ENTITY_COORDS(Player, << -182.1094, -1004.0585, 113.1362 >>, FALSE)
SET_ENTITY_HEADING(Player, 250.235)
INITIALIZE_NEXT_STAGE()
bDoingPSkip = FALSE
bDoingJSkip = FALSE
ENDIF
#ENDIF
WHILE NOT ARE_CONSTRUCTION_PED_MODELS_LOADED()
WAIT(0)
ENDWHILE
CREATE_WORKER_WAVE(3)
IF NOT IS_PED_INJURED(wave3[0].ped)
SET_ENTITY_COORDS(wave3[0].ped, << -152.26974, -1003.76453, 113.13822 >>)
ENDIF
WAVE_3_WORKER_ASSAULT()
SET_GROUND_ELEVATOR_TO_TOP(FALSE)
GIVE_PLAYER_WEAPONS(WEAPONTYPE_PISTOL, 50)
ALTER_WAVE_ACCURACY(3, 0)
HANDLE_REPLAY_WEAPON_EQUIP()
IF NOT IS_TIMER_STARTED(changeAccuracyTimer01)
START_TIMER_NOW(changeAccuracyTimer01)
PRINTLN("STARTING TIMER - changeAccuracyTimer01")
ELSE
RESTART_TIMER_NOW(changeAccuracyTimer01)
PRINTLN("RESTARTING TIMER - changeAccuracyTimer01")
ENDIF
TRIGGER_MUSIC_EVENT("ASS5_RESTART2")
PRINTLN("TRIGGERING MUSIC - ASS5_RESTART2")
FORCE_PED_AI_AND_ANIMATION_UPDATE(Player, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(Player, << -182.1094, -1004.0585, 113.1362 >>, -1)
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(90)
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
FADE_IN()
MainStage = STAGE_GET_TO_SECOND_ELEVATOR
PRINTLN("MainStage = STAGE_GET_TO_SECOND_ELEVATOR")
ENDPROC
PROC GO_TO_CHECKPOINT_4()
PRINTLN("GO_TO_CHECKPOINT_4")
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
PRINTLN("GO_TO_CHECKPOINT_4() - DEBUG SKIPPING")
// bDebugSkipping = TRUE
REMOVE_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
REMOVE_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
REMOVE_WORKER_WAVE(wave3, NUM_WAVE_3_WORKERS)
REMOVE_WORKER_WAVE(wave4, NUM_WAVE_4_WORKERS)
REMOVE_WORKER_WAVE(wave5, NUM_WAVE_5_WORKERS)
REMOVE_WORKER_WAVE(wave6, NUM_WAVE_6_WORKERS)
CLEANUP_WARNING_GUYS()
REMOVING_HELI_AND_TARGET()
CLEANUP_DEST_BLIPS()
bHeliModelLoaded = FALSE
bHeliPedsCreated = FALSE
bRooftopWaveCreated = FALSE
bOkayToAttack = FALSE
IF DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<-150.5964, -945.8911, 268.1318>>)
REMOVE_COVER_POINT(ciRoofPosition)
PRINTLN("REMOVING COVER POINT - ciRoofPosition")
ENDIF
ciRoofPosition = ADD_COVER_POINT(<<-150.5964, -945.8911, 268.1318>>, 231.5456, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
SET_ENTITY_COORDS(Player, vLastStageCoverPosition, FALSE)
SET_ENTITY_HEADING(Player, fLastStageCoverHeading)
INITIALIZE_NEXT_STAGE()
bDoingPSkip = FALSE
bDoingJSkip = FALSE
ENDIF
#ENDIF
WHILE NOT ARE_CONSTRUCTION_PED_MODELS_LOADED()
WAIT(0)
ENDWHILE
WHILE NOT HAS_HELICOPTER_MODEL_LOADED()
WAIT(0)
ENDWHILE
SET_SECOND_ELEVATOR_TO_TOP(TRUE, FALSE)
CREATE_HELI_PEDS(TRUE)
CREATE_WORKER_WAVE(5)
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
FORCE_PED_AI_AND_ANIMATION_UPDATE(Player, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(Player, vLastStageCoverPosition, -1)
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(90)
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
FADE_IN()
bTargetKillLinePlayed = FALSE
bFranklinJumpLinePlayed = FALSE
TRIGGER_MUSIC_EVENT("ASS5_RESTART3")
PRINTLN("TRIGGERING MUSIC - ASS5_RESTART3")
MainStage = STAGE_ROOFTOP_BATTLE
PRINTLN("MainStage = STAGE_ROOFTOP_BATTLE")
ENDPROC
PROC GO_TO_CHECKPOINT_5()
PRINTLN("GO_TO_CHECKPOINT_5")
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
PRINTLN("GO_TO_CHECKPOINT_5() - DEBUG SKIPPING")
// bDebugSkipping = TRUE
REMOVE_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
REMOVE_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
REMOVE_WORKER_WAVE(wave3, NUM_WAVE_3_WORKERS)
REMOVE_WORKER_WAVE(wave4, NUM_WAVE_4_WORKERS)
REMOVE_WORKER_WAVE(wave5, NUM_WAVE_5_WORKERS)
REMOVE_WORKER_WAVE(wave6, NUM_WAVE_6_WORKERS)
CLEANUP_WARNING_GUYS()
REMOVING_HELI_AND_TARGET()
CLEANUP_DEST_BLIPS()
bHeliModelLoaded = FALSE
bHeliPedsCreated = FALSE
IF DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<-150.5964, -945.8911, 268.1318>>)
REMOVE_COVER_POINT(ciRoofPosition)
PRINTLN("REMOVING COVER POINT - ciRoofPosition")
ENDIF
SET_ENTITY_COORDS(Player, <<-102.2210, -941.3790, 28.2330>>, FALSE)
SET_ENTITY_HEADING(Player, 67.1012)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
bDoingPSkip = FALSE
bDoingJSkip = FALSE
ENDIF
#ENDIF
SET_SECOND_ELEVATOR_TO_TOP(TRUE, FALSE)
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
FADE_IN()
MainStage = STAGE_CLEANUP
PRINTLN("MainStage = STAGE_CLEANUP")
ENDPROC
PROC GO_TO_CLEANUP()
//explode the heli
IF DOES_ENTITY_EXIST(viHeli) AND IS_VEHICLE_DRIVEABLE(viHeli)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viHeli)
STOP_PLAYBACK_RECORDED_VEHICLE(viHeli)
ENDIF
// ADD_EXPLOSION(GET_ENTITY_COORDS(viHeli), EXP_TAG_PETROL_PUMP)
ENDIF
#IF IS_DEBUG_BUILD
FAKE_KEY_PRESS(KEY_K)
#ENDIF
//remove the target and blips
DELETE_PED(piTarget)
// IF DOES_BLIP_EXIST(bTargetBlip)
// REMOVE_BLIP(bTargetBlip)
// ENDIF
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
PRINTLN("Assassination Passed via J-SKIP")
INITIALIZE_NEXT_STAGE()
FADE_IN(500)
MainStage = STAGE_CLEANUP
ENDPROC
/// PURPOSE:
/// Create necessary objects for primary stage of the mission
PROC DO_STAGE_SPAWNING()
CREATE_CAMERAS()
CREATE_VEHICLES()
// CREATE_ELEVATOR_DOORS()
SETUP_UI_LABELS()
HANDLE_COVER_PROPS()
CREATE_HEALTH_PACK()
CREATE_PARACHUTE_PACK()
INITIALIZE_NEXT_STAGE()
IF bReplaying
IF g_savedGlobals.sAssassinData.fConstructionMissionTime <> 0
RESTART_TIMER_AT(missionTimer, g_savedGlobals.sAssassinData.fConstructionMissionTime)
PRINTLN("RESTARTING TIMER - missionTimer AT: ", g_savedGlobals.sAssassinData.fConstructionMissionTime)
ENDIF
//iStageToUse is now determined right before the main WHILE loop of the script!
//player at payphone
IF iStageToUse = 0
GO_TO_CHECKPOINT_1()
//player outside of site on ground level
ELIF iStageToUse = 1
GO_TO_CHECKPOINT_2()
//player on mid level of the building
ELIF iStageToUse = 2
GO_TO_CHECKPOINT_3()
//rooftop
ELIF iStageToUse = 3
GO_TO_CHECKPOINT_4()
ELIF iStageToUse = 4
GO_TO_CHECKPOINT_5()
ENDIF
ELSE
IF NOT IS_TIMER_STARTED(missionTimer)
START_TIMER_NOW(missionTimer)
PRINTLN("STARTING TIMER - missionTimer")
g_savedGlobals.sAssassinData.fConstructionMissionTime = 0
PRINTLN("CONSTRUCTION GLOBAL MISSION TIMER = ", g_savedGlobals.sAssassinData.fConstructionMissionTime)
ENDIF
// CREATE_WORKER_WAVE(1)
// CREATE_WORKER_WAVE(2)
// CREATE_WARNING_GUYS()
SETUP_CONSTRUCTION_DESTINATION_BLIP()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "assassin_construction_get_to_site")
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(viReplayVehicle)
MainStage = STAGE_GET_TO_SITE
PRINTLN("MainStage = STAGE_GET_TO_SITE (from DO_STAGE_SPAWNING)")
ENDIF
ENDPROC
PROC REMOVE_SKINNED_PHONE_PROP()
VECTOR vPlayerPos
IF NOT DOES_ENTITY_EXIST(oPayPhoneAnimated)
EXIT
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF VDIST2(vPlayerPos, vPhoneLocation) > 10000 // 100m
IF DOES_ENTITY_EXIST(oPayPhoneAnimated)
SET_MODEL_AS_NO_LONGER_NEEDED(P_PHONEBOX_01B_S)
DELETE_OBJECT(oPayPhoneAnimated)
PRINTLN("DELETING OBJECT - oPayPhoneAnimated")
ENDIF
IF DOES_ENTITY_EXIST(oPayPhone)
SET_ENTITY_VISIBLE(oPayPhone, TRUE)
SET_ENTITY_COLLISION(oPayPhone, TRUE)
PRINTLN("TURNING BACK ON VISIBILITY AND COLLISION")
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handle blip behavior and enemy patrol behavior in first stage
PROC DO_STAGE_GET_TO_SITE()
REMOVE_SKINNED_PHONE_PROP()
GRAB_RETRY_VEHICLE()
//handles streaming/creation of enemies when the player is en route to the destination
IF NOT bGuardsCreatedForFirstStage
OR bPanicking = TRUE
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vIntroCutsceneTriggerPos, FALSE) < 500
IF ARE_CONSTRUCTION_PED_MODELS_LOADED()
CREATE_WORKER_WAVE(1)
CREATE_WORKER_WAVE(2)
CREATE_WARNING_GUYS()
bGuardsCreatedForFirstStage = TRUE
PRINTLN("bGuardsCreatedForFirstStage = TRUE")
ENDIF
ENDIF
ENDIF
//advance past the cutscene if you go the area while wanted
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
IF IS_PLAYER_IN_CONSTRUCTION_AREA()
OR GET_PLAYER_DISTANCE_FROM_LOCATION(vIntroCutsceneTriggerPos) < 25
bPanicking = TRUE
PRINTLN("bPanicking = TRUE VIA WANTED LEVEL ")
ENDIF
ENDIF
//if the player attacks the guards prior to triggering the cutscene, skip the cutscene and advance to the next stage
IF bPanicking
// IF STREAMVOL_IS_VALID(svPanicCutscene)
// STREAMVOL_DELETE(svPanicCutscene)
// PRINTLN("REMOVING - svPanicCutscene")
// ENDIF
END_SRL()
IF bGuardsCreatedForFirstStage
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_ENTER_SITE
PRINTLN("MainStage = STAGE_ENTER_SITE - bPanicking = TRUE")
EXIT
ENDIF
ENDIF
SWITCH iStageNum
CASE 0
IF NOT DOES_ENTITY_EXIST(objElev[0])
CREATE_GROUND_ELEVATOR()
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vIntroCutsceneTriggerPos, <<5,5,LOCATE_SIZE_HEIGHT>>, TRUE)
ELSE
//draw corona
ENDIF
//create site blip and wait for player to get close to the construction site
IF IS_PLAYER_NEAR_COORD_AND_NOT_A_TAXI_PASSENGER(vIntroCutsceneTriggerPos, 5)
AND IS_PLAYER_READY_FOR_CUTSCENE(PLAYER_ID())
IF DOES_BLIP_EXIST(bSiteBlip)
REMOVE_BLIP(bSiteBlip)
ENDIF
iStageNum ++
ELSE
//make sure the volume around the panic cutscene streams in/out properly based on player proximity to the vIntroCutsceneTriggerPos
HANDLE_STREAMVOL_LOADING_UNLOADING()
ENDIF
BREAK
CASE 1
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 10, 1)
OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT bPanicking
RESTART_TIMER_NOW(tPanicFailSafeTimer)
PRINTLN("RESTARTING TIMER - tPanicFailSafeTimer")
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_PANIC_CUTSCENE
PRINTLN("MainStage = STAGE_PANIC_CUTSCENE")
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Play a cutscene of an enemy calling the target on the upper levels to verify the player's identity
PROC DO_STAGE_PANIC_CUTSCENE()
VECTOR vElevPos
FLOAT fElevatorDistPerFrame
SWITCH iStageNum
CASE 0
//prep the player
IF ( IS_PLAYER_READY_FOR_ASSASSINATION_CUTSCENE(5.0, FALSE)
AND IS_SRL_LOADED() )
// AND STREAMVOL_HAS_LOADED(svPanicCutscene))
OR (IS_PLAYER_READY_FOR_ASSASSINATION_CUTSCENE() AND IS_TIMER_STARTED(tPanicFailSafeTimer) AND GET_TIMER_IN_SECONDS(tPanicFailSafeTimer) > 15)
IF NOT bIntroSceneCreated
iRoadNode01 = ADD_ROAD_NODE_SPEED_ZONE(<< -69.7777, -923.6335, 28.2933 >>, 10.0, 0)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehPlayerIsIn = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehPlayerIsIn)
IF NOT IS_ENTITY_DEAD(vehPlayerIsIn)
SET_VEH_RADIO_STATION(vehPlayerIsIn, "OFF")
PRINTLN("TURNING OFF RADIO")
ENDIF
ENDIF
ENDIF
ENDIF
//create target and extra ped that are used in the intro cutscene
CREATE_TARGET(TRUE)
IF NOT IS_PED_INJURED(piTarget)
FORCE_PED_AI_AND_ANIMATION_UPDATE(piTarget, TRUE)
TASK_PLAY_ANIM(piTarget, "oddjobs@assassinate@construction@", "CS_GetInLift", INSTANT_BLEND_IN, SLOW_BLEND_OUT, 9500)
ENDIF
IF NOT IS_PED_INJURED(piCutscenePed)
// TASK_PLAY_ANIM(piCutscenePed, "oddjobs@assassinate@construction@", "react_small_variations_g", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(piCutscenePed, TRUE)
TASK_PLAY_ANIM(piCutscenePed, "oddjobs@assassinate@construction@", "idle_a", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
TASK_LOOK_AT_ENTITY(piCutscenePed, piTarget, -1)
ENDIF
CREATE_MODEL_HIDE(vElev2Bottom, 5, PROP_CONSLIFT_LIFT, TRUE)
CREATE_SECOND_ELEVATOR()
IF DOES_ENTITY_EXIST(objElev[1])
IF NOT IS_PED_INJURED(piTarget)
//attach since we want him to move with the elevator later
ATTACH_ENTITY_TO_ENTITY(piTarget, objElev[1], 0, << -1.75, -1.88, -1.3 >>, <<0, 0, 84.2 >>)
ENDIF
ENDIF
//create intro cutscene cameras
camIntroA = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-147.566757,-958.613892,114.883949>>,<<-1.648425,-0.298680,24.550936>>,31.352049)
camIntroB = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-147.235367,-957.665466,114.866714>>,<<-1.648426,-0.298680,25.520023>>,31.352049)
SHAKE_CAM(camIntroA, "HAND_SHAKE", 0.2)
SHAKE_CAM(camIntroB, "HAND_SHAKE", 0.2)
bIntroSceneCreated = TRUE
ELSE
START_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_CUTSCENE")
PRINTLN("ASSASSINATION_CONSTRUCT_CUTSCENE STARTED!")
SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
BEGIN_SRL()
SET_SRL_POST_CUTSCENE_CAMERA(<<-112.1211, -907.9638, 30.1577>>, <<-1.9677, 0.0000, 71.4750>>)
ODDJOB_ENTER_CUTSCENE()
GET_ASSASSIN_CUTSCENE_START_TIME()
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
SET_CAM_ACTIVE_WITH_INTERP(camIntroB, camIntroA, 4800, GRAPH_TYPE_LINEAR)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ADD_PED_FOR_DIALOGUE(siteConv, 3, piTarget, "MAFIABOSS")
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_SCARE", CONV_PRIORITY_VERY_HIGH)
PRINTLN("CALLING CONVERSATION IN PANIC CUTSCENE - 01")
bPlayedLined = TRUE
ENDIF
bGrabbedDistance = FALSE // Reset Grab Distance, so it's not the distance from payphone to building.
SETTIMERA(0)
iStageNum ++
ENDIF
ENDIF
BREAK
//show closeup of target
CASE 1
SET_SRL_TIME( TO_FLOAT(TIMERA()) )
IF NOT bPlayedLined
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_SCARE", CONV_PRIORITY_VERY_HIGH)
PRINTLN("CALLING CONVERSATION IN PANIC CUTSCENE - 02")
bPlayedLined = TRUE
ENDIF
ENDIF
IF TIMERA() >= 4800
SET_CAM_PARAMS(camIntroA, <<-152.648544,-944.800049,114.202782>>,<<2.386309,-0.295268,43.695774>>,31.342575)
SET_CAM_PARAMS(camIntroB, <<-152.750519,-944.693359,114.208893>>,<<2.386309,-0.295268,43.695774>>,31.342575)
SHAKE_CAM(camIntroA, "HAND_SHAKE", 0.2)
SHAKE_CAM(camIntroB, "HAND_SHAKE", 0.2)
SET_CAM_ACTIVE_WITH_INTERP(camIntroB, camIntroA, 6000, GRAPH_TYPE_LINEAR)
iStageNum++
ENDIF
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
BREAK
//Cut to shot further out once it's time to start elevator.
CASE 2
SET_SRL_TIME( TO_FLOAT(TIMERA()) )
IF TIMERA() >= 7500
SET_CAM_PARAMS(camIntroA, <<-165.200241,-938.027649,113.466736>>,<<4.389886,0.213688,-112.112709>>,32.212269)
SET_CAM_PARAMS(camIntroB, <<-164.622894,-937.124084,113.467522>>,<<77.824348,0.213692,-131.064331>>,32.212269)
SHAKE_CAM(camIntroA, "HAND_SHAKE", 0.2)
SHAKE_CAM(camIntroB, "HAND_SHAKE", 0.2)
SET_CAM_ACTIVE_WITH_INTERP(camIntroB, camIntroA, 4250, GRAPH_TYPE_SIN_ACCEL_DECEL)
ODDJOB_STOP_SOUND(iSoundIdElevator)
iStageNum++
ENDIF
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
BREAK
//elevator ascends, cut to shot outside the building.
CASE 3
SET_SRL_TIME( TO_FLOAT(TIMERA()) )
IF TIMERA() >= 9250
// SET_CAM_PARAMS(camIntroA, <<-160.488113,-921.966370,112.177086>>,<<64.558716,0.213686,-174.816742>>,50.066635)
// SET_CAM_PARAMS(camIntroB, <<-160.456223,-922.317749,112.918907>>,<<64.558716,0.213686,-174.816742>>,50.066635)
// SHAKE_CAM(camIntroA, "HAND_SHAKE", 0.2)
// SHAKE_CAM(camIntroB, "HAND_SHAKE", 0.2)
// SET_CAM_ACTIVE_WITH_INTERP(camIntroB, camIntroA, 2700, GRAPH_TYPE_LINEAR)
// SET_ENTITY_COORDS(objElev[1], GET_ENTITY_COORDS(objElev[1]) + <<0.0, 0.0, 15.0>>)
//stop elevator door sound and start moving the entire elevator
ODDJOB_STOP_SOUND(iSoundIdElevator)
// MOVE_ELEVATOR(objElev[1], objElevDoorControl[2], objElevDoorControl[3], 0.25, FALSE, TRUE, TRUE)
// RESTORE_PLAYER_POSITION()
//attach cam to outside of elevator
iStageNum++
// ELSE
// //close the elevator door
// IF TIMERA() >= 1000
// AND TIMERA() <= 2000
//// MOVE_ELEVATOR_DOOR(objElevDoorControl[2], 0.15, TRUE)
// ENDIF
ENDIF
vElevPos = GET_ENTITY_COORDS(objElev[1])
fElevatorDistPerFrame = GET_ELEVATOR_TARGET_MOVE_SPEED_START(vElevPos.z, vMyElevPos[1].z + 7.5, vMyElevPos[1].z + 2.763, 0.1, 0.2)
MOVE_ELEVATOR(objElev[1], NULL, NULL, fElevatorDistPerFrame, FALSE, TRUE, TRUE)
BREAK
//shot looking at building exterior
CASE 4
IF NOT bDoneFlash
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
IF TIMERA() >= 12550
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
PRINTLN("bDoneFlash = TRUE")
bDoneFlash = TRUE
ENDIF
ENDIF
ENDIF
SET_SRL_TIME( TO_FLOAT(TIMERA()) )
IF TIMERA() >= 12850
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
// DO_SCREEN_FADE_OUT(500)
iStageNum++
ELSE
// IF TIMERA() >= 500
// IF NOT IS_ENTITY_DEAD(piTarget)
// IF IS_ENTITY_PLAYING_ANIM(piTarget, "oddjobs@assassinate@construction@", "CS_GetInLift")
// STOP_ANIM_TASK(piTarget, "oddjobs@assassinate@construction@", "CS_GetInLift", SLOW_BLEND_OUT)
// ENDIF
// ENDIF
// ENDIF
ENDIF
vElevPos = GET_ENTITY_COORDS(objElev[1])
fElevatorDistPerFrame = GET_ELEVATOR_TARGET_MOVE_SPEED_START(vElevPos.z, vMyElevPos[1].z + 7.5, vMyElevPos[1].z + 2.763, 0.1, 0.25)
MOVE_ELEVATOR(objElev[1], NULL, NULL, fElevatorDistPerFrame, FALSE, TRUE, TRUE)
BREAK
//shut down cutscene, teleport player back to ground level, and return to gameplay
CASE 5
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
CLEAR_PRINTS()
SET_SRL_TIME( TO_FLOAT(TIMERA()) )
ELSE
ODDJOB_EXIT_CUTSCENE()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
//remove the cutscene peds_
REMOVE_PED_FOR_DIALOGUE(siteConv, 3)
REMOVE_PED_FOR_DIALOGUE(siteConv, 5)
DELETE_PED(piTarget)
DELETE_PED(piCutscenePed)
//stop elevator sounds
ODDJOB_STOP_SOUND(iSoundIdElevator)
//fade back in and advance to next stage
CUTSCENE_SKIP_FADE_IN()
//davance to next stage
INITIALIZE_NEXT_STAGE()
// IF STREAMVOL_IS_VALID(svPanicCutscene)
// STREAMVOL_DELETE(svPanicCutscene)
// PRINTLN("REMOVING - svPanicCutscene - 01")
// ENDIF
END_SRL()
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_CUTSCENE")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_CUTSCENE")
PRINTLN("ASSASSINATION_CONSTRUCT_CUTSCENE STOPPED!")
ENDIF
MainStage = STAGE_ENTER_SITE
PRINTLN("Cutscene Finished - MainStage = STAGE_ENTER_SITE")
ENDIF
vElevPos = GET_ENTITY_COORDS(objElev[1])
fElevatorDistPerFrame = GET_ELEVATOR_TARGET_MOVE_SPEED_START(vElevPos.z, vMyElevPos[1].z + 7.5, vMyElevPos[1].z + 2.763, 0.1, 0.25)
MOVE_ELEVATOR(objElev[1], NULL, NULL, 0.25, FALSE, TRUE, TRUE)
BREAK
ENDSWITCH
//see if player is trying to skip the cutscene and handle accordingly (wait until stage 2 since we teleport the player in stage 1)
IF iStageNum >= 2
IF NOT bCutsceneSkipped
IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime)
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_CUTSCENE")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_CUTSCENE")
PRINTLN("ASSASSINATION_CONSTRUCT_CUTSCENE STOPPED!")
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
// RESTORE_PLAYER_POSITION()
iStageNum = 5
bCutsceneSkipped = TRUE
ODDJOB_STOP_SOUND(iSoundIdElevator)
END_SRL()
// IF STREAMVOL_IS_VALID(svPanicCutscene)
// STREAMVOL_DELETE(svPanicCutscene)
// PRINTLN("REMOVING - svPanicCutscene - 02")
// ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PLAYERS_LAST_VEHICLE_IN_BOTTOM_ELEVATOR()
VEHICLE_INDEX vehLastPlayer
vehLastPlayer = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(vehLastPlayer)
IF IS_ENTITY_IN_ANGLED_AREA(vehLastPlayer, <<-185.042389,-1018.321350,29.051546>>, <<-183.152817,-1013.211792,31.051546>>, 2.000000)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC TASK_CLOSEST_LIVING_GUARDS_TO_FLEE_PLAYER(FLOAT fDistanceProbe = 10.0)
VECTOR vTemp
INT tempInt
FLOAT tempDist
vTemp = GET_ENTITY_COORDS(Player)
IF MainStage < STAGE_ELEVATOR_CUTSCENE //check guys in wave 1
FOR tempInt = 0 TO NUM_WAVE_1_WORKERS - 1
IF NOT IS_PED_INJURED(wave1[tempInt].ped)
tempDist = VDIST2(vTemp, GET_ENTITY_COORDS(wave1[tempInt].ped))
IF tempDist < fDistanceProbe * fDistanceProbe
TASK_SMART_FLEE_PED(wave1[tempInt].ped, Player, 30, -1)
ENDIF
ENDIF
ENDFOR
tempInt = 0
FOR tempInt = 0 TO NUM_WAVE_2_WORKERS - 1
IF NOT IS_PED_INJURED(wave2[tempInt].ped)
tempDist = VDIST2(vTemp, GET_ENTITY_COORDS(wave2[tempInt].ped))
IF tempDist < fDistanceProbe * fDistanceProbe
TASK_SMART_FLEE_PED(wave2[tempInt].ped, Player, 30, -1)
ENDIF
ENDIF
ENDFOR
ELIF MainStage < STAGE_SECOND_ELEVATOR_CUTSCENE //check guys in wave 3
FOR tempInt = 0 TO NUM_WAVE_3_WORKERS - 1
IF NOT IS_PED_INJURED(wave3[tempInt].ped)
tempDist = VDIST2(vTemp, GET_ENTITY_COORDS(wave3[tempInt].ped))
IF tempDist < fDistanceProbe * fDistanceProbe
TASK_SMART_FLEE_PED(wave3[tempInt].ped, Player, 30, -1)
ENDIF
ENDIF
ENDFOR
tempInt = 0
FOR tempInt = 0 TO NUM_WAVE_4_WORKERS - 1
IF NOT IS_PED_INJURED(wave4[tempInt].ped)
tempDist = VDIST2(vTemp, GET_ENTITY_COORDS(wave4[tempInt].ped))
IF tempDist < fDistanceProbe * fDistanceProbe
TASK_SMART_FLEE_PED(wave4[tempInt].ped, Player, 30, -1)
ENDIF
ENDIF
ENDFOR
ELSE
FOR tempInt = 0 TO NUM_WAVE_5_WORKERS - 1 //check guys in wave 5
IF NOT IS_PED_INJURED(wave5[tempInt].ped)
tempDist = VDIST2(vTemp, GET_ENTITY_COORDS(wave5[tempInt].ped))
IF tempDist < fDistanceProbe * fDistanceProbe
TASK_SMART_FLEE_PED(wave5[tempInt].ped, Player, 30, -1)
ENDIF
ENDIF
ENDFOR
ENDIF
ENDPROC
/// PURPOSE:
/// Unblip the site blip and blip the elevator. Trigger elevator cutscene when near.
PROC DO_STAGE_ENTER_SITE()
SWITCH iStageNum
CASE 0
//set mission checkpoint
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "assassin_construction_enter_site")
START_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_SHOOTOUT_START")
TRIGGER_MUSIC_EVENT("ASS5_START")
PRINTLN("TRIGGERING MUSIC - ASS5_START")
// //hide existing elevator since we will need to create our own with doors that will be scripted to move
// CREATE_MODEL_HIDE(vElev1Bottom, 5, PROP_CONSLIFT_LIFT, TRUE)
IF NOT DOES_ENTITY_EXIST(objElev[0])
CREATE_GROUND_ELEVATOR()
ENDIF
//cleanup existing blip, create new blip inside site and tell player to enter the site
CLEANUP_DEST_BLIPS()
// IF NOT bPanicking //to fix Bug 544290
PRINT_NOW("ASS_CS_ROOF", DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("PRINTING OBJECTIVE TO GET TO THE ROOFTOP")
IF NOT DOES_BLIP_EXIST(blipRooftop)
blipRooftop = ADD_BLIP_FOR_COORD(<< -184.5990, -1015.8192, 254.2567 >>)
// SET_BLIP_COLOUR(blipRooftop, BLIP_COLOUR_RED)
SET_BLIP_ROUTE(blipRooftop, FALSE)
SET_BLIP_NAME_FROM_TEXT_FILE(blipRooftop, "ASS_CS_TARGET")
PRINTLN("ADDING BLIP - blipRooftop")
ENDIF
// ENDIF
iStageNum++
BREAK
// wait for player to activate the elevator
CASE 1
IF CAN_PLAYER_ACTIVATE_ELEVATOR(vElev1Bottom)
AND NOT IS_PLAYERS_LAST_VEHICLE_IN_BOTTOM_ELEVATOR()
PRINT_ELEVATOR_ACTIVATION_HELP()
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_CONTEXT)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_CS_ELEHELP")
// REMOVE_BLIP(bElevatorBlip)
viPlayerCar = GET_PLAYERS_LAST_VEHICLE()
IF viPlayerCar != NULL
IF IS_VEHICLE_DRIVEABLE(viPlayerCar)
SET_ENTITY_AS_MISSION_ENTITY(viPlayerCar)
ENDIF
ENDIF
TRIGGER_MUSIC_EVENT("ASS5_LIFT")
PRINTLN("TRIGGERING MUSIC - ASS5_LIFT")
// TASK_CLOSEST_LIVING_GUARDS_TO_FLEE_PLAYER()
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_ELEVATOR_CUTSCENE
PRINTLN("MainStage = STAGE_ELEVATOR_CUTSCENE")
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_CS_ELEHELP")
CLEAR_HELP()
ENDIF
IF bAdvanceOnPlayer = FALSE
IF ( GET_NUM_ENEMIES_LEFT_IN_WAVE(wave1, NUM_WAVE_1_WORKERS) + GET_NUM_ENEMIES_LEFT_IN_WAVE(wave2, NUM_WAVE_2_WORKERS) ) = 1
TASK_REMAINING_PEDS_IN_WAVE_TO_ATTACK_PLAYER(wave1, NUM_WAVE_1_WORKERS)
TASK_REMAINING_PEDS_IN_WAVE_TO_ATTACK_PLAYER(wave2, NUM_WAVE_2_WORKERS)
PRINTLN("TASKING THE LAST GUY TO CHARGE THE PLAYER")
bAdvanceOnPlayer = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//controls behavior of guys in the vehicle on the ground level (when to drive, exit the vehicle and attack)
HANDLE_WAVE_2_ENEMY_ASSAULT()
IF bPanicking
AND NOT bWave1Attacking
WAVE_1_WORKER_ASSAULT()
bWave1Attacking = TRUE
PRINTLN("bWave1Attacking = TRUE")
ENDIF
ENDPROC
FUNC BOOL HANDLE_PLAYER_PRESSING_ELEVATOR_BUTTON(OBJECT_INDEX elevatorObj, OBJECT_INDEX elevatorButtonObj, FLOAT fPlayerFaceButtonHeading)
SWITCH iElevButtonStage
CASE 0
TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(elevatorObj, vButtonPressAnimOffset), PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, fPlayerFaceButtonHeading)
iElevButtonStage ++
BREAK
CASE 1
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_STRAIGHT_TO_COORD) != PERFORMING_TASK
// IF VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(elevatorObj, vButtonPressAnimOffset)) < 0.1
// TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), elevatorButtonObj)
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtElevatorWeapon)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
elevatorButtonObj = elevatorButtonObj
iElevButtonStage ++
ENDIF
BREAK
CASE 2
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> PERFORMING_TASK
iElevSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(elevatorObj, vButtonPressAnimOffset), GET_ENTITY_ROTATION(elevatorObj))
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iElevSyncScene, "oddjobs@assassinate@construction@", "ig_1_button", SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
iElevButtonStage ++
ENDIF
BREAK
CASE 3
IF IS_SYNCHRONIZED_SCENE_RUNNING(iElevSyncScene)
AND GET_SYNCHRONIZED_SCENE_PHASE(iElevSyncScene) > 0.9
iElevButtonStage ++
ENDIF
BREAK
CASE 4
VECTOR vAttach
vAttach = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(elevatorObj, GET_ENTITY_COORDS(PLAYER_PED_ID()))
vAttach.z = -1.333402
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), elevatorObj, 0, vAttach, <<0,0,GET_ENTITY_HEADING(PLAYER_PED_ID())-GET_ENTITY_HEADING(elevatorObj)>>, TRUE, TRUE, FALSE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC DO_STAGE_ELEVATOR_CUTSCENE()
SEQUENCE_INDEX tempSeq
tempSeq = tempSeq
VECTOR tempVec
FLOAT fElevatorDistPerFrame
IF DOES_ENTITY_EXIST(objElev[0])
tempVec = GET_ENTITY_COORDS(objElev[0])
ENDIF
SWITCH iStageNum
//set scripts safe for the cutscene
CASE 0
ODDJOB_ENTER_CUTSCENE(SPC_LEAVE_CAMERA_CONTROL_ON) // Setting this control flag to allow us to control the 3rd person camerawhile the elevator is active
GET_ASSASSIN_CUTSCENE_START_TIME()
ODDJOB_STOP_SOUND(iSoundIdElevator)
CLEAR_PRINTS()
CLEAR_HELP()
//set this value to the appropriate level for enemy speech on mid level of building to be used with the UPDATE_COMBAT_DIALOGUE_ENEMY function
IF iEnemySpeechStage < 4
PRINTLN("SETTING iEnemySpeechStage TO 4")
iEnemySpeechStage = 4
ENDIF
// FREEZE_ENTITY_POSITION(Player, TRUE)
SET_PLAYER_INVINCIBLE(PLAYER_ID(), TRUE)
CLEAR_AREA(vElev1Bottom, 10, TRUE)
SETTIMERA(0)
iStageNum ++
BREAK
CASE 1
IF HANDLE_PLAYER_PRESSING_ELEVATOR_BUTTON(objElev[0], objElevButton[0], 264.1952)
// TASK_LOOK_AT_COORD(PLAYER_PED_ID(), << -182.86542, -1012.34216, 114.13878 >>, -1)
iStageNum ++
ENDIF
BREAK
//show elevator going up
CASE 2
IF TIMERA() >= 0
//close the elvator door behind the player
ODDJOB_STOP_SOUND(iSoundIdElevator)
// //cam attached to elevator
// INIT_FIRST_PERSON_CAMERA(camFirstPerson, << -188.2900, -1022.0970, 31.3926 >>, vElev1CamRot, 45, 90, 90)
// ATTACH_CAM_TO_ENTITY(camFirstPerson.theCam, objElev[0], vAttachmentOffset)
//create next wave of enemies on mid-level
CREATE_WORKER_WAVE(3)
FREEZE_ENTITY_POSITION(Player, FALSE)
SETTIMERA(0)
iStageNum ++
// ELSE
// //close the elevator door - monitor the height so that we know when to stop it
// VECTOR tempVec2
// IF DOES_ENTITY_EXIST(objElevDoorControl[0])
// tempVec2 = GET_ENTITY_COORDS(objElevDoorControl[0])
// ENDIF
// IF tempVec2.z >= 30.45 //do this to make sure the door doesn't descend too much (Bug 403374)
// IF TIMERA() > 500
// AND TIMERA() <= 1600
//// MOVE_ELEVATOR_DOOR(objElevDoorControl[0], 0.15, TRUE)
// ENDIF
// ENDIF
ENDIF
BREAK
//go back to gameplay after reaching mid level
CASE 3
IF DOES_ENTITY_EXIST(objElev[0])
IF tempVec.z >= 115.4
OR bCutsceneSkipped
IF IS_SCREEN_FADING_OUT()
IF NOT IS_SCREEN_FADING_IN()
CLEANUP_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
CLEANUP_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
DO_SCREEN_FADE_IN(1000)
ENDIF
ELSE
// SET_ENTITY_COORDS(objElev[0], << -182.170, -1016.090, 115.46 >>)
// SET_ENTITY_COORDS(objElevDoorControl[0], << -184.97, -1018.08, 114.551 >>)
IF NOT IS_PED_IN_ANY_VEHICLE(Player)
DETACH_ENTITY(Player, FALSE, FALSE)
ELSE
DETACH_ENTITY(GET_VEHICLE_PED_IS_IN(Player), FALSE, FALSE)
ENDIF
// SET_ENTITY_HEADING(Player, 340.3911)
// CLEAR_FIRST_PERSON_CAMERA(camFirstPerson)
// SET_GAMEPLAY_CAM_RELATIVE_HEADING()
// SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SETTIMERA(0)
ODDJOB_STOP_SOUND(iSoundIdElevator)
iStageNum ++
ENDIF
ELSE
// //gradually slow down the elevator as it approaches its destination
fElevatorDistPerFrame = GET_ELEVATOR_TARGET_MOVE_SPEED_STOP(tempVec.z, 105.0, 115.4, 111.0, 0.10, 0.25)
MOVE_ELEVATOR(objElev[0], NULL, NULL, fElevatorDistPerFrame)
//have the enemy spot franklin as the elevator starts slowing down and trigger panic
IF tempVec.z >= 113.8
IF NOT bPanicking
PLAY_ENEMY_SPOTTED_FRANKLIN_LINE(wave3[0].ped)
bPanicking = TRUE
ENDIF
WAVE_3_WORKER_ASSAULT()
ENDIF
RELOAD_PLAYERS_WEAPON()
// UPDATE_FIRST_PERSON_CAMERA(camFirstPerson)
ENDIF
ENDIF
BREAK
//tell the enemies to attack the player return control to the player
CASE 4
// IF TIMERA() >= 1650
//stop elevator and camera sounds and play sound of elevator door opening in front of player
ODDJOB_STOP_SOUND(iSoundIdElevator)
//cleanup ground level enemies and create next wave on mid-level of the building
CLEANUP_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
CLEANUP_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
CLEANUP_WARNING_GUYS()
WAVE_3_WORKER_ASSAULT()
ODDJOB_EXIT_CUTSCENE()
// IF bCutsceneSkipped
CUTSCENE_SKIP_FADE_IN()
// ENDIF
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_GET_TO_SECOND_ELEVATOR
PRINTLN("MainStage = STAGE_GET_TO_SECOND_ELEVATOR")
// ELSE
// IF TIMERA() > 500
// AND TIMERA() <= 1600
//// MOVE_ELEVATOR_DOOR(objElevDoorControl[1], 0.15, FALSE)
// ENDIF
// ENDIF
BREAK
ENDSWITCH
//see if the player is trying to skip the cutscene while ascending in the elevator
IF iStageNum >= 3
IF NOT bCutsceneFading
IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime)
bCutsceneFading = TRUE
PRINTLN("bCutsceneFading = TRUE")
ENDIF
ELSE
IF IS_SCREEN_FADED_OUT()
KILL_ANY_CONVERSATION()
//set this value to the appropriate level for enemy speech on mid level of building to be used with the UPDATE_COMBAT_DIALOGUE_ENEMY function
IF iEnemySpeechStage < 4
PRINTLN("SETTING iEnemySpeechStage TO 4 VIA CUTSCENE SKIP")
iEnemySpeechStage = 4
ENDIF
SET_GROUND_ELEVATOR_TO_TOP()
// CLEAR_FIRST_PERSON_CAMERA(camFirstPerson)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handle Enemy response on second level. Wait for player to get to the base of the crane to trigger the crane cutscene.
PROC DO_STAGE_GET_TO_SECOND_ELEVATOR()
PED_INDEX tempPed
INT iNumLeft
// INT iTemp
IF NOT bChangeAccuracy01
IF IS_TIMER_STARTED(changeAccuracyTimer01)
IF GET_TIMER_IN_SECONDS(changeAccuracyTimer01) >= CHANGE_ACCURACY_TIME
ALTER_WAVE_ACCURACY(3, 20)
ALTER_WAVE_ACCURACY(4, 20)
PRINTLN("CHANGE_ACCURACY_TIME IS UP, ALTERING ACCURACY")
bChangeAccuracy01 = TRUE
ENDIF
ELSE
// PRINTLN("TIMER HAS NOT STARTED - changeAccuracyTimer01")
ENDIF
ENDIF
SWITCH iStageNum
CASE 0
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "assassin_construction_get_to_second_elevator")
IF NOT bPanicking
bPanicking = TRUE
PRINTLN("set panic if not already set in DO_STAGE_GET_TO_SECOND_ELEVATOR")
ENDIF
IF NOT DOES_BLIP_EXIST(blipRooftop)
blipRooftop = ADD_BLIP_FOR_COORD(<< -154.7990, -941.62, 269.10 >>)
// SET_BLIP_COLOUR(blipRooftop, BLIP_COLOUR_RED)
SET_BLIP_ROUTE(blipRooftop, FALSE)
SET_BLIP_NAME_FROM_TEXT_FILE(blipRooftop, "ASS_CS_TARGET")
PRINTLN("ADDING BLIP - blipRooftop in STAGE_GET_TO_SECOND_ELEVATOR")
ELSE
SET_BLIP_COORDS(blipRooftop, << -154.7990, -941.62, 269.10 >>)
ENDIF
//set this value to the appropriate level for enemy speech on mid level of building to be used with the UPDATE_COMBAT_DIALOGUE_ENEMY function
IF iEnemySpeechStage < 4
PRINTLN("SETTING iEnemySpeechStage TO 4 VIA DO_STAGE_GET_TO_SECOND_ELEVATOR")
iEnemySpeechStage = 4
ENDIF
TRIGGER_MUSIC_EVENT("ASS5_TOP")
PRINTLN("TRIGGERING MUSIC - ASS5_TOP")
//cleanup any previous enemies from ground level waves
CLEANUP_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
CLEANUP_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
RENDER_SCRIPT_CAMS(FALSE, TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_PLAYER_INVINCIBLE(PLAYER_ID(), FALSE)
// PRINT_NOW("ASS_CS_ELEVAT2", DEFAULT_GOD_TEXT_TIME, 1)
PRINT_NOW("ASS_CS_EHELP1", DEFAULT_GOD_TEXT_TIME, 1)
// bElevatorBlip = CREATE_BLIP_FOR_COORD(vElev2Bottom, TRUE)
SETTIMERA(0)
iStageNum++
BREAK
CASE 1
IF DOES_ENTITY_EXIST(objElev[1])
CREATE_SECOND_ELEVATOR(FALSE)
iStageNum++
ELSE
CREATE_MODEL_HIDE(vElev2Bottom, 5, PROP_CONSLIFT_LIFT, TRUE)
CREATE_SECOND_ELEVATOR(FALSE)
iStageNum++
ENDIF
BREAK
CASE 2
IF GET_ENTITY_DISTANCE_FROM_LOCATION(Player, << -148.6073, -952.5458, 113.1339 >>) <= 5
CREATE_WORKER_WAVE(4)
CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScs_LIFT", CONV_PRIORITY_VERY_HIGH)
iStageNum++
ENDIF
BREAK
CASE 3
IF bElevatorAttack
IF CAN_PLAYER_ACTIVATE_ELEVATOR(vElev2Bottom)
PRINT_ELEVATOR_ACTIVATION_HELP()
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_CONTEXT)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_CS_ELEHELP")
// FOR iTemp = 0 TO NUM_WAVE_4_WORKERS - 1
// IF DOES_ENTITY_EXIST(wave4[iTemp].ped)
// IF IS_ENTITY_IN_ANGLED_AREA(wave4[iTemp].ped, <<-160.578, -939.448, 114.418>>, <<-155.410, -941.329, 114.418>>, 3, FALSE, FALSE)
// iNumDeadPedsInElevator ++
// ENDIF
// ENDIF
// ENDFOR
// REMOVE_BLIP(bElevatorBlip)
ODDJOB_STOP_SOUND(iSoundIdElevator)
// TASK_CLOSEST_LIVING_GUARDS_TO_FLEE_PLAYER()
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_SECOND_ELEVATOR_CUTSCENE
PRINTLN("MainStage = STAGE_SECOND_ELEVATOR_CUTSCENE (Player took elevator)")
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_CS_ELEHELP")
CLEAR_HELP()
ELSE
IF NOT bElevatorMsgPrinted
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// PRINT_NOW("ASS_CS_ELEVAT3", DEFAULT_GOD_TEXT_TIME, 1)
bElevatorMsgPrinted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SEND_ENEMIES_DOWN_IN_ELEVATOR()
ENDIF
BREAK
ENDSWITCH
//task enemies to advance on player if there are only a few enemies left in the wave
IF bAdvanceOnPlayer = FALSE
iNumLeft = GET_NUM_ENEMIES_LEFT_IN_WAVE(wave3, NUM_WAVE_3_WORKERS)
IF iNumLeft = 3
TASK_REMAINING_PEDS_IN_WAVE_TO_ATTACK_PLAYER(wave2, NUM_WAVE_2_WORKERS)
PRINTLN("TASKING THE LAST GUY TO CHARGE THE PLAYER")
bAdvanceOnPlayer = TRUE
ELIF iNumLeft = 5
IF NOT bLeaveDefensiveArea
IF GET_CLOSEST_LIVING_ENEMY(50) <> NULL
tempPed = GET_CLOSEST_LIVING_ENEMY(50)
REMOVE_PED_DEFENSIVE_AREA(tempPed)
SET_PED_COMBAT_MOVEMENT(tempPed, CM_WILLADVANCE)
TASK_CLEAR_DEFENSIVE_AREA(tempPed)
TASK_COMBAT_PED(tempPed, Player)
bLeaveDefensiveArea = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC DELETE_WAVE_4_PEDS_IN_ELEVATOR_IF_DEAD()
INT idx
VECTOR wave4WorkerPos
REPEAT NUM_WAVE_4_WORKERS idx
IF IS_PED_INJURED(wave4[idx].ped)
wave4WorkerPos = GET_ENTITY_COORDS(wave4[idx].ped, FALSE)
IF GET_DISTANCE_BETWEEN_COORDS(wave4WorkerPos, vElev2Bottom) < 3.25
DELETE_PED(wave4[idx].ped)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Play the 2nd elevator cutscene of the player traveling to the rooftop level
PROC DO_STAGE_SECOND_ELEVATOR_CUTSCENE()
VECTOR tempVec
// VECTOR tempDoorPos
FLOAT fElevatorDistPerFrame
SWITCH iStageNum
//take away player control, wait a second before starting the cutscene
CASE 0
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_SHOOTOUT_START")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_SHOOTOUT_START")
ENDIF
START_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_SHOOTOUT_ROOFTOP")
ODDJOB_STOP_SOUND(iSoundIdElevator)
ODDJOB_ENTER_CUTSCENE(SPC_LEAVE_CAMERA_CONTROL_ON)
GET_ASSASSIN_CUTSCENE_START_TIME()
CLEAR_PRINTS()
CLEAR_HELP()
// FREEZE_ENTITY_POSITION(Player, TRUE)
SET_PLAYER_INVINCIBLE(PLAYER_ID(), TRUE)
CLEAR_AREA(vElev2Bottom, 10, TRUE)
CLEAR_HELP()
SETTIMERA(0)
iStageNum++
BREAK
CASE 1
IF HANDLE_PLAYER_PRESSING_ELEVATOR_BUTTON(objElev[1], objElevButton[1], 152.2146)
DELETE_WAVE_4_PEDS_IN_ELEVATOR_IF_DEAD()
// TASK_LOOK_AT_COORD(PLAYER_PED_ID(), << -154.71185, -941.35815, 269.13300 >>, -1)
iStageNum ++
ENDIF
BREAK
//show elevator
CASE 2
IF TIMERA() >= 0
ODDJOB_STOP_SOUND(iSoundIdElevator)
// //elevator cam
// INIT_FIRST_PERSON_CAMERA(camFirstPerson, << -152.0316, -942.8273, 115.6051 >>, vElev2CamRot, 45, 100, 90)
// ATTACH_CAM_TO_ENTITY(camFirstPerson.theCam, objElev[1], vAttachmentOffset)
//cleanup peds on mid-level of the building
CLEANUP_WORKER_WAVE(wave3, NUM_WAVE_3_WORKERS)
CLEANUP_WORKER_WAVE(wave4, NUM_WAVE_4_WORKERS)
CLEANUP_PED_BLIPS(FALSE)
FREEZE_ENTITY_POSITION(Player, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
iStageNum ++
// ELSE
// //close the door behind the player
//// tempDoorPos = GET_ENTITY_COORDS(objElevDoorControl[2])
// IF TIMERA() > 500
// AND TIMERA() <= 1600
// AND tempDoorPos.z > 114.65
//// MOVE_ELEVATOR_DOOR(objElevDoorControl[2], 0.15, TRUE)
// ENDIF
ENDIF
BREAK
//return to game camera after reaching the top of the building
CASE 3
IF DOES_ENTITY_EXIST(objElev[1])
tempVec = GET_ENTITY_COORDS(objElev[1])
IF tempVec.z >= 270.46
IF IS_SCREEN_FADING_OUT()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(1000)
ENDIF
ELSE
DETACH_ENTITY(Player, FALSE, FALSE)
SETTIMERA(0)
ODDJOB_STOP_SOUND(iSoundIdElevator)
iStageNum ++
ENDIF
ELSE
IF tempVec.z >= 235.0
IF NOT DOES_ENTITY_EXIST(viHeli)
CREATE_HELI_PEDS()
ENDIF
IF NOT bRooftopWaveCreated
CREATE_WORKER_WAVE(5)
ENDIF
ENDIF
// //gradually slow down the elevator as it approaches its destination
fElevatorDistPerFrame = GET_ELEVATOR_TARGET_MOVE_SPEED_STOP(tempVec.z, 260.0, 270.46, 266.0, 0.10, 0.25)
MOVE_ELEVATOR(objElev[1], NULL, NULL, fElevatorDistPerFrame)
RELOAD_PLAYERS_WEAPON()
// UPDATE_FIRST_PERSON_CAMERA(camFirstPerson)
ENDIF
ENDIF
BREAK
//
CASE 4
ODDJOB_STOP_SOUND(iSoundIdElevator)
SETTIMERA(0)
iStageNum ++
BREAK
CASE 5
ODDJOB_EXIT_CUTSCENE()
CUTSCENE_SKIP_FADE_IN()
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_ROOFTOP_BATTLE
PRINTLN("MainStage = STAGE_ROOFTOP_BATTLE - Rooftop Cutscene finished")
BREAK
ENDSWITCH
//handle cutscene camera skip
IF iStageNum >= 3
IF NOT bCutsceneFading
IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime)
bCutsceneFading = TRUE
PRINTLN("bCutsceneFading = TRUE")
ENDIF
ELSE
IF IS_SCREEN_FADED_OUT()
IF NOT bRooftopWaveCreated
CREATE_WORKER_WAVE(5)
ENDIF
IF NOT bHeliPedsCreated
CREATE_HELI_PEDS()
ENDIF
IF bRooftopWaveCreated AND bHeliPedsCreated
KILL_ANY_CONVERSATION()
SET_SECOND_ELEVATOR_TO_TOP()
SET_ENTITY_HEADING(Player, 243.9563)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
ODDJOB_EXIT_CUTSCENE()
CUTSCENE_SKIP_FADE_IN()
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_ROOFTOP_BATTLE
PRINTLN("MainStage = STAGE_ROOFTOP_BATTLE - Rooftop Cutscene skipped")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handle enemy's behavior on crane
PROC DO_STAGE_ROOFTOP_BATTLE()
INT iPlacementFlags
PICKUP_INDEX weapPickup
SWITCH iStageNum
CASE 0
IF bTriggerRooftop
bNeedToCheckOnRoof = TRUE
PRINTLN("bNeedToCheckOnRoof = TRUE")
ELSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "assassin_construction_rooftop_battle")
PRINTLN("SETTING MISSION STAGE TO 3")
ENDIF
TRIGGER_MUSIC_EVENT("ASS5_ROOF")
PRINTLN("TRIGGERING MUSIC - ASS5_ROOF")
START_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_HELICOPTER_SCENE")
IF DOES_BLIP_EXIST(blipRooftop)
REMOVE_BLIP(blipRooftop)
PRINTLN("REMOVING BLIP - blipRooftop")
ENDIF
END_SRL()
// IF STREAMVOL_IS_VALID(svPanicCutscene)
// STREAMVOL_DELETE(svPanicCutscene)
// PRINTLN("REMOVING - svPanicCutscene - 04")
// ENDIF
SET_PLAYER_INVINCIBLE(PLAYER_ID(), FALSE)
//create rooftop enemies and start the helicopter vehicle playback
CREATE_WORKER_WAVE(5)
CREATE_HELI_PEDS()
IF NOT IS_ENTITY_DEAD(piTarget) AND NOT IS_ENTITY_DEAD(viHeli)
AND NOT IS_PED_IN_VEHICLE(piTarget, viHeli)
TASK_ENTER_VEHICLE(piTarget, viHeli, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
ENDIF
IF bHeliModelLoaded
// //play vehicle recording on heli
// IF IS_VEHICLE_DRIVEABLE(viHeli)
// IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viHeli)
// START_PLAYBACK_RECORDED_VEHICLE(viHeli, 102, "OJAScs")
// SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(viHeli, 3000)
// SET_PLAYBACK_SPEED(viHeli, 1)
// ELSE
// SET_PLAYBACK_SPEED(viHeli, 1)
// ENDIF
// ENDIF
// //create closed elevator doors for other elevator located at the top level
// IF DOES_ENTITY_EXIST(objElevDoorClosed[0])
// SET_ENTITY_COORDS(objElevDoorClosed[0], << -162.010, -943.190, 269.520 >>)
// SET_ENTITY_ROTATION(objElevDoorClosed[0], << 0, 0, 339 >>)
// ENDIF
// IF DOES_ENTITY_EXIST(objElevDoorClosed[1])
// SET_ENTITY_COORDS(objElevDoorClosed[1], << -156.850, -945.060, 269.520 >>)
// SET_ENTITY_ROTATION(objElevDoorClosed[1], << 0, 0, 339 >>)
// ENDIF
// IF DOES_ENTITY_EXIST(objElevDoorClosed[2])
// DELETE_OBJECT(objElevDoorClosed[2])
// ENDIF
// IF DOES_ENTITY_EXIST(objElevDoorClosed[3])
// DELETE_OBJECT(objElevDoorClosed[3])
// ENDIF
//create weapon pickup on opposite side of rooftop
IF NOT DOES_PICKUP_EXIST(weapPickup)
iPlacementFlags = 0
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
// weapPickup = CREATE_PICKUP(PICKUP_WEAPON_DLC_ASSAULTMG, << -148.4082, -976.2664, 268.2574 >>, iPlacementFlags, 150)
ENDIF
PRINTLN("ROOFTOP BATTLE: GOING TO CASE 1")
iStageNum++
ENDIF
BREAK
CASE 1
IF IS_SCREEN_FADED_IN()
IF NOT IS_ENTITY_DEAD(wave6[1].ped)
TASK_COMBAT_PED(wave6[1].ped, Player)
PRINTLN("TASKING WAVE 6, GUY 1 TO COMBAT")
ENDIF
IF NOT IS_ENTITY_DEAD(wave6[2].ped)
TASK_COMBAT_PED(wave6[2].ped, Player)
PRINTLN("TASKING WAVE 6, GUY 2 TO COMBAT")
ENDIF
//attack! attack!
WAVE_5_WORKER_ASSAULT()
SETTIMERA(0)
iStageNum++
ENDIF
BREAK
CASE 2
IF TIMERA() > 4000
bOkayToAttack = TRUE
PRINT_NOW("ASS_CS_KILL", DEFAULT_GOD_TEXT_TIME, 1)
iStageNum++
ENDIF
BREAK
CASE 3
//empty state - waiting for player to kill the target
BREAK
ENDSWITCH
CONTROL_ROOFTOP_ACCURACY()
IF bNeedToCheckOnRoof
CHECK_FOR_PLAYER_ON_ROOF()
ENDIF
//handles all helictoper combat behavior
CONTROL_HELICOPTER_BEHAVIOR()
//controls behavior of enemy positioned on the crane
CONTROL_CRANE_ENEMY_BEHAVIOR()
ENDPROC
/// PURPOSE: Play cutscene camera of the target when killed on the street level
PROC DO_STAGE_KILL_CAM()
// INT tempInt
SWITCH iStageNum
CASE 0
bUpdateGuysInCar = FALSE
TRIGGER_MUSIC_EVENT("ASS5_KILL")
PRINTLN("TRIGGERING MUSIC - ASS5_KILL")
IF DOES_ENTITY_EXIST(viHeli)
IF NOT IS_ENTITY_DEAD(viHeli) AND NOT IS_ENTITY_DEAD(GET_PED_IN_VEHICLE_SEAT(viHeli))
TASK_HELI_MISSION(GET_PED_IN_VEHICLE_SEAT(viHeli), viHeli, NULL, Player, <<0,0,180>>, MISSION_FLEE, 20, 30, -1, 325, 40)
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(viHeli)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED - viHeli - 02")
ENDIF
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(3.0)
SETTIMERA(0)
iStageNum++
BREAK
CASE 1
IF TIMERA() >= 3000
CLEANUP_DEST_BLIPS()
// IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
// SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE, -1)
// ENDIF
// IF bTriggerRooftop
// killType = KT_BONUS
// INITIALIZE_NEXT_STAGE()
// MainStage = STAGE_CLEANUP
// PRINTLN("bTriggerRooftop: MainStage = STAGE_CLEANUP")
// ELSE
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_FLEE_POLICE
PRINTLN("MainStage = STAGE_FLEE_POLICE")
// ENDIF
ELSE
HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, siteConv, "OJASAUD", "OJAS_COCOM", CONV_PRIORITY_VERY_HIGH)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Play the 2nd elevator cutscene of the player traveling to the rooftop level
PROC UPDATE_FINAL_ELEVATOR_CUTSCENE()
VECTOR tempVec
SWITCH iFinalElevatorCutsceneStage
//take away player control, wait a second before starting the cutscene
CASE 0
ODDJOB_STOP_SOUND(iSoundIdElevator)
ODDJOB_ENTER_CUTSCENE(SPC_LEAVE_CAMERA_CONTROL_ON)
GET_ASSASSIN_CUTSCENE_START_TIME()
REMOVE_WORKER_WAVE(wave1, NUM_WAVE_1_WORKERS)
REMOVE_WORKER_WAVE(wave2, NUM_WAVE_2_WORKERS)
REMOVE_WORKER_WAVE(wave3, NUM_WAVE_3_WORKERS)
REMOVE_WORKER_WAVE(wave4, NUM_WAVE_4_WORKERS)
REMOVE_WORKER_WAVE(wave5, NUM_WAVE_5_WORKERS)
REMOVE_WORKER_WAVE(wave6, NUM_WAVE_6_WORKERS)
// REMOVE_DEAD_ELEVATOR_GUYS()
CLEANUP_WARNING_GUYS()
CLEAR_PRINTS()
CLEAR_HELP()
// FREEZE_ENTITY_POSITION(Player, TRUE)
SET_PLAYER_INVINCIBLE(PLAYER_ID(), TRUE)
CLEAR_AREA(vElev2Top, 10, TRUE)
CLEAR_HELP()
SETTIMERA(0)
iFinalElevatorCutsceneStage ++
BREAK
CASE 1
IF HANDLE_PLAYER_PRESSING_ELEVATOR_BUTTON(objElev[1], objElevButton[1], 152.2146)
// TASK_LOOK_AT_COORD(PLAYER_PED_ID(), << -161.82307, -939.10950, 29.28928 >>, -1)
iFinalElevatorCutsceneStage ++
ENDIF
BREAK
//show elevator
CASE 2
IF TIMERA() >= 0
ODDJOB_STOP_SOUND(iSoundIdElevator)
// //elevator cam
// INIT_FIRST_PERSON_CAMERA(camFirstPerson, << -152.0316, -942.8273, 115.6051 >>, <<vElev2CamRot.x, vElev2CamRot.y, vElev2CamRot.z >>, 45, 90, 90)
// ATTACH_CAM_TO_ENTITY(camFirstPerson.theCam, objElev[1], vAttachmentOffset)
FREEZE_ENTITY_POSITION(Player, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
iFinalElevatorCutsceneStage ++
ENDIF
BREAK
//return to game camera after reaching the bottom of the building
CASE 3
IF DOES_ENTITY_EXIST(objElev[1])
tempVec = GET_ENTITY_COORDS(objElev[1])
IF tempVec.z <= 32
IF IS_SCREEN_FADING_OUT()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(1000)
ENDIF
ELSE
SET_SECOND_ELEVATOR_TO_BOTTOM(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
// SET_ENTITY_HEADING(Player, 74.1208)
ODDJOB_STOP_SOUND(iSoundIdElevator)
iFinalElevatorCutsceneStage ++
ENDIF
ELSE
MOVE_ELEVATOR(objElev[1], NULL, NULL, 0.25, TRUE, FALSE)
// RELOAD_PLAYERS_WEAPON()
// UPDATE_FIRST_PERSON_CAMERA(camFirstPerson)
ENDIF
ENDIF
BREAK
//
CASE 4
ODDJOB_STOP_SOUND(iSoundIdElevator)
SETTIMERA(0)
// CLEAR_FIRST_PERSON_CAMERA(camFirstPerson)
// SET_GAMEPLAY_CAM_RELATIVE_HEADING()
// SET_GAMEPLAY_CAM_RELATIVE_PITCH()
ODDJOB_EXIT_CUTSCENE()
bPlayerReachedBottom = TRUE
EXIT
BREAK
ENDSWITCH
//handle cutscene camera skip
IF iFinalElevatorCutsceneStage >= 3
IF NOT bCutsceneFading
IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime)
bCutsceneFading = TRUE
PRINTLN("bCutsceneFading = TRUE")
ENDIF
ELSE
IF IS_SCREEN_FADED_OUT()
KILL_ANY_CONVERSATION()
SET_SECOND_ELEVATOR_TO_BOTTOM()
SET_ENTITY_HEADING(Player, 74.1208)
// CLEAR_FIRST_PERSON_CAMERA(camFirstPerson)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
ODDJOB_EXIT_CUTSCENE()
CUTSCENE_SKIP_FADE_IN()
bPlayerReachedBottom = TRUE
EXIT
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL HAS_ENDING_CELL_PHONE_CALL_COMPLETED()
IF NOT bPlayedCellPhoneCall
ADD_PED_FOR_DIALOGUE(siteConv, 3, NULL, "LESTER")
IF PLAYER_CALL_CHAR_CELLPHONE(siteConv, CHAR_LESTER, "OJASAUD", "OJAS_CONST_C", CONV_MISSION_CALL)
PRINTLN("BUS - CELL PHONE CALL")
bPlayedCellPhoneCall = TRUE
ENDIF
ENDIF
IF bPlayedCellPhoneCall AND HAS_CELLPHONE_CALL_FINISHED()
PRINTLN("RETURNING TRUE - HAS_ENDING_CELL_PHONE_CALL_COMPLETED")
RETURN TRUE
ELSE
PRINTLN("WAITING FOR CELL PHONE CALL TO FINISH")
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Monitor players wanted level and advance to next stage when it becomes cleared.
PROC DO_STAGE_FLEE_POLICE()
HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, siteConv, "OJASAUD", "OJAS_COCOM", CONV_PRIORITY_VERY_HIGH)
//handles printing of messages to leave the rooftop
IF NOT bPrintLastObjective
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("ASS_CS_PARA")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_PLAYER_IN_CONSTRUCTION_AREA()
PRINT_NOW("ASS_CS_PARA", DEFAULT_GOD_TEXT_TIME, 1)
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_SHOOTOUT_ROOFTOP")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_SHOOTOUT_ROOFTOP")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_HELICOPTER_SCENE")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_HELICOPTER_SCENE")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_LEAVE_THE_AREA")
START_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_LEAVE_THE_AREA")
ENDIF
ENDIF
RESTART_TIMER_NOW(tPanicFailSafeTimer) //timer to use in the next segment
bPrintLastObjective = TRUE
ENDIF
ENDIF
ELSE
IF NOT bPrintedReminderMessage
AND iStageNum = 0
IF GET_TIMER_IN_SECONDS(tPanicFailSafeTimer) > DEFAULT_GOD_TEXT_TIME / 1000
AND NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
PRINT_HELP("ASS_CS_REMIND")
bPrintedReminderMessage = TRUE
ENDIF
ENDIF
ENDIF
HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, siteConv, "OJASAUD", "OJAS_COCOM", CONV_PRIORITY_VERY_HIGH)
SWITCH iStageNum
CASE 0
IF GET_PED_PARACHUTE_STATE(Player) != PPS_INVALID
IF NOT bFranklinJumpLinePlayed
AND NOT IS_SCRIPTED_CONVERSATION_ONGOING()
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAS_JUMP", CONV_PRIORITY_VERY_HIGH)
bFranklinJumpLinePlayed = TRUE
ENDIF
ENDIF
IF GET_PED_PARACHUTE_STATE(Player) = PPS_DEPLOYING
OR GET_PED_PARACHUTE_STATE(Player) = PPS_PARACHUTING
CLEAR_HELP(TRUE)
// PRINT_NOW("ASS_CS_LAND", DEFAULT_GOD_TEXT_TIME, 1)
TRIGGER_MUSIC_EVENT("ASS5_STOP")
PRINTLN("TRIGGERING MUSIC - ASS5_STOP")
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_SHOOTOUT_ROOFTOP")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_SHOOTOUT_ROOFTOP")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_HELICOPTER_SCENE")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_HELICOPTER_SCENE")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_LEAVE_THE_AREA")
START_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_LEAVE_THE_AREA")
ENDIF
PRINTLN("USING PARACHUTE")
iStageNum++
ELSE
IF GET_PED_PARACHUTE_STATE(Player) = PPS_SKYDIVING
IF DOES_BLIP_EXIST(blipRooftop)
REMOVE_BLIP(blipRooftop)
PRINTLN("REMOVING BLIP - blipRooftop VIA DO_STAGE_FLEE_POLICE")
ENDIF
PRINT_HELP("ASS_CS_PARA2")
ENDIF
ENDIF
ELSE
//support for final elevator cutscene riding down
IF CAN_PLAYER_ACTIVATE_ELEVATOR(<< -158.3, -940.8, 269.2 >>)
PRINT_ELEVATOR_ACTIVATION_HELP()
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_CONTEXT)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_CS_ELEHELP")
ODDJOB_STOP_SOUND(iSoundIdElevator)
TRIGGER_MUSIC_EVENT("ASS5_STOP")
PRINTLN("TRIGGERING MUSIC - ASS5_STOP")
PRINTLN("USING ELEVATOR")
REMOVE_ALL_SHOCKING_EVENTS(FALSE)
iStageNum++
bRidingFinalElevator = TRUE
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_CS_ELEHELP")
CLEAR_HELP()
ENDIF
ENDIF
IF NOT IS_PLAYER_IN_CONSTRUCTION_AREA()
AND NOT IS_PED_RAGDOLL(Player)
iStageNum = 3 //to fix bug
ENDIF
ENDIF
BREAK
CASE 1
IF NOT bRidingFinalElevator
IF GET_PED_PARACHUTE_STATE(Player) = PPS_LANDING
SETTIMERA(0)
REMOVE_ALL_SHOCKING_EVENTS(FALSE)
iStageNum++
ELSE
IF NOT HAS_PED_GOT_WEAPON(Player, GADGETTYPE_PARACHUTE)
IF NOT IS_PED_INJURED(Player)
SETTIMERA(0)
REMOVE_ALL_SHOCKING_EVENTS(FALSE)
iStageNum++
ENDIF
ENDIF
ENDIF
ELSE
IF bPlayerReachedBottom
IF DOES_ENTITY_EXIST(viPlayerCar)
IF IS_VEHICLE_DRIVEABLE(viPlayerCar)
SET_VEHICLE_ON_GROUND_PROPERLY(viPlayerCar)
PRINTLN("Players last vehicle being set properly on the ground")
ELSE
PRINTLN("Players last vehicle not driveable")
ENDIF
ELSE
PRINTLN("Players last vehicle does not exist")
ENDIF
iStageNum++
ELSE
UPDATE_FINAL_ELEVATOR_CUTSCENE()
ENDIF
ENDIF
BREAK
CASE 2
//check to make sure that the player survived the parachute jump
IF GET_PED_PARACHUTE_STATE(Player) = PPS_INVALID
AND NOT IS_ENTITY_IN_AIR(Player)
IF NOT IS_PED_INJURED(Player)
IF IS_PLAYER_IN_CONSTRUCTION_AREA()
PRINT_NOW("ASS_CS_PARA", DEFAULT_GOD_TEXT_TIME, 1)
iStageNum++
ELSE
iStageNum++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_PLAYER_IN_CONSTRUCTION_AREA()
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_CONSTRUCT_LEAVE_THE_AREA")
STOP_AUDIO_SCENE("ASSASSINATION_CONSTRUCT_LEAVE_THE_AREA")
ENDIF
PRINTLN("Assassination Passed")
IF HAS_ENDING_CELL_PHONE_CALL_COMPLETED()
INITIALIZE_NEXT_STAGE()
MainStage = STAGE_CLEANUP
PRINTLN("MainStage = STAGE_CLEANUP")
ENDIF
ENDIF
BREAK
ENDSWITCH
HANDLE_DEBLIP_ROOFTOP_ENEMIES()
ENDPROC
PROC MANAGE_PETROL()
//make sure this thing starts leakig petrol if there is a fire near the oil pool position
IF iPetrolStage > 0
IF GET_NUMBER_OF_FIRES_IN_RANGE(vTrailEnd, 5) > 0
IF IS_VEHICLE_DRIVEABLE(viTruck)
IF GET_VEHICLE_PETROL_TANK_HEALTH(viTruck) > 499
SET_VEHICLE_PETROL_TANK_HEALTH(viTruck,499)
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iPetrolStage
CASE 0
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vTrailEnd, FALSE) < 100
IF IS_VEHICLE_DRIVEABLE(viTruck)
SET_ENTITY_PROOFS(viTruck, FALSE, FALSE, FALSE, FALSE, FALSE)
// SET_VEHICLE_PETROL_TANK_HEALTH(viTruck,499)
SET_VEHICLE_CAN_LEAK_PETROL(viTruck,TRUE)
SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(viTruck,FALSE)
ENDIF
ADD_PETROL_DECAL(vTrailEnd, 1.5,2,1)
iPetrolStage ++
ENDIF
BREAK
CASE 1
ADD_PETROL_DECAL(vTrailEnd + <<0.25,0.35,0>>,1.5,2,1)
iPetrolStage ++
BREAK
CASE 2
ADD_PETROL_DECAL(vTrailEnd + <<0.50,0.7,0>> ,1.5,2,1)
iPetrolStage ++
BREAK
CASE 3
ADD_PETROL_DECAL(vTrailEnd + <<0.75,1.05,0>> ,1.5,2,1)
iPetrolStage ++
BREAK
CASE 4
ADD_PETROL_DECAL(vTrailEnd + <<1.0,1.4,0>>,1.5,2,1)
iPetrolStage ++
BREAK
CASE 5
ADD_PETROL_DECAL(vTrailEnd + <<1.25,1.75,0>>,1.5,2,1)
iPetrolStage ++
BREAK
CASE 6
ADD_PETROL_DECAL(vTrailEnd + <<1.5,2.15,0>>,1.5,2,1)
iPetrolStage ++
BREAK
CASE 7
ADD_PETROL_DECAL(vTrailEnd + <<1.8,2.4,0>>,1.5,2,1)
iPetrolStage ++
BREAK
CASE 8
START_PETROL_TRAIL_DECALS(1)
ADD_PETROL_TRAIL_DECAL_INFO(vTrailEnd ,1)
iPetrolStage ++
BREAK
CASE 9
ADD_PETROL_TRAIL_DECAL_INFO(vTrailEnd + <<0.50,0.7,0>> ,1)
iPetrolStage ++
BREAK
CASE 10
ADD_PETROL_TRAIL_DECAL_INFO(vTrailEnd + <<1.0,1.4,0>> ,1)
iPetrolStage ++
BREAK
CASE 11
ADD_PETROL_TRAIL_DECAL_INFO(vTrailEnd + <<1.5,2.15,0>> ,1)
iPetrolStage ++
BREAK
CASE 12
END_PETROL_TRAIL_DECALS()
PRINTSTRING("Petrol Trail Created")PRINTNL()
iPetrolStage ++
BREAK
CASE 13
//empty state
BREAK
ENDSWITCH
ENDPROC
//DEBUG ONLY
#IF IS_DEBUG_BUILD
PROC SHOW_ENEMY_POSITIONS()
TEXT_LABEL_3 tempstring
VECTOR pedPos
INT idx
REPEAT NUM_WAVE_1_WORKERS idx
IF DOES_ENTITY_EXIST(wave1[idx].ped)
IF NOT IS_PED_INJURED(wave1[idx].ped)
tempstring = idx
DRAW_DEBUG_SPHERE(wave1[idx].loc, 0.25)
DRAW_DEBUG_TEXT(tempstring, wave1[idx].loc )
pedPos = GET_ENTITY_COORDS(wave1[idx].ped)
DRAW_DEBUG_TEXT(tempstring, pedPos )
ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_WAVE_2_WORKERS idx
IF DOES_ENTITY_EXIST(wave2[idx].ped)
IF NOT IS_PED_INJURED(wave2[idx].ped)
tempstring = idx
DRAW_DEBUG_SPHERE(wave2[idx].loc, 0.25)
DRAW_DEBUG_TEXT(tempstring, wave2[idx].loc )
pedPos = GET_ENTITY_COORDS(wave2[idx].ped)
DRAW_DEBUG_TEXT(tempstring, pedPos )
ENDIF
ENDIF
ENDREPEAT
ENDPROC
#ENDIF
/// 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()
IF bMissionFailed = FALSE // (should only do this failed stuff once)
TRIGGER_MUSIC_EVENT("ASS5_FAIL")
PRINTLN("TRIGGERING MUSIC - ASS5_FAIL")
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-99.4653, -940.7606, 28.2290>>, 82.5402)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-99.4940, -937.6118, 28.1219>>, 250.2531)
STRING strFailReason
IF NOT bAbandoned
strFailReason = "ASS_CS_ESCAPED"
ELSE
strFailReason = "ASS_CS_ESCAPED" // To Fix Bug # 1209444
ENDIF
bMissionFailed = TRUE
ASSASSIN_MISSION_MarkMissionFailed(strFailReason)
MISSION_FLOW_MISSION_FAILED()
ENDIF
ENDPROC
FUNC BOOL HAS_PLAYER_TOUCHED_RIGHT_STICK()
fRightX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
fRightY = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)
// PRINTLN("fRightX = ", fRightX)
// PRINTLN("fRightY = ", fRightY)
IF fRightX > 0
OR fRightY > 0
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ADJUST_CAMERA(CAMERA_INDEX & camToChange, FLOAT fTimeToSwitch, VECTOR vPosition, VECTOR vRotation, FLOAT fCamFOV, BOOL bUseShake = FALSE, FLOAT fShakeValue = 0.5)
IF DOES_CAM_EXIST(camToChange)
IF IS_TIMER_STARTED(tPayphoneCameraTimer)
IF GET_TIMER_IN_SECONDS(tPayphoneCameraTimer) >= fTimeToSwitch
SET_CAM_COORD(camPayPhoneIntro01, vPosition)
SET_CAM_ROT(camPayPhoneIntro01, vRotation)
SET_CAM_FOV(camPayPhoneIntro01, fCamFOV)
IF bUseShake
SHAKE_CAM(camPayPhoneIntro01, "HAND_SHAKE", fShakeValue)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC HANDLE_INTRO_CAMERAS()
SWITCH iIntroCameraStages
CASE 0
IF ADJUST_CAMERA(camPayPhoneIntro01, 4.0, <<799.7321, -1083.4171, 30.3753>>, <<-1.3455, 0.0000, -42.1124>>, 42.5517, TRUE, 0.3)
PRINTLN("iIntroCameraStages = 1")
iIntroCameraStages = 1
ENDIF
BREAK
CASE 1
IF ADJUST_CAMERA(camPayPhoneIntro01, 11.0, <<814.8909, -1078.2717, 29.0784>>, <<-0.0000, -0.0387, 70.1654>>, 30.1956, TRUE, 0.3)
PRINTLN("iIntroCameraStages = 2")
iIntroCameraStages = 2
ENDIF
BREAK
CASE 2
IF ADJUST_CAMERA(camPayPhoneIntro01, 20.0, <<808.0440, -1074.6467, 29.2119>>, <<-4.8627, 0.0000, -129.3806>>, 36.3462, TRUE, 0.3)
PRINTLN("iIntroCameraStages = 3")
iIntroCameraStages = 3
ENDIF
BREAK
CASE 3
IF ADJUST_CAMERA(camPayPhoneIntro01, 25.0, <<814.8909, -1078.2717, 29.0784>>, <<-0.0000, -0.0387, 70.1654>>, 30.1956, TRUE, 0.2)
PRINTLN("iIntroCameraStages = 4")
iIntroCameraStages = 4
ENDIF
BREAK
CASE 4
IF ADJUST_CAMERA(camPayPhoneIntro01, 30.0, <<808.0440, -1074.6467, 29.2119>>, <<-4.8627, 0.0000, -129.3806>>, 36.3462, TRUE, 0.2)
PRINTLN("iIntroCameraStages = 5")
iIntroCameraStages = 5
ENDIF
BREAK
CASE 5
IF ADJUST_CAMERA(camPayPhoneIntro01, 37.0, <<812.5805, -1076.6483, 28.9375>>, <<2.1171, 0.0247, 79.0055>>, 29.2734, TRUE, 0.2)
PRINTLN("iIntroCameraStages = 6")
iIntroCameraStages = 6
ENDIF
BREAK
CASE 6
BREAK
ENDSWITCH
ENDPROC
PROC DO_STAGE_INTRO_CUTSCENE()
// PRINTLN("TIME: ", TIMERB())
// IF STREAMVOL_HAS_LOADED(svPhoneCutscene)
// PRINTLN("WE'RE LOADED")
// ENDIF
SWITCH payPhoneCutsceneStages
CASE PAYPHONE_CUTSCENE_INIT
REQUEST_ANIM_DICT("oddjobs@assassinate@construction@call")
PRINTLN("REQUESTING ANIM DICTIONARY - oddjobs@assassinate@construction@call")
REQUEST_MODEL(P_PHONEBOX_01B_S)
PRINTLN("REQUESTING MODEL - P_PHONEBOX_01B_S")
IF HAS_ANIM_DICT_LOADED("oddjobs@assassinate@construction@call") AND HAS_MODEL_LOADED(P_PHONEBOX_01B_S)
bContinueWithScene = TRUE
ENDIF
IF bContinueWithScene
IF DOES_ENTITY_EXIST(oPayPhone)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<805.021729,-1076.810791,26.622034>>, <<813.882324,-1076.814209,32.505760>>, 5.000000, <<814.4346, -1081.6877, 27.3991>>, 90.2655)
PRINTLN("REPOSITIONING VEHICLE")
CLEAR_AREA(<<809.308472,-1074.928101,27.6018>>, 3.0, TRUE)
IF NOT IS_TIMER_STARTED(tPayphoneCameraTimer)
START_TIMER_NOW(tPayphoneCameraTimer)
PRINTLN("STARTING TIMER - tPayphoneCameraTimer")
ENDIF
IF DOES_ENTITY_EXIST(oPayPhone)
SET_ENTITY_VISIBLE(oPayPhone, FALSE)
SET_ENTITY_COLLISION(oPayPhone, FALSE)
SET_ENTITY_CAN_BE_DAMAGED(oPayPhone, FALSE)
PRINTLN("TURNING OFF VISIBILITY AND COLLISION")
// oPayPhoneAnimated = CREATE_OBJECT(P_PHONEBOX_01B_S, <<809.308472,-1074.928101,27.679195>>) // Having to lower prop for some reason?! ... to fix Bug # 1352784
oPayPhoneAnimated = CREATE_OBJECT(P_PHONEBOX_01B_S, <<809.308472,-1074.928101,27.6018>>)
SET_ENTITY_ROTATION(oPayPhoneAnimated, <<0.000000,0.000000,0.091681>>)
SET_ENTITY_COLLISION(oPayPhoneAnimated, FALSE)
SET_ENTITY_CAN_BE_DAMAGED(oPayPhoneAnimated, FALSE)
PRINTLN("CREATING SKINNED VERSION OF PROP")
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
PRINTLN("TURNING BACK ON PLAYER VISIBILITY")
ENDIF
svPhoneCutscene = STREAMVOL_CREATE_SPHERE(<<809.308472,-1074.928101,27.6018>>, 350, FLAG_MAPDATA)
PRINTLN("CREATING STREAM VOLUME - svPhoneCutscene")
// Start the cutscene.
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerWarpPosition)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fPlayerWarpHeading)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
PRINTLN("MOVING FRANKLIN TO PHONE")
ENDIF
iSceneId = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation)
IF DOES_ENTITY_EXIST(oPayPhoneAnimated)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSceneId, oPayPhoneAnimated, -1)
PRINTLN("oPayPhoneAnimated EXISTS, ATTACHING SCENE TO IT")
ELSE
PRINTLN("NOTHING EXISTS")
ENDIF
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSceneId, "oddjobs@assassinate@construction@call", "ass_construction_call_p1", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT)
PRINTLN("TASKING FRANKLIN TO TALK ON THE PHONE")
PLAY_SYNCHRONIZED_ENTITY_ANIM(oPayPhoneAnimated, iSceneId, "ass_construction_call_phone", "oddjobs@assassinate@construction@call", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT)
PRINTLN("PLAYING ANIMATION ON PAYPHONE PROP")
REMOVE_PARTICLE_FX_IN_RANGE(vPlayerWarpPosition, 5.0)
IF NOT DOES_CAM_EXIST(camPayPhoneIntro01)
camPayPhoneIntro01 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCameraPosition01, vCameraRotation01, 34.0542, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
PRINTLN("CREATING CAMERA - camPayPhoneIntro01")
SHAKE_CAM(camPayPhoneIntro01, "HAND_SHAKE", 0.2)
ENDIF
// PLAY_SYNCHRONIZED_CAM_ANIM(camPayPhoneIntro01, iSceneId, "ass_construction_call_cam", "oddjobs@assassinate@construction@call")
// PRINTLN("PLAYING ANIMATION ON CAMERA")
ADD_PED_FOR_DIALOGUE(siteConv, 3, NULL, "LESTER")
ADD_PED_FOR_DIALOGUE(siteConv, 1, PLAYER_PED_ID(), "FRANKLIN")
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
// DISABLE_NAVMESH_IN_AREA(<< vPhoneLocation.x-20, vPhoneLocation.y-20, vPhoneLocation.z-20 >>, << vPhoneLocation.x+20, vPhoneLocation.y+20, vPhoneLocation.z+20 >>, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_REMOVE_EXPLOSIONS | SPC_REMOVE_FIRES | SPC_REMOVE_PROJECTILES) // | SPC_LEAVE_CAMERA_CONTROL_ON)
PRINTLN("REMOVING PLAYER CONTROL")
DISABLE_CHEAT(CHEAT_TYPE_ALL, TRUE)
payPhoneCutsceneStages = PAYPHONE_CUTSCENE_UPDATE
PRINTLN("CONSTRUCTION: GOING TO STATE - PAYPHONE_CUTSCENE_UPDATE")
ELSE
REQUEST_ANIM_DICT("oddjobs@assassinate@construction@call")
PRINTLN("REQUESTING ANIM DICTIONARY - oddjobs@assassinate@construction@call")
REQUEST_MODEL(P_PHONEBOX_01B_S)
PRINTLN("REQUESTING MODEL - P_PHONEBOX_01B_S")
IF NOT DOES_ENTITY_EXIST(oPayPhone)
oPayPhone = GET_CLOSEST_OBJECT_OF_TYPE(vPhoneLocation, 5.0, prop_phonebox_01b)
PRINTLN("CONSTRUCTION: PAYPHONE WAS NOT FOUND IN TRIGGER SCENE, FIND IN SCRIPT")
ENDIF
ENDIF
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE PAYPHONE_CUTSCENE_UPDATE
HANDLE_INTRO_CAMERAS()
IF IS_TIMER_STARTED(tPayphoneCutsceneTimer)
IF GET_TIMER_IN_SECONDS(tPayphoneCutsceneTimer) > 1.0
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED()
bSkipCutscene = TRUE
IF NOT IS_SCREEN_FADED_OUT()
FADE_DOWN()
ENDIF
payPhoneCutsceneStages = PAYPHONE_CUTSCENE_SKIP
PRINTLN("CONSTRUCTION: GOING TO STATE - PAYPHONE_CUTSCENE_SKIP")
BREAK
ENDIF
ENDIF
ENDIF
IF NOT bPlayedPayPhoneConvo
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.05
IF CREATE_CONVERSATION(siteConv, "OJASAUD", "OJAScnt_cs", CONV_PRIORITY_VERY_HIGH)
IF NOT IS_TIMER_STARTED(tPayphoneCutsceneTimer)
START_TIMER_NOW(tPayphoneCutsceneTimer)
PRINTLN("CONSTRUCTION: STARTING TIMER - tPayphoneCutsceneTimer")
bPlayedPayPhoneConvo = TRUE
IF IS_REPEAT_PLAY_ACTIVE()
FADE_IN()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_TIMER_STARTED(tPayphoneCutsceneTimer)
IF GET_TIMER_IN_SECONDS(tPayphoneCutsceneTimer) > fCutsceneLength
OR (IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) AND GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) >= 0.961)
OR bSkipCutscene
payPhoneCutsceneStages = PAYPHONE_CUTSCENE_CLEANUP
PRINTLN("CONSTRUCTION: GOING TO STATE - PAYPHONE_CUTSCENE_CLEANUP")
ENDIF
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE PAYPHONE_CUTSCENE_SKIP
STOP_SCRIPTED_CONVERSATION(FALSE)
IF bSkipCutscene
IF IS_SCREEN_FADED_OUT()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerWarpPosition)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fPlayerWarpHeading)
PRINTLN("MOVING FRANKLIN - SKIP CUTSCENE")
ENDIF
STOP_SYNCHRONIZED_ENTITY_ANIM (oPayPhoneAnimated, INSTANT_BLEND_OUT, TRUE)
WAIT(0)
DO_SCREEN_FADE_IN(500)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
payPhoneCutsceneStages = PAYPHONE_CUTSCENE_CLEANUP
PRINTLN("CONSTRUCTION: GOING TO STATE - PAYPHONE_CUTSCENE_CLEANUP")
ENDIF
ENDIF
BREAK
//----------------------------------------------------------------------------------------------------------------------
CASE PAYPHONE_CUTSCENE_CLEANUP
IF NOT bSkipCutscene
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
DESTROY_ALL_CAMS()
ENDIF
IF STREAMVOL_IS_VALID(svPhoneCutscene)
STREAMVOL_DELETE(svPhoneCutscene)
PRINTLN("DELETING STREAM VOLUME - svPhoneCutscene VIA PAYPHONE_CUTSCENE_CLEANUP")
ENDIF
SET_ENTITY_COLLISION(oPayPhoneAnimated, TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE)
DISABLE_CHEAT(CHEAT_TYPE_ALL, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//to fix Bug 1173621 - (3/12/13) - MB
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
REMOVE_ANIM_DICT("oddjobs@assassinate@construction@call")
SET_OBJECT_AS_NO_LONGER_NEEDED(oPayPhone)
MainStage = STAGE_INIT
PRINTLN("CONSTRUCTION: GOING TO STATE - STAGE_INIT")
BREAK
ENDSWITCH
ENDPROC
// -----------------------------------
// MAIN SCRIPT
// -----------------------------------
PROC Update_Loop()
IF MainStage > STAGE_SPAWNING AND MainStage < STAGE_ROOFTOP_BATTLE
UPDATE_TRIGGER_EARLY_ROOFTOP_BATTLE()
ENDIF
IF MainStage > STAGE_SPAWNING AND MainStage < STAGE_ELEVATOR_CUTSCENE
MANAGE_PETROL()
ENDIF
//handle the wanted level settings
HANDLE_PLAYER_MAX_WANTED_LEVEL()
SWITCH MainStage
// CASE STAGE_TIME_LAPSE
// timeLapseCutscene()
// BREAK
CASE STAGE_BRIEF_INIT
//initialize this
iPetrolStage = 0
iNumDead = 0
iCurrentPlayerLine = 0
heliFleeLinePlayed = FALSE
//assign unsafe angled areas near the warning guys to fix issues like Bug 1545383 where guards can loop their lines if the player is close to them but not in the site
vAngledAreaMinWarningGuy[0] = <<-100.453239,-947.640686,25.729670>>
vAngledAreaMaxWarningGuy[0] = <<-122.555359,-939.633911,36.728752>>
fAngledAreaWidthWarningGuy[0] = 15.0
vAngledAreaMinWarningGuy[1] = <<-209.190720,-1087.516602,18.190535>>
vAngledAreaMaxWarningGuy[1] = <<-188.870010,-1095.158325,34.437973>>
fAngledAreaWidthWarningGuy[1] = 25.0
vAngledAreaMinWarningGuy[2] = <<-84.503349,-1029.007690,24.754467>>
vAngledAreaMaxWarningGuy[2] = <<-80.107407,-1016.939575,35.953331>>
fAngledAreaWidthWarningGuy[2] = 15
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
MainStage = STAGE_INIT
PRINTLN("MainStage = STAGE_INIT")
BREAK
ENDIF
DO_STAGE_INTRO_CUTSCENE()
BREAK
CASE STAGE_INIT
IF Is_Replay_In_Progress()
bReplaying = TRUE
ENDIF
INIT_MODELS()
REQUEST_STREAMS_NO_PEDS()
SETUP_MISSION_REWARDS()
//restrict ambient peds from being created within the construction site
SET_PED_NON_CREATION_AREA(<< -250.5509, -1126.1462, -100.7299 >>, << -55.8166, -858.6929, 100.7734 >>)
ADD_SCENARIO_BLOCKING_AREA(<< -55.8166, -1126.1462, -100.7299 >>, << -250.5509, -858.6929, 100.7734 >>)
//add a body armor pickup next to the second elevator on the mid-level of the building
// CREATE_PICKUP_ROTATE(PICKUP_ARMOUR_STANDARD, <<-145.070, -958.325, 114.33>>, <<270 ,0, 0>>)
SET_ELEVATOR_PARAMS()
SETUP_WORKER_PARAMS()
SETUP_PATROL_PATHS()
//setup Franklin's dialogue info
ADD_PED_FOR_DIALOGUE(siteConv, 1, Player, "FRANKLIN")
// TRIGGER_MUSIC_EVENT("ASS5_DRIVE")
// PRINTLN("TRIGGERING MUSIC - ASS5_DRIVE")
MainStage = STAGE_STREAMING
PRINTLN("MainStage = STAGE_STREAMING")
BREAK
CASE STAGE_STREAMING
IF ARE_STREAMS_LOADED_NO_PEDS()
SET_PED_MODEL_IS_SUPPRESSED(WorkerModel[0], TRUE)
MainStage = STAGE_SPAWNING
PRINTLN("MainStage = STAGE_SPAWNING")
ENDIF
BREAK
CASE STAGE_SPAWNING
DO_STAGE_SPAWNING()
BREAK
CASE STAGE_GET_TO_SITE
UPDATE_WARNING_GUARDS()
UPDATE_PATROLLING_GUARDS()
DO_STAGE_GET_TO_SITE()
BREAK
CASE STAGE_PANIC_CUTSCENE
DO_STAGE_PANIC_CUTSCENE()
BREAK
CASE STAGE_ENTER_SITE
UPDATE_WARNING_GUARDS()
UPDATE_PATROLLING_GUARDS()
DO_STAGE_ENTER_SITE()
BREAK
// CASE STAGE_GET_TO_ELEVATOR
// DO_STAGE_GET_TO_ELEVATOR()
// BREAK
CASE STAGE_ELEVATOR_CUTSCENE
DO_STAGE_ELEVATOR_CUTSCENE()
BREAK
CASE STAGE_GET_TO_SECOND_ELEVATOR
DO_STAGE_GET_TO_SECOND_ELEVATOR()
BREAK
CASE STAGE_SECOND_ELEVATOR_CUTSCENE
DO_STAGE_SECOND_ELEVATOR_CUTSCENE()
BREAK
CASE STAGE_ROOFTOP_BATTLE
DO_STAGE_ROOFTOP_BATTLE()
BREAK
CASE STAGE_KILL_CAM
DO_STAGE_KILL_CAM()
BREAK
CASE STAGE_FLEE_POLICE
DO_STAGE_FLEE_POLICE()
BREAK
CASE STAGE_CLEANUP
Script_Passed()
BREAK
ENDSWITCH
//make sure workers react appropriately
IF MainStage <> STAGE_PANIC_CUTSCENE
HANDLE_ENEMY_BEHAVIOR()
ENDIF
//play the kill cam if the target dies
HANDLE_KILL_CAMERA_LOGIC()
//check to see if target escaped
IF HAS_PLAYER_ABANDONED_TARGET(bAbandoned)
SET_MISSION_FAILED()
ENDIF
ENDPROC
// debug only
#IF IS_DEBUG_BUILD
PROC JUMP_TO_STAGE(Assassin_Stages stage, BOOL bIsDebugJump = FALSE)
FADE_OUT()
//Update mission checkpoint in case they skipped the stages where it gets set.
IF bIsDebugJump
SWITCH STAGE
CASE STAGE_SPAWNING
GO_TO_CHECKPOINT_1()
BREAK
CASE STAGE_ENTER_SITE
GO_TO_CHECKPOINT_2()
BREAK
CASE STAGE_GET_TO_SECOND_ELEVATOR
GO_TO_CHECKPOINT_3()
BREAK
CASE STAGE_ROOFTOP_BATTLE
GO_TO_CHECKPOINT_4()
BREAK
CASE STAGE_CLEANUP
GO_TO_CLEANUP()
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC INITIALIZE_JSKIP()
RENDER_SCRIPT_CAMS(FALSE, TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDPROC
// debug: skips
PROC DO_DEBUG_SKIPS()
Assassin_Stages eStage
IF IS_SCREEN_FADED_IN()
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage)
IF iDebugJumpStage = 0
eStage = STAGE_SPAWNING
ELIF iDebugJumpStage = 1
eStage = STAGE_ENTER_SITE
ELIF iDebugJumpStage = 2
eStage = STAGE_GET_TO_SECOND_ELEVATOR
ELIF iDebugJumpStage = 3
eStage = STAGE_ROOFTOP_BATTLE
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_CLEANUP
ENDIF
// Debug Key: Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
SET_MISSION_FAILED()
ENDIF
// IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_N))
// SET_ENTITY_COORDS(Player, <<-87.3165, -916.2086, 28.2419>>)
// ENDIF
// skip stage P
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
bDoingPSkip = TRUE
IF MainStage = STAGE_GET_TO_SITE OR MainStage = STAGE_ENTER_SITE
eStage = STAGE_SPAWNING
PRINTLN("eStage = STAGE_SPAWNING")
ELIF /*MainStage = STAGE_GET_TO_ELEVATOR OR*/ MainStage = STAGE_GET_TO_SECOND_ELEVATOR
eStage = STAGE_ENTER_SITE
PRINTLN("eStage = STAGE_ENTER_SITE")
ELIF MainStage = STAGE_ROOFTOP_BATTLE
eStage = STAGE_GET_TO_SECOND_ELEVATOR
PRINTLN("eStage = STAGE_GET_TO_SECOND_ELEVATOR")
ELIF MainStage = STAGE_FLEE_POLICE
eStage = STAGE_ROOFTOP_BATTLE
PRINTLN("eStage = STAGE_ROOFTOP_BATTLE")
ENDIF
//TODO add cleanup
JUMP_TO_STAGE(eStage, TRUE)
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
IF MainStage = STAGE_GET_TO_SITE
bDoingJSkip = TRUE
eStage = STAGE_ENTER_SITE
PRINTLN("eStage = STAGE_ENTER_SITE")
JUMP_TO_STAGE(eStage, TRUE)
ELIF MainStage = STAGE_ENTER_SITE /*OR MainStage = STAGE_GET_TO_ELEVATOR */
bDoingJSkip = TRUE
eStage = STAGE_GET_TO_SECOND_ELEVATOR
PRINTLN("eStage = STAGE_GET_TO_SECOND_ELEVATOR")
JUMP_TO_STAGE(eStage, TRUE)
ELIF MainStage = STAGE_GET_TO_SECOND_ELEVATOR
bDoingJSkip = TRUE
eStage = STAGE_ROOFTOP_BATTLE
PRINTLN("eStage = STAGE_ROOFTOP_BATTLE")
JUMP_TO_STAGE(eStage, TRUE)
ELIF MainStage = STAGE_ROOFTOP_BATTLE OR MainStage = STAGE_FLEE_POLICE
bDoingJSkip = TRUE
eStage = STAGE_CLEANUP
PRINTLN("eStage = STAGE_CLEANUP")
JUMP_TO_STAGE(eStage, TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
#ENDIF
// 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("ASS5_FAIL")
PRINTLN("TRIGGERING MUSIC - ASS5_FAIL")
SET_BITMASK_AS_ENUM(g_savedGlobals.sAssassinData.iGenericData, ACD_FAILED)
Mission_Flow_Mission_Force_Cleanup()
Script_Cleanup()
ENDIF
// Any initialisation (generally, only mission scripts should set
// the mission flag to TRUE)
SET_MISSION_FLAG(TRUE)
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
Player = PLAYER_PED_ID()
REMOVE_IPL("DT1_21_prop_lift_on")
REQUEST_IPL("DT1_21_ConSiteAssass")
// Fix Bug # 712684
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
ENDIF
SETUP_DEBUG()
ASSASSINATION_ClearUnneededGenericData()
iCurAssassinRank = ENUM_TO_INT(ASSASSINATION_Construction) //g_savedGlobals.sAssassinData.iCurrentAssassinRank
missionData = ASSASSINATION_GetMissionData(iCurAssassinRank)
PRINTLN("Current rank is... ", iCurAssassinRank)
//Don't check EAggro_Attacked to allow the player to perform stealth kills
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Attacked)
//allow player to go wanted without immediately triggering aggro
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
//reduce enemy reactions to aim time by 50% (0.75 seconds)
aggroArgs.fAimTime = 750
//set wanted level multiplier (note that HANDLE_PLAYER_MAX_WANTED_LEVEL() will disallow the player to get a wanted level once the player has played past the panic cutscene)
SET_WANTED_LEVEL_MULTIPLIER(0.2)
MainStage = STAGE_BRIEF_INIT
PRINTLN("STARTING MISSION ON STAGE - STAGE_BRIEF_INIT")
//HANDLE STREAMING AROUND REPLAY START POSITION
IF IS_REPLAY_IN_PROGRESS()
bHaveRetryOnce = TRUE
PRINTLN("CONSTRUCTION: SETTING - bHaveRetryOnce = TRUE")
iStageToUse = Get_Replay_Mid_Mission_Stage()
PRINTLN("iStageToUse = ", iStageToUse)
IF g_bShitskipAccepted
IF iStageToUse <= 3
iStageToUse = (iStageToUse + 1)
PRINTLN("SHIT SKIP: iStageToUse = ", iStageToUse)
ENDIF
ENDIF
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(vMoveVehiclePosition01, fMoveVehicleHeading01)
IF NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(vehPlayer))
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(vehPlayer))
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehPlayer))
SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayer)
ELSE
DELETE_VEHICLE(vehPlayer)
ENDIF
ENDIF
START_REPLAY_SETUP(<< 804.2744, -1077.5593, 27.5087 >>, 71.7369)
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(vMoveVehiclePosition02, fMoveVehicleHeading02)
IF NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(vehPlayer))
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(vehPlayer))
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehPlayer))
SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayer)
ELSE
DELETE_VEHICLE(vehPlayer)
ENDIF
ENDIF
START_REPLAY_SETUP(<< -102.4433, -907.4056, 28.2065 >>, 160.4677)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 2
IF DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<-182.0891, -1004.0555, 113.1355>>)
REMOVE_COVER_POINT(ciSecondFloorPosition)
PRINTLN("REMOVING COVER POINT - ciSecondFloorPosition")
ENDIF
ciSecondFloorPosition = ADD_COVER_POINT(<<-182.0891, -1004.0555, 113.1355>>, 341.2941, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(90)
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
START_REPLAY_SETUP(<< -182.1094, -1004.0585, 113.1362 >>, 250.235)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 3
IF DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<-150.5964, -945.8911, 268.1318>>)
REMOVE_COVER_POINT(ciRoofPosition)
PRINTLN("REMOVING COVER POINT - ciRoofPosition")
ENDIF
ciRoofPosition = ADD_COVER_POINT(<<-150.5964, -945.8911, 268.1318>>, 231.5456, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_180)
FORCE_PED_AI_AND_ANIMATION_UPDATE(Player, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(Player, vLastStageCoverPosition, -1)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(90)
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
START_REPLAY_SETUP(vLastStageCoverPosition, fLastStageCoverHeading)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 4
IF DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<-150.5964, -945.8911, 268.1318>>)
REMOVE_COVER_POINT(ciRoofPosition)
PRINTLN("REMOVING COVER POINT - ciRoofPosition")
ENDIF
START_REPLAY_SETUP(<<-102.2210, -941.3790, 28.2330>>, 67.1012)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ENDIF
ENDIF
// The script loop
WHILE (TRUE)
// Maintain the script perform per-frame functionality
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_ASS5")
IF bMissionFailed
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
Script_Failed()
ENDIF
ELIF NOT IS_PED_INJURED(Player)
Update_Loop()
#IF IS_DEBUG_BUILD
DO_DEBUG_SKIPS()
// IF myDebugData.bTurnOnDebugPos
// IF NOT DOES_PICKUP_EXIST(pickupParachuteTable) //the ped you are attaching
// SET_BIT(iParachutePickupTable, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
//
// pickupParachuteTable = CREATE_PICKUP_ROTATE(PICKUP_PARACHUTE, << myDebugData.fOffsetX, myDebugData.fOffsetY, myDebugData.fOffsetZ >>, << myDebugData.fRotateX, myDebugData.fRotateY, myDebugData.fRotateZ >>, iParachutePickupTable)
// PRINTLN("CREATING PARACHUTE PICKUP ON TABLE")
// ELSE
// REMOVE_PICKUP(pickupParachuteTable)
// ENDIF
// ENDIF
SHOW_ENEMY_POSITIONS()
#ENDIF
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT