7587 lines
246 KiB
Python
Executable File
7587 lines
246 KiB
Python
Executable File
|
||
//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
|
||
|
||
|