////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // 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, <>) // 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