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

6077 lines
217 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : Assassin_Bus.sch //
// AUTHOR : Michael Bagley //
// DESCRIPTION : Bus Assassination Script - Player drives a bus searching bus stops for the target //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "Assassin_Core.sch"
USING "Assassin_Shared.sch"
USING "Assassination_briefing_lib.sch"
USING "replay_public.sch"
USING "clearMissionArea.sch"
USING "replay_public.sch"
USING "load_queue_public.sch"
// ********************************** Script Globals *************************************
CONST_INT NUM_BUS_STOPS 4
CONST_INT NUM_BUS_STOP_PEDS 3
CONST_INT NUM_BUS_SEATS 9
CONST_FLOAT BUS_ABANDON_DISTANCE 10000.0
CONST_FLOAT BUS_SPEED_FACTOR 5.0
CONST_FLOAT BUS_STOP_PAD 6.0
ENUM MISSION_BUS_STAGE
MISSION_BUS_STREAM_PEDS,
MISSION_BUS_CREATE_PEDS,
MISSION_BUS_ENTER_BUS,
MISSION_BUS_UPDATE_BUS_PEDS,
MISSION_BUS_TARGET_FLEE,
MISSION_BUS_UPDATE_BIKE,
MISSION_BUS_FLEE_ON_FOOT
ENDENUM
MISSION_BUS_STAGE missionStage
ASS_ARGS asnArgs
// ------------------------------Cutscene variables------------------------------
ENUM PAYPHONE_CUTSCENE
PAYPHONE_CUTSCENE_INIT = 0,
PAYPHONE_CUTSCENE_UPDATE,
PAYPHONE_CUTSCENE_SKIP,
PAYPHONE_CUTSCENE_CLEANUP
ENDENUM
PAYPHONE_CUTSCENE payPhoneCutsceneStages = PAYPHONE_CUTSCENE_INIT
OBJECT_INDEX oPayPhone, oPayPhoneAnimated
CAMERA_INDEX camPayPhoneIntro01
CAMERA_INDEX camPayPhoneIntro01a
VECTOR vPhoneLocation = <<-26.1052, -109.8479, 56.0793>>
VECTOR vPlayerWarpPosition = <<-26.1052, -109.8479, 56.0793>>
FLOAT fPlayerWarpHeading = 159.0238
FLOAT fCutsceneLength = 30.0
FLOAT fRightX, fRightY
VECTOR vCameraPosition01a = <<-27.2053, -109.6966, 57.6161>>
VECTOR vCameraRotation01a = <<-8.1281, -0.0574, -140.8007>>
VECTOR vCameraPosition01 = <<-27.2053, -109.6968, 57.6161>>
VECTOR vCameraRotation01 = <<-1.4844, -0.0472, -124.6345>>
structTimer tPayphoneCutsceneTimer
structTimer tPayphoneCameraTimer
BOOL bSkipCutscene = FALSE
BOOL bPlayedPayPhoneConvo = FALSE
BOOL bContinueWithScene = FALSE
//BOOL bTouchedRightStick = FALSE
VECTOR scenePosition = <<0,0,0>>
VECTOR sceneRotation = <<0,0,0>>
INT iSceneId
INT iIntroCameraStages = 0
INT iNavMeshBlocking
STREAMVOL_ID svPhoneCutscene
// ------------------------------END Cutscene variables------------------------------
BOOL bWantedLevelSet
BOOL bPlayerInBus
BOOL bReturnMsgPrinted
BOOL bOffBikeMsgPlayed
BOOL bBailMsgPlayed
//BOOL bPassengersLeftBus
BOOL bTargetFleeing
BOOL bCutsceneSkipped
//BOOL bTargetBrawlMsg
BOOL bBusFacingCorrectly
BOOL bApproachBackwards
BOOL bBusFacingPerpendicular
BOOL bNeedToLeaveArea = FALSE
BOOL bBusDamaged
BOOL bReplaying = FALSE
//BOOL bFirstObjectivePrinted
//BOOL bFirstCheckpointSceneLoad = FALSE
//BOOL bSecondCheckpointSceneLoad = FALSE
//BOOL bThirdCheckpointSceneLoad = FALSE
BOOL bTaskedPassengers = FALSE
BOOL bRunDistanceToStop = TRUE
//BOOL bRemovedAnims = FALSE
BOOL bReactionAnimsLoaded = FALSE
BOOL bPrintCinematicHelp = FALSE
BOOL bFirstPress = FALSE
BOOL bGrabbedSpeaker = FALSE
BOOL bTaskedOldLady = FALSE
BOOL bTaskedToEnterBus = FALSE
BOOL bUsingBus = FALSE
BOOL bUsingCoach = FALSE
BOOL bReplayVehicleAvailable = FALSE
BOOL bSetThirdCheckpoint = FALSE
BOOL bTriggerEraticAnimations = FALSE
//BOOL bUseCinematicCam = FALSE
BOOL bPlayedCellPhoneCall = FALSE
BOOL bGrabbedDistanceToNextStop = FALSE
BOOL bTargetKillLinePlayed = FALSE
BOOL bLoadSceneRequested = FALSE
BOOL bClearedHelp = FALSE
BOOL bPoliceScannerLinePlayed = FALSE
BOOL bResetBikeSpeed = FALSE
//BOOL bClosingBusDoorsForCutscene = FALSE
BOOL bDoneFlash = FALSE
INT iBusCutsceneStage
INT iMocapBusSceneStage
INT iBusStop = -1
INT iFrameToCheck
INT iFranklinChaseSpeech
INT iFranklinSpeechTime = GET_RANDOM_INT_IN_RANGE(5, 15)
INT iPassengerChaseSpeech
INT iPassengerPreChaseSpeech
INT iPassengerReactionSpeech
INT iPassengerAbandonSpeech
INT iPassengerSpeechTime = GET_RANDOM_INT_IN_RANGE(5, 10)
INT iFootChaseSpeech
INT iNumBusPeds = 0
INT iNumInnocentsDead
INT iNumDeadMsg
INT iLastBusHealthChecked = 1000
INT iBusHealthSpeech
INT iBusStopOrder[NUM_BUS_STOPS]
INT iNumStopsVisited
INT iRecordingTime
//INT iTargetBikeFrameCounter
INT iRunAlternateStage
INT iStageToUse
INT iLeaveBusStages = 0
FLOAT fBikeTopSpeedModifier = 0.50 //percentage increase to bump the vehicles max top speed by
FLOAT fBikeNormalSpeed
FLOAT fDesiredBikeSpeed
FLOAT fFirstCamCutTime
FLOAT fDefaultAssassinSceneRange = 15
FLOAT fScreamTime
VECTOR vCombatPos
VECTOR vBusDoorPos
VECTOR vBusWarpPos
VECTOR vBusCamPos
VECTOR vBusCamRot
VECTOR vBusPreWarpPos
VECTOR vBusLot = << 414.1398, -640.0020, 27.5001 >>
//VECTOR vMissionCenter = << 288.6, -860.02, 29.28 >> //roughly the center of the downtown area used in the mission
VECTOR vBusPos, vPlayerPosition // Used to track abandon distance
FLOAT fBusWarpHead
FLOAT fDistanceToNextStop
// Move Vehicle Positions
VECTOR vMoveVehiclePosition01 = <<-25.1870, -113.0940, 55.9396>>
FLOAT fMoveVehicleHeading01 = 69.4062
PED_INDEX busPed4, busPed5, busPed6, busPed7, pedBusPassengerShooting
PED_INDEX pedBusLotScenarios[4]
//PED_INDEX pedCurrentlyEnteringBus
VEHICLE_INDEX tempBus1, tempBus2
VEHICLE_INDEX vehPlayerIsIn
VEHICLE_INDEX viReplayVehicle
VEHICLE_INDEX viPlayerLastVehicle
CAMERA_INDEX busCam
CAMERA_INDEX busCam2
//CAMERA_INDEX franklinCam
SCENARIO_BLOCKING_INDEX sbiBusLot[6]
MODEL_NAMES mnCarPlayerIsIn
structTimer busTimer
structTimer failTimer
structTimer speechTimerFranklin
structTimer speechTimerPassenger
structTimer speechTimerPassengerPreChase
structTimer speechDelayTimer
structTimer playbackTimer
//structTimer passengerExitTimer
structTimer tScreamTimer
structTimer tPoliceScanner
SCENARIO_BLOCKING_INDEX sb01, sb02
STREAMVOL_ID svBusStopCutscene
// Cutscene
PED_INDEX pedOldLady
//CustomCutsceneCaller fpCutsceneCustomIntro
WEAPON_TYPE mPlayerWeapon
SIMPLE_USE_CONTEXT cucEndScreenCore
LoadQueueLarge sLoadQueue
STRUCT BUS_STOP_STRUCT // contains vectors and headings for police blockade positions
BOOL bActive // check to see if the bus stop is active
VECTOR vStopPos // location to spawn the roadblock
FLOAT fStopHead // bus stop heading
VECTOR vVehPos // position for targets vehicle (if positioned there)
FLOAT fVehHead // heading for the targets vehicle(if positioned there)
BLIP_INDEX blipStop // blip for the bus stop
TEXT_LABEL tlBlip // blip name
PED_INDEX piAmbPed[4] // ambient bus peds at the bus stop
VEHICLE_INDEX viBike // bmx bike parked at stop
FLOAT fCorrectHeading // proper heading for each stop
VECTOR vCoronaPosition // position for in game corona
VECTOR vStreamVolPos //location for streamvol
VECTOR vStreamVolDir //direction vector for streamvol
ENDSTRUCT
BUS_STOP_STRUCT busStop[NUM_BUS_STOPS]
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
// -----------------------------------
// DEBUG MODE
// -----------------------------------
#IF IS_DEBUG_BUILD
USING "shared_debug.sch"
USING "script_debug.sch"
USING "select_mission_stage.sch"
#ENDIF
#IF IS_DEBUG_BUILD
DEBUG_POS_DATA myDebugData
BOOL bDoingPSkip = FALSE
BOOL bDoingJSkip = FALSE
MissionStageMenuTextStruct sSkipMenu[3]
INT iDebugJumpStage = 0
// INT iSkip
VECTOR vSpherePosition, vPlayerDebugPositon
FLOAT fDebugHeight, fPlayerDebugHeading
PROC SETUP_DEBUG()
sSkipMenu[0].sTxtLabel = "TRAVEL_STAGE"
sSkipMenu[1].sTxtLabel = "PICKUP_PASSENGERS"
sSkipMenu[2].sTxtLabel = "KILL_TARGET"
ENDPROC
#ENDIF
// ********************************** END SCRIPT GLOBALS *************************************
//initialize all the necessities for the mission
PROC INIT_BUS_DATA(ASS_TARGET_DATA& targetData)
targetData.targetEnum = A_M_M_Business_01
targetData.otherPedEnum = A_M_M_EastSA_02
targetData.auxPedEnum = A_M_O_Tramp_01
targetData.vehEnum = BUS
targetData.otherVehEnum = SCORCHER
targetData.vTargetPos = << 477.8577, -605.9913, 28.5108 >>
targetData.fTargetHead = 352
targetData.vDestPos = << 421.5518, -640.2146, 27.5068 >>
targetData.vVehPos = << 421.5518, -640.2146, 27.5068 >>
targetData.fVehHead = 178.95
//cutscene
targetData.vCutscenePos = << 420.3106, -676.6454, 36.0428 >>
targetData.vCutsceneHead = << -1.2817, 0.0000, -9.4208 >>
targetData.fCutsceneDoF = 39.8344
targetData.sStringTable = "ASS_BS"
targetData.sAnimDict[0] = "oddjobs@assassinate@bus@"
targetData.sAnimDict[1] = "misscommon@response"
ADD_STREAMED_MODEL(targetData.streamedModels, targetData.vehEnum)
ADD_STREAMED_MODEL(targetData.streamedModels, targetData.otherVehEnum)
ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[0])
ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[1])
targetData.OBJECTIVES[0] = "ASS_BS_ENTER"
targetData.vWarpPos = << 421.4034, -675.3058, 28.2859 >>
targetData.myType = MISSION_NAME_BUS
targetData.bNonTemp = TRUE
targetData.bLeaveVehicles = TRUE
ENDPROC
FUNC BOOL ARE_MODELS_LOADED_FOR_EARLY_BUS_STOPS(ASS_TARGET_DATA& targetData)
BOOL bLoaded
REQUEST_MODEL(targetData.auxPedEnum)
REQUEST_MODEL(targetData.otherPedEnum)
REQUEST_MODEL(A_M_M_EASTSA_01)
IF HAS_MODEL_LOADED(targetData.auxPedEnum)
AND HAS_MODEL_LOADED(targetData.otherPedEnum)
AND HAS_MODEL_LOADED(A_M_M_EASTSA_01)
PRINTLN("MODELS_LOADED_FOR_EARLY_BUS_STOPS")
bLoaded = TRUE
ELSE
bLoaded = FALSE
ENDIF
RETURN bLoaded
ENDFUNC
FUNC BOOL ARE_MODELS_LOADED_FOR_FINAL_BUS_STOP(ASS_TARGET_DATA& targetData)
BOOL bLoaded
REQUEST_MODEL(targetData.targetEnum)
REQUEST_MODEL(a_f_o_genstreet_01)
IF HAS_MODEL_LOADED(targetData.targetEnum)
AND HAS_MODEL_LOADED(a_f_o_genstreet_01)
PRINTLN("MODELS_LOADED_FOR_FINAL_BUS_STOP")
bLoaded = TRUE
ELSE
PRINTLN("WAITING FOR MODELS TO LOAD FOR FINAL_BUS_STOP")
bLoaded = FALSE
ENDIF
RETURN bLoaded
ENDFUNC
PROC SET_BUS_MISSION_TRAFFIC_SETTINGS()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.5)
SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
//so cars won't drive into bus during intro cutscene
SET_ROADS_IN_ANGLED_AREA(<< 426.035, -644.930, -100 >>, << 421.035, -644.930, 100 >>, 55.000, FALSE, FALSE)
VECTOR tempVec[6]
tempVec[0] = << 421.94028, -652.32758, 27.50035 >> // near parking lot entrance
tempVec[1] = << 404.63669, -636.35431, 27.50008 >> // inside lot entrance west
tempVec[2] = << 425.59662, -613.08936, 27.56621 >> // northernmost part of the lot
tempVec[3] = << 423.34677, -636.78638, 27.50008 >> // center of lot
tempVec[4] = << 421.88361, -667.14240, 28.04054 >> // lot entrance
tempVec[5] = << 423.51428, -677.39557, 28.33767 >> //road in front of entrance
sbiBusLot[0] = ADD_SCENARIO_BLOCKING_AREA( (tempVec[0] - <<8,8,8>>), (tempVec[0] + <<8,8,8>>) )
sbiBusLot[1] = ADD_SCENARIO_BLOCKING_AREA( (tempVec[1] - <<8.5,8.5,8.5>>), (tempVec[1] + <<8.5,8.5,8.5>>) )
sbiBusLot[2] = ADD_SCENARIO_BLOCKING_AREA( (tempVec[2] - <<8.5,8.5,8.5>>), (tempVec[2] + <<8.5,8.5,8.5>>) )
sbiBusLot[3] = ADD_SCENARIO_BLOCKING_AREA( (tempVec[3] - <<9.5,9.5,9.5>>), (tempVec[3] + <<9.5,9.5,9.5>>) )
sbiBusLot[4] = ADD_SCENARIO_BLOCKING_AREA( (tempVec[4] - <<8.0,8.0,8.0>>), (tempVec[4] + <<8.0,8.0,8.0>>) )
sbiBusLot[5] = ADD_SCENARIO_BLOCKING_AREA( (tempVec[5] - <<15.0,15.0,15.0>>), (tempVec[5] + <<15.0,15.0,15.0>>) )
ENDPROC
//setup data for each bus stop
PROC INIT_BUS_STOP_DATA()
// first stop
busStop[0].bActive = FALSE
busStop[0].vStopPos = << 303.6007, -765.1572, 28.3112 >>
busStop[0].fStopHead = 255.4414
busStop[0].vVehPos = << 300.9491, -757.7515, 28.3240 >>
busStop[0].fVehHead = 342.2245
busStop[0].tlBlip = "ASS_BS_STOP0"
busStop[0].fCorrectHeading = 160.5196
busStop[0].vCoronaPosition = <<307.4789, -766.0983, 28.2473>>
busStop[0].vStreamVolPos = <<298.8621, -771.5198, 29.4770>>
busStop[0].vStreamVolDir = <<8.7930, 0.0000, -52.1743>>
//<<308.3141, -769.4610, 30.3267>>, <<-8.3640, 0.0000, 78.0163>> //data for shot inside bus
// second stop
busStop[1].bActive = FALSE
busStop[1].vStopPos = << 356.10, -1067.84, 28.57 >>
busStop[1].fStopHead = 6.6156
busStop[1].vVehPos = << 362.1344, -1073.3867, 28.5679 >>
busStop[1].fVehHead = 272.8605
busStop[1].tlBlip = "ASS_BS_STOP1"
busStop[1].fCorrectHeading = 269.7676
busStop[1].vCoronaPosition = <<355.5678, -1063.8975, 28.3927>>
busStop[1].vStreamVolPos = <<364.4333, -1071.3138, 30.1969>>
busStop[1].vStreamVolDir = <<0.8394, -0.0000, 42.3892>>
//<<358.9606, -1062.5612, 30.3524>>, <<-5.0965, -0.0000, -172.7951>>
// third stop
busStop[2].bActive = FALSE
busStop[2].vStopPos = << 264.05, -1120.78, 28.35 >>
busStop[2].fStopHead = 179.7187
busStop[2].vVehPos = << 258.1293, -1119.1965, 28.3053 >>
busStop[2].fVehHead = 95.72
busStop[2].tlBlip = "ASS_BS_STOP3"
busStop[2].fCorrectHeading = 88.6072
busStop[2].vCoronaPosition = <<264.2879, -1124.3931, 28.2193>>
busStop[2].vStreamVolPos = <<254.3144, -1118.1940, 30.1446>>
busStop[2].vStreamVolDir = <<-0.9803, 0.0000, -137.7603>>
//<<261.3863, -1126.6526, 30.2008>>, <<-5.5612, 0.0000, 6.1281>>
// fourth stop
busStop[3].bActive = FALSE
busStop[3].vStopPos = << 115.62, -781.09, 30.40 >>
busStop[3].fStopHead = 154.9924
busStop[3].vVehPos = << 109.4136, -774.7261, 30.4493 >>
busStop[3].fVehHead = 68.8722
busStop[3].tlBlip = "ASS_BS_STOP2"
busStop[3].fCorrectHeading = 68.4520
busStop[3].vCoronaPosition = <<115.7016, -785.4189, 30.3382>>
busStop[3].vStreamVolPos = <<104.8598, -774.3508, 31.6923>>
busStop[3].vStreamVolDir = <<4.8718, 0.0000, -144.4729>>
ENDPROC
PROC REMOVE_BUS_PASSENGERS()
INT idx, idx2
REPEAT NUM_BUS_STOPS idx
REPEAT NUM_BUS_STOP_PEDS idx2
IF DOES_ENTITY_EXIST(busStop[idx].piAmbPed[idx2])
DELETE_PED(busStop[idx].piAmbPed[idx2])
PRINTLN("REMOVE PED FROM STOP: ", idx, " PED: ", idx2)
ENDIF
ENDREPEAT
ENDREPEAT
ENDPROC
PROC CREATE_FILLED_BUS(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
IF DOES_ENTITY_EXIST(args.myVehicle) AND NOT IS_ENTITY_DEAD(args.myVehicle)
// ------------------------------------------------------BUS STOP 1----------------------------------------------------------------
busStop[0].piAmbPed[0] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, targetData.auxPedEnum, INT_TO_ENUM(VEHICLE_SEAT, 3))
// SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
// SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,2), 2, 0, 0) //(hair)
// SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,3), 2, 1, 0) //(uppr)
// SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
// SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[0].piAmbPed[0], TRUE)
busStop[0].piAmbPed[1] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, A_M_M_EASTSA_01, INT_TO_ENUM(VEHICLE_SEAT, 4))
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,2), 1, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[0].piAmbPed[1], TRUE)
busStop[0].piAmbPed[2] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, targetData.otherPedEnum, INT_TO_ENUM(VEHICLE_SEAT, 5))
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,2), 2, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(busStop[0].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[0].piAmbPed[2], TRUE)
// ------------------------------------------------------BUS STOP 2----------------------------------------------------------------
busStop[1].piAmbPed[0] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, targetData.auxPedEnum, INT_TO_ENUM(VEHICLE_SEAT, 6))
// SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
// SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,3), 1, 3, 0) //(uppr)
// SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[1].piAmbPed[0], TRUE)
busStop[1].piAmbPed[1] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, A_M_M_EASTSA_01, INT_TO_ENUM(VEHICLE_SEAT, 7))
SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[1].piAmbPed[1], TRUE)
busStop[1].piAmbPed[2] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, targetData.otherPedEnum, INT_TO_ENUM(VEHICLE_SEAT, 8))
SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[1].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[1].piAmbPed[2], TRUE)
// ------------------------------------------------------BUS STOP 3----------------------------------------------------------------
busStop[2].piAmbPed[0] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, targetData.auxPedEnum, INT_TO_ENUM(VEHICLE_SEAT, 0))
// SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
// SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
// SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
// SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[2].piAmbPed[0], TRUE)
busStop[2].piAmbPed[1] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, A_M_M_EASTSA_01, INT_TO_ENUM(VEHICLE_SEAT, 1))
SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,3), 1, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[2].piAmbPed[1], TRUE)
busStop[2].piAmbPed[2] = CREATE_PED_INSIDE_VEHICLE(args.myVehicle, PEDTYPE_CIVMALE, targetData.otherPedEnum, INT_TO_ENUM(VEHICLE_SEAT, 2))
SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,2), 0, 1, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,3), 1, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[2].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[2].piAmbPed[2], TRUE)
ENDIF
ENDPROC
PROC CREATE_BUS_PEDS_FOR_CURRENT_STOP(ASS_TARGET_DATA& targetData, INT iStopNum)
VECTOR pedPos[3]
//switch these positions around based on the stop so that the same ped enums won't always appear in the same location
IF iStopNum = 0
pedPos[0] = << 303.68, -766.33, 28.31 >>
pedPos[1] = << 305.28, -762.28, 28.41 >>
pedPos[2] = << 302.70, -770.61, 28.45 >>
ELIF iStopNum = 1
pedPos[0] = << 351.41, -1068.09, 28.60 >>
pedPos[1] = << 360.98, -1068.01, 28.53 >>
pedPos[2] = << 357.6896, -1071.0891, 28.5567 >>
ELIF iStopNum = 2
pedPos[0] = << 260.96, -1119.53, 28.36 >>
pedPos[1] = << 266.74, -1119.44, 28.37 >>
pedPos[2] = << 258.61, -1121.24, 28.45 >>
ELIF iStopNum = 3
pedPos[0] = << 119.20, -781.85, 30.53 >>
pedPos[1] = << 116.39, -778.02, 30.40 >>
pedPos[2] = << 119.10, -781.83, 30.38 >>
ENDIF
CLEAR_AREA(busStop[iStopNum].vStopPos, 10, FALSE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< busStop[iStopNum].vStopPos.x - 30, busStop[iStopNum].vStopPos.y - 30, busStop[iStopNum].vStopPos.z - 30 >>,
<< busStop[iStopNum].vStopPos.x + 30, busStop[iStopNum].vStopPos.y + 30, busStop[iStopNum].vStopPos.z + 30 >>, FALSE)
//create bus stop peds and setup their variations
IF NOT DOES_ENTITY_EXIST(busStop[iStopNum].piAmbPed[0])
busStop[iStopNum].piAmbPed[0] = CREATE_PED(PEDTYPE_CIVMALE, targetData.auxPedEnum, pedPos[0], busStop[iStopNum].fStopHead)
IF iStopNum = 0
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,2), 2, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,3), 2, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
ELIF iStopNum = 1
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,2), 1, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
ELIF iStopNum = 2
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,2), 2, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs)
ELIF iStopNum = 3
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,3), 1, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[0], INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
ENDIF
TASK_LOOK_AT_ENTITY(busStop[iStopNum].piAmbPed[0], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_PLAY_ANIM(busStop[iStopNum].piAmbPed[0], "oddjobs@assassinate@bus@", "base", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[iStopNum].piAmbPed[0], TRUE)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(busStop[iStopNum].piAmbPed[0], "PASSENGERS_Group")
PRINTLN("ADDING PASSENGER - busStop[iStopNum].piAmbPed[0] TO AUDIO GROUP - PASSENGERS_Group")
ENDIF
IF NOT DOES_ENTITY_EXIST(busStop[iStopNum].piAmbPed[1])
busStop[iStopNum].piAmbPed[1] = CREATE_PED(PEDTYPE_CIVMALE, A_M_M_EASTSA_01, pedPos[1], busStop[iStopNum].fStopHead)
IF iStopNum = 0
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,3), 1, 3, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
ELIF iStopNum = 1
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
ELIF iStopNum = 2
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
ELIF iStopNum = 3
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,3), 2, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[1], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
ENDIF
TASK_LOOK_AT_ENTITY(busStop[iStopNum].piAmbPed[1], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_PLAY_ANIM(busStop[iStopNum].piAmbPed[1], "oddjobs@assassinate@bus@", "base", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[iStopNum].piAmbPed[1], TRUE)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(busStop[iStopNum].piAmbPed[1], "PASSENGERS_Group")
PRINTLN("ADDING PASSENGER - busStop[iStopNum].piAmbPed[1] TO AUDIO GROUP - PASSENGERS_Group")
ENDIF
IF NOT DOES_ENTITY_EXIST(busStop[iStopNum].piAmbPed[2])
busStop[iStopNum].piAmbPed[2] = CREATE_PED(PEDTYPE_CIVMALE, targetData.otherPedEnum, pedPos[2], busStop[iStopNum].fStopHead)
IF iStopNum = 0
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
ELIF iStopNum = 1
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,3), 1, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
ELIF iStopNum = 2
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,2), 0, 1, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,3), 1, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
ELIF iStopNum = 3
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,0), 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(busStop[iStopNum].piAmbPed[2], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
ENDIF
TASK_LOOK_AT_ENTITY(busStop[iStopNum].piAmbPed[2], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_PLAY_ANIM(busStop[iStopNum].piAmbPed[2], "oddjobs@assassinate@bus@", "base", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(busStop[iStopNum].piAmbPed[2], TRUE)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(busStop[iStopNum].piAmbPed[2], "PASSENGERS_Group")
PRINTLN("ADDING PASSENGER - busStop[iStopNum].piAmbPed[2] TO AUDIO GROUP - PASSENGERS_Group")
ENDIF
//create bike vehicle at bus stop
IF iStopNum = 3
IF NOT DOES_ENTITY_EXIST(busStop[iStopNum].viBike)
busStop[iStopNum].viBike = CREATE_VEHICLE(targetData.otherVehEnum, busStop[iStopNum].vVehPos, busStop[iStopNum].fVehHead)
SET_VEHICLE_ON_GROUND_PROPERLY(busStop[iStopNum].viBike)
ELSE
PRINTLN("busStop[iStopNum].viBike already exists - no need to create!")
ENDIF
ENDIF
ENDPROC
//create the target and set his bike at the specific Bus Stop
PROC CREATE_TARGET_AT_BUS_STOP(ASS_TARGET_DATA& targetData, ASS_ARGS& args, INT iStopNumber)
VECTOR targetSpawnPos
//only set these vectors up for the last 2 stops since he can only spawn at those 2 stops
IF iStopNumber = 2
targetSpawnPos = << 260.71, -1121.16, 28.42 >>
ELIF iStopNumber = 3
targetSpawnPos = << 110.80412, -777.96265, 30.43521 >>
ENDIF
//delete the ped standing next to the bike vehicle and replace him with the target
IF DOES_ENTITY_EXIST(busStop[iStopNumber].piAmbPed[2])
DELETE_PED(busStop[iStopNumber].piAmbPed[2])
ENDIF
IF NOT DOES_ENTITY_EXIST(args.myTarget)
targetData.vTargetPos = targetSpawnPos
targetData.fTargetHead = busStop[iStopNumber].fStopHead
CREATE_ASSASSINATION_TARGET(targetData, args)
SET_ENTITY_HEALTH(args.myTarget, 175) //set his health a bit lower than the default value so that he is more likely to die when hit by a car
ENDIF
args.myOtherVehicle = busStop[iStopNumber].viBike
IF NOT IS_ENTITY_PLAYING_ANIM(args.myTarget, "oddjobs@assassinate@bus@", "base")
TASK_PLAY_ANIM(args.myTarget, "oddjobs@assassinate@bus@", "base", NORMAL_BLEND_IN, FAST_BLEND_OUT, -1, AF_LOOPING)
ENDIF
ENDPROC
PROC REMOVE_FILLER_BUSES()
IF DOES_ENTITY_EXIST(tempBus1)
DELETE_VEHICLE(tempBus1)
PRINTLN("tempBus1")
ENDIF
IF DOES_ENTITY_EXIST(tempBus2)
DELETE_VEHICLE(tempBus2)
PRINTLN("tempBus2")
ENDIF
ENDPROC
PROC FILL_LOT_WITH_ADDITIONAL_BUSES(ASS_TARGET_DATA& targetData)
tempBus1 = CREATE_VEHICLE(targetData.vehEnum, << 439.7705, -571.9359, 27.5068 >>, 325)
// SET_VEHICLE_TYRES_CAN_BURST(tempBus1, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(tempBus1)
tempBus2 = CREATE_VEHICLE(targetData.vehEnum, << 406.7046, -625.4039, 27.5068 >>, 91)
// SET_VEHICLE_TYRES_CAN_BURST(tempBus2, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(tempBus2)
ENDPROC
FUNC BOOL FILL_LOT_WITH_AMBIENT_PEDS(ASS_TARGET_DATA& targetData)
IF NOT DOES_ENTITY_EXIST(pedBusLotScenarios[3])
REQUEST_MODEL(targetData.auxPedEnum)
REQUEST_MODEL(targetData.otherPedEnum)
REQUEST_MODEL(A_M_M_EASTSA_01)
IF HAS_MODEL_LOADED(targetData.auxPedEnum)
AND HAS_MODEL_LOADED(targetData.otherPedEnum)
AND HAS_MODEL_LOADED(A_M_M_EASTSA_01)
IF NOT DOES_ENTITY_EXIST(pedBusLotScenarios[0])
pedBusLotScenarios[0] = CREATE_PED(PEDTYPE_CIVMALE, A_M_M_EASTSA_01, << 435.07727, -650.21936, 27.74271 >>, 85.9928)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[0], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[0], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[0], INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[0], INT_TO_ENUM(PED_COMPONENT,4), 1, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[0], INT_TO_ENUM(PED_COMPONENT,10), 1, 1, 0) //(decl)
IF DOES_SCENARIO_EXIST_IN_AREA(<< 435.07727, -650.21936, 27.74271 >>, 2.0, TRUE)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedBusLotScenarios[0], << 435.07727, -650.21936, 27.74271 >>, 2.0, -1)
ELSE
TASK_WANDER_STANDARD(pedBusLotScenarios[0])
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(pedBusLotScenarios[1])
pedBusLotScenarios[1] = CREATE_PED(PEDTYPE_CIVMALE, targetData.auxPedEnum, << 436.31714, -642.88324, 27.73943 >>, 32.8396)
IF DOES_SCENARIO_EXIST_IN_AREA(<< 436.31714, -642.88324, 27.73943 >>, 2.0, TRUE)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedBusLotScenarios[1], << 436.31714, -642.88324, 27.73943 >>, 2.0, -1)
ELSE
TASK_WANDER_STANDARD(pedBusLotScenarios[1])
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(pedBusLotScenarios[2])
pedBusLotScenarios[2] = CREATE_PED(PEDTYPE_CIVMALE, targetData.otherPedEnum, << 435.65689, -645.55878, 27.73775 >>, 343.8998)
IF DOES_SCENARIO_EXIST_IN_AREA(<< 435.65689, -645.55878, 27.73775 >>, 2.0, TRUE)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedBusLotScenarios[2], << 435.65689, -645.55878, 27.73775 >>, 2.0, -1)
ELSE
TASK_WANDER_STANDARD(pedBusLotScenarios[2])
ENDIF
ENDIF
pedBusLotScenarios[3] = CREATE_PED(PEDTYPE_CIVMALE, A_M_M_EASTSA_01, << 436.68021, -629.73248, 27.71444 >>, 179.4746)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[1], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[1], INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[1], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(pedBusLotScenarios[1], INT_TO_ENUM(PED_COMPONENT,10), 1, 0, 0) //(decl)
IF DOES_SCENARIO_EXIST_IN_AREA(<< 436.68021, -629.73248, 27.71444 >>, 2.0, TRUE)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedBusLotScenarios[3], << 436.68021, -629.73248, 27.71444 >>, 2.0, -1)
ELSE
TASK_WANDER_STANDARD(pedBusLotScenarios[3])
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC RELEASE_AMBIENT_PEDS_IN_LOT()
IF DOES_ENTITY_EXIST(pedBusLotScenarios[0])
SET_PED_AS_NO_LONGER_NEEDED(pedBusLotScenarios[0])
ENDIF
IF DOES_ENTITY_EXIST(pedBusLotScenarios[1])
SET_PED_AS_NO_LONGER_NEEDED(pedBusLotScenarios[1])
ENDIF
IF DOES_ENTITY_EXIST(pedBusLotScenarios[2])
SET_PED_AS_NO_LONGER_NEEDED(pedBusLotScenarios[2])
ENDIF
IF DOES_ENTITY_EXIST(pedBusLotScenarios[3])
SET_PED_AS_NO_LONGER_NEEDED(pedBusLotScenarios[3])
ENDIF
ENDPROC
PROC SET_BUSES_IN_LOT_AS_NO_LONGER_NEEDED()
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), tempBus1)
SET_VEHICLE_AS_NO_LONGER_NEEDED(tempBus1)
ENDIF
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), tempBus2)
SET_VEHICLE_AS_NO_LONGER_NEEDED(tempBus2)
ENDIF
ENDPROC
PROC REMOVE_STREAMVOL_FOR_BUS_STOP_CUTSCENE()
IF STREAMVOL_IS_VALID(svBusStopCutscene)
STREAMVOL_DELETE(svBusStopCutscene)
bLoadSceneRequested = FALSE
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the loading and unloading of the bus stop cutscenes so that we make sure it is loaded in when close to the current bus stop and unloads if the player dirves away
PROC HANDLE_STREAMVOL_LOADING_UNLOADING_FOR_CURRENT_STOP(INT iCurStop)
IF NOT bLoadSceneRequested
IF GET_PLAYER_DISTANCE_FROM_LOCATION(busStop[iCurStop].vStopPos) <= DEFAULT_CUTSCENE_LOAD_DIST
IF NOT IS_VECTOR_ZERO(busStop[iCurStop].vStreamVolPos)
svBusStopCutscene = STREAMVOL_CREATE_FRUSTUM(busStop[iCurStop].vStreamVolPos, busStop[iCurStop].vStreamVolDir, 25, FLAG_MAPDATA)
IF iNumStopsVisited = 3
REQUEST_CUTSCENE("ASS_MCS_1")
SET_SRL_POST_CUTSCENE_CAMERA(<< 133.2094, -791.9310, 35.3551 >>, << -4.9404, 0.0000, 68.7852 >>)
PRINTLN("REQUESTING CUT SCENE - ASS_MCS_1 - 02")
ENDIF
bLoadSceneRequested = TRUE
ENDIF
ENDIF
ELSE
IF GET_PLAYER_DISTANCE_FROM_LOCATION(busStop[iCurStop].vStopPos) > DEFAULT_CUTSCENE_UNLOAD_DIST
REMOVE_STREAMVOL_FOR_BUS_STOP_CUTSCENE()
REMOVE_CUTSCENE()
ENDIF
ENDIF
ENDPROC
//create blips for active bus stops (ones that the player has not visited yet)
PROC CREATE_BUS_STOP_BLIPS()
INT tempInt
VECTOR tempVec
//only create blips for bus stops that the player has not visited yet
FOR tempInt = 0 TO NUM_BUS_STOPS - 1
IF busStop[tempInt].bActive = TRUE
IF NOT DOES_BLIP_EXIST(busStop[tempInt].blipStop)
PRINTLN("CREATING BLIP: ", tempInt)
//get position in street in front of the bus stop
tempVec = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(busStop[tempInt].vStopPos, busStop[tempInt].fStopHead, <<0,3,0>>)
busStop[tempInt].blipStop = CREATE_BLIP_FOR_COORD(tempVec, TRUE)
SET_BLIP_NAME_FROM_TEXT_FILE(busStop[tempInt].blipStop, busStop[tempInt].tlBlip )
ENDIF
ENDIF
ENDFOR
ENDPROC
//deblip any active bus stop blips
PROC REMOVE_BUS_STOP_BLIPS()
REMOVE_BLIP(busStop[0].blipStop)
REMOVE_BLIP(busStop[1].blipStop)
REMOVE_BLIP(busStop[2].blipStop)
REMOVE_BLIP(busStop[3].blipStop)
ENDPROC
PROC SET_TARGET_IN_GRAY_SUIT(ASS_ARGS& args)
IF NOT IS_PED_INJURED(args.myTarget)
SET_PED_COMPONENT_VARIATION(args.myTarget, INT_TO_ENUM(PED_COMPONENT,0), 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(args.myTarget, INT_TO_ENUM(PED_COMPONENT,2), 2, 2, 0) //(hair)
SET_PED_COMPONENT_VARIATION(args.myTarget, INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(args.myTarget, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
ENDIF
ENDPROC
//PROC HANDLE_BUS_PASSENGER_SPEECH_ABANDONING_ROUTE()
// SWITCH iAbandonLine
// CASE 0
// ENDSWITCH
//ENDPROC
//create peds for next stop, blip the stop, and set active
PROC ACTIVATE_NEXT_BUS_STOP(ASS_TARGET_DATA& targetData, ASS_ARGS& args, INT iStopToActivate, BOOL bAddBlip = TRUE)
busStop[iStopToActivate].bActive = TRUE
CREATE_BUS_PEDS_FOR_CURRENT_STOP(targetData, iStopToActivate)
//check to see if the next stop to activate should be the one that the target will be at
IF iStopToActivate = iBusStop
CREATE_TARGET_AT_BUS_STOP(targetData, args, iBusStop)
SET_TARGET_IN_GRAY_SUIT(args)
//enable target panic checks now that his visibility and collision have been restored and he has been teleported
args.bDoAssAggroChecks = TRUE
ENDIF
IF bAddBlip
CREATE_BUS_STOP_BLIPS()
ENDIF
// bClosingBusDoorsForCutscene = FALSE
ENDPROC
//shuffle the route so that it is different each time the script is launched
PROC CREATE_BUS_ROUTE(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
//hard code the route - Bug 483685 - [LB] route need to be more realistic.
iBusStopOrder[0] = 0
iBusStopOrder[1] = 1
iBusStopOrder[2] = 2
iBusStopOrder[3] = 3
iBusStop = iBusStopOrder[3]
ACTIVATE_NEXT_BUS_STOP(targetData, args, iBusStopOrder[0], FALSE)
ENDPROC
//spech timer stuff
PROC RESTART_ALL_SPEECH_TIMERS()
RESTART_TIMER_NOW(speechTimerFranklin)
RESTART_TIMER_NOW(speechDelayTimer)
RESTART_TIMER_NOW(speechTimerPassenger)
ENDPROC
PROC RESTART_FRANKLIN_SPEECH_TIMER_AND_ADVANCE_SPEECH_STAGE(INT iMinTime, INT iMaxTime)
iFranklinSpeechTime = GET_RANDOM_INT_IN_RANGE(iMinTime, iMaxTime)
RESTART_TIMER_NOW(speechTimerFranklin)
RESTART_TIMER_NOW(speechDelayTimer)
iFranklinChaseSpeech ++
ENDPROC
PROC RESTART_PASSENGER_SPEECH_TIMER_AND_ADVANCE_SPEECH_STAGE(INT iMinTime, INT iMaxTime)
iPassengerSpeechTime = GET_RANDOM_INT_IN_RANGE(iMinTime, iMaxTime)
RESTART_TIMER_NOW(speechTimerPassenger)
RESTART_TIMER_NOW(speechDelayTimer)
iPassengerChaseSpeech ++
ENDPROC
PROC RESTART_PASSENGER_SPEECH_TIMER_AND_ADVANCE_SPEECH_STAGE_PRE_CHASE(INT iMinTime, INT iMaxTime)
iPassengerSpeechTime = GET_RANDOM_INT_IN_RANGE(iMinTime, iMaxTime)
RESTART_TIMER_NOW(speechTimerPassengerPreChase)
iPassengerPreChaseSpeech++
ENDPROC
FUNC BOOL IS_PED_ALIVE_AND_IN_BUS(ASS_ARGS& args, PED_INDEX pedToCheck)
IF NOT IS_PED_INJURED(pedToCheck)
AND IS_PED_IN_VEHICLE(pedToCheck, args.myVehicle)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//player and target are involved in foot chase
PROC MANAGE_PASSENGER_PRE_CHASE_DIALOGUE(ASS_ARGS& args)
IF iNumStopsVisited = 0
PRINTLN("EXITING EARLY - iNumStopsVisited = 0")
EXIT
ENDIF
IF IS_TIMER_STARTED(speechTimerPassengerPreChase)
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
IF (GET_TIMER_IN_SECONDS(speechTimerPassengerPreChase) >= 7)
OR bFirstPress
SWITCH iPassengerPreChaseSpeech
CASE 0
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed4)
ADD_PED_FOR_DIALOGUE(args.assConv, 4, busPed4, "BusPed1")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_BCH1", CONV_PRIORITY_VERY_HIGH)
bFirstPress = FALSE
RESTART_TIMER_NOW(speechTimerPassengerPreChase)
iPassengerPreChaseSpeech = 1
PRINTLN("FIRST LINE IS PLAYED INSIDE BUS")
ELSE
PRINTLN("ADVANCING TO NEXT PRE-CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed4)")
ENDIF
BREAK
CASE 1
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed5)
ADD_PED_FOR_DIALOGUE(args.assConv, 5, busPed5, "BusPed2")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_BCH2", CONV_PRIORITY_VERY_HIGH)
RESTART_TIMER_NOW(speechTimerPassengerPreChase)
iPassengerPreChaseSpeech = 2
PRINTLN("SECOND LINE IS PLAYED INSIDE BUS")
ELSE
PRINTLN("ADVANCING TO NEXT PRE-CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed5)")
ENDIF
BREAK
CASE 2
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed6)
ADD_PED_FOR_DIALOGUE(args.assConv, 6, busPed6, "BusPed3")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_BCH3", CONV_PRIORITY_VERY_HIGH)
RESTART_TIMER_NOW(speechTimerPassengerPreChase)
iPassengerPreChaseSpeech = 3
PRINTLN("THIRD LINE IS PLAYED INSIDE BUS")
ELSE
PRINTLN("ADVANCING TO NEXT PRE-CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed6)")
ENDIF
BREAK
CASE 3
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed4)
ADD_PED_FOR_DIALOGUE(args.assConv, 4, busPed4, "BusPed1")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_BCH4", CONV_PRIORITY_VERY_HIGH)
RESTART_TIMER_NOW(speechTimerPassengerPreChase)
iPassengerPreChaseSpeech = 4
PRINTLN("FOURTH LINE IS PLAYED INSIDE BUS")
ELSE
PRINTLN("ADVANCING TO NEXT PRE-CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed4)")
ENDIF
BREAK
CASE 4
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed5)
ADD_PED_FOR_DIALOGUE(args.assConv, 5, busPed5, "BusPed2")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_BCH5", CONV_PRIORITY_VERY_HIGH)
RESTART_TIMER_NOW(speechTimerPassengerPreChase)
iPassengerPreChaseSpeech = 5
PRINTLN("FIFTH LINE IS PLAYED INSIDE BUS")
ELSE
PRINTLN("ADVANCING TO NEXT PRE-CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed5)")
ENDIF
BREAK
CASE 5
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed6)
ADD_PED_FOR_DIALOGUE(args.assConv, 6, busPed6, "BusPed3")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_BCH6", CONV_PRIORITY_VERY_HIGH)
RESTART_TIMER_NOW(speechTimerPassengerPreChase)
iPassengerPreChaseSpeech = 6
PRINTLN("SIXTH LINE IS PLAYED INSIDE BUS")
ELSE
PRINTLN("ADVANCING TO NEXT PRE-CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed6)")
ENDIF
BREAK
CASE 6
BREAK
ENDSWITCH
// RESTART_PASSENGER_SPEECH_TIMER_AND_ADVANCE_SPEECH_STAGE_PRE_CHASE(7, 14)
ENDIF
ENDIF
ENDIF
ELSE
START_TIMER_NOW(speechTimerPassengerPreChase)
PRINTLN("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!TIMER IS NOT STARTED, STARTING NOW!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
ENDIF
ENDPROC
PROC REMOVE_SPECIAL_HINT_CAM()
IF DOES_CAM_EXIST(camHint)
IF IS_CAM_ACTIVE(camHint)
SET_CAM_ACTIVE(camHint, FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DESTROY_CAM(camHint)
PRINTLN("DESTROYING CAMERA INSIDE BUS")
ENDIF
ENDIF
ENDPROC
PROC HANDLE_CINEMATIC_CAM(ASS_ARGS& args, BOOL bChaseIsOn = TRUE)
IF iNumStopsVisited = 0
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
IF IS_HELP_MESSAGE_ON_SCREEN()
CLEAR_HELP()
ENDIF
EXIT
ELSE
SET_CINEMATIC_BUTTON_ACTIVE(FALSE)
ENDIF
IF NOT bPrintCinematicHelp
IF iNumStopsVisited > 0
PRINT_HELP("ASS_HELP_02")
bPrintCinematicHelp = TRUE
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
bClearedHelp = FALSE
IF SHOULD_CONTROL_CHASE_HINT_CAM(localChaseHintCamStruct, TRUE, FALSE)
IF NOT bChaseIsOn
IF iPassengerPreChaseSpeech = 0
bFirstPress = TRUE
ENDIF
PRINTLN("CALLING - MANAGE_PASSENGER_PRE_CHASE_DIALOGUE")
MANAGE_PASSENGER_PRE_CHASE_DIALOGUE(args)
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_BUS_SCREAMS_INT_SCENE")
STOP_AUDIO_SCENE("ASSASSINATION_BUS_SCREAMS_INT_SCENE")
PRINTLN("CHASE IS NOT GOING, STOPPING AUDIO SCENE - ASSASSINATION_BUS_SCREAMS_INT_SCENE - 01")
ENDIF
ELSE
IF NOT IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_BUS_SCREAMS_INT_SCENE")
START_AUDIO_SCENE("ASSASSINATION_BUS_SCREAMS_INT_SCENE")
PRINTLN("CHASE IS ON STARTING AUDIO SCENE - ASSASSINATION_BUS_SCREAMS_INT_SCENE")
ENDIF
ENDIF
IF NOT DOES_CAM_EXIST(camHint)
camHint = CREATE_CAMERA(CAMTYPE_SCRIPTED)
SET_CAM_CONTROLS_MINI_MAP_HEADING(camHint, TRUE)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_HELP_02")
CLEAR_HELP()
ENDIF
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
IF bUsingBus
ATTACH_CAM_TO_ENTITY(camHint, args.myVehicle, <<0.0467, -6.4343, 1.5665>>)
POINT_CAM_AT_ENTITY(camHint, args.myVehicle, <<-0.0074, -3.4691, 1.1139>>)
PRINTLN("USING BUS INSIDE CAMERA POSITIONS")
ELIF bUsingCoach
ATTACH_CAM_TO_ENTITY(camHint, args.myVehicle, <<-0.0387, -5.3568, 0.8942>>)
POINT_CAM_AT_ENTITY(camHint, args.myVehicle, <<0.0245, -2.4095, 0.3379>>)
PRINTLN("USING COACH INSIDE CAMERA POSITIONS")
ELSE
ATTACH_CAM_TO_ENTITY(camHint, args.myVehicle, <<0.0467, -6.4343, 1.5665>>)
POINT_CAM_AT_ENTITY(camHint, args.myVehicle, <<-0.0074, -3.4691, 1.1139>>)
PRINTLN("USING DEFAULTS INSIDE CAMERA POSITIONS")
ENDIF
SET_CAM_FOV(camHint, 35.0)
PRINTLN("CREATING CAMERA INSIDE BUS")
ENDIF
IF NOT IS_CAM_ACTIVE(camHint)
SET_CAM_ACTIVE(camHint, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
PRINTLN("SETTING CAMERA ACTIVE AND RENDERING")
ENDIF
ELSE
IF DOES_CAM_EXIST(camHint)
IF IS_CAM_ACTIVE(camHint)
SET_CAM_ACTIVE(camHint, FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
// DISPLAY_RADAR(TRUE)
DESTROY_CAM(camHint)
PRINTLN("DESTROYING CAMERA INSIDE BUS")
CASCADE_SHADOWS_INIT_SESSION()
IF IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_BUS_SCREAMS_INT_SCENE")
STOP_AUDIO_SCENE("ASSASSINATION_BUS_SCREAMS_INT_SCENE")
PRINTLN("TOGGLE CAM IS OFF, STOPPING AUDIO SCENE - ASSASSINATION_BUS_SCREAMS_INT_SCENE - 02")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bClearedHelp
CLEAR_HELP()
PRINTLN("CLEARING HELP - OUT OF BUS")
bClearedHelp = TRUE
ENDIF
REMOVE_SPECIAL_HINT_CAM()
ENDIF
ENDIF
ENDPROC
PROC PLAY_SCREAM_FROM_RANDOM_BUS_PASSENGER(VEHICLE_INDEX vehToCheck, BOOL bForcePanicScream = FALSE)
IF NOT IS_TIMER_STARTED(tScreamTimer)
RESTART_TIMER_NOW(tScreamTimer)
ENDIF
IF GET_TIMER_IN_SECONDS(tScreamTimer) > fScreamTime
INT iSeat = GET_RANDOM_INT_IN_RANGE(0, 8)
INT iReason = GET_RANDOM_INT_IN_RANGE(0, 2)
PED_INDEX pedScream
IF IS_VEHICLE_DRIVEABLE(vehToCheck)
pedScream = GET_PED_IN_VEHICLE_SEAT(vehToCheck, INT_TO_ENUM(VEHICLE_SEAT, iSeat))
IF NOT IS_PED_INJURED(pedScream)
IF NOT bForcePanicScream
IF iReason = 0
PLAY_PAIN(pedScream, AUD_DAMAGE_REASON_SCREAM_SHOCKED)
ELIF iReason = 1
PLAY_PAIN(pedScream, AUD_DAMAGE_REASON_SCREAM_TERROR)
ELIF iReason = 2
PLAY_PAIN(pedScream, AUD_DAMAGE_REASON_SCREAM_PANIC)
ENDIF
// ELSE
// PLAY_PAIN(pedScream, AUD_DAMAGE_REASON_SCREAM_PANIC) //set this up so coders can easily diagnose byg 1067458 0 disable this after the bug is fixed
ENDIF
ENDIF
ENDIF
fScreamTime = GET_RANDOM_FLOAT_IN_RANGE(0, 3)
RESTART_TIMER_NOW(tScreamTimer)
ENDIF
// PRINTLN("fScreamTime = ", fScreamTime)
ENDPROC
PROC UPDATE_BUS_PASSENGER_ANIMS(ASS_ARGS& args, BOOL bRunAnimations = TRUE)
INT idx
PED_INDEX tempPed
IF NOT bRunAnimations
bTaskedPassengers = FALSE
PRINTLN("WE'RE NO LONGER RUNNING ANIMATIONS, SETTING bTaskedPassengers = FALSE")
ENDIF
REQUEST_ANIM_DICT("veh@bus@passenger@rds@idle_panic")
REQUEST_ANIM_DICT("veh@bus@passenger@rps@idle_panic")
IF NOT bReactionAnimsLoaded
IF HAS_ANIM_DICT_LOADED("veh@bus@passenger@rds@idle_panic")
AND HAS_ANIM_DICT_LOADED("veh@bus@passenger@rps@idle_panic")
bReactionAnimsLoaded = TRUE
PRINTLN("bReactionAnimsLoaded = TRUE")
ELSE
PRINTLN("WAITING ON BUS PANIC ANIMATIONS")
ENDIF
ENDIF
IF NOT bTriggerEraticAnimations
IF NOT IS_ENTITY_DEAD(args.myVehicle) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(args.myVehicle) OR IS_PED_SHOOTING(PLAYER_PED_ID())
bTriggerEraticAnimations = TRUE
PRINTLN("bTriggerEraticAnimations = TRUE")
ENDIF
ENDIF
ENDIF
IF bReactionAnimsLoaded AND bTriggerEraticAnimations
IF NOT bTaskedPassengers
REPEAT NUM_BUS_SEATS idx
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, idx)) <> NULL
tempPed = GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, idx))
IF NOT bRunAnimations
IF GET_RANDOM_INT_IN_RANGE() % 3 < 1 // 33% chance to clear tasks
IF IS_ENTITY_PLAYING_ANIM(tempPed, "veh@bus@passenger@rds@idle_panic", "sit")
OR IS_ENTITY_PLAYING_ANIM(tempPed, "veh@bus@passenger@rps@idle_panic", "sit")
CLEAR_PED_TASKS(tempPed)
PRINTLN("CLEARING PED TASKS")
ENDIF
ENDIF
ENDIF
IF bRunAnimations
IF idx % 2 = 0 //we know they are on the driver's side
TASK_PLAY_ANIM(tempPed, "veh@bus@passenger@rps@idle_panic", "sit", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE())
PRINTLN("TASKING PASSENGER TO PLAY ANIMATION: rps@idle_panic. SEAT: ", idx)
ELSE
TASK_PLAY_ANIM(tempPed, "veh@bus@passenger@rds@idle_panic", "sit", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE())
PRINTLN("TASKING PASSENGER TO PLAY ANIMATION: rds@idle_panic. SEAT: ", idx)
ENDIF
// ELSE
// IF IS_ENTITY_PLAYING_ANIM(tempPed, "veh@bus@passenger@rds@idle_panic", "sit")
// CLEAR_PED_TASKS(tempPed)
// PRINTLN("CLEARING PED TASKS - 0")
// ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
PRINTLN("SETTING bTaskedPassengers = TRUE")
bTaskedPassengers = TRUE
ENDIF
IF bRunAnimations
PLAY_SCREAM_FROM_RANDOM_BUS_PASSENGER(args.myVehicle)
IF NOT IS_AUDIO_SCENE_ACTIVE("ASSASSINATION_BUS_SCREAMS_EXT_SCENE")
START_AUDIO_SCENE("ASSASSINATION_BUS_SCREAMS_EXT_SCENE")
PRINTLN("STARING AUDIO SCENE - ASSASSINATION_BUS_SCREAMS_EXT_SCENE")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SETUP_BUS_PASSENGERS_FOR_DIALOGUE(ASS_ARGS& args)
PED_INDEX tempPed
INT tempInt
//initialize these
iNumBusPeds = 0
//check all possible bus seats before setting up passsenger peds for dialogue
REPEAT NUM_BUS_SEATS tempInt
IF iNumBusPeds < 4
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, tempInt)) <> NULL
tempPed = GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, tempInt))
IF iNumBusPeds = 0
ADD_PED_FOR_DIALOGUE(args.assConv, 4, tempPed, "BusPed1")
busPed4 = tempPed
PRINTLN("Bus ped in seat ", tempInt, " added as busPed4 to dialogue.")
iNumBusPeds++
ELIF iNumBusPeds = 1
ADD_PED_FOR_DIALOGUE(args.assConv, 5, tempPed, "BusPed2")
busPed5 = tempPed
PRINTLN("Bus ped in seat ", tempInt, " added as busPed5 to dialogue.")
iNumBusPeds++
ELIF iNumBusPeds = 2
ADD_PED_FOR_DIALOGUE(args.assConv, 6, tempPed, "BusPed3")
busPed6 = tempPed
PRINTLN("Bus ped in seat ", tempInt, " added as busPed6 to dialogue.")
iNumBusPeds++
ELIF iNumBusPeds = 3
ADD_PED_FOR_DIALOGUE(args.assConv, 7, tempPed, "BusPed4")
busPed7 = busPed7
busPed7 = tempPed
PRINTLN("Bus ped in seat ", tempInt, " added as busPed7 to dialogue.")
iNumBusPeds++
ENDIF
ELSE
PRINTLN("No ped in bus seat ", tempInt)
ENDIF
ENDIF
ENDIF
ENDREPEAT
PRINTLN("iNumBusPeds = ", iNumBusPeds)
ENDPROC
//Handle Franklin's banter as he driving the bus chasing the target on his bike
PROC MANAGE_FRANKLIN_CHASE_SPEECH_IN_BUS(ASS_ARGS& args)
SWITCH iFranklinChaseSpeech
CASE 0
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_SPOT", CONV_PRIORITY_VERY_HIGH)
BREAK
CASE 1
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_CHAS1", CONV_PRIORITY_VERY_HIGH)
BREAK
CASE 2
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_CHAS2", CONV_PRIORITY_VERY_HIGH)
BREAK
CASE 3
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_CHAS3", CONV_PRIORITY_VERY_HIGH)
BREAK
CASE 4
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_CHAS4", CONV_PRIORITY_VERY_HIGH)
BREAK
CASE 5
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_CHAS5", CONV_PRIORITY_VERY_HIGH)
BREAK
CASE 6
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_CHAS6", CONV_PRIORITY_VERY_HIGH)
BREAK
ENDSWITCH
RESTART_FRANKLIN_SPEECH_TIMER_AND_ADVANCE_SPEECH_STAGE(6,12)
ENDPROC
//passengers panicking as player is chasing the target
PROC MANAGE_PASSENGER_CHASE_DIALOGUE(ASS_ARGS& args)
IF IS_TIMER_STARTED(speechTimerPassenger)
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
IF GET_TIMER_IN_SECONDS(speechTimerPassenger) >= iPassengerSpeechTime
SWITCH iPassengerChaseSpeech
CASE 0
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed4)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_PASS1", CONV_PRIORITY_VERY_HIGH)
ENDIF
BREAK
CASE 1
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed5)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_PASS2", CONV_PRIORITY_VERY_HIGH)
ELSE
PRINTLN("ADVANCING TO NEXT CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed5)")
ENDIF
BREAK
CASE 2
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed6)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_PASS3", CONV_PRIORITY_VERY_HIGH)
ELSE
PRINTLN("ADVANCING TO NEXT CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed6)")
ENDIF
BREAK
CASE 3
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed4)
ADD_PED_FOR_DIALOGUE(args.assConv, 6, busPed4, "BusPed3")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_ARGUE", CONV_PRIORITY_VERY_HIGH)
ELSE
PRINTLN("ADVANCING TO NEXT CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed4)!!!!")
ENDIF
BREAK
CASE 4
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed4)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_PASS4", CONV_PRIORITY_VERY_HIGH)
ELSE
PRINTLN("ADVANCING TO NEXT CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed4)")
ENDIF
BREAK
CASE 5
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed5)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_PASS5", CONV_PRIORITY_VERY_HIGH)
ELSE
PRINTLN("ADVANCING TO NEXT CHASE DIALOGUE STAGE - IS_PED_INJURED(busPed5)")
ENDIF
BREAK
ENDSWITCH
RESTART_PASSENGER_SPEECH_TIMER_AND_ADVANCE_SPEECH_STAGE(10, 20)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//speech reactions for a ped on the bus after the player damages it
PROC MANAGE_BUS_PED_SPEECH_FOR_DAMAGED_BUS(ASS_ARGS& args)
INT tempHealth = GET_ENTITY_HEALTH(args.myVehicle)
SWITCH iBusHealthSpeech
CASE 0
IF GET_VEHICLE_NUMBER_OF_PASSENGERS(args.myVehicle) >= 2
iLastBusHealthChecked = GET_ENTITY_HEALTH(args.myVehicle)
iBusHealthSpeech++
ENDIF
BREAK
CASE 1
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF tempHealth < iLastBusHealthChecked - 50
OR HAS_ENTITY_COLLIDED_WITH_ANYTHING(args.myVehicle)
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed4)
ADD_PED_FOR_DIALOGUE(args.assConv, 4, busPed4, "BusPed1")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_DMG4", CONV_PRIORITY_VERY_HIGH)
iLastBusHealthChecked = tempHealth
iBusHealthSpeech++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF tempHealth < iLastBusHealthChecked - 150
OR HAS_ENTITY_COLLIDED_WITH_ANYTHING(args.myVehicle)
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed5)
ADD_PED_FOR_DIALOGUE(args.assConv, 5, busPed5, "BusPed2")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_DMG5", CONV_PRIORITY_VERY_HIGH)
iLastBusHealthChecked = tempHealth
iBusHealthSpeech++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF tempHealth < iLastBusHealthChecked - 200
OR HAS_ENTITY_COLLIDED_WITH_ANYTHING(args.myVehicle)
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed6)
ADD_PED_FOR_DIALOGUE(args.assConv, 6, busPed6, "BusPed3")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_DMG6", CONV_PRIORITY_VERY_HIGH)
iLastBusHealthChecked = tempHealth
iBusHealthSpeech++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
//speech reactions for a ped on the bus after the player damages it
PROC MANAGE_BUS_PED_SPEECH_FOR_HITTING_PEDS(ASS_ARGS& args)
INT iRand
IF iNumInnocentsDead > 0
SWITCH iPassengerReactionSpeech
CASE 0
iRand = GET_RANDOM_INT_IN_RANGE() % 2
PRINTLN("iRand = ", iRand)
IF iRand = 0
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed4)
ADD_PED_FOR_DIALOGUE(args.assConv, 4, busPed4, "BusPed1")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_DMG", CONV_PRIORITY_VERY_HIGH)
iNumDeadMsg = iNumInnocentsDead
iPassengerReactionSpeech++
PRINTLN("PLAYING CONVO - OJASbs_DMG")
ENDIF
ELSE
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed6)
ADD_PED_FOR_DIALOGUE(args.assConv, 6, busPed6, "BusPed3")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_DMG3", CONV_PRIORITY_VERY_HIGH)
iNumDeadMsg = iNumInnocentsDead
iPassengerReactionSpeech++
PRINTLN("PLAYING CONVO - OJASbs_DMG3")
ENDIF
ENDIF
BREAK
CASE 1
IF iNumInnocentsDead > iNumDeadMsg
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed5)
ADD_PED_FOR_DIALOGUE(args.assConv, 5, busPed5, "BusPed2")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_DMG2", CONV_PRIORITY_VERY_HIGH)
iNumDeadMsg = iNumInnocentsDead
iPassengerReactionSpeech++
ENDIF
ENDIF
BREAK
CASE 3
BREAK
ENDSWITCH
ENDIF
ENDPROC
//manage the bus ped dialogue when the player damages the bus or runs people over
PROC MANAGE_PASSENGER_EVENT_DIALOGUE(ASS_ARGS& args)
// INT iRound
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF IS_TIMER_STARTED(speechTimerPassenger)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
IF iNumStopsVisited <> 0 //player has already visited a bus stop and there are passengers on the bus
// iRound = ROUND(GET_TIMER_IN_SECONDS(speechTimerPassenger))
//
// IF iRound % 2 = 0
MANAGE_BUS_PED_SPEECH_FOR_DAMAGED_BUS(args)
// ELSE
MANAGE_BUS_PED_SPEECH_FOR_HITTING_PEDS(args)
// ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
START_TIMER_NOW(speechTimerPassenger)
ENDIF
ENDIF
ENDPROC
//player and target are involved in foot chase
PROC MANAGE_FOOT_CHASE_DIALOGUE(ASS_ARGS& args)
IF NOT bBailMsgPlayed
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myVehicle) < 20
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_BAIL", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
bBailMsgPlayed = TRUE
ENDIF
ELSE
IF NOT IS_PED_INJURED(args.myTarget)
IF NOT IS_PED_IN_ANY_VEHICLE(args.myTarget)
IF GET_TIMER_IN_SECONDS(speechTimerFranklin) >= iFranklinSpeechTime
IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 50
AND GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) > 10
SWITCH iFootChaseSpeech
CASE 0
ADD_PED_FOR_DIALOGUE(args.assConv, 3, args.myTarget, "INVESTOR")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_FOOT2", CONV_PRIORITY_VERY_HIGH)
BREAK
CASE 1
IF NOT bCutsceneSkipped
IF GET_TIMER_IN_SECONDS(speechTimerFranklin) >= iFranklinSpeechTime
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_FOOT3", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
BREAK
CASE 2
IF GET_TIMER_IN_SECONDS(speechTimerFranklin) >= iFranklinSpeechTime
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_FOOT4", CONV_PRIORITY_VERY_HIGH)
ENDIF
BREAK
CASE 3
IF GET_TIMER_IN_SECONDS(speechTimerFranklin) >= iFranklinSpeechTime
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_FOOT5", CONV_PRIORITY_VERY_HIGH)
ENDIF
BREAK
CASE 4
IF GET_TIMER_IN_SECONDS(speechTimerFranklin) >= iFranklinSpeechTime
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_FOOT6", CONV_PRIORITY_VERY_HIGH)
ENDIF
BREAK
ENDSWITCH
RESTART_TIMER_NOW(speechTimerFranklin)
iFootChaseSpeech++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//Manage all bus dialogue for mission
PROC MANAGE_BUS_DIALOGUE(ASS_ARGS& args)
FLOAT fBusSpeed
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_TIMER_STARTED(speechDelayTimer)
IF GET_TIMER_IN_SECONDS(speechDelayTimer) > 5
IF bTargetFleeing
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
fBusSpeed = GET_ENTITY_SPEED(args.myVehicle)
IF fBusSpeed > 10
IF NOT IS_PED_INJURED(args.myTarget)
IF GET_TIMER_IN_SECONDS(speechTimerFranklin) >= iFranklinSpeechTime
AND GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) <= 50
IF IS_VEHICLE_DRIVEABLE(args.myOtherVehicle)
IF IS_PED_IN_VEHICLE(args.myTarget, args.myOtherVehicle)
//play lines that Franklin says while chasing the target
MANAGE_FRANKLIN_CHASE_SPEECH_IN_BUS(args)
ELSE
IF NOT bOffBikeMsgPlayed
//play the line "my shift is up bitches"
PLAY_SINGLE_LINE_FROM_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_FOOT", "OJASbs_FOOT_1", CONV_PRIORITY_VERY_HIGH)
RESTART_FRANKLIN_SPEECH_TIMER_AND_ADVANCE_SPEECH_STAGE(3, 12)
bOffBikeMsgPlayed = TRUE
ENDIF
ENDIF
ENDIF
ELIF GET_TIMER_IN_SECONDS(speechTimerPassenger) >= iPassengerSpeechTime
//play lines of passengers panicking
MANAGE_PASSENGER_CHASE_DIALOGUE(args)
ENDIF
ENDIF
ENDIF
ELSE
//play lines of Franklin yelling at the target while chasing on foot
MANAGE_FOOT_CHASE_DIALOGUE(args)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
RESTART_TIMER_NOW(speechDelayTimer)
ENDIF
//play lines for when the player runs over peds or damages the bus
MANAGE_PASSENGER_EVENT_DIALOGUE(args)
ENDIF
ENDPROC
////throttles peds leaving vehicle. they should exit one at a time when the bus is travling at a slow enough speed for the ped to exit safely
//PROC TASK_BUS_PEDS_TO_EXIT_VEHICLE_WHEN_SAFE(ASS_ARGS& args)
// PED_INDEX tempPed
// INT tempInt
// SEQUENCE_INDEX tempSeq
//
// IF NOT IS_TIMER_STARTED(passengerExitTimer)
// START_TIMER_NOW(passengerExitTimer)
// ELIF GET_TIMER_IN_SECONDS(passengerExitTimer) > 2
// IF NOT bPassengersLeftBus
//
// IF bBailMsgPlayed
// OR IS_PED_INJURED(args.myTarget)
// IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
// IF GET_ENTITY_SPEED(args.myVehicle) <= 2
// IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
// FOR tempInt = 0 to NUM_BUS_SEATS - 1
// tempPed = GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, tempInt))
// IF tempPed <> NULL
//
// SET_PED_DESIRED_MOVE_BLEND_RATIO(tempPed, PEDMOVEBLENDRATIO_RUN)
// SET_PED_KEEP_TASK(tempPed, TRUE)
//
// IF NOT IS_PED_INJURED(tempPed)
// CLEAR_SEQUENCE_TASK(tempSeq)
// OPEN_SEQUENCE_TASK(tempSeq)
// TASK_LEAVE_VEHICLE(NULL, args.myVehicle)
// TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)
// CLOSE_SEQUENCE_TASK(tempSeq)
// TASK_PERFORM_SEQUENCE(tempPed, tempSeq)
// CLEAR_SEQUENCE_TASK(tempSeq)
// ENDIF
//
// PRINTLN("TASKING PASSENGERS TO LEAVE THE BUS - SAFE")
//
// //exit out since we want to stagger guys leaving and not all at once
// RESTART_TIMER_NOW(passengerExitTimer)
// EXIT
// ENDIF
//
// //flip the bool to no longer check this once we've gone through all the seats
// IF tempInt = NUM_BUS_SEATS - 1
// bPassengersLeftBus = TRUE
// ENDIF
// ENDFOR
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ENDIF
//ENDPROC
//PROC TASK_BUS_PEDS_TO_EXIT_VEHICLE(ASS_ARGS& args)
// PED_INDEX pedBusPassengers
// INT tempInt
// SEQUENCE_INDEX tempSeq
//
// PRINTLN("INSIDE - TASK_BUS_PEDS_TO_EXIT_VEHICLE")
//
// FOR tempInt = 0 to NUM_BUS_SEATS - 1
// IF NOT IS_ENTITY_DEAD(args.myVehicle)
// pedBusPassengers = GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, tempInt))
//
// IF pedBusPassengers <> NULL
// IF NOT IS_ENTITY_DEAD(pedBusPassengers)
// SET_PED_DESIRED_MOVE_BLEND_RATIO(pedBusPassengers, PEDMOVEBLENDRATIO_RUN)
// SET_PED_KEEP_TASK(pedBusPassengers, TRUE)
//
// IF NOT IS_PED_INJURED(pedBusPassengers)
// CLEAR_SEQUENCE_TASK(tempSeq)
// OPEN_SEQUENCE_TASK(tempSeq)
// TASK_LEAVE_VEHICLE(NULL, args.myVehicle)
// TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)
// CLOSE_SEQUENCE_TASK(tempSeq)
// TASK_PERFORM_SEQUENCE(pedBusPassengers, tempSeq)
// CLEAR_SEQUENCE_TASK(tempSeq)
// ENDIF
//
//// PRINTLN("TASKING PASSENGERS TO JUMP OUT")
// ENDIF
// ENDIF
// ENDIF
// ENDFOR
//
//ENDPROC
//PROC SET_BUS_PASSENGERS_TO_HATE_PLAYER(ASS_ARGS& args)
// INT tempInt
// PED_INDEX tempPed
//
// IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
// REPEAT NUM_BUS_SEATS tempInt
// tempPed = GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, tempInt))
// IF tempPed <> NULL
// IF NOT IS_PED_INJURED(tempPed)
// SET_PED_COMBAT_ATTRIBUTES(tempPed, CA_LEAVE_VEHICLES, FALSE)
// SET_PED_RELATIONSHIP_GROUP_HASH(tempPed, RELGROUPHASH_HATES_PLAYER)
// PRINTLN("PED IN BUS SEAT ", tempInt, "HATES PLAYER AND IS SET TO COMBAT THEM")
// ENDIF
// ENDIF
// ENDREPEAT
// ENDIF
//ENDPROC
//PROC MAKE_BUS_PEDS_LEAVE_BUS(VEHICLE_INDEX veh, BOOL bOneAtATime = TRUE)
// INT tempInt
// PED_INDEX tempPed
// SEQUENCE_INDEX tempSeq
//
// IF IS_VEHICLE_DRIVEABLE(veh)
// IF GET_ENTITY_SPEED(veh) < 5
// FOR tempInt = 0 to NUM_BUS_SEATS - 1
// tempPed = GET_PED_IN_VEHICLE_SEAT(veh, INT_TO_ENUM(VEHICLE_SEAT, tempInt))
// IF tempPed <> NULL
// IF NOT IS_PED_INJURED(tempPed)
// SET_PED_COMBAT_ATTRIBUTES(tempPed, CA_LEAVE_VEHICLES, TRUE)
// RESTART_TIMER_NOW(passengerExitTimer)
// IF bOneAtATime
// EXIT
// ELSE
// OPEN_SEQUENCE_TASK(tempSeq)
// TASK_LEAVE_ANY_VEHICLE(NULL)
// TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 200, -1)
// CLOSE_SEQUENCE_TASK(tempSeq)
// TASK_PERFORM_SEQUENCE(tempPed, tempSeq)
// CLEAR_SEQUENCE_TASK(tempSeq)
// ENDIF
// ENDIF
// ENDIF
// ENDFOR
// ENDIF
// ENDIF
//ENDPROC
PROC TASK_PLAYER_TO_KILL_TARGET(ASS_ARGS& args, BOOL bDisplayEvenIfConversationOngoing = FALSE)
IF NOT DOES_BLIP_EXIST(args.myTargetBlip)
IF NOT IS_PED_INJURED(args.myTarget)
IF bDisplayEvenIfConversationOngoing
OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
REMOVE_BLIP(args.myTargetBlip)
REMOVE_BUS_STOP_BLIPS()
IF DOES_BLIP_EXIST(args.mytargetblip)
REMOVE_BLIP(args.mytargetblip)
ENDIF
args.myTargetBlip = ADD_BLIP_FOR_ENTITY(args.myTarget)
PRINT_NOW("ASS_BS_KILL", DEFAULT_GOD_TEXT_TIME, 1)
RESTART_ALL_SPEECH_TIMERS()
ENDIF
ENDIF
ENDIF
ENDPROC
//PURPOSE: Controls Rubberbanding on the Target's Vehicle when fleeing the player on his bike
PROC ADJUST_TARGETS_VEHICLE_PLAYBACK_SPEED(PED_INDEX pedToCheck, VEHICLE_INDEX vehToAdjust)
FLOAT fDistBetweenPlayerAndAI //, fSpeed
INT iCurRecordingProgress
IF NOT IS_TIMER_STARTED(playbackTimer)
START_TIMER_NOW(playbackTimer)
ENDIF
// ONLY UPDATE EVERY OTHER SECOND
IF GET_TIMER_IN_SECONDS(playbackTimer) > 1
fDistBetweenPlayerAndAI = GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck)
IF DOES_ENTITY_EXIST(pedToCheck) AND IS_VEHICLE_DRIVEABLE(vehToAdjust)
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(vehToAdjust)
// Check if the player and target are far away
//FOR REFERENCE - last time I checked (6/25/13) fBikeNormalSpeed = 22.916668
IF fDistBetweenPlayerAndAI > 150
fDesiredBikeSpeed = 10
ELIF fDistBetweenPlayerAndAI < 100 AND fDistBetweenPlayerAndAI > 75
fDesiredBikeSpeed = 11
ELIF fDistBetweenPlayerAndAI < 75 AND fDistBetweenPlayerAndAI > 50
fDesiredBikeSpeed = 12
ELIF fDistBetweenPlayerAndAI < 50 AND fDistBetweenPlayerAndAI > 35
fDesiredBikeSpeed = 13
ELIF fDistBetweenPlayerAndAI < 35
fDesiredBikeSpeed = 14
ENDIF
// adjust scaling of rubberbanding based on the target's progress in their current playback
iCurRecordingProgress = GET_VEHICLE_WAYPOINT_PROGRESS(vehToAdjust)
FLOAT fCurRecordingProgress = TO_FLOAT(iCurRecordingProgress)
FLOAT fRecordingTime = TO_FLOAT(iRecordingTime)
//scale down bike desired speed even more if the vehicle is over X% through the waypoint path
//special case to always keep the ped at at least regular speed for the jump moment through the mall so that he has enough speed to make it
IF iBusStop = 3
AND fCurRecordingProgress >= fRecordingTime * 0.625
AND fCurRecordingProgress <= fRecordingTime * 0.75
IF fDesiredBikeSpeed < fBikeNormalSpeed
fDesiredBikeSpeed = fBikeNormalSpeed
ENDIF
ELSE
IF fCurRecordingProgress > fRecordingTime * 0.75
IF fDesiredBikeSpeed > fBikeNormalSpeed - (fBikeNormalSpeed * 0.15)
fDesiredBikeSpeed = fBikeNormalSpeed - (fBikeNormalSpeed * 0.15)
ENDIF
ELIF fCurRecordingProgress > fRecordingTime * 0.5
IF fDesiredBikeSpeed > fBikeNormalSpeed - (fBikeNormalSpeed * 0.05)
fDesiredBikeSpeed = fBikeNormalSpeed - (fBikeNormalSpeed * 0.05)
ENDIF
ENDIF
ENDIF
IF fDesiredBikeSpeed <> 0
SET_DRIVE_TASK_CRUISE_SPEED(pedToCheck, fDesiredBikeSpeed)
// fSpeed = GET_ENTITY_SPEED(pedToCheck)
// PRINTLN("fSpeed = ", fSpeed)
// PRINTLN("iBusStop = ", iBusStop, " fCurRecordingProgress = ", fCurRecordingProgress, " fRecordingTime = ", fRecordingTime, " progression is: ", fCurRecordingProgress / fRecordingTime)
// PRINTLN("TARGET'S DESIRED BIKE SPEED IS: ", fDesiredBikeSpeed)
// PRINTLN("fDistBetweenPlayerAndAI = ", fDistBetweenPlayerAndAI)
ENDIF
ENDIF
ENDIF
ELIF GET_TIMER_IN_SECONDS(playbackTimer) >= 2.0
RESTART_TIMER_NOW(playbackTimer)
ENDIF
ENDPROC
FUNC BOOL IS_BIKE_SAFE_FOR_TARGET(ASS_ARGS& args)
IF NOT IS_ENTITY_DEAD(args.myVehicle) AND NOT IS_ENTITY_DEAD(args.myOtherVehicle)
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF IS_VEHICLE_DRIVEABLE(args.myOtherVehicle)
IF GET_ENTITY_DISTANCE_FROM_LOCATION(args.myOtherVehicle, busStop[iBusStop].vVehPos) > 5
OR IS_ENTITY_TOUCHING_ENTITY(args.myVehicle, args.myOtherVehicle)
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE: Sets up a quick camera cut of a camera shot located to the left of Franklin's head
PROC SHOW_CAM_INSIDE_BUS(ASS_ARGS& args)
IF NOT DOES_CAM_EXIST(busCam)
busCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, GET_FINAL_RENDERED_CAM_COORD(), GET_FINAL_RENDERED_CAM_ROT(), 35, FALSE)
ENDIF
IF NOT DOES_CAM_EXIST(busCam2)
busCam2 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, GET_FINAL_RENDERED_CAM_COORD(), GET_FINAL_RENDERED_CAM_ROT(), 34, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
AND NOT IS_ENTITY_DEAD(args.myVehicle)
IF bUsingBus
ATTACH_CAM_TO_ENTITY(busCam, args.myVehicle, <<-1.7004, 5.5826, 1.0005>>)
POINT_CAM_AT_ENTITY(busCam, args.myVehicle, <<1.2599, 5.9690, 0.7051>>)
PRINTLN("USING BUS CAMERA POSITIONS")
ELIF bUsingCoach
ATTACH_CAM_TO_ENTITY(busCam, args.myVehicle, <<-1.6144, 4.8097, 0.4117>>)
POINT_CAM_AT_ENTITY(busCam, args.myVehicle, <<1.3280, 4.7560, -0.1711>>)
PRINTLN("USING COACH CAMERA POSITIONS")
ELSE
ATTACH_CAM_TO_ENTITY(busCam, args.myVehicle, <<-1.7004, 5.5826, 1.0005>>)
POINT_CAM_AT_ENTITY(busCam, args.myVehicle, <<1.2599, 5.9690, 0.7051>>)
PRINTLN("USING DEFAULT BUS CAMERA POSITIONS")
ENDIF
SET_CAM_NEAR_CLIP(busCam, 0.55)
SET_CAM_ACTIVE(busCam, TRUE)
ENDIF
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.3)
RENDER_SCRIPT_CAMS(TRUE,FALSE)
ENDPROC
PROC KILL_BUS_CUTSCENE_AND_RESTORE_PLAYER_CONTROL(ASS_ARGS& args)
//kill cutscene cams and restore control back to the player as the target flees on his bike
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ODDJOB_EXIT_CUTSCENE()
DO_SCREEN_FADE_IN(500)
FREEZE_ENTITY_POSITION(args.myVehicle, FALSE)
PRINTLN("SETTING bDoneFlash = FALSE")
bDoneFlash = FALSE
//no longer force loading around cutscene coords
CLEAR_FOCUS()
ENDPROC
FUNC PED_INDEX GET_PED_CLOSEST_TO_BUS_DOORS(VECTOR vBusEntryPoint, INT busStopInt)
PED_INDEX ped
FLOAT fDist
FLOAT fClosestDist = 1000 //arbitrary high number
INT i
//find passenger closest to bus door position
FOR i = 0 TO 2
IF NOT IS_ENTITY_DEAD(busStop[busStopInt].piAmbPed[i])
fDist = GET_ENTITY_DISTANCE_FROM_LOCATION(busStop[busStopInt].piAmbPed[i], vBusEntryPoint)
IF fDist < fClosestDist
ped = busStop[busStopInt].piAmbPed[i]
fClosestDist = fDist
ENDIF
ENDIF
ENDFOR
RETURN ped
ENDFUNC
//position the bus passenger peds outside of the bus doors
PROC LINE_UP_PASSENGERS_OUTSIDE_BUS_DOORS(ASS_ARGS& args, INT busStopInt)
VECTOR tempVec
PED_INDEX pedClosest
VECTOR vPlayer
FLOAT fPlayer
FLOAT fHeight
FLOAT fTempHead
fTempHead = busStop[busStopInt].fStopHead
//get player pos and heading for bus door pos calculations
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayer = GET_ENTITY_COORDS(PLAYER_PED_ID())
fPlayer = GET_ENTITY_HEADING(PLAYER_PED_ID())
ENDIF
IF bUsingBus
tempVec = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vPlayer, fPlayer, << 2.519, 5.6, 0.1098 >>)
GET_GROUND_Z_FOR_3D_COORD(tempVec, fHeight)
ELIF bUsingCoach
tempVec = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vPlayer, fPlayer, << 2.519, 5.6, 0.1098 >>)
GET_GROUND_Z_FOR_3D_COORD(tempVec, fHeight)
ENDIF
//Find ped currently closest to bus doors so that we can position them at the bus doors for the next cutscene shot.
//In the case where the bus is not oriented correctly, grab the ped furthest away so that you don't see the closest ped warping in the cutscene
IF busStopInt = iBusStop
pedClosest = args.myTarget
ELSE
pedClosest = GET_PED_CLOSEST_TO_BUS_DOORS(vBusDoorPos, busStopInt)
ENDIF
//line up front ped in line outside the bus doors
IF NOT IS_PED_INJURED(pedClosest)
CLEAR_PED_TASKS_IMMEDIATELY(pedClosest)
SET_ENTITY_COORDS(pedClosest, << tempVec.x, tempVec.y, fHeight >>)
SET_ENTITY_HEADING(pedClosest, fTempHead)
ENDIF
ENDPROC
//since bus enter/exit anims only work for the first 4 seats, we need to warp peds to seats in the back to keep the front ones free until the bus is full
PROC WARP_PASSENGERS_INTO_FREE_SEATS(ASS_ARGS& args, INT busStopInt)
INT i
INT iSeatNum
FOR i = 0 TO 2 //only have the first 3 peds enter the bus due to limited seating on the vehicle
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF NOT IS_PED_INJURED(busStop[busStopInt].piAmbPed[i])
CLEAR_PED_TASKS(busStop[busStopInt].piAmbPed[i])
PRINTLN("ASSIGNING SEAT DATA BASED ON iNumStopsVisited. iNumStopsVisited = ", iNumStopsVisited)
//assign seat data
IF iNumStopsVisited = 1
IF i = 0
iSeatNum = 3
ELIF i = 1
iSeatNum = 4
ELIF i = 2
iSeatNum = 5
ENDIF
ELIF iNumStopsVisited = 2
IF i = 0
iSeatNum = 6
ELIF i = 1
iSeatNum = 7
ELIF i = 2
iSeatNum = 8
ENDIF
ELIF iNumStopsVisited = 3
IF i = 0
iSeatNum = 0
ELIF i = 1
iSeatNum = 1
ELIF i = 2
iSeatNum = 2
ENDIF
ENDIF
IF IS_VEHICLE_SEAT_FREE(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, iSeatNum))
SET_PED_INTO_VEHICLE(busStop[busStopInt].piAmbPed[i], args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, iSeatNum))
PRINTLN("SETTING PED INTO VEHICLE")
ELSE
PRINTLN("UNABLE TO SET PED INTO FREE SEAT BECAUSE SEAT NUMBER ", INT_TO_ENUM(VEHICLE_SEAT, iSeatNum), " IS OCCUPIED!")
ENDIF
ENDIF
ENDIF
ENDFOR
ENDPROC
//peds standing outside bus doors turn to watch the target as he flees the scene
PROC TASK_PASSENGERS_OUTSIDE_BUS_TO_LOOK_AT_TARGET(PED_INDEX pedToLookAt, INT busStopInt)
INT i
SEQUENCE_INDEX tempSeq
STRING sAnimName
IF NOT IS_PED_INJURED(pedToLookAt)
FOR i = 0 TO 2
IF NOT IS_PED_INJURED(busStop[busStopInt].piAmbPed[i])
IF i = 0
sAnimName = "give_me_a_break"
ELIF i = 1
sAnimName = "numbnuts"
ELSE
sAnimName = "threaten"
ENDIF
CLEAR_PED_TASKS(busStop[busStopInt].piAmbPed[i])
OPEN_SEQUENCE_TASK(tempSeq)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, pedToLookAt)
TASK_PLAY_ANIM(NULL, "misscommon@response", sAnimName)
TASK_WANDER_STANDARD(NULL)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(busStop[busStopInt].piAmbPed[i], tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
ENDIF
ENDFOR
ENDIF
ENDPROC
PROC CLOSE_BUS_DOORS(VEHICLE_INDEX busVeh, BOOL bShutInstantly = TRUE)
IF IS_VEHICLE_DRIVEABLE(busVeh)
SET_VEHICLE_DOOR_SHUT(busVeh, SC_DOOR_FRONT_RIGHT, bShutInstantly)
SET_VEHICLE_DOOR_SHUT(busVeh, SC_DOOR_FRONT_LEFT, bShutInstantly)
PRINTLN("CLOSING BUS DOORS")
ENDIF
ENDPROC
PROC OPEN_BUS_DOORS(VEHICLE_INDEX busVeh)
IF IS_VEHICLE_DRIVEABLE(busVeh)
IF NOT bUsingCoach //to fix assert about no door since there is only one for this vehicle
SET_VEHICLE_DOOR_OPEN(busVeh, SC_DOOR_FRONT_RIGHT)
ENDIF
SET_VEHICLE_DOOR_OPEN(busVeh, SC_DOOR_FRONT_LEFT)
PRINTLN("OPENING BUS DOORS")
ENDIF
ENDPROC
PROC CUTSCENE_PREPARATION()//(ASS_ARGS& args, ASS_TARGET_DATA& targetData)
pedOldLady = CREATE_PED(PEDTYPE_CIVFEMALE, A_F_O_GENSTREET_01, << 110.6556, -776.3679, 30.4390 >>, 346.1708)
SET_PED_COMPONENT_VARIATION(pedOldLady, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(pedOldLady, INT_TO_ENUM(PED_COMPONENT,2), 1, 2, 0) //(hair)
SET_PED_COMPONENT_VARIATION(pedOldLady, INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(pedOldLady, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(pedOldLady, INT_TO_ENUM(PED_COMPONENT,8), 1, 2, 0) //(accs)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedOldLady, TRUE)
// args.myOtherVehicle = CREATE_VEHICLE(targetData.otherVehEnum, busStop[iBusStop].vVehPos, busStop[iBusStop].fVehHead)
ENDPROC
//handle all necessities for bus and passengers when coming out of a cutscene
PROC READY_BUS_AND_PASSENGERS_FOR_NEXT_STAGE_AND_EXIT_CUTSCENE(ASS_ARGS& args, INT busStopInt)
bRunDistanceToStop = TRUE
iRunAlternateStage = 0
//reset this to allow player to run over a ped on the way to next stop w/o being penalized
iNumInnocentsDead = 0
//re-init this
iBusCutsceneStage = 0
//increment num stops visited
iNumStopsVisited ++
PRINTLN("iNumStopsVisited = ", iNumStopsVisited)
bGrabbedDistanceToNextStop = FALSE
PRINTLN("SETTING - bGrabbedDistanceToNextStop = FALSE")
IF iNumStopsVisited = 2
CUTSCENE_PREPARATION()//(args, targetData)
ENDIF
WARP_PASSENGERS_INTO_FREE_SEATS(args, busStopInt)
SETUP_BUS_PASSENGERS_FOR_DIALOGUE(args)
KILL_BUS_CUTSCENE_AND_RESTORE_PLAYER_CONTROL(args)
CLOSE_BUS_DOORS(args.myVehicle)
REMOVE_STREAMVOL_FOR_BUS_STOP_CUTSCENE()
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE)
CASCADE_SHADOWS_INIT_SESSION()
ENDPROC
PROC TASK_PED_TO_START_WAYPOINT_RECORDING_ON_BIKE(PED_INDEX pedToFlee, VEHICLE_INDEX vehToUse)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(pedToFlee, vehToUse, "OJASbs_102", DF_SwerveAroundAllCars|DF_SteerAroundObjects|DF_SteerAroundPeds, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE)
vCombatPos = << -455.28925, -326.13641, 41.22218 >>
WAYPOINT_RECORDING_GET_NUM_POINTS("OJASbs_102", iRecordingTime)
PRINTLN("START_TARGET_PLAYBACK_ON_BIKE: TASKING PED TO USE WAYPOINT RECORDING, BUS STOP 3")
SET_ENTITY_LOAD_COLLISION_FLAG(pedToFlee, TRUE)
fBikeNormalSpeed = GET_VEHICLE_ESTIMATED_MAX_SPEED(vehToUse)
PRINTLN("fBikeNormalSpeed = ", fBikeNormalSpeed)
MODIFY_VEHICLE_TOP_SPEED(vehToUse, (fBikeTopSpeedModifier * 100)) //allow the bike to achieve speeds faster than its default
SET_PED_COMBAT_ATTRIBUTES(pedToFlee, CA_LEAVE_VEHICLES, TRUE)
SET_VEHICLE_FORWARD_SPEED(vehToUse, 1.5)
ENDPROC
PROC START_TARGET_PLAYBACK_ON_BIKE(PED_INDEX& pedToFlee, VEHICLE_INDEX& vehToUse)
PRINTLN("START_TARGET_PLAYBACK_ON_BIKE BEING CALLED")
//have target start vehicle recording
IF IS_VEHICLE_DRIVEABLE(vehToUse)
IF NOT IS_PED_INJURED(pedToFlee)
IF IS_PED_IN_VEHICLE(pedToFlee, vehToUse)
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(vehToUse)
TASK_PED_TO_START_WAYPOINT_RECORDING_ON_BIKE(pedToFlee, vehToUse)
bTargetFleeing = TRUE
ELSE
PRINTLN("START_TARGET_PLAYBACK_ON_BIKE: WAYPOINT RECORDING IS GOING")
ENDIF
ELSE
PRINTLN("START_TARGET_PLAYBACK_ON_BIKE: PED IS NOT IN THE VEHICLE")
ENDIF
ELSE
PRINTLN("START_TARGET_PLAYBACK_ON_BIKE: PED IS INJURED")
ENDIF
ELSE
PRINTLN("START_TARGET_PLAYBACK_ON_BIKE: VEHICLE IS NOT DRIVEABLE")
ENDIF
ENDPROC
//PROC RESET_BIKE_AND_TELEPORT_TARGET_NEAR_IT(PED_INDEX& pedToFlee, VEHICLE_INDEX& vehToUse)
// VECTOR vTargetWarp
// FLOAT fTargetHead
// FLOAT fTargetHeight
//
// IF iBusStop = 0
// vTargetWarp = << 301.6020, -758.9800, 28.3159 >>
// fTargetHead = 340.3962
// ELIF iBusStop = 1
// vTargetWarp = << 361.2802, -1072.4950, 28.5595 >>
// fTargetHead = 264.2537
// ELIF iBusStop = 2
// IF bBusFacingCorrectly
// vTargetWarp = << 258.8023, -1120.3799, 28.3287 >>
// fTargetHead = 76.3996
// ELSE
// vTargetWarp = << 263.0038, -1123.6873, 28.2180 >>
// fTargetHead = 56.2486
// ENDIF
// ELIF iBusStop = 3
// IF bBusFacingCorrectly
// vTargetWarp = << 110.2194, -775.8312, 30.4426 >>
// fTargetHead = 77.2454
// ELSE
// vTargetWarp = << 116.2432, -779.7109, 30.4000 >>
// fTargetHead = 79.7910
// ENDIF
// ENDIF
//
// GET_GROUND_Z_FOR_3D_COORD(vTargetWarp, fTargetHeight)
// IF fTargetHeight = 0
// fTargetHeight = busStop[iBusStop].vVehPos.z
// ENDIF
//
// IF NOT IS_PED_INJURED(pedToFlee)
// CLEAR_AREA_OF_OBJECTS(busStop[iBusStop].vVehPos, 10)
// CLEAR_PED_TASKS(pedToFlee)
// SET_ENTITY_COORDS(pedToFlee, <<vTargetWarp.x, vTargetWarp.y, fTargetHeight>>)
// SET_ENTITY_HEADING(pedToFlee, fTargetHead)
// PRINTLN("SETTING TARGET POS AND ROTATION DATA TO << ", vTargetWarp.x, " ", vTargetWarp.y, " ", fTargetHeight, " >> , ", busStop[iBusStop].fVehHead)
// IF IS_VEHICLE_DRIVEABLE(vehToUse)
// SET_ENTITY_COORDS(vehToUse, busStop[iBusStop].vVehPos)
// SET_ENTITY_HEADING(vehToUse, busStop[iBusStop].fVehHead)
// SET_VEHICLE_ON_GROUND_PROPERLY(vehToUse)
// SET_VEHICLE_FIXED(vehToUse)
// ENDIF
// ENDIF
//ENDPROC
//Look at the player's approach angle at the bus stop and reposition him for the cutscene parallel to the bus stop either facing one way or the other
PROC REPOSITION_BUS_BASED_ON_PLAYER_APPROACH_ANGLE(ASS_ARGS& args, INT busStopInt, BOOL bTask = TRUE)
FLOAT fWarpHeight
VECTOR vOffset = <<0,-3,0>>
CLEAR_PED_TASKS(PLAYER_PED_ID())
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(args.myVehicle)
VEHICLE_WAYPOINT_PLAYBACK_PAUSE(args.myVehicle)
PRINTLN("PAUSING PLAYBACK ON WAYPOINT")
ENDIF
IF busStopInt = 0 //closest to station
vBusWarpPos = << 308.0244, -765.3675, 29.2651 >>
fBusWarpHead = 160.6500
vBusPreWarpPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBusWarpPos, fBusWarpHead, vOffset)
PRINTLN("REPOSTION: busStopInt = 0")
ELIF busStopInt = 1 //railroad tracks
vBusWarpPos = <<355.0645, -1064.2660, 28.3992>>
fBusWarpHead = 269.7723
vBusPreWarpPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBusWarpPos, fBusWarpHead, vOffset)
PRINTLN("REPOSTION: busStopInt = 1")
ELIF busStopInt = 2 //near freeway
vBusWarpPos = << 265.4390, -1125.0682, 29.2194 >>
fBusWarpHead = 88.8280
vBusPreWarpPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBusWarpPos, fBusWarpHead, vOffset)
PRINTLN("REPOSTION: busStopInt = 2")
ELIF busStopInt = 3 //through the mall escape path
vBusWarpPos = << 115.0176, -785.3170, 31.3490 >>
fBusWarpHead = 68.7612
vBusPreWarpPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBusWarpPos, fBusWarpHead, vOffset)
PRINTLN("REPOSTION: busStopInt = 3")
ENDIF
//reposition the player to the new correct location
GET_GROUND_Z_FOR_3D_COORD(vBusWarpPos, fWarpHeight)
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vBusPreWarpPos)
PRINTLN("WARPING BUS TO POSITION = ", vBusPreWarpPos)
SET_ENTITY_HEADING(args.myVehicle, fBusWarpHead)
SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle)
// FREEZE_ENTITY_POSITION(args.myVehicle, TRUE)
SET_VEHICLE_FORWARD_SPEED(args.myVehicle, 5.0)
SET_VEHICLE_FIXED(args.myVehicle)
IF bUsingBus
vBusDoorPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBusWarpPos, fBusWarpHead, << 2, 5.6201, 0.1098 >>)
PRINTLN("USING BUS: vBusDoorPos = ", << 2, 5.6201, 0.1098 >>)
ELIF bUsingCoach
vBusDoorPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBusWarpPos, fBusWarpHead, << 2, 5.6201, 0.1098 >>)
PRINTLN("USING COACH: vBusDoorPos = ", << 2, 5.6201, 0.1098 >>)
ENDIF
//have Franklin look at peds as they enter the bus
IF bTask
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), vBusDoorPos, 5000)
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the entity exists and is not dead.
/// PARAMS:
/// mEntity - the entity we are checking.
/// RETURNS:
/// True if the entity exists and is not dead.
FUNC BOOL IS_ENTITY_ALIVE(ENTITY_INDEX mEntity)
IF DOES_ENTITY_EXIST(mEntity)
IF NOT IS_ENTITY_DEAD(mEntity)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC ASSASSINATION_PRE_REQUEST_CUTSCENE()
PLAYER_INDEX pId = GET_PLAYER_INDEX()
IF NOT IS_PLAYER_DEAD(pId)
// Stop player control and remove anything we dont want in the area
SET_PLAYER_CONTROL(pId, FALSE, SPC_REMOVE_EXPLOSIONS)
SET_PLAYER_CONTROL(pId, FALSE, SPC_REMOVE_PROJECTILES)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles entering cutscenes. Turns player control off, disables phone
/// Clears area of peds, clears wanted level, hides radar + HUD, Clears Prints + Help
/// Puts widescreen borders on, handles hiding player's weapon
/// repositions player's last vehicle, fades in
/// PARAMS:
/// vTriggerLocation - where is the cutscene taking place
/// vMoveToLocation - where do you want to move the player's last vehicle to
/// fMoveToHeading - the heading for the player's last vehicle
/// bUseWidescreenBorders - TRUE turn widescreen borders on
/// bPutPlayerWeaponAway - TRUE handle hiding the player's weapon
/// bFadeIn = should we fade the screen in?
/// bClearPeds = do we want to clear the nearby area of peds
PROC ASSASSINATION_START_CUTSCENE_MODE(VECTOR vTriggerLocation, VECTOR vMoveToLocation, FLOAT fMoveToHeading, BOOL bUseWidescreenBorders = TRUE, BOOL bPutPlayerWeaponAway = TRUE, BOOL bFadeIn = TRUE, BOOL bClearPeds = TRUE)
PLAYER_INDEX pId = GET_PLAYER_INDEX()
IF IS_PLAYER_PLAYING(pId)
PRINTSTRING("......")PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING(": ")PRINTSTRING("RC_START_CUTSCENE_MODE")PRINTNL()
ASSASSINATION_PRE_REQUEST_CUTSCENE()
REMOVE_PLAYER_HELMET(GET_PLAYER_INDEX(), FALSE) // remove player's bike helmet if he has one
IF bClearPeds = TRUE // Clear area around player
CLEAR_AREA_OF_PEDS(GET_PLAYER_COORDS(GET_PLAYER_INDEX()), 50.0)
ENDIF
// clear the cut-scene area of projectiles and objects
CLEAR_AREA_OF_OBJECTS(vTriggerLocation, 30.0)
CLEAR_AREA_OF_PROJECTILES(vTriggerLocation, 30.0)
// Clear the player's wanted level
SET_PLAYER_WANTED_LEVEL(pId,0)
SET_PLAYER_WANTED_LEVEL_NOW(pId)
// Stop anyone from attacking the player
SET_EVERYONE_IGNORE_PLAYER(pId, TRUE)
// Remove radar and HUD
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
// Clear objective and help text
CLEAR_PRINTS()
CLEAR_HELP()
// Widescreen borders option
IF bUseWidescreenBorders = TRUE
SET_WIDESCREEN_BORDERS(TRUE, 0)
ENDIF
// Automatically put the player's weapon away
IF bPutPlayerWeaponAway = TRUE
mPlayerWeapon = WEAPONTYPE_INVALID
IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) // remove player's weapon
mPlayerWeapon = GET_SELECTED_PED_WEAPON(PLAYER_PED_ID()) // store current weapon
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
ENDIF
ENDIF
// move the player's last vehicle if it is in way of cutscene, and clear area of vehicles
// only do this if the player isn't in the car
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// if trigger location or move location is set to 0,0,0 we won't move the car
// as this must be a special case cut-scene
IF NOT ARE_VECTORS_EQUAL(vTriggerLocation, <<0.0,0.0,0.0>>)
AND NOT ARE_VECTORS_EQUAL(vMoveToLocation, <<0.0,0.0,0.0>>)
PRINTSTRING("......")PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING(": ")PRINTSTRING("Repositioning the player's last vehicle")PRINTNL()
printnl()PRINTVECTOR(vMoveToLocation)PRINTNL()
// RESOLVE_VEHICLES_AT_MISSION_TRIGGER_WITH_LOCATION(vTriggerLocation, vMoveToLocation, fMoveToHeading)
fMoveToHeading = fMoveToHeading
ENDIF
ENDIF
IF bFadeIn = TRUE
// SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles delaying a cutscene until it's loaded, the last line of dialogue has finished, and the player's car has been halted.
/// NOTE: The player's control will be disabled whilst this is called.
FUNC BOOL ASSASSINATION_IS_CUTSCENE_OK_TO_START(BOOL check_for_cutscene_loaded = TRUE, FLOAT stopping_distance = 10.0)
BOOL b_cutscene_ok_to_start = TRUE // See B*649704 - we need to do all this stuff rather than return false as soon as a condition returns false
REQUEST_CUTSCENE("ASS_MCS_1")
SET_SRL_POST_CUTSCENE_CAMERA(<< 133.2094, -791.9310, 35.3551 >>, << -4.9404, 0.0000, 68.7852 >>)
PRINTLN("REQUESTING CUT SCENE - ASS_MCS_1 - 01")
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), stopping_distance, 1)
b_cutscene_ok_to_start = FALSE
ENDIF
IF NOT IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
b_cutscene_ok_to_start = FALSE
ENDIF
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
ENDIF
IF check_for_cutscene_loaded = TRUE
IF NOT HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
b_cutscene_ok_to_start = FALSE
ENDIF
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
b_cutscene_ok_to_start = FALSE
ENDIF
IF b_cutscene_ok_to_start = FALSE
RETURN FALSE
ENDIF
IF IS_SCRIPTED_CONVERSATION_ONGOING() // Double check to make sure any conversations are killed
STOP_SCRIPTED_CONVERSATION(FALSE)
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Handles exiting cutscenes.
/// shows radar + HUD, Clears Help, turns player control back on, re-enables phone
/// Puts widescreen borders off, handles re-eqipping player's weapon
/// PARAMS:
/// bUseWidescreenBorders - TRUE turn widescreen borders off
/// bReEquipPlayerWeapon - TRUE = reequip the weapon the player had before the cut-scene
PROC ASSASSINATION_END_CUTSCENE_MODE(BOOL bUseWidescreenBorders = TRUE, BOOL bReEquipPlayerWeapon= TRUE)
PLAYER_INDEX pId = GET_PLAYER_INDEX()
PRINTSTRING("......")PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING(": ")PRINTSTRING("RC_END_CUTSCENE_MODE")PRINTNL()
SET_EVERYONE_IGNORE_PLAYER(pId, FALSE)
SET_PLAYER_CONTROL(pId, TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
CLEAR_HELP()
IF bUseWidescreenBorders = TRUE
SET_WIDESCREEN_BORDERS(FALSE, 0)
ENDIF
IF bReEquipPlayerWeapon = TRUE
IF mPlayerWeapon <> WEAPONTYPE_INVALID
AND mPlayerWeapon <> WEAPONTYPE_OBJECT
AND mPlayerWeapon <> GADGETTYPE_PARACHUTE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) // put player's stored weapon back in his hand
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), mPlayerWeapon, FALSE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_OLD_LADY()
IF NOT bTaskedOldLady
IF NOT IS_PED_INJURED(pedOldLady)
CLEAR_PED_TASKS(pedOldLady)
TASK_PLAY_ANIM(pedOldLady, "oddjobs@assassinate@bus@", "looking_for_help", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
PLAY_PAIN(pedOldLady, AUD_DAMAGE_REASON_SCREAM_SHOCKED)
PRINTLN("TASKING OLD LADY TO PLAY POST CUTSCENE ANIMATION")
bTaskedOldLady = TRUE
ENDIF
ELSE
IF DOES_ENTITY_EXIST(pedOldLady)
IF DO_AGGRO_CHECK(pedOldLady, NULL, aggroArgs, aggroReason, FALSE, FALSE)
IF GET_SCRIPT_TASK_STATUS(pedOldLady, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK
CLEAR_PED_TASKS(pedOldLady)
TASK_SMART_FLEE_PED(pedOldLady, PLAYER_PED_ID(), 1000, -1)
PRINTLN("TASKING OLD LADY TO FLEE THE PLAYER")
ENDIF
ENDIF
IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedOldLady) > 100
IF NOT IS_ENTITY_ON_SCREEN(pedOldLady)
OR IS_ENTITY_OCCLUDED(pedOldLady)
DELETE_PED(pedOldLady)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MAINTAIN_CUTSCENE_PEDS(ASS_ARGS& args, BOOL bHide)
IF bHide
PRINTLN("bHide = TRUE")
ELSE
PRINTLN("bHide = FALSE")
ENDIF
SET_ENTITY_VISIBLE(args.myTarget, bHide)
SET_ENTITY_VISIBLE(pedOldLady, bHide)
SET_ENTITY_VISIBLE(args.myVehicle, bHide)
SET_ENTITY_VISIBLE(args.myOtherVehicle, bHide)
// SET_ENTITY_VISIBLE(PLAYER_PED_ID(), bHide)
ENDPROC
PROC PLAY_TARGET_FLEE_CUTSCENE_MOCAP(PED_INDEX& pedToFlee, ASS_ARGS& args)//, ASS_TARGET_DATA& targetData)
// PRINTLN("INSIDE - PLAY_TARGET_FLEE_CUTSCENE_MOCAP")
SWITCH iMocapBusSceneStage
CASE 0
// IF TIMERA() > 2000
IF ASSASSINATION_IS_CUTSCENE_OK_TO_START(TRUE, 3.0)
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
//remove the previous streamvol request
REMOVE_STREAMVOL_FOR_BUS_STOP_CUTSCENE()
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE)
CASCADE_SHADOWS_INIT_SESSION()
IF NOT IS_ENTITY_DEAD(args.myVehicle)
SET_VEHICLE_USE_PLAYER_LIGHT_SETTINGS(args.myVehicle, TRUE)
PRINTLN("SETTING - SET_VEHICLE_USE_PLAYER_LIGHT_SETTINGS - TRUE")
ENDIF
OPEN_BUS_DOORS(args.myVehicle)
// Register the player
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
// Register target
IF NOT IS_ENTITY_DEAD(pedToFlee)
REGISTER_ENTITY_FOR_CUTSCENE(pedToFlee, "Mugger", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(pedToFlee))
ENDIF
// Register old lady
IF NOT IS_ENTITY_DEAD(pedOldLady)
REGISTER_ENTITY_FOR_CUTSCENE(pedOldLady, "Mugging_Victim", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, A_F_O_GENSTREET_01)
ENDIF
// Register bus
IF NOT IS_ENTITY_DEAD(args.myVehicle)
IF bUsingCoach
REGISTER_ENTITY_FOR_CUTSCENE(args.myVehicle, "Franklins_Coach", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, COACH)
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Franklins_Bus", CU_DONT_ANIMATE_ENTITY, BUS)
PRINTLN("REGISTERING COACH BUS")
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(args.myVehicle, "Franklins_Bus", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, BUS)
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Franklins_Coach", CU_DONT_ANIMATE_ENTITY, COACH)
PRINTLN("REGISTERING BUS")
ENDIF
ENDIF
// Register bike
IF NOT IS_ENTITY_DEAD(args.myOtherVehicle)
REGISTER_ENTITY_FOR_CUTSCENE(args.myOtherVehicle, "Stolen_Bike", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, scorcher)
ENDIF
START_CUTSCENE()
PRINTLN("STARTING CUTSCENE")
ASSASSINATION_START_CUTSCENE_MODE(<< 102.7480, -782.9255, 35.7965 >>, << 102.7480, -782.9255, 35.7965 >>, 0)
iMocapBusSceneStage++
ELSE
PRINTLN("CAN NOT START CUT SCENE!!!")
ENDIF
// ENDIF
BREAK
//---------------------------------------------------------------------------------------------------------------------
CASE 1
IF IS_CUTSCENE_PLAYING()
IF g_bShitskipAccepted
DO_SCREEN_FADE_IN(500)
ENDIF
IF DOES_CAM_EXIST(busCam) AND IS_CAM_ACTIVE(busCam)
SET_CAM_ACTIVE(busCam, FALSE)
DESTROY_CAM(busCam)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
PRINTLN("DESTROYING CAM 01 - busCam")
ELSE
IF DOES_CAM_EXIST(busCam)
DESTROY_CAM(busCam)
PRINTLN("DESTROYING CAM 02 - busCam")
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(pedToFlee) AND NOT IS_PED_INJURED(pedToFlee)
AND IS_VEHICLE_DRIVEABLE(args.myOtherVehicle)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Mugger")
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Stolen_Bike")
// SET_PED_INTO_VEHICLE(pedToFlee, args.myOtherVehicle)
TASK_ENTER_VEHICLE(pedToFlee, args.myOtherVehicle)
SET_PED_COMBAT_ATTRIBUTES(pedToFlee, CA_LEAVE_VEHICLES, FALSE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(pedToFlee, KNOCKOFFVEHICLE_HARD)
TASK_PED_TO_START_WAYPOINT_RECORDING_ON_BIKE(pedToFlee, args.myOtherVehicle)
bTargetFleeing = TRUE
PRINTLN("PUTTING GUY ON BIKE IN MOCAP SCENE")
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Mugging_Victim")
IF DOES_ENTITY_EXIST(pedOldLady) AND NOT IS_PED_INJURED(pedOldLady)
PRINTLN("OLD LADY IS OKAY TO EXIT?")
HANDLE_OLD_LADY()
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
AND DOES_ENTITY_EXIST(args.myVehicle) AND NOT IS_ENTITY_DEAD(args.myVehicle)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
// PRINTLN("OLD LADY IS OKAY TO EXIT?")
// HANDLE_OLD_LADY()
ENDIF
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
PRINTLN("CUTSCENE IS NO LONGER PLAYING")
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
ASSASSINATION_END_CUTSCENE_MODE()
IF NOT IS_PED_INJURED(pedToFlee)
IF DOES_ENTITY_EXIST(args.myOtherVehicle)
AND IS_VEHICLE_DRIVEABLE(args.myOtherVehicle)
// RESET_BIKE_AND_TELEPORT_TARGET_NEAR_IT(pedToFlee, vehToUse)
PRINTLN("args.myOtherVehicle exists and driveable - setting target on it!!")
SET_PED_INTO_VEHICLE(pedToFlee, args.myOtherVehicle)
SET_PED_COMBAT_ATTRIBUTES(pedToFlee, CA_LEAVE_VEHICLES, FALSE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(pedToFlee, KNOCKOFFVEHICLE_HARD)
ELSE
IF NOT DOES_ENTITY_EXIST(args.myOtherVehicle)
PRINTLN("args.myOtherVehicle Does not exist!!")
ELIF NOT IS_VEHICLE_DRIVEABLE(args.myOtherVehicle)
PRINTLN("args.myOtherVehicle Not driveable!!")
ENDIF
TASK_SMART_FLEE_PED(pedToFlee, PLAYER_PED_ID(), 500, -1)
PRINTLN("TARGET FLEEING ON FOOT! - 01")
ENDIF
ENDIF
START_TARGET_PLAYBACK_ON_BIKE(args.myTarget, args.myOtherVehicle)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ODDJOB_EXIT_CUTSCENE()
FREEZE_ENTITY_POSITION(args.myVehicle, FALSE)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAS_MCS1LO", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
TASK_PLAYER_TO_KILL_TARGET(args, TRUE)
PRINTLN("ADVANCING TO CASE 2 VIA PLAY_TARGET_FLEE_CUTSCENE_MOCAP")
iMocapBusSceneStage++
ENDIF
BREAK
//---------------------------------------------------------------------------------------------------------------------
CASE 2
TASK_PASSENGERS_OUTSIDE_BUS_TO_LOOK_AT_TARGET(args.myTarget, iBusStop)
CLOSE_BUS_DOORS(args.myVehicle)
IF NOT IS_ENTITY_DEAD(args.myVehicle)
SET_VEHICLE_USE_PLAYER_LIGHT_SETTINGS(args.myVehicle, FALSE)
PRINTLN("SETTING - SET_VEHICLE_USE_PLAYER_LIGHT_SETTINGS - FALSE")
ENDIF
missionStage = MISSION_BUS_UPDATE_BIKE
BREAK
ENDSWITCH
ENDPROC
//tell the target to leave the bike and run on foot
PROC TASK_TARGET_TO_FLEE_ON_FOOT(PED_INDEX pedToFlee)
SEQUENCE_INDEX tempSeq
IF NOT IS_ENTITY_DEAD(pedToFlee)
IF GET_SCRIPT_TASK_STATUS(pedToFlee, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(pedToFlee, SCRIPT_TASK_PERFORM_SEQUENCE) <> WAITING_TO_START_TASK
IF GET_ENTITY_DISTANCE_FROM_LOCATION(pedToFlee, vCombatPos) <= 50
CLEAR_SEQUENCE_TASK(tempSeq)
OPEN_SEQUENCE_TASK(tempSeq)
TASK_GO_TO_COORD_ANY_MEANS(NULL, vCombatPos, PEDMOVEBLENDRATIO_RUN, NULL)
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)
CLOSE_SEQUENCE_TASK(tempSeq)
TASK_PERFORM_SEQUENCE(pedToFlee, tempSeq)
CLEAR_SEQUENCE_TASK(tempSeq)
ELSE
TASK_SMART_FLEE_PED(pedToFlee, PLAYER_PED_ID(), 500, -1)
ENDIF
PRINTLN("missionStage = MISSION_BUS_FLEE_ON_FOOT")
missionStage = MISSION_BUS_FLEE_ON_FOOT
ENDIF
ENDIF
ENDPROC
//control the targets flee behavior based on their distance to the player and whether or not they are fleeing in a vehicle
PROC HANDLE_TARGET_FLEE_BEHAVIOR_ON_FOOT(ASS_ARGS& args)
// FLOAT fPlayerDistToTarget
IF NOT IS_PED_INJURED(args.myTarget)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// fPlayerDistToTarget = GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget)
// IF fPlayerDistToTarget < 5
// AND GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_UNARMED
// //have the target engage player in fist fight if player is curently unarmed
// IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_COMBAT) <> PERFORMING_TASK
// AND GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_COMBAT) <> WAITING_TO_START_TASK
// TASK_COMBAT_PED(args.myTarget, PLAYER_PED_ID())
// IF NOT bTargetBrawlMsg
// IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// AND NOT IS_MESSAGE_BEING_DISPLAYED()
// CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_BRAWL", CONV_PRIORITY_VERY_HIGH)
// bTargetBrawlMsg = TRUE
// ENDIF
// ENDIF
// ENDIF
// ELSE
IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_GO_TO_COORD_ANY_MEANS) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK
TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 500, -1)
PRINTLN("TARGET FLEEING ON FOOT! - 02")
ENDIF
//slow down the target's run speed on foot
SET_PED_MAX_MOVE_BLEND_RATIO(args.myTarget, PEDMOVE_RUN)
// ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) <> WAITING_TO_START_TASK
AND GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PERFORM_SEQUENCE) <> WAITING_TO_START_TASK
TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 500, -1)
PRINTLN("TARGET FLEEING ON FOOT! - 03")
ENDIF
ENDIF
ENDIF
TASK_PLAYER_TO_KILL_TARGET(args)
ENDPROC
PROC TARGET_FLEE_ON_BIKE(PED_INDEX pedToFlee, VEHICLE_INDEX vehToUse, ASS_ARGS& args)
IF IS_VEHICLE_DRIVEABLE(vehToUse)
IF NOT IS_ENTITY_DEAD(pedToFlee)
IF IS_PED_IN_ANY_VEHICLE(pedToFlee)
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(vehToUse)
PRINTLN("WAYPOINT RECORDING IS NOT GOING!!!!")
IF GET_SCRIPT_TASK_STATUS(pedToFlee, SCRIPT_TASK_LEAVE_VEHICLE) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(pedToFlee, SCRIPT_TASK_LEAVE_VEHICLE) <> WAITING_TO_START_TASK
TASK_LEAVE_VEHICLE(pedToFlee, vehToUse)
PRINTLN("TASKING TO LEAVE VEHICLE")
ENDIF
ELSE
//handle rubber banding
ADJUST_TARGETS_VEHICLE_PLAYBACK_SPEED(args.myTarget, args.myOtherVehicle)
// PRINTLN("WAYPOINT RECORDING IS GOING")
// PRINTLN("VEHICLES ESTIMATED MAX SPEED IS: ", GET_VEHICLE_ESTIMATED_MAX_SPEED(args.myOtherVehicle))
// PRINTLN("ACTUAL SPEED IS: ", GET_ENTITY_SPEED(args.myOtherVehicle))
ENDIF
// PRINTLN("SHOULD BE USING WAYPOINT PATH")
//handle the target's bike getting stuck
IF IS_VEHICLE_PERMANENTLY_STUCK(args.myOtherVehicle)
IF GET_SCRIPT_TASK_STATUS(pedToFlee, SCRIPT_TASK_LEAVE_VEHICLE) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(pedToFlee, SCRIPT_TASK_LEAVE_VEHICLE) <> WAITING_TO_START_TASK
TASK_LEAVE_VEHICLE(pedToFlee, vehToUse)
ENDIF
PRINTLN("VEHICLE STUCK TIMER UP!!! TASKING TARGET TO FLEE ON FOOT")
ENDIF
TASK_PLAYER_TO_KILL_TARGET(args)
ELSE
IF GET_SCRIPT_TASK_STATUS(pedToFlee, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(pedToFlee, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK
TASK_TARGET_TO_FLEE_ON_FOOT(pedToFlee)
PRINTLN("TARGET NOT ON SET VEHICLE")
ENDIF
ENDIF
ELSE
PRINTLN("TARGET_FLEE_ON_BIKE - PED IS DEAD")
ENDIF
ELSE
TASK_TARGET_TO_FLEE_ON_FOOT(pedToFlee)
PRINTLN("TARGET_FLEE_ON_BIKE - VEHICLE IS NOT DRIVEABLE")
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_SHOOTING_FROM_BUS()
IF bPlayerInBus
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_ARMED(PLAYER_PED_ID(), ENUM_TO_INT(WF_INCLUDE_GUN))
IF IS_PED_SHOOTING(PLAYER_PED_ID())
AND NOT IS_PED_CURRENT_WEAPON_SILENCED(PLAYER_PED_ID())
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_PLAYER_INJURED_BUS_STOP_PEDS(INT& iFrame)
PED_INDEX pedToCheck
INT tempInt
//determine which bus stop number is active
IF busStop[0].bActive
tempInt = 0
ELIF busStop[1].bActive
tempInt = 1
ELIF busStop[2].bActive
tempInt = 2
ELIF busStop[3].bActive
tempInt = 3
ENDIF
//only check one ped per frame
IF iFrame = 0
pedToCheck = busStop[tempInt].piAmbPed[0]
ELIF iFrame = 1
pedToCheck = busStop[tempInt].piAmbPed[1]
ELIF iFrame = 2
pedToCheck = busStop[tempInt].piAmbPed[2]
ENDIF
IF DOES_ENTITY_EXIST(pedToCheck)
IF NOT IS_PED_INJURED(pedToCheck)
IF DO_AGGRO_CHECK(pedToCheck, NULL, aggroArgs, aggroReason, FALSE, FALSE)
OR IS_PLAYER_SHOOTING_FROM_BUS()
PRINTLN("CHECKING STOP: ", tempInt)
PRINTLN("PLAYER AGGROD BUS STOP PED")
RETURN TRUE
ENDIF
ELSE
PRINTLN("HAS_PLAYER_INJURED_BUS_STOP_PEDS - PASSENGER DIED!!")
RETURN TRUE
ENDIF
ENDIF
//increment it by one - reset it if it exceeds the checks
iFrame ++
IF iFrame > 2
iFrame = 0
ENDIF
RETURN FALSE
ENDFUNC
// tell the peds to enter the bus and set up their dialogue info. - busStopInt should be the bus stop number to pass in to update
PROC TASK_CLOSEST_PED_TO_BUS_TO_WALK_TO_IT(ASS_ARGS& args, INT busStopInt)
PED_INDEX pedClosest
PRINTLN("TASK_CLOSEST_PED_TO_BUS_TO_WALK_TO_IT - busStopInt = ", busStopInt)
IF busStopInt = 1
pedClosest = GET_PED_CLOSEST_TO_BUS_DOORS(<< 360.98, -1068.01, 28.53 >>, busStopInt)
ELIF busStopInt = 3
pedClosest = args.myTarget
ELSE
pedClosest = GET_PED_CLOSEST_TO_BUS_DOORS(vBusDoorPos, busStopInt)
ENDIF
IF DOES_ENTITY_EXIST(pedClosest) AND NOT IS_ENTITY_DEAD(pedClosest)
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedClosest)
IF busStopInt = 0
SET_PED_MOVEMENT_CLIPSET(pedClosest, "move_m@casual@d")
TASK_FOLLOW_NAV_MESH_TO_COORD(pedClosest, << 305.26889, -768.14148, 28.17335 >>, PEDMOVEBLENDRATIO_WALK)
FORCE_PED_MOTION_STATE(pedClosest, MS_ON_FOOT_WALK)
ELIF busStopInt = 1
SET_PED_MOVEMENT_CLIPSET(pedClosest, "move_m@casual@d")
TASK_GO_STRAIGHT_TO_COORD(pedClosest, << 358.69525, -1065.93530, 28.39328 >>, PEDMOVEBLENDRATIO_WALK)
// TASK_FOLLOW_NAV_MESH_TO_COORD(pedClosest, << 358.69525, -1065.93530, 28.39328 >>, PEDMOVEBLENDRATIO_WALK)
// FORCE_PED_MOTION_STATE(pedClosest, MS_ON_FOOT_WALK)
ELIF busStopInt = 3
TASK_GO_STRAIGHT_TO_COORD(pedClosest, << 111.68324, -781.50983, 30.26971 >>, PEDMOVEBLENDRATIO_WALK) //near curb
ELSE
//works for these stops - leave it alone
TASK_ENTER_VEHICLE(pedClosest, args.myVehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_WALK, ECF_DONT_CLOSE_DOOR)
ENDIF
PRINTLN("TASKING GUY TO WALK TO BUS")
ENDIF
ENDPROC
FUNC BOOL CHECK_TO_SEE_BUS_PERPENDICULAR(INT busStopInt)
FLOAT fBusHead
FLOAT fHeadingToTest
BOOL bPerpendicular
fBusHead = GET_ENTITY_HEADING(PLAYER_PED_ID())
PRINTLN("fBusHead = ", fBusHead)
PRINTLN("busStop[busStopInt].fStopHead = ", busStop[busStopInt].fStopHead)
fHeadingToTest = (busStop[busStopInt].fStopHead - 180)
PRINTLN("fHeadingToTest = ", fHeadingToTest)
IF COS(ABSF(fBusHead - fHeadingToTest)) <= 0.766
bBusFacingPerpendicular = FALSE
bPerpendicular = FALSE
PRINTLN("bBusFacingPerpendicular = FALSE")
ELSE
bBusFacingPerpendicular = TRUE
PRINTLN("bBusFacingPerpendicular = TRUE")
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("ASS_BS_BOARD")
CLEAR_THIS_PRINT("ASS_BS_BOARD")
ENDIF
PRINT_HELP("ASS_HELP_01")
bPerpendicular = TRUE
ENDIF
RETURN bPerpendicular
ENDFUNC
PROC DETERMINE_PLAYER_APPROACH_TO_STOP(INT busStopInt)
FLOAT fBusHead
FLOAT fStopHeadAdjusted
VECTOR vFront
VECTOR vBusStop
VECTOR vPlayerLocation
vPlayerLocation = GET_ENTITY_COORDS(PLAYER_PED_ID())
fBusHead = GET_ENTITY_HEADING(PLAYER_PED_ID())
PRINTLN("fBusHead = ", fBusHead)
PRINTLN("busStop[busStopInt].fStopHead = ", busStop[busStopInt].fStopHead)
PRINTLN("fStopHeadAdjusted = ", busStop[busStopInt].fStopHead + 180)
PRINTLN("busStopInt = ", busStopInt)
fStopHeadAdjusted = busStop[busStopInt].fStopHead + 180
PRINTLN("busStop[busStopInt].vStopPos = ", busStop[busStopInt].vStopPos)
PRINTLN("vPlayerLocation = ", vPlayerLocation)
vFront = << -SIN(fBusHead), COS(fBusHead), 0>>
vBusStop = (busStop[busStopInt].vStopPos - vPlayerLocation)
VECTOR vSpeedVector = GET_ENTITY_SPEED_VECTOR(PLAYER_PED_ID())
VECTOR vForwardVector = GET_ENTITY_FORWARD_VECTOR(PLAYER_PED_ID())
IF NOT bBusFacingPerpendicular
IF DOT_PRODUCT(vFront, vBusStop) < 0
AND DOT_PRODUCT(vSpeedVector, vForwardVector) > 0
bApproachBackwards = TRUE
bBusFacingCorrectly = FALSE
PRINTLN("DOT PRODUCT LESS THAN ZERO: bApproachBackwards = TRUE")
PRINTLN("DOT PRODUCT 01 = ", DOT_PRODUCT(vFront, vBusStop))
ELSE
bApproachBackwards = FALSE
bBusFacingCorrectly = TRUE
PRINTLN("DOT PRODUCT GREATER THAN ZERO: bApproachBackwards = FALSE")
PRINTLN("DOT PRODUCT 02 = ", DOT_PRODUCT(vFront, vBusStop))
ENDIF
ELSE
PRINTLN("bBusFacingPerpendicular = TRUE")
ENDIF
IF NOT bBusFacingPerpendicular AND NOT bApproachBackwards
IF fStopHeadAdjusted < 360
IF fBusHead > busStop[busStopInt].fStopHead
AND fBusHead < fStopHeadAdjusted
bBusFacingCorrectly = FALSE
PRINTLN("LESS THAN 360: bBusFacingCorrectly = FALSE")
ELSE
bBusFacingCorrectly = TRUE
PRINTLN("LESS THAN 360: bBusFacingCorrectly = TRUE")
ENDIF
ELSE
IF fBusHead < busStop[busStopInt].fStopHead
AND fBusHead > fStopHeadAdjusted - 360
bBusFacingCorrectly = TRUE
PRINTLN("bBusFacingCorrectly = TRUE")
ELSE
bBusFacingCorrectly = FALSE
PRINTLN("bBusFacingCorrectly = FALSE")
ENDIF
ENDIF
ENDIF
IF bBusFacingCorrectly
AND busStopInt <> iBusStop //target walks slower than other peds so need to allow for a longer camera shot for the bus stop cutscene
fFirstCamCutTime = 2.0
PRINTLN("fFirstCamCutTime = 2.0")
ELSE
fFirstCamCutTime = 5.0
PRINTLN("fFirstCamCutTime = 5.0")
ENDIF
//HACK!! always set the target's bus stop to facing correctly to make the transition smooth into the mocap cutscene
IF busStopInt = iBusStop
bBusFacingCorrectly = TRUE
fFirstCamCutTime = 2.0
PRINTLN("bBusFacingCorrectly = TRUE and cut time = 2.0 (target cutscene)")
ENDIF
ENDPROC
PROC RUN_ALTERNATE_CUTSCENE(ASS_ARGS& args, INT busStopInt)
SWITCH iRunAlternateStage
CASE 0
SWITCH busStopInt
CASE 0
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), args.myVehicle, "OJASbs01", DRIVINGMODE_STOPFORCARS, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 3.0)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_WRNG", CONV_PRIORITY_VERY_HIGH)
PRINTLN("busStopInt = 0")
BREAK
CASE 1
// NEED TO UPDATE
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), args.myVehicle, "OJASbs02", DRIVINGMODE_STOPFORCARS, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 3.0)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_WRNGa", CONV_PRIORITY_VERY_HIGH)
PRINTLN("busStopInt = 1")
BREAK
CASE 2
// NEED TO UPDATE
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), args.myVehicle, "OJASbs03", DRIVINGMODE_STOPFORCARS, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 3.0)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_WRNGb", CONV_PRIORITY_VERY_HIGH)
PRINTLN("busStopInt = 2")
BREAK
CASE 3
// NEED TO UPDATE
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), args.myVehicle, "OJASbs04", DRIVINGMODE_STOPFORCARS, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 3.0)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_WRNGc", CONV_PRIORITY_VERY_HIGH)
PRINTLN("busStopInt = 3")
BREAK
ENDSWITCH
PRINTLN("TASKED TO FOLLOW WAYPOINT RECORDING")
iRunAlternateStage++
BREAK
//-------------------------------------------------------------------------------------------------------
CASE 1
IF IS_TIMER_STARTED(busTimer)
IF GET_TIMER_IN_SECONDS(busTimer) > 3.0
// Need to switch back to normal camera
IF iNumStopsVisited = 0
vBusCamPos = << 298.8621, -771.5198, 29.4770 >>
vBusCamRot = << 8.7930, 0.0000, -52.1743 >>
ELIF iNumStopsVisited = 1
vBusCamPos = << 364.4333, -1071.3138, 30.1969 >>
vBusCamRot = << 0.8394, 0.0000, 42.3892 >>
ELIF iNumStopsVisited = 2
vBusCamPos = << 254.3144, -1118.1940, 30.1446 >>
vBusCamRot = << -0.9803, 0.0000, -137.7603 >>
ELIF iNumStopsVisited = 3
vBusCamPos = << 104.8598, -774.3508, 31.6923 >>
vBusCamRot = << 4.8718, -0.0000, -144.4729 >>
ENDIF
PRINTLN("vBusCamPos 01 = ", vBusCamPos)
PRINTLN("vBusCamRot 02 = ", vBusCamRot)
DETACH_CAM(busCam)
STOP_CAM_POINTING(busCam)
SET_CAM_COORD(busCam, vBusCamPos)
SET_CAM_ROT(busCam, vBusCamRot)
REPOSITION_BUS_BASED_ON_PLAYER_APPROACH_ANGLE(args, busStopInt)
OPEN_BUS_DOORS(args.myVehicle)
iRunAlternateStage++
ENDIF
ENDIF
BREAK
//-------------------------------------------------------------------------------------------------------
CASE 2
BREAK
ENDSWITCH
ENDPROC
PROC REMOVE_EXISTING_BUS_PASSENGERS_ON_STOLEN_BUS(ASS_ARGS& args)
PED_INDEX pedTemp[8]
INT idx
IF DOES_ENTITY_EXIST(args.myVehicle) AND NOT IS_ENTITY_DEAD(args.myVehicle)
REPEAT 8 idx
IF NOT IS_VEHICLE_SEAT_FREE(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, idx))
pedTemp[idx] = GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, idx))
PRINTLN("FOUND A PED: ", idx)
SET_ENTITY_AS_MISSION_ENTITY(pedTemp[idx])
IF DOES_ENTITY_EXIST(pedTemp[idx])
DELETE_PED(pedTemp[idx])
PRINTLN("DELETING PED WITH INDEX: ", idx)
ENDIF
ELSE
PRINTLN("VEHICLE SEAT IS FREE: ", idx)
ENDIF
ENDREPEAT
ENDIF
ENDPROC
PROC MOVE_LAST_PLAYER_DRIVEN_VEHICLE_TO_FRANKLINS_SAFEHOUSE()
IF DOES_ENTITY_EXIST(viPlayerLastVehicle)
AND IS_VEHICLE_DRIVEABLE(viPlayerLastVehicle)
SET_MISSION_VEHICLE_GEN_VEHICLE(viPlayerLastVehicle, <<-25.2554, -1438.2389, 29.6542>>, 2.3100)
ENDIF
ENDPROC
// Handle the cutscene of peds getting on the bus when the player arrives at a stop - busStopInt is the bus stop numebr to update
PROC MANAGE_BUS_STOP_CUTSCENE(ASS_ARGS& args, ASS_TARGET_DATA& targetData, INT busStopInt)
VECTOR vVehicleDeform
PED_INDEX pedClosest
VECTOR vBusPosition, vLookAtPos
FLOAT fBusHeading
//to fix bug 1517047 - Franklin seems to have very exaggerated stopping anim when bus pulls up to stop
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoShuntInVehicleState, TRUE)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableInVehicleActions, TRUE)
// //to try and fix bug 1548986 (issues with one bus door not closing properly)
// IF DOES_ENTITY_EXIST(pedCurrentlyEnteringBus)
// SET_PED_RESET_FLAG(pedCurrentlyEnteringBus, PRF_DisableInVehicleActions, TRUE)
// ENDIF
SWITCH iBusCutsceneStage
CASE 0
IF busStop[busStopInt].bActive
IF DOES_CAM_EXIST(camHint)
IF IS_CAM_ACTIVE(camHint)
SET_CAM_ACTIVE(camHint, FALSE)
ENDIF
ENDIF
ODDJOB_ENTER_CUTSCENE()
//check to see if player approached stop backwards or not
DETERMINE_PLAYER_APPROACH_TO_STOP(busStopInt)
//check to see if bus entry area is damaged
vVehicleDeform = GET_VEHICLE_DEFORMATION_AT_POS(args.myVehicle, <<1.21, 6.15, 0.3>>) //position just in front of bus doors
PRINTLN("vVehicleDeform AT DOOR POS <<1.21, 6.15, 0.3>> IS: << ", vVehicleDeform.x, vVehicleDeform.y, vVehicleDeform.z, " >>")
PRINTLN("DISPLACEMENT IS: ", GET_DISTANCE_BETWEEN_COORDS(vVehicleDeform, <<0,0,0>>))
IF GET_DISTANCE_BETWEEN_COORDS(vVehicleDeform, <<0,0,0>>) > 0.23 //enough displacement to appear damaged
bBusDamaged = TRUE
SET_VEHICLE_DOOR_BROKEN(args.myVehicle, SC_DOOR_FRONT_RIGHT, TRUE)
SET_VEHICLE_DOOR_BROKEN(args.myVehicle, SC_DOOR_FRONT_LEFT, TRUE)
ENDIF
// CAMERAS
IF iNumStopsVisited = 0
//make sure to set this (just in case it never got set in MISSION_BUS_ENTER_BUS earlier (to fix bug 1062610 - 3/14/13 - MB)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "assassin_bus_stage_drive_to_stops")
MOVE_LAST_PLAYER_DRIVEN_VEHICLE_TO_FRANKLINS_SAFEHOUSE()
IF bBusFacingCorrectly
vBusCamPos = << 298.8621, -771.5198, 29.4770 >>
vBusCamRot = << 8.7930, 0.0000, -52.1743 >>
ENDIF
ELIF iNumStopsVisited = 1
IF bBusFacingCorrectly
vBusCamPos = << 364.4333, -1071.3138, 30.1969 >>
vBusCamRot = << 0.8394, 0.0000, 42.3892 >>
ENDIF
ELIF iNumStopsVisited = 2
IF bBusFacingCorrectly
vBusCamPos = <<255.5488, -1118.9313, 30.1211>>
vBusCamRot = <<-0.9803, 0.0000, -137.7603>>
ENDIF
ELIF iNumStopsVisited = 3
IF bBusFacingCorrectly
vBusCamPos = << 104.8598, -774.3508, 31.6923 >>
vBusCamRot = << 4.8718, -0.0000, -144.4729 >>
ENDIF
ENDIF
PRINTLN("vBusCamPos = ", vBusCamPos)
PRINTLN("vBusCamRot = ", vBusCamRot)
//create cameras that show the shot of passengers waiting on the bus
busCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vBusCamPos, vBusCamRot)
SET_CAM_FOV(busCam, 38)
SET_CAM_ACTIVE(busCam, TRUE)
IF NOT bBusFacingCorrectly
ATTACH_CAM_TO_ENTITY(busCam, args.myVehicle, <<-4.4984, 8.6802, -0.3745>>)
POINT_CAM_AT_ENTITY(busCam, args.myVehicle, <<-2.0642, 7.0391, 0.2430>>)
ENDIF
//clear any objects nearby so any nearby broken props won't fly through the scene
CLEAR_AREA_OF_OBJECTS(busStop[busStopInt].vStopPos, 30)
CLEAR_AREA_OF_PEDS(busStop[busStopInt].vStopPos, 30)
REMOVE_PARTICLE_FX_IN_RANGE(busStop[busStopInt].vStopPos, 7.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
IF busStopInt = 0
REMOVE_EXISTING_BUS_PASSENGERS_ON_STOLEN_BUS(args)
ENDIF
IF bBusFacingCorrectly
//position the bus in a set location at the bus stop depending on whether or not it was approached at the correct angle
REPOSITION_BUS_BASED_ON_PLAYER_APPROACH_ANGLE(args, busStopInt)
ELSE
IF busStopInt = 0 //closest to station
vBusWarpPos = << 306.7456, -771.3451, 28.2966 >>
fBusWarpHead = 340.8777
ELIF busStopInt = 1 //railroad tracks
vBusWarpPos = << 373.7143, -1064.0206, 28.2864 >>
fBusWarpHead = 89.7653
ELIF busStopInt = 2 //near freeway
// NEED TO UPDATE
vBusWarpPos = << 250.6179, -1126.4532, 28.2040 >>
fBusWarpHead = 274.4086
ELIF busStopInt = 3 //through the mall escape path
// NEED TO UPDATE
vBusWarpPos = << 96.6454, -779.0001, 30.4853 >>
fBusWarpHead = 249.5191
ENDIF
SET_ENTITY_COORDS(args.myVehicle, vBusWarpPos)
SET_ENTITY_HEADING(args.myVehicle, fBusWarpHead)
SET_VEHICLE_FIXED(args.myVehicle)
SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle)
SET_VEHICLE_FORWARD_SPEED(args.myVehicle, 2)
vBusPosition = GET_ENTITY_COORDS(args.myVehicle)
fBusHeading = GET_ENTITY_HEADING(args.myVehicle)
vLookAtPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBusPosition, fBusHeading, << 2, 5.6201, 0.1098 >>)
//have Franklin look at peds as they enter the bus
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), vLookAtPos, 5000)
PRINTLN("bBusFacingCorrectly IS FALSE, GOING TO SHOW ALTERNATE CUTSCENE")
ENDIF
//open the bus doors
OPEN_BUS_DOORS(args.myVehicle)
//remove any floating help that may currenty exist
CLEAR_HELP()
//reset this timer used in bus stop cutscenes
IF NOT IS_TIMER_STARTED(busTimer)
START_TIMER_NOW(busTimer)
PRINTLN("STARTING TIMER - busTimer")
ELSE
RESTART_TIMER_NOW(busTimer)
PRINTLN("RESTARTING TIMER - busTimer")
ENDIF
bTaskedToEnterBus = FALSE
// remove all the bus stop blips if the player arrives at the stop with the target
// IF busStopInt = iBusStop
// IF bBusFacingCorrectly
// //initialize this
// iBusCutsceneStage = 0
// TASK_CLOSEST_PED_TO_BUS_TO_WALK_TO_IT(args, busStopInt)
// PRINTLN("missionStage = MISSION_BUS_TARGET_FLEE")
// missionStage = MISSION_BUS_TARGET_FLEE
// ELSE
// iBusCutsceneStage++
// PRINTLN("iBusCutsceneStage GOING TO CASE 1 - AT TARGET STOP")
// ENDIF
// ELSE
iBusCutsceneStage++
PRINTLN("iBusCutsceneStage GOING TO CASE 1")
// ENDIF
ENDIF
BREAK
//--------------------------------------------------------------------------------------------------------------------------------
CASE 1
IF NOT bBusFacingCorrectly
RUN_ALTERNATE_CUTSCENE(args, busStopInt)
ENDIF
IF NOT bTaskedToEnterBus
IF bBusFacingCorrectly
// IF IS_TIMER_STARTED(busTimer)
// IF GET_TIMER_IN_SECONDS(busTimer) > 1.0
//peds walk to their assigned vector outside the bus doors
TASK_CLOSEST_PED_TO_BUS_TO_WALK_TO_IT(args, busStopInt)
bTaskedToEnterBus = TRUE
PRINTLN("TASK_CLOSEST_PED_TO_BUS_TO_WALK_TO_IT inside of case 1 - 01")
// ENDIF
// ENDIF
ELSE
IF IS_TIMER_STARTED(busTimer)
IF GET_TIMER_IN_SECONDS(busTimer) > 4.0
//peds walk to their assigned vector outside the bus doors
TASK_CLOSEST_PED_TO_BUS_TO_WALK_TO_IT(args, busStopInt)
bTaskedToEnterBus = TRUE
PRINTLN("TASK_CLOSEST_PED_TO_BUS_TO_WALK_TO_IT inside of case 1 - 02")
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_TIMER_STARTED(busTimer)
IF GET_TIMER_IN_SECONDS(busTimer) > fFirstCamCutTime
// IF NOT bBusFacingCorrectly
IF busStopInt = iBusStop
//initialize this
iBusCutsceneStage = 0
PRINTLN("BUS NOT FACING CORRECTLY: missionStage = MISSION_BUS_TARGET_FLEE")
missionStage = MISSION_BUS_TARGET_FLEE
BREAK
ENDIF
// ENDIF
bTaskedToEnterBus = FALSE
//cut to camera inside bus and have Franklin look at the peds entering the bus
LINE_UP_PASSENGERS_OUTSIDE_BUS_DOORS(args, busStopInt)
SHOW_CAM_INSIDE_BUS(args)
pedClosest = GET_PED_CLOSEST_TO_BUS_DOORS(vBusDoorPos, busStopInt)
// pedCurrentlyEnteringBus = pedClosest
//play any lines for the cutscene and have the ped closest to the bus enter if the bus isn't damaged
//if the bus is damaged, have the ped make a comment about it and refuse to enter the bus
IF busStopInt = 0
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_NOPE", CONV_PRIORITY_VERY_HIGH)
PLAY_SINGLE_LINE_FROM_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_NOPE", "OJASbs_NOPE_1", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
IF NOT IS_PED_INJURED(pedClosest)
TASK_ENTER_VEHICLE(pedClosest, args.myVehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, ECF_WARP_ENTRY_POINT|ECF_DONT_CLOSE_DOOR)
PRINTLN("BUS STOP 0: TASKING GUY TO ENTER BUS")
IF DOES_ENTITY_EXIST(pedClosest)
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedClosest, TRUE)
PRINTLN("CALLING FORCE ANIMATION UPDATE ON CLOSEST PED - 1")
ENDIF
ENDIF
ELIF busStopInt = 1
IF NOT IS_PED_INJURED(pedClosest)
TASK_ENTER_VEHICLE(pedClosest, args.myVehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, ECF_WARP_ENTRY_POINT|ECF_DONT_CLOSE_DOOR)
PRINTLN("BUS STOP 1: TASKING GUY TO ENTER BUS")
IF DOES_ENTITY_EXIST(pedClosest)
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedClosest, TRUE)
PRINTLN("CALLING FORCE ANIMATION UPDATE ON CLOSEST PED - 2")
ENDIF
ENDIF
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_NOPE3", CONV_PRIORITY_VERY_HIGH)
ELIF busStopInt = 2
IF NOT IS_PED_INJURED(pedClosest)
TASK_ENTER_VEHICLE(pedClosest, args.myVehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, ECF_WARP_ENTRY_POINT|ECF_DONT_CLOSE_DOOR)
PRINTLN("BUS STOP 2: TASKING GUY TO ENTER BUS")
IF DOES_ENTITY_EXIST(pedClosest)
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedClosest, TRUE)
PRINTLN("CALLING FORCE ANIMATION UPDATE ON CLOSEST PED - 3")
ENDIF
ENDIF
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_NOPE4", CONV_PRIORITY_VERY_HIGH)
ENDIF
RESTART_TIMER_NOW(busTimer)
iBusCutsceneStage++
ENDIF
ENDIF
BREAK
//--------------------------------------------------------------------------------------------------------------------------------
CASE 2
IF NOT bDoneFlash
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
IF GET_TIMER_IN_SECONDS(busTimer) > 1.2
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
PRINTLN("bDoneFlash = TRUE")
bDoneFlash = TRUE
ENDIF
ENDIF
ENDIF
IF ( GET_TIMER_IN_SECONDS(busTimer) > 1.5 AND NOT bBusDamaged )
OR ( bBusDamaged AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() )
READY_BUS_AND_PASSENGERS_FOR_NEXT_STAGE_AND_EXIT_CUTSCENE(args, busStopInt)
//restart the timer
RESTART_TIMER_NOW(busTimer)
//remove the blip from the minimap, put the target at one of the remaining stops and re-initialize data for next stage
REMOVE_BLIP(busStop[busStopInt].blipStop)
busStop[busStopInt].bActive = FALSE
ACTIVATE_NEXT_BUS_STOP(targetData, args, iBusStopOrder[iNumStopsVisited])
// ELSE
// IF bClosingBusDoorsForCutscene = FALSE
// IF GET_TIMER_IN_SECONDS(busTimer) > 1.0
// SCRIPT_ASSERT("CLOSE THE BUS DOORS")
// PRINTLN("CLOSE THE BUS DOORS")
// CLOSE_BUS_DOORS(args.myVehicle, FALSE)
// bClosingBusDoorsForCutscene = TRUE
// ENDIF
// ENDIF
ENDIF
BREAK
ENDSWITCH
//Handle all the necessary data for the player skipping the cutscene
IF iBusCutsceneStage = 1
IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime)
CLEAR_PED_TASKS(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(args.myVehicle)
// SET_ENTITY_COORDS(args.myVehicle, busStop[busStopInt].vStopPos)
SET_ENTITY_HEADING(args.myVehicle, busStop[busStopInt].fCorrectHeading)
ENDIF
REMOVE_BLIP(busStop[busStopInt].blipStop)
IF busStopInt = iBusStop
busStop[busStopInt].bActive = FALSE
READY_BUS_AND_PASSENGERS_FOR_NEXT_STAGE_AND_EXIT_CUTSCENE(args, busStopInt)
iBusCutsceneStage = 0
CLEAR_PED_TASKS(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(args.myTarget)
IF IS_VEHICLE_DRIVEABLE(args.myOtherVehicle)
SET_ENTITY_VISIBLE(args.myTarget, TRUE)
CLEAR_PED_TASKS(args.myTarget)
SET_ENTITY_COORDS(args.myOtherVehicle, busStop[iBusStop].vVehPos)
SET_ENTITY_HEADING(args.myOtherVehicle, busStop[iBusStop].fVehHead)
SET_VEHICLE_ON_GROUND_PROPERLY(args.myOtherVehicle)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(args.myTarget, KNOCKOFFVEHICLE_HARD)
IF NOT IS_PED_IN_VEHICLE(args.myTarget, args.myOtherVehicle)
SET_PED_INTO_VEHICLE(args.myTarget, args.myOtherVehicle)
ENDIF
ENDIF
ENDIF
CLEAR_AREA(busStop[iBusStop].vVehPos, 30, FALSE)
CLEAR_AREA_OF_OBJECTS(busStop[iBusStop].vVehPos, 30)
TASK_PASSENGERS_OUTSIDE_BUS_TO_LOOK_AT_TARGET(args.myTarget, iBusStop)
KILL_BUS_CUTSCENE_AND_RESTORE_PLAYER_CONTROL(args)
TASK_PLAYER_TO_KILL_TARGET(args, TRUE)
START_TARGET_PLAYBACK_ON_BIKE(args.myTarget, args.myOtherVehicle)
PRINTLN("missionStage = MISSION_BUS_UPDATE_BIKE - CUTSCENE SKIPPED")
missionStage = MISSION_BUS_UPDATE_BIKE
ELSE
READY_BUS_AND_PASSENGERS_FOR_NEXT_STAGE_AND_EXIT_CUTSCENE(args, busStopInt)
// PRINT_NOW("ASS_BS_OTHER", DEFAULT_GOD_TEXT_TIME, 1)
busStop[busStopInt].bActive = FALSE
ACTIVATE_NEXT_BUS_STOP(targetData, args, iBusStopOrder[iNumStopsVisited])
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_ABANDON_DIALOGUE(ASS_ARGS& args)
INT iRand
SWITCH iPassengerAbandonSpeech
CASE 0
iRand = GET_RANDOM_INT_IN_RANGE() % 2
PRINTLN("iRand = ", iRand)
IF iRand = 0
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed6)
ADD_PED_FOR_DIALOGUE(args.assConv, 6, busPed6, "BusPed3")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_WAY3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING THIRD ABANDON CONVO")
iPassengerAbandonSpeech++
ENDIF
ENDIF
ELSE
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed4)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
ADD_PED_FOR_DIALOGUE(args.assConv, 4, busPed4, "BusPed1")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_WAY", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING FIRST ABANDON CONVO")
iPassengerAbandonSpeech++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_PED_ALIVE_AND_IN_BUS(args, busPed5)
ADD_PED_FOR_DIALOGUE(args.assConv, 5, busPed5, "BusPed2")
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_WAY2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING SECOND ABANDON CONVO")
iPassengerAbandonSpeech++
ENDIF
ENDIF
BREAK
CASE 3
BREAK
ENDSWITCH
ENDPROC
//deblip the bus stop once visited and have bus peds enter the bus
PROC UPDATE_BUS_PEDS_AND_BLIPS(ASS_ARGS& args, ASS_TARGET_DATA& targetData)
INT iCurStop
FLOAT fDistForPickup
//choose next bus stop to update
iCurStop = iBusStopOrder[iNumStopsVisited]
HANDLE_STREAMVOL_LOADING_UNLOADING_FOR_CURRENT_STOP(iCurStop)
// Special case for last stop
IF iCurStop = 3
IF NOT IS_ENTITY_DEAD(args.myVehicle) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle, TRUE )
// IF IS_ENTITY_IN_ANGLED_AREA(args.myVehicle, <<110.972397,-784.841736,29.916990>>, <<130.084183,-791.836243,35.787785>>, 8.500000)
// IF IS_ENTITY_IN_ANGLED_AREA(args.myVehicle, <<96.225983,-782.354553,29.558491>>, <<142.175232,-799.789612,37.994461>>, 15.000000)
// fDistForPickup = (GET_ENTITY_SPEED(PLAYER_PED_ID())/BUS_SPEED_FACTOR) + BUS_STOP_PAD
// IF GET_ENTITY_DISTANCE_FROM_LOCATION(args.myVehicle, busStop[iCurStop].vStopPos) <= fDistForPickup
// BRING_VEHICLE_TO_HALT(args.myVehicle, 5.0, -1)
// SETTIMERA(0)
// PRINTLN("missionStage = MISSION_BUS_TARGET_FLEE")
// missionStage = MISSION_BUS_TARGET_FLEE
// EXIT
// ELSE
// PRINTLN("HAVE NOT MET DISTANCE REQUIREMENT")
// ENDIF
//check to see if the player ran into the angled area surrounding the final bus stop prop
IF IS_ENTITY_IN_ANGLED_AREA(args.myVehicle, <<112.874443,-780.204834,29.419115>>, <<118.278450,-782.233887,34.384232>>, 2.500000)
SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER)
PRINTLN("FAILING BUS ASSASSINATION: Player rammed target's bus stop!")
ENDIF
ENDIF
ENDIF
ENDIF
//clear the area around the bus stop of vehicles if any exist within X radius and the point is not on screen
IF NOT IS_SPHERE_VISIBLE(busStop[iCurStop].vStopPos, 15)
CLEAR_AREA_OF_VEHICLES(busStop[iCurStop].vStopPos, 15)
ENDIF
IF bRunDistanceToStop
fDistForPickup = (GET_ENTITY_SPEED(PLAYER_PED_ID())/BUS_SPEED_FACTOR) + BUS_STOP_PAD //this is dynamic depending on the player's speed
// PRINTLN("fDistForPickup = ", fDistForPickup)
//distance to check if the bus is near the bus stop
//stop this timer if running since it is only used for cutscenes
IF IS_TIMER_STARTED(busTimer)
CANCEL_TIMER(busTimer)
PRINTLN("CANCEL_TIMER")
ENDIF
ENDIF
// Once we've entered perpendicular to the stop, we need to leave the area and re-enter.
IF bBusFacingPerpendicular
bNeedToLeaveArea = TRUE
PRINTLN("SETTING bNeedToLeaveArea = TRUE")
ENDIF
IF bNeedToLeaveArea
IF NOT IS_ENTITY_DEAD(args.myVehicle)
IF GET_ENTITY_DISTANCE_FROM_LOCATION(args.myVehicle, busStop[iCurStop].vStopPos) >= 10
bNeedToLeaveArea = FALSE
PRINTLN("FAR ENOUGH AWAY - bNeedToLeaveArea = FALSE")
ELSE
FLOAT fTempBusPosition
fTempBusPosition = GET_ENTITY_DISTANCE_FROM_LOCATION(args.myVehicle, busStop[iCurStop].vStopPos)
PRINTLN("NEED TO MOVE AWAY FROM BUS STOP: DISTANCE = ", fTempBusPosition)
ENDIF
ENDIF
ENDIF
IF bRunDistanceToStop
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle) //only draw the corona if the player is in the bus
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), busStop[iCurStop].vCoronaPosition, <<5,5,LOCATE_SIZE_HEIGHT>>, TRUE)
// Do nothing, use corona
ENDIF
ENDIF
ENDIF
//check to see if player has approached the bus stop
IF NOT IS_ENTITY_DEAD(args.myVehicle)
//check the active blip
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
IF busStop[iCurStop].bActive
VECTOR vPlayerBoneCoords
vPlayerBoneCoords = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0,0,0>>)
IF GET_DISTANCE_BETWEEN_COORDS(vPlayerBoneCoords, busStop[iCurStop].vCoronaPosition) <= fDistForPickup
AND IS_PLAYER_READY_FOR_CUTSCENE(PLAYER_ID())
AND STREAMVOL_HAS_LOADED(svBusStopCutscene)
AND NOT CHECK_TO_SEE_BUS_PERPENDICULAR(iCurStop) // If we're perpendicular do not run
AND NOT bNeedToLeaveArea // If we've entered perpendicular, we need to get far enough away to re-trigger.
bRunDistanceToStop = FALSE
PRINTLN("SETTING bRunDistanceToStop = FALSE")
ENDIF
IF iNumStopsVisited > 0
RELEASE_AMBIENT_PEDS_IN_LOT()
IF NOT bGrabbedDistanceToNextStop
fDistanceToNextStop = GET_ENTITY_DISTANCE_FROM_LOCATION(args.myVehicle, busStop[iCurStop].vStopPos)
PRINTLN("fDistanceToNextStop = ", fDistanceToNextStop)
bGrabbedDistanceToNextStop = TRUE
ENDIF
IF GET_ENTITY_DISTANCE_FROM_LOCATION(args.myVehicle, busStop[iCurStop].vStopPos) > (fDistanceToNextStop + 100)
AND GET_ENTITY_DISTANCE_FROM_LOCATION(args.myVehicle, busStop[iCurStop].vStopPos) < (fDistanceToNextStop + 200)
HANDLE_ABANDON_DIALOGUE(args)
ELIF GET_ENTITY_DISTANCE_FROM_LOCATION(args.myVehicle, busStop[iCurStop].vStopPos) > (fDistanceToNextStop + 200)
PRINTLN("FAILING MISSION FOR GOING TO FAR FROM THE NEXT BUS STOP")
SET_MISSION_FAILED(asnArgs, targetData, FAIL_ABANDONED_MISSION)
ENDIF
ENDIF
ENDIF
IF NOT bRunDistanceToStop
MANAGE_BUS_STOP_CUTSCENE(args, targetData, iCurStop)
// IF iCurStop = 3
// PLAY_TARGET_FLEE_CUTSCENE_MOCAP(args.myTarget, args)
//
// PRINTLN("EARLY BREAK: missionStage = MISSION_BUS_TARGET_FLEE")
// missionStage = MISSION_BUS_TARGET_FLEE
// EXIT
// ELSE
// PRINTLN("EARLY BREAK: missionStage = MISSION_BUS_TARGET_FLEE")
// MANAGE_BUS_STOP_CUTSCENE(args, targetData, iCurStop)
// ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//checks to the health of the bus vehicle
PROC MONITOR_PLAYER_BUS(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
//we only want to monitor this until the target has been discovered
IF missionStage < MISSION_BUS_TARGET_FLEE
IF DOES_ENTITY_EXIST(args.myVehicle)
IF NOT IS_VEHICLE_DRIVEABLE(args.myVehicle) //AND iNumStopsVisited > 0
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
ENDIF
SET_MISSION_FAILED(asnArgs, targetData, FAIL_VEHICLE_DESTROYED)
PRINTLN("FAILING BUS ASSASSINATION SCRIPT BECUASE BUS IS NO LONGER DRIVEABLE")
ENDIF
IF IS_VEHICLE_STUCK_TIMER_UP(args.myVehicle, VEH_STUCK_ON_ROOF, 1000)
SET_MISSION_FAILED(asnArgs, targetData, FAIL_VEHICLE_DESTROYED)
PRINTLN("FAILING BUS ASSASSINATION SCRIPT BECUASE BUS TIMER IS UP")
ENDIF
// IF NOT IS_VEHICLE_DRIVEABLE(args.myVehicle) AND iNumStopsVisited = 0
// IF DOES_BLIP_EXIST(args.myTargetBlip)
// REMOVE_BLIP(args.myTargetBlip)
// PRINTLN("REMOVING BLIP ON BUS - BUS IS NOT DRIVEABLE BUT HAS NO PASSENGERS")
// ENDIF
// ENDIF
// IF iNumStopsVisited > 0
//checks to see if player abandoned bus
IF missionStage >= MISSION_BUS_UPDATE_BUS_PEDS
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
IF bPlayerInBus = TRUE
bPlayerInBus = FALSE
REMOVE_BUS_STOP_BLIPS()
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
ENDIF
IF NOT DOES_BLIP_EXIST(args.myTargetBlip)
args.myTargetBlip = CREATE_BLIP_ON_ENTITY(args.myVehicle)
ENDIF
//start the fail timer
IF NOT IS_TIMER_STARTED(failTimer)
START_TIMER_NOW(failTimer)
ELSE
RESTART_TIMER_NOW(failTimer)
ENDIF
IF NOT bReturnMsgPrinted
PRINT_NOW("ASS_BS_RETURN", DEFAULT_GOD_TEXT_TIME, 1)
bReturnMsgPrinted = TRUE
ENDIF
ENDIF
ELSE
IF NOT bPlayerInBus
bPlayerInBus = TRUE
CLEAR_PRINTS()
CREATE_BUS_STOP_BLIPS()
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
ENDIF
IF IS_TIMER_STARTED(failTimer)
PAUSE_TIMER(failTimer)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// ENDIF
ENDIF
//fail the mission if the player has been out of the vehicle for X amt of time
IF NOT bPlayerInBus
// If we're out of the vehicle, grab the coordinates of the bus and player's position.
IF NOT IS_ENTITY_DEAD(args.myVehicle)
vBusPos = GET_ENTITY_COORDS(args.myVehicle)
// PRINTLN("vBusPos = ", vBusPos)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
// PRINTLN("vPlayerPosition = ", vPlayerPosition)
ENDIF
IF VDIST2(vPlayerPosition, vBusPos) > BUS_ABANDON_DISTANCE
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
PRINTLN("FAILING BUS ASSASSINATION SCRIPT BECAUSE FAIL TIMER EXPIRED (PLAYER ABANDONED THE BUS")
SET_MISSION_FAILED(asnArgs, targetData, FAIL_TIME_EXPIRED)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//returns TRUE if the Player is in a bus vehicle
FUNC BOOL IS_PLAYER_IN_VEHICLE_FOR_BUS_MISSION(ASS_ARGS& args)
VEHICLE_INDEX tempVeh
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
SET_ENTITY_AS_MISSION_ENTITY(args.myVehicle)
RETURN TRUE
ELSE
tempVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF GET_ENTITY_MODEL(tempVeh) = BUS
args.myVehicle = tempVeh
SET_ENTITY_AS_MISSION_ENTITY(args.myVehicle)
bUsingBus = TRUE
PRINTLN("USING BUS - IS_PLAYER_IN_VEHICLE_FOR_BUS_MISSION")
ELIF GET_ENTITY_MODEL(tempVeh) = COACH
args.myVehicle = tempVeh
SET_ENTITY_AS_MISSION_ENTITY(args.myVehicle)
bUsingCoach = TRUE
PRINTLN("USING COACH - IS_PLAYER_IN_VEHICLE_FOR_BUS_MISSION")
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//return the number of innocent bus peds killed by the player
FUNC INT GET_NUM_INNOCENT_BUS_PEDS_KILLED_BY_PLAYER(INT& iCounter)
//give the player a couple of free deaths before penalizing them for killing innocents with the bus
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
iCounter++
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
ENDIF
RETURN iCounter
ENDFUNC
/// PURPOSE:
/// Checks to see if the player has rammed the target's bike or has approached the target on foot
/// PARAMS:
/// pedTarget - The target ped to check
/// veh - The vehicle to check
/// fDistanceForPanic - Player distance from the target to return true
/// RETURNS:
/// TRUE if the player has approached on foot or is touching teh targets bike
FUNC BOOL HAS_PLAYER_DAMAGED_TARGETS_BIKE_OR_APPROACHED_TARGET(PED_INDEX pedTarget, VEHICLE_INDEX veh, FLOAT fDistanceForPanic = 15.0)
IF DOES_ENTITY_EXIST(veh)
IF IS_VEHICLE_DRIVEABLE(veh)
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(pedTarget)
IF NOT IS_PED_INJURED(pedTarget)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedTarget) < fDistanceForPanic
RETURN TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), veh)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//check to see if the player has killed the target via killing them with their bus
//tBonusTimer variable is checked in the CHECK_FOR_TARGET_DEATH function in assassin_core.sch
PROC CHECK_FOR_HIT_AND_RUN_BONUS(ASS_ARGS& args)
IF NOT IS_TIMER_STARTED(tBonusTimer)
RESTART_TIMER_NOW(tBonusTimer)
ELSE
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF DOES_ENTITY_EXIST(args.myTarget)
// IF NOT IS_PED_INJURED(args.myTarget)
IF DOES_ENTITY_EXIST(args.myOtherVehicle)
IF IS_VEHICLE_DRIVEABLE(args.myOtherVehicle)
AND IS_PED_IN_VEHICLE(args.myTarget, args.myOtherVehicle)
IF IS_ENTITY_TOUCHING_ENTITY(args.myVehicle, args.myTarget)
OR IS_ENTITY_TOUCHING_ENTITY(args.myVehicle, args.myOtherVehicle)
PRINTLN("RESTARTING TIMER - tBonusTimer 1")
RESTART_TIMER_NOW(tBonusTimer)
ENDIF
ELSE
IF IS_ENTITY_TOUCHING_ENTITY(args.myVehicle, args.myTarget)
OR IS_ENTITY_TOUCHING_ENTITY(args.myVehicle, args.myOtherVehicle)
PRINTLN("RESTARTING TIMER - tBonusTimer 2")
RESTART_TIMER_NOW(tBonusTimer)
ELSE
// PRINTLN("WE'RE NOT TOUCHING ANYTHING")
ENDIF
ENDIF
ENDIF
// ENDIF
ENDIF
ELSE
PRINTLN("args.myVehicle IS NOT DRIVEABLE")
ENDIF
ENDIF
ENDPROC
FUNC BOOL BUS_DO_CUSTOM_SHOP_FAIL_CHECKS()
IF iNumStopsVisited >= 1
IF IS_PLAYER_IN_ANY_SHOP_EXCEPT_AMMUNATION()
RETURN TRUE
ENDIF
ELSE
IF IS_PLAYER_IN_ANY_SHOP_EXCEPT_AMMUNATION()
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//run these panic checks while the mission is updating
PROC DO_PANIC_CHECKS_FOR_BUS_MISSION(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
// SEQUENCE_INDEX iSeq
// VECTOR vBikePosition
IF NOT bWantedLevelSet = TRUE
IF missionStage < MISSION_BUS_TARGET_FLEE
//do panic checks but don't trigger panic if the player walks into them or their bus
IF DO_AGGRO_CHECK(args.myTarget, NULL, aggroArgs, aggroReason, FALSE, FALSE)
OR HAS_PLAYER_INJURED_BUS_STOP_PEDS(iFrameToCheck)
OR iNumInnocentsDead >= 2
OR GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
OR NOT IS_VEHICLE_DRIVEABLE(args.myVehicle)
OR HAS_PLAYER_DAMAGED_TARGETS_BIKE_OR_APPROACHED_TARGET(args.myTarget, args.myOtherVehicle)
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
PRINTLN("PLAYER IS WANTED")
ENDIF
//set player wanted level if they have injured a couple of peds
IF iNumInnocentsDead >= 2
PRINTLN("iNumInnocentsDead >= 2")
ENDIF
bWantedLevelSet = TRUE
//Handle how to fail or advance the mission
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF DOES_ENTITY_EXIST(args.myTarget)
IF NOT IS_PED_INJURED(args.myTarget)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 30
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(args.myTarget, PLAYER_PED_ID())
REMOVE_BUS_STOP_BLIPS()
IF DOES_BLIP_EXIST(args.mytargetblip)
REMOVE_BLIP(args.mytargetblip)
ENDIF
PRINTLN("NOT FAILING")
// TASK_PLAYER_TO_KILL_TARGET(args)
bBailMsgPlayed = TRUE //don't play Franklin's line about his shift being up
//check to see if the targets bike is ok for the target to flee on
IF IS_BIKE_SAFE_FOR_TARGET(args)
AND NOT IS_ENTITY_ON_SCREEN(args.myVehicle)
AND NOT IS_ENTITY_ON_SCREEN(args.myTarget)
SET_PED_INTO_VEHICLE(args.myTarget, args.myOtherVehicle)
START_TARGET_PLAYBACK_ON_BIKE(args.myTarget, args.myOtherVehicle)
PRINTLN("missionStage = MISSION_BUS_UPDATE_BIKE - GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 30")
missionStage = MISSION_BUS_UPDATE_BIKE
ELSE
// IF NOT IS_ENTITY_DEAD(args.myOtherVehicle)
// vBikePosition = GET_ENTITY_COORDS(args.myOtherVehicle)
// ENDIF
//
// OPEN_SEQUENCE_TASK(iSeq)
// TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vBikePosition, PEDMOVEBLENDRATIO_RUN)
// TASK_ENTER_VEHICLE(NULL, args.myOtherVehicle)
// TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(NULL, args.myOtherVehicle, "OJASbs_102",
// DF_SwerveAroundAllCars|DF_SteerAroundObjects|DF_SteerAroundPeds, 0,
// EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE)
// CLOSE_SEQUENCE_TASK(iSeq)
// IF NOT IS_ENTITY_DEAD(args.myTarget)
// TASK_PERFORM_SEQUENCE(args.myTarget, iSeq)
// ENDIF
// CLEAR_SEQUENCE_TASK(iSeq)
//
// WAYPOINT_RECORDING_GET_NUM_POINTS("OJASbs_102", iRecordingTime)
//
// PRINTLN("SEQUENCE TASK TARGET TO BIKE")
// missionStage = MISSION_BUS_UPDATE_BIKE
bCutsceneSkipped = TRUE
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_FOOT3", CONV_PRIORITY_VERY_HIGH)
bTargetFleeing = TRUE
PRINTLN("missionStage = MISSION_BUS_FLEE_ON_FOOT - GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 30 AND BIKE NOT SAFE TO TELEPOT PED ONTO")
missionStage = MISSION_BUS_FLEE_ON_FOOT
ENDIF
ELSE
SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER)
PRINTLN("FAILING BUS ASSASSINATION: GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) > 30")
ENDIF
ENDIF
ELSE
SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER)
PRINTLN("FAILING BUS ASSASSINATION: COVER BLOWN, KILLED BUS STOP PEDS")
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bWantedLevelSet
IF iNumInnocentsDead >= 4
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
PRINTLN("SETTING WANTED LEVEL BECAUSE iNumInnocentsDead >= 4")
SET_PLAYER_WANTED_LEVEL_NO_DROP_NOW()
bWantedLevelSet = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//PROC REMOVE_ANIMS()
// IF NOT bRemovedAnims
// REMOVE_ANIM_DICT("oddjobs@assassinate@bus@")
// REMOVE_ANIM_DICT("misscommon@response")
// PRINTLN("REMOVING ANIMS")
// bRemovedAnims = TRUE
// ENDIF
//ENDPROC
PROC HANDLE_POLICE_SCANNER_LINE_FOR_BUS_MISSION()
IF NOT bPoliceScannerLinePlayed
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
IF NOT IS_TIMER_STARTED(tPoliceScanner)
RESTART_TIMER_NOW(tPoliceScanner)
ELSE
IF TIMER_DO_ONCE_WHEN_READY(tPoliceScanner, 10.0)
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_ASS_BUS_01", 0.0)
bPoliceScannerLinePlayed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CHECK_FOR_PLAYER_SHOOTING(ASS_ARGS& args)
INT tempInt
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_SHOOTING(PLAYER_PED_ID())
IF iNumStopsVisited > 0
IF NOT bGrabbedSpeaker
REPEAT NUM_BUS_SEATS tempInt
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, tempInt)) <> NULL
pedBusPassengerShooting = GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, tempInt))
ADD_PED_FOR_DIALOGUE(args.assConv, 7, pedBusPassengerShooting, "BusPed7")
PRINTLN("FOUND SPEAKER")
bGrabbedSpeaker = TRUE
ENDIF
ENDIF
ENDREPEAT
IF IS_PED_ALIVE_AND_IN_BUS(args, pedBusPassengerShooting)
CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_SHOT", CONV_PRIORITY_VERY_HIGH)
SET_PLAYER_WANTED_LEVEL_NO_DROP_NOW()
PRINTLN("PLAYER SHOOTING")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_REPLAY_MARKER()
IF NOT bSetThirdCheckpoint
PRINTLN("missionStage = MISSION_BUS_UPDATE_BIKE")
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "assassin_bus_stage_kill_target")
PRINTLN("SETTING CHECKPOINT 3")
bSetThirdCheckpoint = TRUE
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, <<-24.8539, -110.4900, 57.5606>>, <<-1.6505, 0.0546, 82.1926>>, 35.0, TRUE, 0.2)
PRINTLN("iIntroCameraStages = 1")
iIntroCameraStages = 1
ENDIF
BREAK
CASE 1
IF ADJUST_CAMERA(camPayPhoneIntro01, 11.0, <<-27.3634, -109.3758, 57.7306>>, <<-6.4572, 0.0825, -115.4860>>, 40.0, TRUE, 0.3)
PRINTLN("iIntroCameraStages = 2")
iIntroCameraStages = 2
ENDIF
BREAK
CASE 2
IF ADJUST_CAMERA(camPayPhoneIntro01, 19.0, <<-24.5192, -111.0343, 57.4342>>, <<0.7037, -0.0769, 66.6607>>, 28.6009, TRUE, 0.3)
PRINTLN("iIntroCameraStages = 3")
iIntroCameraStages = 3
ENDIF
BREAK
CASE 3 // Tighten the Fov on this one
IF ADJUST_CAMERA(camPayPhoneIntro01, 27.0, <<-28.7803, -108.8278, 57.6104>>, <<-3.9667, -0.0497, -116.5466>>, 35.1220, TRUE, 0.2)
PRINTLN("iIntroCameraStages = 4")
iIntroCameraStages = 4
ENDIF
BREAK
CASE 4
BREAK
ENDSWITCH
ENDPROC
PROC REMOVE_SKINNED_PHONE_PROP()
VECTOR vPlayerPos
IF NOT DOES_ENTITY_EXIST(oPayPhoneAnimated)
EXIT
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF VDIST2(vPlayerPos, vPhoneLocation) > 10000 // 100m
IF DOES_ENTITY_EXIST(oPayPhoneAnimated)
SET_MODEL_AS_NO_LONGER_NEEDED(P_PHONEBOX_01B_S)
DELETE_OBJECT(oPayPhoneAnimated)
PRINTLN("DELETING OBJECT - oPayPhoneAnimated")
ENDIF
IF DOES_ENTITY_EXIST(oPayPhone)
SET_ENTITY_VISIBLE(oPayPhone, TRUE)
SET_ENTITY_COLLISION(oPayPhone, TRUE)
PRINTLN("TURNING BACK ON VISIBILITY AND COLLISION")
ENDIF
ENDIF
ENDPROC
PROC DO_STAGE_INTRO_CUTSCENE(ASS_ARGS& args)
// PRINTLN("TIME: ", TIMERB())
// IF STREAMVOL_HAS_LOADED(svPhoneCutscene)
// PRINTLN("WE'RE LOADED")
// ENDIF
SWITCH payPhoneCutsceneStages
CASE PAYPHONE_CUTSCENE_INIT
REQUEST_ANIM_DICT("oddjobs@assassinate@bus@call")
PRINTLN("REQUESTING ANIM DICTIONARY - oddjobs@assassinate@bus@call")
REQUEST_MODEL(P_PHONEBOX_01B_S)
PRINTLN("REQUESTING MODEL - P_PHONEBOX_01B_S")
IF HAS_ANIM_DICT_LOADED("oddjobs@assassinate@bus@call") AND HAS_MODEL_LOADED(P_PHONEBOX_01B_S)
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
bContinueWithScene = TRUE
ENDIF
IF bContinueWithScene
IF DOES_ENTITY_EXIST(oPayPhone)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-23.959661,-110.568062,56.035263>>, <<-28.194920,-109.038986,57.127155>>, 6.000000, <<-33.4344, -110.1356, 56.1898>>, 68.6902)
PRINTLN("REPOSITIONING VEHICLE")
CLEAR_AREA(<<-26.48, -110.66, 56.0227>>, 3.0, TRUE)
IF NOT IS_TIMER_STARTED(tPayphoneCameraTimer)
START_TIMER_NOW(tPayphoneCameraTimer)
PRINTLN("STARTING TIMER - tPayphoneCameraTimer")
ENDIF
// Hide other model
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, <<-24.48, -105.83, 56.07>>) // Having to lower prop for some reason?! ... to fix Bug # 1352784
oPayPhoneAnimated = CREATE_OBJECT(P_PHONEBOX_01B_S, <<-26.48, -110.66, 56.0227>>)
SET_ENTITY_ROTATION(oPayPhoneAnimated, <<0.00, 0.00, 157.62>>)
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(<<-26.48, -110.66, 56.0227>>, 350, FLAG_MAPDATA)
PRINTLN("CREATING STREAM VOLUME - svPhoneCutscene")
// Start the cutscene.
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
CLEAR_AREA_OF_PEDS(vPlayerWarpPosition, 5.0)
// Position the player somewhat close.
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)
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
PRINTLN("MOVING FRANKLIN TO PHONE")
ENDIF
// Create scene
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
// Franklin Animation
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSceneId, "oddjobs@assassinate@bus@call", "ass_bus_call_p1", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT)
PRINTLN("TASKING FRANKLIN TO TALK ON THE PHONE")
// Phone Prop Animation
PLAY_SYNCHRONIZED_ENTITY_ANIM(oPayPhoneAnimated, iSceneId, "ass_bus_call_phone", "oddjobs@assassinate@bus@call", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT)
PRINTLN("PLAYING ANIMATION ON PAYPHONE PROP")
// Create Camera
IF NOT DOES_CAM_EXIST(camPayPhoneIntro01)
camPayPhoneIntro01a = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCameraPosition01a, vCameraRotation01a, 36.0, TRUE)
camPayPhoneIntro01 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCameraPosition01, vCameraRotation01, 36.0, FALSE)
SET_CAM_ACTIVE_WITH_INTERP(camPayPhoneIntro01, camPayPhoneIntro01a, 2500)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
PRINTLN("CREATING CAMERA - camPayPhoneIntro01")
SHAKE_CAM(camPayPhoneIntro01, "HAND_SHAKE", 0.2)
ENDIF
// // Animate Camera
// PLAY_SYNCHRONIZED_CAM_ANIM(camPayPhoneIntro01, iSceneId, "ass_bus_call_cam", "oddjobs@assassinate@bus@call")
// PRINTLN("PLAYING ANIMATION ON CAMERA")
// Setup speakers
ADD_PED_FOR_DIALOGUE(args.assConv, 3, NULL, "LESTER")
ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN")
// Turn off HUD elements
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
iNavMeshBlocking = ADD_NAVMESH_BLOCKING_OBJECT(<<-26.48, -110.66, 56.0227>>, <<3,3,3>>, 0)
PRINTLN("BUS: CREATING NAVMESH BLOCKING OBJECT - iNavMeshBlocking")
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
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("BUS: GOING TO STATE - PAYPHONE_CUTSCENE_UPDATE")
ELSE
REQUEST_ANIM_DICT("oddjobs@assassinate@bus@call")
PRINTLN("REQUESTING ANIM DICTIONARY - oddjobs@assassinate@bus@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("BUS: 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("BUS: GOING TO STATE - PAYPHONE_CUTSCENE_SKIP")
BREAK
ENDIF
ENDIF
ENDIF
IF NOT bPlayedPayPhoneConvo
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.05
IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAScnt_bs", CONV_PRIORITY_VERY_HIGH)
IF NOT IS_TIMER_STARTED(tPayphoneCutsceneTimer)
START_TIMER_NOW(tPayphoneCutsceneTimer)
PRINTLN("BUS: 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.962)
OR bSkipCutscene
payPhoneCutsceneStages = PAYPHONE_CUTSCENE_CLEANUP
PRINTLN("BUS: 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(), <<-25.8488, -109.9882, 56.0738>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 236.2218)
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("BUS: 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@bus@call")
SET_OBJECT_AS_NO_LONGER_NEEDED(oPayPhone)
curStage = MISSION_STATE_INIT
PRINTLN("BUS: GOING TO STATE - MISSION_STATE_INIT")
BREAK
ENDSWITCH
ENDPROC
PROC REMOVE_NAVMESH_BLOCKING()
IF DOES_NAVMESH_BLOCKING_OBJECT_EXIST(iNavMeshBlocking)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavMeshBlocking)
PRINTLN("BUS: REMOVING NAVMESH BLOCKING OBJECT - iNavMeshBlocking")
ENDIF
ENDPROC
//update loop for the Bus assassination
PROC UPDATE_LOOP_BUS(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
CHECK_FOR_PLAYER_SHOOTING(args)
SWITCH missionStage
CASE MISSION_BUS_STREAM_PEDS
//remove previous destination blip and blip the bus
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
ENDIF
// IF NOT bDoingJSkip
IF NOT DOES_BLIP_EXIST(args.myTargetBlip)
args.myTargetBlip = CREATE_BLIP_ON_ENTITY(args.myVehicle)
ENDIF
// ENDIF
IF ARE_MODELS_LOADED_FOR_EARLY_BUS_STOPS(targetData)
AND ARE_MODELS_LOADED_FOR_FINAL_BUS_STOP(targetData)
missionStage = MISSION_BUS_CREATE_PEDS
ENDIF
BREAK
//Blip the bus and print objective to the player to enter it.
CASE MISSION_BUS_CREATE_PEDS
IF ARE_MODELS_LOADED_FOR_EARLY_BUS_STOPS(targetData)
AND ARE_MODELS_LOADED_FOR_FINAL_BUS_STOP(targetData)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
INIT_BUS_STOP_DATA()
CREATE_BUS_ROUTE(targetData, args)
// //remove previous destination blip and blip the bus
// IF DOES_BLIP_EXIST(args.myTargetBlip)
// REMOVE_BLIP(args.myTargetBlip)
// ENDIF
//
// // IF NOT bDoingJSkip
// IF NOT DOES_BLIP_EXIST(args.myTargetBlip)
// args.myTargetBlip = CREATE_BLIP_ON_ENTITY(args.myVehicle)
// ENDIF
// // ENDIF
//tell player to enter the bus
// PRINT_NOW("ASS_BS_ENTER", DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("missionStage = MISSION_BUS_ENTER_BUS")
missionStage = MISSION_BUS_ENTER_BUS
ENDIF
BREAK
CASE MISSION_BUS_ENTER_BUS
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(args.myVehicle, PLAYER_PED_ID())
DEBUG_MESSAGE("FAILING ASSASSINATION SCRIPT - PLAYER HARMING BUS")
SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER)
EXIT
ENDIF
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF IS_PLAYER_IN_VEHICLE_FOR_BUS_MISSION(args)
SET_BUSES_IN_LOT_AS_NO_LONGER_NEEDED()
SET_VEHICLE_MODEL_IS_SUPPRESSED(BUS, TRUE)
//remove bus blip
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
ENDIF
#IF IS_DEBUG_BUILD
// iSkip = 1
#ENDIF
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vBusLot) <= 75.0
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "assassin_bus_stage_drive_to_stops")
ENDIF
bPlayerInBus = TRUE
CREATE_BUS_STOP_BLIPS()
PRINT_NOW("ASS_BS_FIND", DEFAULT_GOD_TEXT_TIME, 1)
SETTIMERA(0)
PRINTLN("missionStage = MISSION_BUS_UPDATE_BUS_PEDS")
missionStage = MISSION_BUS_UPDATE_BUS_PEDS
ENDIF
ENDIF
BREAK
CASE MISSION_BUS_UPDATE_BUS_PEDS
UPDATE_BUS_PEDS_AND_BLIPS(args, targetData)
HANDLE_CINEMATIC_CAM(args, FALSE)
BREAK
//Panic stage - Player has alerted the target - task him to flee
CASE MISSION_BUS_TARGET_FLEE
PLAY_TARGET_FLEE_CUTSCENE_MOCAP(args.myTarget, args)
BREAK
CASE MISSION_BUS_UPDATE_BIKE
HANDLE_POLICE_SCANNER_LINE_FOR_BUS_MISSION()
SET_REPLAY_MARKER()
HANDLE_OLD_LADY()
TARGET_FLEE_ON_BIKE(args.myTarget, args.myOtherVehicle, args)
// TASK_BUS_PEDS_TO_EXIT_VEHICLE_WHEN_SAFE(args)
// HANDLE_CINEMATIC_CAM(args)
CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, args.myTarget)
UPDATE_BUS_PASSENGER_ANIMS(args)
BREAK
CASE MISSION_BUS_FLEE_ON_FOOT
HANDLE_POLICE_SCANNER_LINE_FOR_BUS_MISSION()
HANDLE_TARGET_FLEE_BEHAVIOR_ON_FOOT(args)
// TASK_BUS_PEDS_TO_EXIT_VEHICLE_WHEN_SAFE(args)
CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, args.myTarget)
BREAK
ENDSWITCH
//HANDLE PANIC CHECKS
DO_PANIC_CHECKS_FOR_BUS_MISSION(targetData, args)
//DISTANCE FAIL CHECK
IF missionStage > MISSION_BUS_TARGET_FLEE
IF HAS_TARGET_ESCAPED(args.myTarget, 175)
IF NOT IS_PED_INJURED(args.myTarget)
IF NOT IS_ENTITY_ON_SCREEN(args.myTarget)
OR IS_ENTITY_OCCLUDED(args.myTarget)
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
ENDIF
PRINTLN("FAILING BUS ASSASSINATION SCRIPT BECAUSE TARGET ESCAPED DISTANCE FAIL CHECK")
SET_MISSION_FAILED(asnArgs, targetData, FAIL_PED_ESCAPED)
ENDIF
ENDIF
ENDIF
ENDIF
//FAIL CHECK TO SEE IF THE BUS IS DRIVEABLE
MONITOR_PLAYER_BUS(targetData, args)
//MANAGES ALL BUS DIALOGUE/SPEECH
MANAGE_BUS_DIALOGUE(args)
//monitor number of peds that the player has innocently run over
GET_NUM_INNOCENT_BUS_PEDS_KILLED_BY_PLAYER(iNumInnocentsDead)
//check to see if the player killed the target via hit and run in the bus
CHECK_FOR_HIT_AND_RUN_BONUS(args)
ENDPROC
/// PURPOSE:
/// Make sure that the player's last vehicle is set as a mission entity so that it wont get cleared up aggeressively by garbage collection while on the mission
PROC SAVE_LAST_PLAYER_VEHICLE()
VEHICLE_INDEX vehLast
IF curStage > MISSION_STATE_INIT
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vehLast = GET_LAST_DRIVEN_VEHICLE()
IF DOES_ENTITY_EXIST(vehLast)
IF IS_VEHICLE_DRIVEABLE(vehLast)
IF vehLast != viPlayerLastVehicle
AND GET_ENTITY_MODEL(vehLast) != BUS
AND GET_ENTITY_MODEL(vehLast) != COACH
//set the new vehicle as the current mission entity vehicle
viPlayerLastVehicle = vehLast
SET_ENTITY_AS_MISSION_ENTITY(viPlayerLastVehicle, TRUE, TRUE)
SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(viPlayerLastVehicle, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CHECK_FOR_PLAYER_IN_BUS(ASS_ARGS& args)
IF iNumStopsVisited > 0
// PRINTLN("EXITING EARLY, BECAUSE WE ALREADY FOUND A BUS AND HAVE PASSENGERS")
EXIT
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehPlayerIsIn = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
mnCarPlayerIsIn = GET_ENTITY_MODEL(vehPlayerIsIn)
IF mnCarPlayerIsIn <> DUMMY_MODEL_FOR_SCRIPT
IF mnCarPlayerIsIn = BUS
DISABLE_CELLPHONE(TRUE)
// PRINTLN("DISABLING CELLPHONE - NOW THAT THE PLAYER IS IN A BUS")
args.myVehicle = vehPlayerIsIn
bUsingBus = TRUE
// PRINTLN("bUsingBus = TRUE")
SET_VEHICLE_HAS_STRONG_AXLES(args.myVehicle, TRUE)
// IF DOES_ENTITY_EXIST(viPlayerLastVehicle)
// AND IS_VEHICLE_DRIVEABLE(viPlayerLastVehicle)
// SET_MISSION_VEHICLE_GEN_VEHICLE(viPlayerLastVehicle, <<-25.2554, -1438.2389, 29.6542>>, 2.3100)
// ENDIF
curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
ELIF mnCarPlayerIsIn = COACH
DISABLE_CELLPHONE(TRUE)
// PRINTLN("DISABLING CELLPHONE - NOW THAT THE PLAYER IS IN A BUS")
args.myVehicle = vehPlayerIsIn
bUsingCoach = TRUE
// PRINTLN("bUsingCoach = TRUE")
SET_VEHICLE_HAS_STRONG_AXLES(args.myVehicle, TRUE)
// IF DOES_ENTITY_EXIST(viPlayerLastVehicle)
// AND IS_VEHICLE_DRIVEABLE(viPlayerLastVehicle)
// SET_MISSION_VEHICLE_GEN_VEHICLE(viPlayerLastVehicle, <<-25.2554, -1438.2389, 29.6542>>, 2.3100)
// ENDIF
curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
ENDIF
ELSE
PRINTLN("MODEL IS DUMMY_MODEL_FOR_SCRIPT")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CREATE_PLAYER_BUS_AT_TARGET_BUS_STOP(ASS_ARGS& args)
IF DOES_ENTITY_EXIST(args.myVehicle)
// IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
// CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
// SET_ENTITY_COORDS(PLAYER_PED_ID(), << 118.3466, -786.1586, 30.3105 >>)
// PRINTLN("PLAYER IS IN THE BUS, LET'S DETACH AND MOVE HIM")
// ENDIF
DELETE_VEHICLE(args.myVehicle)
PRINTLN("DELETING VEHICLE - args.myVehicle")
ENDIF
IF bUsingCoach
args.myVehicle = CREATE_VEHICLE(COACH, << 118.3466, -786.1586, 30.3105 >>, 68.7988)
PRINTLN("CREATING VEHICLE - args.myVehicle - USING COACH MODEL")
SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle)
SET_VEHICLE_COLOUR_COMBINATION(args.myVehicle, 0)
ELSE
args.myVehicle = CREATE_VEHICLE(BUS, << 118.3466, -786.1586, 30.3105 >>, 68.7988)
PRINTLN("DEFAULT: CREATING VEHICLE - args.myVehicle - USING BUS MODEL")
SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle)
SET_VEHICLE_COLOUR_COMBINATION(args.myVehicle, 0)
ENDIF
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
SET_ENTITY_COORDS(args.myVehicle, << 118.3466, -786.1586, 30.3105 >>)
SET_ENTITY_HEADING(args.myVehicle, 68.7988)
// SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
ENDIF
ENDPROC
PROC GO_TO_CHECKPOINT_1(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
UNUSED_PARAMETER(targetData)
UNUSED_PARAMETER(args)
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
REMOVE_FILLER_BUSES()
REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(assArgs)
SET_ENTITY_COORDS(PLAYER_PED_ID(), << -22.4026, -110.8498, 56.0027 >>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 187.4018)
PRINTLN("Bus Assassination - SETTING PLAYER COORDS TO << -22.4026, -110.8498, 56.0027 >>")
IF DOES_ENTITY_EXIST(args.myVehicle)
DELETE_VEHICLE(args.myVehicle)
PRINTLN("CHECKPOINT 1: DELETING VEHICLE - args.myVehicle")
ENDIF
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
PRINTLN("bDoingPSkip: REMOVING BLIP - args.myTargetBlip")
ENDIF
IF DOES_BLIP_EXIST(busStop[0].blipStop)
REMOVE_BLIP(busStop[0].blipStop)
PRINTLN("bDoingPSkip: REMOVING BLIP - busStop[0].blipStop")
ENDIF
IF DOES_BLIP_EXIST(busStop[1].blipStop)
REMOVE_BLIP(busStop[1].blipStop)
PRINTLN("bDoingPSkip: REMOVING BLIP - busStop[1].blipStop")
ENDIF
IF DOES_BLIP_EXIST(busStop[2].blipStop)
REMOVE_BLIP(busStop[2].blipStop)
PRINTLN("bDoingPSkip: REMOVING BLIP - busStop[2].blipStop")
ENDIF
IF DOES_BLIP_EXIST(busStop[3].blipStop)
REMOVE_BLIP(busStop[3].blipStop)
PRINTLN("bDoingPSkip: REMOVING BLIP - busStop[3].blipStop")
ENDIF
// iSkip = 0
iNumStopsVisited = 0
// bFirstCheckpointSceneLoad = FALSE
bGrabbedDistanceToNextStop = FALSE
CREATE_ASSASSINATION_SCENE(targetData, assArgs)
FILL_LOT_WITH_ADDITIONAL_BUSES(targetData)
// INIT_BUS_STOP_DATA()
busStop[0].bActive = TRUE
ENDIF
#ENDIF
bTargetFleeing = FALSE
bCutsceneSkipped = FALSE
// Attempting to fix Bug #937994.
DISPLAY_RADAR(TRUE)
END_REPLAY_SETUP()
REMOVE_STREAMVOL_FOR_BUS_STOP_CUTSCENE()
FADE_IN()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
curStage = MISSION_STATE_PRINTS
ENDPROC
PROC GO_TO_CHECKPOINT_2(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
CLEAR_AREA(vBusLot, 50, TRUE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< vBusLot.x - 40, vBusLot.y - 40, vBusLot.z - 40 >>,
<< vBusLot.x + 40, vBusLot.y + 40, vBusLot.z + 40 >>, FALSE)
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
REMOVE_FILLER_BUSES()
REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(assArgs)
FILL_LOT_WITH_ADDITIONAL_BUSES(targetData)
WHILE NOT FILL_LOT_WITH_AMBIENT_PEDS(targetData)
WAIT(0)
ENDWHILE
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), targetData.vWarpPos)
IF DOES_ENTITY_EXIST(args.myVehicle)
DELETE_VEHICLE(args.myVehicle)
PRINTLN("REMOVING args.myVehicle")
ENDIF
CREATE_ASSASSINATION_SCENE(targetData, assArgs)
SET_ENTITY_COORDS(PLAYER_PED_ID(), << 421.5518, -640.2153, 27.5072 >>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 178.9499)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
PRINTLN("bDoingPSkip: REMOVING BLIP - args.myTargetBlip")
ENDIF
IF DOES_BLIP_EXIST(busStop[0].blipStop)
REMOVE_BLIP(busStop[0].blipStop)
PRINTLN("bDoingPSkip: REMOVING BLIP - busStop[0].blipStop")
ENDIF
IF DOES_BLIP_EXIST(busStop[1].blipStop)
REMOVE_BLIP(busStop[1].blipStop)
PRINTLN("bDoingPSkip: REMOVING BLIP - busStop[1].blipStop")
ENDIF
IF DOES_BLIP_EXIST(busStop[2].blipStop)
REMOVE_BLIP(busStop[2].blipStop)
PRINTLN("bDoingPSkip: REMOVING BLIP - busStop[2].blipStop")
ENDIF
IF DOES_BLIP_EXIST(busStop[3].blipStop)
REMOVE_BLIP(busStop[3].blipStop)
PRINTLN("bDoingPSkip: REMOVING BLIP - busStop[3].blipStop")
ENDIF
bGrabbedDistanceToNextStop = FALSE
INIT_BUS_STOP_DATA()
CREATE_BUS_STOP_BLIPS()
// bSecondCheckpointSceneLoad = FALSE
bReplaying = FALSE
iNumStopsVisited = 0
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(args.myVehicle)
IF NOT bReplaying
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), targetData.vVehPos)
PRINTLN("CHECKPOINT 2: PLAYER IS IN THE BUS, LET'S DETACH AND MOVE HIM")
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), << 423.25, -641.36, 28.5068 >>)
PRINTLN("MOVING GUY, NOT IN CAR")
ENDIF
ENDIF
DELETE_VEHICLE(args.myVehicle)
PRINTLN("CHECKPOINT 2: DELETING VEHICLE - args.myVehicle")
ENDIF
IF NOT DOES_ENTITY_EXIST(args.myVehicle)
IF bUsingCoach
args.myVehicle = CREATE_VEHICLE(COACH, targetData.vVehPos, targetData.fVehHead)
PRINTLN("CREATING VEHICLE - args.myVehicle - USING COACH MODEL")
SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle)
SET_VEHICLE_COLOUR_COMBINATION(args.myVehicle, 0)
ELSE
args.myVehicle = CREATE_VEHICLE(BUS, targetData.vVehPos, targetData.fVehHead)
PRINTLN("CREATING VEHICLE - args.myVehicle - USING BUS MODEL")
SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle)
SET_VEHICLE_COLOUR_COMBINATION(args.myVehicle, 0)
ENDIF
ENDIF
IF NOT bReplaying
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
ENDIF
ENDIF
// IF NOT bSecondCheckpointSceneLoad
// IF IS_SCREEN_FADED_OUT()
// OR IS_REPLAY_IN_PROGRESS()
// NEW_LOAD_SCENE_START_SPHERE(<< 423.25, -641.36, 28.5068 >>, 10.0)
// bSecondCheckpointSceneLoad = TRUE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 2: CALLING NEW_LOAD_SCENE_START_SPHERE")
// ELSE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 2: SCREEN IS NOT FADED OUT")
// ENDIF
// ELSE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 2: bFirstCheckpointSceneLoad IS TRUE")
// ENDIF
IF DOES_BLIP_EXIST(args.mytargetblip)
REMOVE_BLIP(args.mytargetblip)
ENDIF
IF bReplaying
WHILE NOT FILL_LOT_WITH_AMBIENT_PEDS(targetData)
WAIT(0)
PRINTLN("WAITING FOR SCENE TO LOAD - 2")
ENDWHILE
PRINTLN("ASSASSINATION BUS: SCENE HAS LOADED - 2")
bReplaying = FALSE
ENDIF
// NEW_LOAD_SCENE_STOP()
WHILE NOT ARE_MODELS_LOADED_FOR_EARLY_BUS_STOPS(targetData)
WAIT(0)
PRINTLN("WAITING FOR MODELS TO LOAD FOR EARLY BUS STOPS")
ENDWHILE
WHILE NOT ARE_MODELS_LOADED_FOR_FINAL_BUS_STOP(targetData)
WAIT(0)
PRINTLN("WAITING FOR MODELS TO LOAD FOR FINAL BUS STOP")
ENDWHILE
END_REPLAY_SETUP(args.myVehicle)
FADE_IN()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
// Attempting to fix Bug #937994.
DISPLAY_RADAR(TRUE)
INIT_BUS_STOP_DATA()
CREATE_BUS_ROUTE(targetData, args)
bTargetFleeing = FALSE
bCutsceneSkipped = FALSE
bTargetKillLinePlayed = FALSE
REMOVE_STREAMVOL_FOR_BUS_STOP_CUTSCENE()
missionStage = MISSION_BUS_ENTER_BUS
PRINTLN("ASSASSINATION BUS: GOING TO STATE - MISSION_BUS_ENTER_BUS")
curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
PRINTLN("ASSASSINATION BUS: GOING TO STATE - MISSION_STATE_WAITING_FOR_TARGET_KILL")
ENDPROC
//special case for shitskipping - need to warp the player to the target bus stop and start the mocap cutscene
PROC GO_TO_CHECKPOINT_3_MOCAP(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
PRINTLN("USING - GO_TO_CHECKPOINT_3_MOCAP")
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
// bThirdCheckpointSceneLoad = FALSE
IF bSetThirdCheckpoint
bSetThirdCheckpoint = FALSE
PRINTLN("bSetThirdCheckpoint = FALSE")
ENDIF
ENDIF
bReplaying = FALSE
#ENDIF
REMOVE_BUS_PASSENGERS()
CREATE_PLAYER_BUS_AT_TARGET_BUS_STOP(args)
IF NOT bReplaying
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
ENDIF
// IF NOT bThirdCheckpointSceneLoad
// IF IS_SCREEN_FADED_OUT()
// OR IS_REPLAY_IN_PROGRESS()
// NEW_LOAD_SCENE_START_SPHERE(<< 118.3466, -786.1586, 30.3105 >>, 10.0)
// bThirdCheckpointSceneLoad = TRUE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 3 MOCAP: CALLING NEW_LOAD_SCENE_START_SPHERE")
// ELSE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 3 MOCAP: SCREEN IS NOT FADED OUT")
// ENDIF
// ELSE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 3 MOCAP: bFirstCheckpointSceneLoad IS TRUE")
// ENDIF
IF DOES_BLIP_EXIST(args.mytargetblip)
REMOVE_BLIP(args.mytargetblip)
ENDIF
// IF bReplaying
// WHILE NOT IS_NEW_LOAD_SCENE_LOADED()
// WAIT(0)
// PRINTLN("WAITING FOR SCENE TO LOAD - 3 - MOCAP")
// ENDWHILE
// PRINTLN("ASSASSINATION BUS: SCENE HAS LOADED - 3 - MOCAP")
// bReplaying = FALSE
// ENDIF
WHILE NOT ARE_MODELS_LOADED_FOR_EARLY_BUS_STOPS(targetData)
WAIT(0)
ENDWHILE
WHILE NOT ARE_MODELS_LOADED_FOR_FINAL_BUS_STOP(targetData)
WAIT(0)
ENDWHILE
//special data to set the active stop as the targets
INIT_BUS_STOP_DATA()
iBusStop = 3
iNumStopsVisited = 3
bTargetFleeing = FALSE
bCutsceneSkipped = FALSE
bTargetKillLinePlayed = FALSE
ACTIVATE_NEXT_BUS_STOP(targetData, args, iBusStopOrder[iBusStop], FALSE)
IF DOES_ENTITY_EXIST(busStop[3].viBike)
args.myOtherVehicle = busStop[3].viBike
ELSE
busStop[3].viBike = CREATE_VEHICLE(targetData.otherVehEnum, busStop[3].vVehPos, busStop[3].fVehHead)
SET_VEHICLE_ON_GROUND_PROPERLY(busStop[3].viBike)
args.myOtherVehicle = busStop[3].viBike
ENDIF
CREATE_TARGET_AT_BUS_STOP(targetData, args, 3)
SET_TARGET_IN_GRAY_SUIT(args)
CREATE_FILLED_BUS(targetData, args)
END_REPLAY_SETUP(args.myVehicle)
REMOVE_STREAMVOL_FOR_BUS_STOP_CUTSCENE()
missionStage = MISSION_BUS_TARGET_FLEE
PRINTLN("ASSASSINATION BUS: GOING TO STATE - MISSION_BUS_TARGET_FLEE")
curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
PRINTLN("ASSASSINATION BUS: GOING TO STATE - MISSION_STATE_WAITING_FOR_TARGET_KILL")
ENDPROC
PROC GO_TO_CHECKPOINT_3(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
PRINTLN("USING - GO_TO_CHECKPOINT_3")
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
// bThirdCheckpointSceneLoad = FALSE
WHILE NOT ARE_MODELS_LOADED_FOR_EARLY_BUS_STOPS(targetData)
AND NOT ARE_MODELS_LOADED_FOR_FINAL_BUS_STOP(targetData)
PRINTLN("WAITING FOR ALL PED MODELS TO LOAD FOR CHECKPOINT_3")
WAIT(0)
ENDWHILE
IF bSetThirdCheckpoint
bSetThirdCheckpoint = FALSE
PRINTLN("bSetThirdCheckpoint = FALSE")
ENDIF
bReplaying = FALSE
ENDIF
#ENDIF
REMOVE_BUS_PASSENGERS()
CREATE_PLAYER_BUS_AT_TARGET_BUS_STOP(args)
IF NOT bReplaying
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
ENDIF
// IF NOT bThirdCheckpointSceneLoad
// IF IS_SCREEN_FADED_OUT()
// OR IS_REPLAY_IN_PROGRESS()
// NEW_LOAD_SCENE_START_SPHERE(<< 118.3466, -786.1586, 30.3105 >>, 10.0)
// bThirdCheckpointSceneLoad = TRUE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 3: CALLING NEW_LOAD_SCENE_START_SPHERE")
// ELSE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 3: SCREEN IS NOT FADED OUT")
// ENDIF
// ELSE
// PRINTLN("ASSASSINATION BUS CHECKPOINT 3: bFirstCheckpointSceneLoad IS TRUE")
// ENDIF
IF DOES_BLIP_EXIST(args.mytargetblip)
REMOVE_BLIP(args.mytargetblip)
ENDIF
// IF bReplaying
// WHILE NOT IS_NEW_LOAD_SCENE_LOADED()
// WAIT(0)
// PRINTLN("WAITING FOR SCENE TO LOAD - 3")
// ENDWHILE
// PRINTLN("ASSASSINATION BUS: SCENE HAS LOADED - 3")
// bReplaying = FALSE
// ENDIF
WHILE NOT ARE_MODELS_LOADED_FOR_EARLY_BUS_STOPS(targetData)
WAIT(0)
ENDWHILE
WHILE NOT ARE_MODELS_LOADED_FOR_FINAL_BUS_STOP(targetData)
WAIT(0)
ENDWHILE
// NEW_LOAD_SCENE_STOP()
END_REPLAY_SETUP(args.myVehicle)
FADE_IN()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
IF NOT DOES_ENTITY_EXIST(busStop[3].viBike)
busStop[3].viBike = CREATE_VEHICLE(targetData.otherVehEnum, busStop[3].vVehPos, busStop[3].fVehHead)
SET_VEHICLE_ON_GROUND_PROPERLY(busStop[3].viBike)
ENDIF
bTargetKillLinePlayed = FALSE
bPoliceScannerLinePlayed = FALSE
iNumStopsVisited = 3
CREATE_TARGET_AT_BUS_STOP(targetData, args, 3)
SET_TARGET_IN_GRAY_SUIT(args)
args.myOtherVehicle = busStop[3].viBike
SET_ENTITY_COORDS(args.myOtherVehicle, << 110.2194, -775.8312, 30.4426 >>)
SET_ENTITY_HEADING(args.myOtherVehicle, 77.2454)
SET_PED_INTO_VEHICLE(args.myTarget, args.myOtherVehicle)
bReactionAnimsLoaded = FALSE
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(args.myTarget, args.myOtherVehicle, "OJASbs_102", DF_SwerveAroundAllCars|DF_SteerAroundObjects|DF_SteerAroundPeds, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE)
vCombatPos = << -455.28925, -326.13641, 41.22218 >>
WAYPOINT_RECORDING_GET_NUM_POINTS("OJASbs_102", iRecordingTime)
SET_ENTITY_LOAD_COLLISION_FLAG(args.myTarget, TRUE)
fBikeNormalSpeed = GET_VEHICLE_ESTIMATED_MAX_SPEED(args.myOtherVehicle)
MODIFY_VEHICLE_TOP_SPEED(args.myOtherVehicle, (fBikeTopSpeedModifier * 100)) //allow the bike to achieve speeds faster than its default
SET_PED_COMBAT_ATTRIBUTES(args.myTarget, CA_LEAVE_VEHICLES, TRUE)
SET_VEHICLE_FORWARD_SPEED(args.myOtherVehicle, 1.5)
bTargetFleeing = TRUE
FREEZE_ENTITY_POSITION(args.myVehicle, FALSE)
// TASK_PLAYER_TO_KILL_TARGET(args)
CREATE_FILLED_BUS(targetData, args)
SETUP_BUS_PASSENGERS_FOR_DIALOGUE(args)
// Attempting to fix Bug #937994.
DISPLAY_RADAR(TRUE)
REMOVE_STREAMVOL_FOR_BUS_STOP_CUTSCENE()
missionStage = MISSION_BUS_UPDATE_BIKE
PRINTLN("ASSASSINATION BUS: GOING TO STATE - MISSION_BUS_UPDATE_BIKE")
curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
PRINTLN("ASSASSINATION BUS: GOING TO STATE - MISSION_STATE_WAITING_FOR_TARGET_KILL")
ENDPROC
PROC GO_TO_CHECKPOINT_4(ASS_ARGS& args)
PRINTLN("USING - GO_TO_CHECKPOINT_4")
#IF IS_DEBUG_BUILD
IF bDoingPSkip OR bDoingJSkip
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<79.6878, -802.4135, 30.5188>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 266.8253)
bReplaying = FALSE
ENDIF
#ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
IF DOES_BLIP_EXIST(args.mytargetblip)
REMOVE_BLIP(args.mytargetblip)
PRINTLN("GO_TO_CHECKPOINT_4: REMOVING BLIP - args.mytargetblip")
ENDIF
IF DOES_ENTITY_EXIST(args.myTarget)
DELETE_PED(args.myTarget)
PRINTLN("GO_TO_CHECKPOINT_4: DELETING PED - args.myTarget")
ENDIF
IF DOES_ENTITY_EXIST(args.myOtherVehicle)
DELETE_VEHICLE(args.myOtherVehicle)
PRINTLN("GO_TO_CHECKPOINT_4: DELETING VEHICLE - args.myOtherVehicle")
ENDIF
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
KILL_ANY_CONVERSATION()
END_REPLAY_SETUP()
FADE_IN()
// Attempting to fix Bug #937994.
DISPLAY_RADAR(TRUE)
curStage = MISSION_STATE_SUCCESS
PRINTLN("ASSASSINATION BUS: GOING TO STATE - MISSION_STATE_SUCCESS")
ENDPROC
FUNC BOOL HAS_ENDING_CELL_PHONE_CALL_COMPLETED(ASS_ARGS& args)
IF NOT bPlayedCellPhoneCall
DISABLE_CELLPHONE(FALSE)
ADD_PED_FOR_DIALOGUE(args.assConv, 3, NULL, "LESTER")
IF PLAYER_CALL_CHAR_CELLPHONE(args.assConv, CHAR_LESTER, "OJASAUD", "OJAS_BUS_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
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
FUNC BOOL HAS_FRANKLIN_LEFT_BUS(ASS_ARGS& args)
VECTOR vPlayerPos, vVehiclePos
SWITCH iLeaveBusStages
CASE 0
IF NOT IS_ENTITY_DEAD(args.myVehicle) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
PRINT_NOW("ASS_BS_EXIT", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
ENDIF
PRINTLN("iLeaveBusStages = 1")
iLeaveBusStages = 1
BREAK
CASE 1
IF NOT IS_ENTITY_DEAD(args.myVehicle) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
vVehiclePos = GET_ENTITY_COORDS(args.myVehicle, FALSE)
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE)
IF VDIST2(vVehiclePos, vPlayerPos) < 2500 // 50m
PRINT_NOW("ASS_BS_AREA", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
PRINTLN("iLeaveBusStages = 2")
iLeaveBusStages = 2
ENDIF
ELIF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND DOES_ENTITY_EXIST(args.myVehicle)
// If the Bus is dead, we stil need to check if the player has left it.
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
vVehiclePos = GET_ENTITY_COORDS(args.myVehicle, FALSE)
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE)
IF VDIST2(vVehiclePos, vPlayerPos) < 2500 // 50m
PRINT_NOW("ASS_BS_AREA", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
PRINTLN("BUS IS DEAD: iLeaveBusStages = 2")
iLeaveBusStages = 2
ENDIF
ELSE
PRINTLN("FAIL SAFE: iLeaveBusStages = 2")
iLeaveBusStages = 2
ENDIF
BREAK
CASE 2
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle)
PRINTLN("iLeaveBusStages = 0 - Franklin re-entered teh bus. tell him to leave again")
iLeaveBusStages = 0
ENDIF
ENDIF
vVehiclePos = GET_ENTITY_COORDS(args.myVehicle, FALSE)
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE)
IF VDIST2(vVehiclePos, vPlayerPos) > 2500 // 50m
IF IS_THIS_PRINT_BEING_DISPLAYED("ASS_BS_EXIT")
CLEAR_THIS_PRINT("ASS_BS_EXIT")
ENDIF
PRINTLN("RETURNING TRUE - HAS_FRANKLIN_LEFT_BUS")
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC HANDLE_BIKE_RESET(ASS_ARGS& args)
IF NOT bResetBikeSpeed
IF DOES_ENTITY_EXIST(args.myOtherVehicle) AND NOT IS_ENTITY_DEAD(args.myOtherVehicle)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myOtherVehicle)
MODIFY_VEHICLE_TOP_SPEED(args.myOtherVehicle, 0)
PRINTLN("bResetBikeSpeed = TRUE")
bResetBikeSpeed = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
//main update loop for the assassination
FUNC BOOL UPDATE_ASSASSINATION_BUS(ASS_TARGET_DATA& targetData, ASS_ARGS& args)
SWITCH curStage
CASE MISSION_BRIEF_INIT
IF Is_Replay_In_Progress()
// IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
// PRINTLN("REPLAY VEHICLE IS AVAILABLE - BUS")
// bReplayVehicleAvailable = TRUE
// ELSE
// PRINTLN("BUS: REPLAY VEHICLE IS NOT AVAILABLE")
// ENDIF
bReplaying = TRUE
curStage = MISSION_STATE_INIT
BREAK
ENDIF
DO_STAGE_INTRO_CUTSCENE(args)
BREAK
//print the objectives and help messages immediately after launching the mission
CASE MISSION_STATE_INIT
//initialize necessities for mission and create peds/vehicles/props for assassination scene
INIT_BUS_DATA(targetData)
INIT_MISSION_REQUESTS_AND_UI_LABELS(targetData, sLoadQueue)
SET_BUS_MISSION_TRAFFIC_SETTINGS()
SET_PED_MODEL_IS_SUPPRESSED(targetData.targetEnum, TRUE)
CREATE_ASSASSINATION_SCENE(targetData, assArgs)
FILL_LOT_WITH_ADDITIONAL_BUSES(targetData)
IF bReplaying
IF g_savedGlobals.sAssassinData.fBusMissionTime <> 0
RESTART_TIMER_AT(tMissionTime, g_savedGlobals.sAssassinData.fBusMissionTime)
PRINTLN("RESTARTING TIMER - missionTimer AT: ", g_savedGlobals.sAssassinData.fBusMissionTime)
ENDIF
IF iStageToUse = 0
GO_TO_CHECKPOINT_1(targetData, args)
ELIF iStageToUse = 1
GO_TO_CHECKPOINT_2(targetData, args)
ELIF iStageToUse = 4
GO_TO_CHECKPOINT_3_MOCAP(targetData, args)
ELIF iStageToUse = 2
GO_TO_CHECKPOINT_3(targetData, args)
ELIF iStageToUse = 3
GO_TO_CHECKPOINT_4(args)
ENDIF
ELSE
IF NOT IS_TIMER_STARTED(tMissionTime)
START_TIMER_NOW(tMissionTime)
PRINTLN("STARTING TIMER - tMissionTime")
g_savedGlobals.sAssassinData.fBusMissionTime = 0
PRINTLN("BUS GLOBAL MISSION TIMER = ", g_savedGlobals.sAssassinData.fBusMissionTime)
ENDIF
PRINTLN("GOING TO STATE - MISSION_STATE_STREAMING")
curStage = MISSION_STATE_STREAMING
ENDIF
BREAK
CASE MISSION_STATE_STREAMING
IF ARE_MISSION_REQUESTS_FINISHED_STREAMING(targetData, sLoadQueue)
PRINTLN("curStage = MISSION_STATE_PRINTS")
curStage = MISSION_STATE_PRINTS
ENDIF
BREAK
CASE MISSION_STATE_PRINTS
IF NOT IS_SCREEN_FADING_IN()
//tell the player to lose their wanted level if needed
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
PRINT_NOW(targetData.OBJECTIVES[0], DEFAULT_GOD_TEXT_TIME, 1)
// bFirstObjectivePrinted = TRUE
ELSE
REMOVE_BLIP(args.myTargetBlip)
PRINT_NOW("ASS_BS_COPS", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(args.myTargetBlip, <<388.7943, -681.7061, 28.1490>>, 272.5919)
PRINTLN("SETTING TAXI LOCATION")
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "assassin_bus_enter_bus")
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(viReplayVehicle)
curStage = MISSION_STATE_TRAVEL
ENDIF
BREAK
//player is en route to the target. Trigger intro cutscene when in range if not wanted
CASE MISSION_STATE_TRAVEL
REMOVE_SKINNED_PHONE_PROP()
GRAB_RETRY_VEHICLE()
IF DOES_BLIP_EXIST(args.myTargetBlip) //station blip
//set bit to check for wanted as a parameter for triggering panic so that the player will fail if they approach the station while wanted
CHECK_FOR_WANTED_IN_AGGRO_CHECKS()
//monitor to see if player has become wanted or blown their cover prior to triggering the intro cutscene and handle accordingly
IF IS_PLAYER_NEAR_COORD_AND_NOT_A_TAXI_PASSENGER(targetData.vDestPos, fDefaultAssassinSceneRange)
AND IS_PLAYER_READY_FOR_CUTSCENE(PLAYER_ID())
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
ENDIF
// curStage = MISSION_STATE_CUTSCENE_SETUP
DISABLE_CELLPHONE(TRUE)
PRINTLN("DISABLING CELLPHONE - NOW THAT THE PLAYER HAS REACHED BUS DEPOT")
curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
ELSE
REMOVE_BLIP_AND_PRINT_OBJECTIVE_MSG_IF_WANTED(args.myTargetBlip, "ASS_BS_COPS")
IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < 200.0
FILL_LOT_WITH_AMBIENT_PEDS(targetData)
ENDIF
ENDIF
ELSE
//print destination objective message when not wanted
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
args.myTargetBlip = ADD_BLIP_FOR_COORD(targetData.vDestPos)
SET_BLIP_ROUTE(args.myTargetBlip, TRUE)
// IF NOT bFirstObjectivePrinted
// PRINT_NOW("ASS_BS_LOOK", DEFAULT_GOD_TEXT_TIME, 1)
// bFirstObjectivePrinted = TRUE
// ENDIF
ELSE
//don't do wanted checks here because we dont want to fail the player for becoming wanted if they aren't near the station
DONT_CHECK_FOR_WANTED_IN_AGGRO_CHECKS()
ENDIF
ENDIF
// If the player enters a bus early, go ahead and skip right to the first objective, i.e. pick up passengers.
CHECK_FOR_PLAYER_IN_BUS(args)
//make sure we are retaining the players vehicle prior to entering the bus and saving it at franklins house when the mission is over
SAVE_LAST_PLAYER_VEHICLE()
//Fail mission if player is wanted near the station or the vehicle is destroyed
IF (IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) AND GET_PLAYER_DISTANCE_FROM_ENTITY(args.myVehicle) < fDefaultAssassinSceneRange )
OR NOT IS_VEHICLE_SAFE_FOR_ASSASSIN_MISSION(args.myVehicle)
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, targetData.vVehPos, 25)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(args.myVehicle, PLAYER_PED_ID())
DEBUG_MESSAGE("FAILING ASSASSINATION SCRIPT - WANTED LEVEL FAIL")
SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER)
ENDIF
BREAK
// //intro cutscene has been triggered - set it up properly
// CASE MISSION_STATE_CUTSCENE_SETUP
//
// IF IS_PLAYER_READY_FOR_ASSASSINATION_CUTSCENE()
// curStage = MISSION_STATE_CUTSCENE
// ENDIF
// BREAK
// //play the appropriate intro cutscene
// CASE MISSION_STATE_CUTSCENE
//
// fpCutsceneCustomIntro = &ASSASSIN_INTRO_CUSTOM_BUS
// GET_CUSTOM_CUTSCENE(targetData)
//
// //play the cutscene
// IF DO_CUTSCENE_CUSTOM(cutArgs.cutsceneState, cutArgs.cutSceneTimer, targetData.vCutscenePos, targetData.vCutsceneHead, myCamera, "", fpCutsceneCustomIntro, FALSE, FALSE, FALSE, targetData.fCutsceneDoF)
// DO_SCREEN_FADE_IN(500)
//
// DISABLE_CELLPHONE(TRUE)
// PRINTLN("DISABLING CELLPHONE - NOW THAT THE PLAYER HAS REACHED BUS DEPOT")
//
// curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
// ENDIF
// BREAK
//waiting for player to kill the target
CASE MISSION_STATE_WAITING_FOR_TARGET_KILL
HANDLE_BIKE_RESET(assArgs)
CHECK_FOR_PLAYER_IN_BUS(args)
//make sure we are retaining the players vehicle prior to entering the bus and saving it at franklins house when the mission is over
SAVE_LAST_PLAYER_VEHICLE()
IF CHECK_FOR_TARGET_DEATH(assArgs, targetData)
IF passReasonCore = PASS_BONUS
PED_BONETAG pedBonetag
IF GET_PED_LAST_DAMAGE_BONE(args.myTarget, pedBonetag)
AND pedBonetag <> BONETAG_NULL
IF NOT IS_ENTITY_ALIVE(args.myTarget)
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_ojbusass_bus_impact", args.myTarget, <<0,0,0>>, GET_ENTITY_FORWARD_VECTOR(args.myVehicle), pedBonetag, 2)
ENDIF
ELSE
IF NOT IS_ENTITY_ALIVE(args.myTarget)
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_ojbusass_bus_impact", args.myTarget, <<0,0,0>>, GET_ENTITY_FORWARD_VECTOR(args.myVehicle), BONETAG_HEAD, 2)
ENDIF
ENDIF
// IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
// SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
// SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
// PRINTLN("SETTING WANTED LEVEL - 2")
// ENDIF
ENDIF
HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, args.assConv, "OJASAUD", "OJAS_BUCOM", CONV_PRIORITY_VERY_HIGH)
UPDATE_BUS_PASSENGER_ANIMS(args) //TO FIX BUG 1271508
PRINTLN("GOING TO STATE - MISSION_STATE_KILLCAM")
curStage = MISSION_STATE_KILLCAM
ELSE
UPDATE_LOOP_BUS(targetData, assArgs)
CHECK_FOR_HIT_AND_RUN_BONUS(args)
ENDIF
BREAK
//play the kill cam cutscene
CASE MISSION_STATE_KILLCAM
// IF HAS_SLOW_KILLCAM_FINISHED(args.myTarget, FALSE)
IF DOES_BLIP_EXIST(args.myTargetBlip)
REMOVE_BLIP(args.myTargetBlip)
ENDIF
//to fix bugs with camera remaining locked on the target or help message on screen explaining how to focus onthe target
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
CLEAR_HELP()
REMOVE_SPECIAL_HINT_CAM()
bTargetFleeing = FALSE
// CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASbs_WRNG", CONV_PRIORITY_VERY_HIGH)
// MANAGE_BUS_DIALOGUE(args)
UPDATE_BUS_PASSENGER_ANIMS(args, FALSE)
STOP_SCRIPTED_CONVERSATION(FALSE)
HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, args.assConv, "OJASAUD", "OJAS_BUCOM", CONV_PRIORITY_VERY_HIGH)
PRINTLN("GOING TO STATE - MISSION_STATE_SUCCESS")
curStage = MISSION_STATE_SUCCESS
// ENDIF
BREAK
//pass the mission
CASE MISSION_STATE_SUCCESS
HANDLE_BIKE_RESET(assArgs)
HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, args.assConv, "OJASAUD", "OJAS_BUCOM", CONV_PRIORITY_VERY_HIGH)
PLAY_SCREAM_FROM_RANDOM_BUS_PASSENGER(args.myVehicle)
IF HAS_FRANKLIN_LEFT_BUS(args)
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
PRINTLN("WANTED LEVEL = 0")
IF HAS_ENDING_CELL_PHONE_CALL_COMPLETED(args)
RETURN TRUE
ELSE
PRINTLN("WAITING ON PHONE CALL TO FINISH")
ENDIF
ELSE
IF NOT bLoseCopsPrinted
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
PRINT_NOW("ASS_BS_COPS", DEFAULT_GOD_TEXT_TIME, 1)
RESTART_TIMER_NOW(speechDelayTimer)
RESTART_TIMER_NOW(speechTimerPassenger)
PRINTLN("PRINTING LINE TO LOSE THE COPS")
bLoseCopsPrinted = TRUE
ELSE
HANDLE_POLICE_SCANNER_LINE_FOR_BUS_MISSION()
ENDIF
ENDIF
ELSE
HANDLE_POLICE_SCANNER_LINE_FOR_BUS_MISSION()
ENDIF
BREAK
ENDSWITCH
//always run these while thei mission is active since we want to fail the player for entering shops (Bug 1039794)
IF curStage >= MISSION_STATE_TRAVEL
IF BUS_DO_CUSTOM_SHOP_FAIL_CHECKS()
SET_MISSION_FAILED(asnArgs, targetData, FAIL_ABANDONED_MISSION)
PRINTLN("FAILING BUS ASSASSINATION: Player entered a shop")
ENDIF
ENDIF
// //do checks to see if player has abandoned the mission area prior to discovering the target
// IF curStage <= MISSION_STATE_WAITING_FOR_TARGET_KILL
// AND missionStage < MISSION_BUS_TARGET_FLEE
// IF HAS_PLAYER_ABANDONED_ASSASSINATION_AREA(bWarningHelp, vMissionCenter, "ASS_BS_FAILWARN", 500)
// PRINTLN("FAILING BUS ASSASSINATION SCRIPT BECAUSE PLAYER ABANDONED THE DOWNTOWN AREA")
// SET_MISSION_FAILED(asnArgs, targetData, FAIL_ABANDONED_MISSION)
// ENDIF
// ENDIF
RETURN FALSE
ENDFUNC
PROC DO_FADE_OUT_WITH_WAIT()
IF NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
// debug builds only for J-skipping
#IF IS_DEBUG_BUILD
PROC HANDLE_BUS_JSKIP_TELEPORT()
IF IS_GAMEPLAY_CAM_RENDERING()
IF IS_VEHICLE_DRIVEABLE(assArgs.myVehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), assArgs.myVehicle)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), assArgs.myVehicle)
ENDIF
ENDIF
IF busStop[0].bActive
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << 308.5922, -763.7350, 28.2631 >>)
SET_ENTITY_HEADING(assArgs.myVehicle, 160.5210)
ELIF busStop[1].bActive
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << 353.0733, -1064.4456, 28.4131 >>)
SET_ENTITY_HEADING(assArgs.myVehicle, 269.8679)
ELIF busStop[2].bActive
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << 266.7450, -1125.1301, 28.2203 >>)
SET_ENTITY_HEADING(assArgs.myVehicle, 88.6338)
ELIF busStop[3].bActive
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << 116.1863, -785.7573, 30.3428 >>)
SET_ENTITY_HEADING(assArgs.myVehicle, 68.4340)
ENDIF
ENDIF
RESTART_TIMER_AT(busTimer, 2)
ENDPROC
PROC JUMP_TO_STAGE(ASS_TARGET_DATA& targetData, ASS_ARGS& args, MISSION_STATE state, MISSION_BUS_STAGE stage, BOOL bIsDebugJump = FALSE)
DO_FADE_OUT_WITH_WAIT()
//Update mission checkpoint in case they skipped the stages where it gets set.
IF bIsDebugJump
SWITCH state
CASE MISSION_STATE_PRINTS
PRINTLN("JUMP_TO_STAGE 01: MISSION_STATE_PRINTS")
GO_TO_CHECKPOINT_1(targetData, args)
BREAK
CASE MISSION_STATE_WAITING_FOR_TARGET_KILL
SWITCH stage
CASE MISSION_BUS_CREATE_PEDS
PRINTLN("JUMP_TO_STAGE 02: MISSION_STATE_PRINTS")
GO_TO_CHECKPOINT_1(targetData, args)
BREAK
CASE MISSION_BUS_ENTER_BUS
GO_TO_CHECKPOINT_2(targetData, args)
BREAK
CASE MISSION_BUS_TARGET_FLEE
GO_TO_CHECKPOINT_3(targetData, args)
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
ENDPROC
// debug skips
PROC DO_DEBUG_SKIPS_BUS(ASS_ARGS& args, ASS_TARGET_DATA& targetData)
MISSION_STATE eState
MISSION_BUS_STAGE eStage
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage)
IF iDebugJumpStage = 0
eState = MISSION_STATE_PRINTS
ELIF iDebugJumpStage = 1
eState = MISSION_STATE_WAITING_FOR_TARGET_KILL
eStage = MISSION_BUS_ENTER_BUS
ELIF iDebugJumpStage = 2
eState = MISSION_STATE_WAITING_FOR_TARGET_KILL
eStage = MISSION_BUS_TARGET_FLEE
ENDIF
bDoingPSkip = TRUE
JUMP_TO_STAGE(targetData, args, eState, eStage, TRUE)
ENDIF
// mission pass S
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
KILL_ANY_CONVERSATION()
curStage = MISSION_STATE_SUCCESS
ENDIF
// mission failed F
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
SET_MISSION_FAILED(asnArgs, targetData, FAIL_ABANDONED_MISSION)
ENDIF
//output debug cam coords relative to entity
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_N)
OUTPUT_DEBUG_CAM_RELATIVE_TO_ENTITY(args.myVehicle)
ENDIF
// skip to previous stage
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
IF curStage = MISSION_STATE_TRAVEL
eState = MISSION_STATE_PRINTS
eStage = MISSION_BUS_STREAM_PEDS
PRINTLN("eStage = MISSION_STATE_PRINTS")
bDoingPSkip = TRUE
JUMP_TO_STAGE(targetData, args, eState, eStage, TRUE)
ELIF curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
IF missionStage = MISSION_BUS_ENTER_BUS OR missionStage = MISSION_BUS_UPDATE_BUS_PEDS
eState = MISSION_STATE_PRINTS
eStage = MISSION_BUS_STREAM_PEDS
PRINTLN("eStage = MISSION_STATE_PRINTS")
ELIF missionStage = MISSION_BUS_TARGET_FLEE OR missionStage = MISSION_BUS_UPDATE_BIKE
eState = MISSION_STATE_WAITING_FOR_TARGET_KILL
eStage = MISSION_BUS_ENTER_BUS
PRINTLN("eStage = MISSION_BUS_ENTER_BUS")
ELIF missionStage = MISSION_BUS_FLEE_ON_FOOT
eState = MISSION_STATE_WAITING_FOR_TARGET_KILL
eStage = MISSION_BUS_TARGET_FLEE
PRINTLN("eStage = MISSION_BUS_TARGET_FLEE")
ENDIF
bDoingPSkip = TRUE
JUMP_TO_STAGE(targetData, args, eState, eStage, TRUE)
ELSE
PRINTLN("Can't P-SKIP while in this state! You need to be in locate or kill state.")
ENDIF
ENDIF
// skip stage J
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
IF curStage = MISSION_STATE_TRAVEL
eState = MISSION_STATE_WAITING_FOR_TARGET_KILL
eStage = MISSION_BUS_ENTER_BUS
PRINTLN("eStage = MISSION_BUS_ENTER_BUS")
bDoingJSkip = TRUE
JUMP_TO_STAGE(targetData, args, eState, eStage, TRUE)
ELIF curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL
IF missionStage = MISSION_BUS_ENTER_BUS OR missionStage = MISSION_BUS_UPDATE_BUS_PEDS
eState = MISSION_STATE_WAITING_FOR_TARGET_KILL
eStage = MISSION_BUS_TARGET_FLEE
PRINTLN("eStage = MISSION_BUS_TARGET_FLEE")
bDoingJSkip = TRUE
JUMP_TO_STAGE(targetData, args, eState, eStage, TRUE)
ELIF missionStage = MISSION_BUS_TARGET_FLEE OR missionStage = MISSION_BUS_UPDATE_BIKE
SET_ENTITY_HEALTH(args.myTarget, 0)
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
PRINTLN("eStage = MISSION_STATE_SUCCESS")
bDoingJSkip = TRUE
curStage = MISSION_STATE_SUCCESS
ENDIF
ELSE
PRINTLN("Can't J-SKIP while in this state! You need to be in locate or kill state.")
ENDIF
ENDIF
ENDPROC
#ENDIF
PROC REMOVE_BUS()
IF DOES_ENTITY_EXIST(vehPlayerIsIn)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayerIsIn)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), << 421.5518, -640.2153, 27.5072 >>)
PRINTLN("DETACHING PLAYER FROM VEHICLE")
ENDIF
SET_ENTITY_AS_MISSION_ENTITY(vehPlayerIsIn)
DELETE_VEHICLE(vehPlayerIsIn)
PRINTLN("DELETING VEHICLE - vehPlayerIsIn VIA PRE-CLEANUP")
ENDIF
ENDPROC
PROC SET_BUS_PASSENGERS_TO_REMAIN_IN_BUS()
INT idx, pedIdx
REPEAT NUM_BUS_STOPS idx
FOR pedIdx = 0 TO 2
IF NOT IS_PED_INJURED(busStop[idx].piAmbPed[pedIdx])
AND IS_PED_IN_ANY_VEHICLE(busStop[idx].piAmbPed[pedIdx])
SET_PED_COMBAT_ATTRIBUTES(busStop[idx].piAmbPed[pedIdx], CA_LEAVE_VEHICLES, FALSE)
SET_PED_FLEE_ATTRIBUTES(busStop[idx].piAmbPed[pedIdx], FA_USE_VEHICLE, FALSE)
SET_PED_KEEP_TASK(busStop[idx].piAmbPed[pedIdx], TRUE)
ENDIF
ENDFOR
ENDREPEAT
ENDPROC
PROC REMOVE_PEDS_FROM_AUDIO_GROUP(ASS_ARGS& args)
PED_INDEX tempPed
INT idx
REPEAT NUM_BUS_SEATS idx
IF IS_VEHICLE_DRIVEABLE(args.myVehicle)
IF GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, idx)) <> NULL
tempPed = GET_PED_IN_VEHICLE_SEAT(args.myVehicle, INT_TO_ENUM(VEHICLE_SEAT, idx))
IF DOES_ENTITY_EXIST(tempPed) AND NOT IS_ENTITY_DEAD(tempPed)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(tempPed)
PRINTLN("REMOVING PED FROM AUDIO GROUP")
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC SAVE_MISSION_TIMER_FOR_MISSION()
IF IS_TIMER_STARTED(tMissionTime)
g_savedGlobals.sAssassinData.fBusMissionTime = GET_TIMER_IN_SECONDS(tMissionTime)
PRINTLN("CLEANUP: tMissionTime = ", g_savedGlobals.sAssassinData.fBusMissionTime)
ELSE
PRINTLN("CLEANUP: tMissionTime WAS NOT STARTED!!!")
ENDIF
ENDPROC
//main script
SCRIPT(ASS_TARGET_DATA targetData)
DEBUG_MESSAGE("Assassination Bus Start")
SET_MISSION_FLAG(TRUE)
IF (HAS_FORCE_CLEANUP_OCCURRED())
DEBUG_MESSAGE("FORCE CLEANUP HAS OCCURRED!!!")
SET_BITMASK_AS_ENUM(g_savedGlobals.sAssassinData.iGenericData, ACD_FAILED)
SAVE_MISSION_TIMER_FOR_MISSION()
Mission_Flow_Mission_Force_Cleanup()
//restore phone stuff
IF DOES_ENTITY_EXIST(oPayPhone)
SET_ENTITY_VISIBLE(oPayPhone, TRUE)
SET_ENTITY_COLLISION(oPayPhone, TRUE)
SET_ENTITY_CAN_BE_DAMAGED(oPayPhone, TRUE)
ENDIF
REMOVE_NAVMESH_BLOCKING()
MISSION_CLEANUP(sLoadQueue)
ENDIF
IF Is_Replay_In_Progress()
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
PRINTLN("REPLAY VEHICLE IS AVAILABLE - CONSTRUCTION")
bReplayVehicleAvailable = TRUE
ELSE
PRINTLN("REPLAY VEHICLE IS NOT AVAILABLE - CONSTRUCTION")
ENDIF
bReplaying = TRUE
ELSE
bReplaying = FALSE
ENDIF
#IF IS_DEBUG_BUILD
AddWidgets(myDebugData)
SETUP_DEBUG()
#ENDIF
// Fix Bug # 712684
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
ENDIF
sb01 = PREVENT_PEDS_FROM_BEING_IN_AREA((<<305.0073, -764.5070, 28.3097>> + <<2,2,2>>), (<<305.0073, -764.5070, 28.3097>> - <<2,2,2>>))
sb02 = PREVENT_PEDS_FROM_BEING_IN_AREA((<<355.6028, -1067.1489, 28.5672>> + <<2,2,2>>), (<<355.6028, -1067.1489, 28.5672>> - <<2,2,2>>))
ASSASSINATION_ClearUnneededGenericData()
iCurAssassinRank = ENUM_TO_INT(ASSASSINATION_Bus) //g_savedGlobals.sAssassinData.iCurrentAssassinRank
missionData = ASSASSINATION_GetMissionData(iCurAssassinRank)
PRINTLN("Current rank is... ", iCurAssassinRank)
//Note we don't have to check this in Aggro checks because the IS_PLAYER_SHOOTING_FROM_BUS() function will now cover this (3/14/13 - MB)
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_HeardShot)
SET_WANTED_LEVEL_MULTIPLIER(0.2)
PRINTLN("SETTING WANTED LEVEL MULTIPLIER TO 0.2")
//HANDLE STREAMING AROUND REPLAY START POSITION
IF IS_REPLAY_IN_PROGRESS()
bHaveRetryOnce = TRUE
PRINTLN("BUS: SETTING - bHaveRetryOnce = TRUE")
iStageToUse = Get_Replay_Mid_Mission_Stage()
PRINTLN("iStageToUse = ", iStageToUse)
IF g_bShitskipAccepted
IF iStageToUse < 1
OR iStageToUse >= 2
iStageToUse = (iStageToUse + 1)
PRINTLN("SHIT SKIP: iStageToUse = ", iStageToUse)
ELIF iStageToUse = 1
iStageToUse = 4 //special mocap stage
PRINTLN("SHIT SKIP: GO TO MOCAP CUTSCENE! iStageToUse = ", iStageToUse)
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
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(<< -22.4026, -110.8498, 56.0027 >>, 187.4018)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 1
START_REPLAY_SETUP(<< 421.5518, -640.2153, 27.5072 >>, 178.9499)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 2
START_REPLAY_SETUP(<< 96.6454, -779.0001, 30.4853 >>, 249.5191)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 4
//mocap cutscene only triggererable via Shitskip
START_REPLAY_SETUP(<< 96.6454, -779.0001, 30.4853 >>, 249.5191)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ELIF iStageToUse = 3
START_REPLAY_SETUP(<<79.6878, -802.4135, 30.5188>>, 266.8253)
PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse)
ENDIF
ENDIF
//main loop
WHILE TRUE
WAIT(0)
UPDATE_LOAD_QUEUE_LARGE(sLoadQueue)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_ASS4")
// PRINTLN("CURRENT STATE: ", ENUM_TO_INT(curStage))
// PRINTLN("STATE: ", ENUM_TO_INT(missionStage))
IF UPDATE_FAIL_CONDITIONS(targetData)
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
SAVE_MISSION_TIMER_FOR_MISSION()
REMOVE_PEDS_FROM_AUDIO_GROUP(assArgs)
ALLOW_PEDS_TO_BE_IN_AREA(sb01, (<<305.0073, -764.5070, 28.3097>> + <<2,2,2>>), (<<305.0073, -764.5070, 28.3097>> - <<2,2,2>>))
ALLOW_PEDS_TO_BE_IN_AREA(sb02, (<<305.0073, -764.5070, 28.3097>> + <<2,2,2>>), (<<305.0073, -764.5070, 28.3097>> - <<2,2,2>>))
REMOVE_BUS()
REMOVE_SCENARIO_BLOCKING_AREA(sbiBusLot[0])
REMOVE_SCENARIO_BLOCKING_AREA(sbiBusLot[1])
REMOVE_SCENARIO_BLOCKING_AREA(sbiBusLot[2])
REMOVE_SCENARIO_BLOCKING_AREA(sbiBusLot[3])
REMOVE_SCENARIO_BLOCKING_AREA(sbiBusLot[4])
REMOVE_SCENARIO_BLOCKING_AREA(sbiBusLot[5])
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
CLEAR_HELP()
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE)
REMOVE_NAVMESH_BLOCKING()
SET_WANTED_LEVEL_MULTIPLIER(1.0)
PRINTLN("SETTING WANTED LEVEL MULTIPLIER TO 1.0")
MISSION_FAILED(sLoadQueue)
ENDIF
ELIF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF UPDATE_ASSASSINATION_BUS(targetData, assArgs)
g_savedGlobals.sAssassinData.fBusMissionTime = GET_TIMER_IN_SECONDS(tMissionTime)
PRINTLN("GLOBAL BUS MISSION TIME = ", g_savedGlobals.sAssassinData.fBusMissionTime)
fTimeTaken = g_savedGlobals.sAssassinData.fBusMissionTime
PRINTLN("fTimeTaken = ", fTimeTaken)
SET_BUS_PASSENGERS_TO_REMAIN_IN_BUS()
MOVE_LAST_PLAYER_DRIVEN_VEHICLE_TO_FRANKLINS_SAFEHOUSE()
MISSION_PASSED(missionData, cucEndScreenCore, sLoadQueue)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DO_DEBUG_SKIPS_BUS(assArgs, targetData)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerDebugPositon = GET_ENTITY_COORDS(PLAYER_PED_ID())
fPlayerDebugHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
ENDIF
vSpherePosition = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vPlayerDebugPositon, fPlayerDebugHeading, << myDebugData.fOffsetX, myDebugData.fOffsetY, myDebugData.fOffsetZ >>)
GET_GROUND_Z_FOR_3D_COORD(vSpherePosition, fDebugHeight)
DRAW_DEBUG_SPHERE(vSpherePosition, 0.1)
// IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_H)
// PLAY_SCREAM_FROM_RANDOM_BUS_PASSENGER(assArgs.myVehicle, TRUE)
// ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_H)
OPEN_BUS_DOORS(assArgs.myVehicle)
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_V)
CLOSE_BUS_DOORS(assArgs.myVehicle)
ENDIF
#ENDIF
ENDWHILE
ENDSCRIPT