//Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. USING "rage_builtins.sch" USING "globals.sch" USING "cutscene_public.sch" USING "commands_cutscene.sch" USING "commands_entity.sch" USING "commands_script.sch" USING "script_player.sch" USING "script_blip.sch" USING "script_camera.sch" USING "randomChar_public.sch" USING "dialogue_public.sch" USING "CompletionPercentage_public.sch" USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct USING "RC_Threat_public.sch" USING "RC_Helper_Functions.sch" USING "RC_Area_public.sch" USING "initial_scenes_nigel.sch" USING "commands_recording.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" #ENDIF // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Nigel 1 D // AUTHOR : Ben Hinchliffe/Ian Gander // DESCRIPTION : Player has to chase a celebrity golfer and steal his golf club // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // The Random Character - sRCLauncherDataLocal.pedID[0] g_structRCScriptArgs sRCLauncherDataLocal // Mission stages ENUM MISSION_STAGE //MAIN MISSION FLOW MS_INTRO_PHONECALL = 0, MS_GO_TO_THE_GOLF_CLUB, MS_GO_TO_CELEBRITY, MS_GET_THE_CLUB, MS_CHASE_THE_GOLFER, MS_CHASE_IN_CITY, MS_COLLECT_GOLF_CLUB, MS_END_PHONECALL, MS_MISSION_FAILED, //SUB STAGES / RETURNS MS_LOSE_SECURITY, MS_LOSE_THE_COPS ENDENUM // Sub-stages ENUM SUB_STAGE SS_SETUP, SS_UPDATE, SS_CLEANUP ENDENUM // Fail reasons ENUM FAIL_REASON FAIL_DEFAULT, FAIL_LION_ESCAPED, FAIL_DID_NOT_LOCATE_LION, FAIL_LOST_GOLF_CLUB, FAIL_CLUB_DESTROYED ENDENUM //Golfer States ENUM GOLFER_STATE GS_WAIT_FOR_PLAYER, GS_PLAYER_IN_OUTFIT, GS_ANGRY_AT_PLAYER, GS_GET_INTO_VEHICLE, GS_FLEE_FROM_PLAYER_IN_BUGGY, GS_CRASH_INTO_LAKE, GS_FLEE_IN_CITY, GS_CRASHED, GS_FLEEING_ON_FOOT ENDENUM //Celebrity Personal Security states ENUM SECURITY_STATE SS_GUARD_AREA, SS_GO_TO_PLAYER, SS_WARN_PLAYER, SS_AIM_AT_PLAYER, SS_ATTACK_PLAYER, SS_STANDDOWN, SS_FLEEING_AREA ENDENUM //Golf course security ENUM COURSE_SECURITY CS_GET_IN_POSITION, CS_WAIT_AT_LOCATION, CS_PLAYER_WARNED, CS_CHAT_TO_PLAYER, CS_CALL_POLICE, CS_TURN_TO_FACE_BUGGY, CS_AVOID_BUGGY, CS_FLEE_FROM_PLAYER, CS_ATTACK_PLAYER ENDENUM //Consierge Ped state ENUM CONCIERGE_STATE CS_STAND_AND_WAIT, CS_FLEEING_PLAYER ENDENUM //Ambient golfer state ENUM AMBIENT_STATE AS_PLAYGOLF, AS_ALERTED, AS_GO_TO_FLEE_POS, AS_FLEE, AS_DEAD ENDENUM ENUM OUTFIT_STATE OS_WAIT_FOR_PLAYER, OS_DETECTED, OS_DO_CAMERA_UP, OS_CHANGE_OUTFIT, OS_DO_CAMERA_DOWN, OS_OUTFIT_CHANGED, OS_DISABLED ENDENUM ENUM WANTED_STATE WS_NOT_WANTED, WS_WAITING_FOR_WANTED, WS_WANTED ENDENUM ENUM PLAYER_TASE_STATE TS_NOT_TASED, TS_TASED ENDENUM ENUM CELEB_SWING_DIALOGUE SWING_TRIGGER, SWING_SPEAKING, SWING_WAIT ENDENUM // MISSION PED STRUCT MISSION_PED PED_INDEX mPed VECTOR vStartPos VECTOR vFleePos FLOAT fStartHeading MODEL_NAMES mModel BOOL bImDead BOOL bImAttacked BLIP_INDEX mBlip STRING mStartAnim ENDSTRUCT // MISSION VEHICLE STRUCT MISSION_VEHICLE VEHICLE_INDEX mVehicle VECTOR vStartPos FLOAT fStartHeading MODEL_NAMES mModel ENDSTRUCT // MISSION PROPS STRUCT MISSION_PROP OBJECT_INDEX mObject VECTOR vStartPos FLOAT fStartHeading MODEL_NAMES mModel ENDSTRUCT STRUCT MISSION_PICKUP PICKUP_INDEX index OBJECT_INDEX objIndex BLIP_INDEX blip VECTOR pos //temporary until set blip for pickup works correctly ENDSTRUCT // ENUMS MISSION_STAGE eMissionStage = MS_GO_TO_THE_GOLF_CLUB GOLFER_STATE eGolferState = GS_WAIT_FOR_PLAYER //MISSION_STAGE eReturnStage = MS_INTRO_PHONECALL SUB_STAGE eSubStage = SS_SETUP // STAGE SKIPPING #IF IS_DEBUG_BUILD CONST_INT MAX_SKIP_MENU_LENGTH 8 MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH] BOOL bDebug_PrintToTTY = TRUE WIDGET_GROUP_ID widgetGroup #ENDIF MISSION_STAGE eTargetStage // now used in release build too for checkpoint stuff BOOL bFinishedSkipping // now used in release build too for checkpoint stuff //---------------------- // CHECKPOINTS //---------------------- CONST_INT CP_AFTER_MOCAP 0 CONST_INT CP_LOCATED_STANKY 1 CONST_INT CP_COMPLETE 2 CONST_INT Z_SKIP_AFTER_MOCAP 1 CONST_INT Z_SKIP_LOCATED_STANKY 3 // the number passed in to the z skip function to get to the final stage CONST_INT Z_SKIP_ENDPHONECALL 7 // CONVERSATIONS structPedsForConversation sDialogue //BLIPS BLIP_INDEX biMissionBlip BLIP_INDEX biConciergeBlip //CAMERAS CAMERA_INDEX ciOutfitTransitionIn CAMERA_INDEX ciOutfitTransitionOut CAMERA_INDEX ciOutfitTransitionHelper //BOOLS BOOL bDropGolfBag //Used to check if golf bag needs detaching from buggy BOOL bSecurityCreated //Security for the Celebrity created BOOL bCourseSecurityLoaded //Security around edge of golf course BOOL bAmbientGolfersCreated //Ambient golfers around Celeb BOOL bAmbientChaseGolfersCreated //Ambient golfers during the celebrity buggy chase BOOL bPlayerApproached //Used for Celeb security BOOL bPlayerReturned BOOL bShouldAttackPlayer //Used to tell security if they should attack or not BOOL bWarned //Player has been warned about cars and guns BOOL bHelpTextDisplayed BOOL bCelebrityCreated BOOL bFriendIsFleeing BOOL bSecuritySaidCannotDrive BOOL bSecurityAttack BOOL bWarnedAboutLeaving //This is used for leaving lion / golfclubs BOOL bConversationActive //Deals with if conversations are active BOOL bConciergeSceneCreated BOOL bMainObjectiveDisplayed //Has the main objective been displayed // Resets every main objective change. BOOL bClubCollectedByPlayer BOOL bHasGoneOppositeWay //Used to see if Celeb golfer has gone alternative route at start of chase BOOL bPlayerHasBeenClose //Used to see if the player has been near the golf club pickup yet //BOOL bReturnObjectiveDisplayed // Has return objective been displayed // Resets every return objective change. BOOL bHasChanged //Keeping track of Trevor changing outfit BOOL bFostenburgFleeCheck = FALSE BOOL bDonePoliceReport = FALSE BOOL bCheckStatFour = TRUE BOOL bAllowPlayerToStealClubFromBag = TRUE BOOL bHasAcquiredGolfOutfit = FALSE BOOL bHasAddedHeadshot = FALSE INT iHeadshotTimer INT iNigelCallDelayTimer // Replay stuff BOOL bReplayCelebDeadCheck = FALSE // Audio mix group vars BOOL bIsInCaddy = FALSE VEHICLE_INDEX viStoredCaddyIdx //STRINGS FAIL_REASON eFailReason //FAIL REASON THAT GETS DISPLAYED //CONST_INT CONST_INT NUM_OF_CONC_PEDS 4 //NUMBER OF CONCERIGE PEDS AT FRONT OF GOLF CLUB CONST_INT NUM_OF_SECURITY 3 //NUMBER OF CELEBRITY PERSONAL SECURITY CONST_INT NUM_OF_COURSE_SECURITY 3 //NUMBER OF GOLF COURSE SECURTIY CONST_INT NUM_OF_AMB_GOLFERS 6 //NUMBER OF AMBIENT GOLFERS PLAYING GOLF CONST_INT NUM_OF_AMB_CLUBS 6 //NUMBER OF GOLF CLUBS CONST_INT NUM_OF_AMB_CHASE_GOLFERS 2 //NUMBER OF AMBIENT GOLFERS PRESENT DURING BUGGY CHASE CONST_INT NUM_OF_TRANS_BUGGIES 9 //NUMBER OF GOLF BUGGIES USED THROUGHOUT CONST_INT NUM_OF_AMB_BUGGIES 2 //NUMBER OF AMBIENT BUGGIES CONST_INT DROP_CLUB_HEALTH 600 //Health at which the golf clubs will drop from Celebrity golf buggy CONST_INT STUCK_COUNT 30 //COUNTER USED TO DETERMINE IF CELEBRITY GOLF BUGGY IS STUCK // Const Ints for entity IDs in arrays CONST_INT BUGGY_CLUBFRONT1 0 CONST_INT BUGGY_CLUBFRONT2 1 CONST_INT BUGGY_PATH1 2 CONST_INT BUGGY_PATH2 3 CONST_INT BUGGY_BEHINDCELEB 4 CONST_INT BUGGY_NEXTTOCELEB 5 CONST_INT BUGGY_NORTHCARPARK 6 CONST_INT BUGGY_AMBIENTPED1 7 CONST_INT BUGGY_AMBIENTPED2 8 CONST_INT CELEBSEC_WEST 0 CONST_INT CELEBSEC_EAST 1 CONST_INT CELEBSEC_NORTH 2 CONST_INT COURSESEC_ENTRANCE 0 CONST_INT COURSESEC_ROADENTRY 1 CONST_INT COURSESEC_CARPARK 2 CONST_INT CONSIERGE_FRONT 0 CONST_INT CONSIERGE_DRIVER 1 CONST_INT CONSIERGE_RIGHTDOOR 2 CONST_INT CONSIERGE_LEFTDOOR 3 CONST_INT AMBIENTPED_HOLE4WATCH1 0 CONST_INT AMBIENTPED_HOLE4WATCH2 1 CONST_INT AMBIENTPED_NORTHLAKE 2 CONST_INT AMBIENTPED_HOLE4PLAY 3 CONST_INT AMBIENTPED_NEARBANKER 4 CONST_INT AMBIENTPED_INBUNKER 5 CONST_INT AMBIENTCHASEPED_ONGREEN 0 CONST_INT AMBIENTCHASEPED_HOLE7SIGN 1 //CONST FLOATS CONST_FLOAT CF_CAR_STOPPING_DIS 8.0 //Distance car will stop at hotel entrance CONST_FLOAT CF_TALK_DIS 3.0 //Distance conserige will start talking to player CONST_FLOAT ALERT_DIS 11.0 //Distance celebrity is alerted to player CONST_FLOAT GOLFER_ALERT_DIS 20.0 //Distance ambeint golfers will spot player with a gun CONST_FLOAT LOSING_RANGE 65.0 //Range player is warned about losing CONST_FLOAT LOST_RANGE 140.0 //Range player loses celebrity / golf clubs CONST_FLOAT SLOW_DOWN_RANGE 20.0 //Range to slow down celebrity - Rubber banding CONST_FLOAT FIND_DIS 50.0 CONST_FLOAT TRAFFIC_MULTIPLIER 0.75 //INTS INT iBuggieStuckCounter //Used to determine if the celebrity buggy is stuck INT iScaredConvoCounter INT iChaseConvoCounter INT iFostLineTimer INT iGuardWarnTimer //Used to give the player some warning if they are seen holding a weapon INT iGuardTaserTimer //Used to stop the guards tasing the player over and over again INT iHitDialogueTimer //Used to make sure the celeb doesn't spam "you hit me" dialogue INT iScaredDialogueTimer //Used to make sure celeb doesn't spam scared dialogue INT iChaseDialogueTimer //Used to make sure celeb doesn't spam chase dialogue INT iSecurityWarnTimer //Used for warnings for the celeb security INT iCelebWarnTimer //Used for warnings for the celeb INT iClubPickupAudioID //Used to play pickup audio // VECTOR vStopCarLocationOne = << -1304.7542, -38.3551, 47.0814 >> //LOCATION 1 TO STOP PLAYER CAR IF NEAR GOLF COURSE SECURITY VECTOR vStopCarLocationTwo = << -1340.5546, 17.6527, 51.7458 >> //LOCATION 2 TO STOP PLAYER CAR IF NEAR GOLF COURSE SECURITY VECTOR vStopCarLocationThree = << -1388.4355, 138.2263, 55.0734 >> //LOCATION 3 TO STOP PLAYER CAR IF NEAR GOLF COURSE SECURITY VECTOR vAttackedPosition //UPDATED OFF ATTACKED GOLFER POSITION //ARRAYS //PEDS MISSION_PED ConciergePed[NUM_OF_CONC_PEDS] //CONSEIRGE PEDS MISSION_PED CelebrityGolfer //CELEBRITY GOLFER - GLEN STANKY MISSION_PED CelebrityFriend //CELEBRITY GOLFERS FRIEND MISSION_PED CelebSecurity[NUM_OF_SECURITY] //CELEBRITY PERSONAL SECURITY MISSION_PED CourseSecurity[NUM_OF_COURSE_SECURITY] //GOLF COURSE SECURITY MISSION_PED AmbientGolfer[NUM_OF_AMB_GOLFERS] //AMBIENT GOLFERS MISSION_PED AmbientChaseGolfer[NUM_OF_AMB_CHASE_GOLFERS] //AMBIENT GOLFERS DURING BUGGY CHASE //States SECURITY_STATE eSecurityState[NUM_OF_SECURITY] //PERSONAL SECURITY STATE AMBIENT_STATE eAmbientState[NUM_OF_AMB_GOLFERS] //AMBIENT GOLFER STATE AMBIENT_STATE eChaseGolferState[NUM_OF_AMB_CHASE_GOLFERS] //AMBIENT GOLFERS DURING CHASE STATE COURSE_SECURITY eCourseSecurity[NUM_OF_COURSE_SECURITY] //GOLF COURSE SECURITY STATE //CONCIERGE STATES CONCIERGE_STATE eConsiergeState[NUM_OF_CONC_PEDS] //CONCIERGE STATE //OUTFIT CHANGING STATE OUTFIT_STATE eOutfitState //OUTFIT STATE //WANTED TRACKING STATE WANTED_STATE eWantedState //WANTED STATE //TASED TRACKING STATE PLAYER_TASE_STATE eTaseState = TS_NOT_TASED //CELEB SPEECH STATE CELEB_SWING_DIALOGUE eSwingSpeech = SWING_TRIGGER //VEHICLES MISSION_VEHICLE GolfBuggieTransport[NUM_OF_TRANS_BUGGIES] //GOLF BUGGY'S DURING MISSION MISSION_VEHICLE CelebrityBuggy //CELEBRITY'S PERSONAL GOLF BUGGY MISSION_VEHICLE AmbientGolfBuggy[NUM_OF_AMB_BUGGIES] //AMBIENT GOLF BUGGYS DURING CHASE MISSION_VEHICLE ReplayVehicle //SPECIAL BUGGY GIVEN IF PLAYER REPLAYS MISSION AFTER FAILING //Relationship groups REL_GROUP_HASH relHatePlayer //Sequences SEQUENCE_INDEX siCelebSecurity SEQUENCE_INDEX siCelebrity //PROPS OBJECT_INDEX oiGolfBag //GOLF BAG ATTACHED TO BACK OF CELEBRITY GOLF BUGGY SCENARIO_BLOCKING_INDEX sbiGolfer SCENARIO_BLOCKING_INDEX sbiConc INT iNavBlocker = -1 //MODELS MODEL_NAMES CelebrityModel = U_M_M_MARKFOST //CELEBRITY MODEL //pickups MISSION_PICKUP golfClubPickup //GOLF CLUB PICKUP //Props MISSION_PROP AmbientClubs[NUM_OF_AMB_CLUBS] //CLUBS GIVEN TO AMBIENT GOLFERS MISSION_PROP CelebFriendClub //CELEBRITY FRIENDS CLUB //Sequences TEST_POLY tpGolfCourse //AREA TO DETERMINE IF PLAYER HAS ENTERED GOLF COURSE TEST_POLY tpGolfCourseExpanded TEST_POLY tpLeftSideOfCourse //AREA TO DETERMINE WHICH SIDE PLAYER IS ATTACKING CELEBRITY FROM //INIT ARRAYS /// PURPOSE: /// Loads all the inital arrays - PED LOCATIONS etc. PROC INIT_ARRAYS //Celebrity CelebrityGolfer.vStartPos = << -1096.8550, 67.6858, 52.9520 >> CelebrityGolfer.fStartHeading = 112.0 CelebrityGolfer.mModel = CelebrityModel //Celebrity chase vehicle CelebrityBuggy.vStartPos = << -1099.9100, 61.2608, 52.8124 >> CelebrityBuggy.fStartHeading = 243.0 CelebrityBuggy.mModel = caddy //Celerbrity Friend CelebrityFriend.vStartPos = << -1096.2576, 69.7230, 53.0107 >> CelebrityFriend.fStartHeading = 163.0 CelebrityFriend.mModel = A_M_Y_Golfer_01 //Golf club for celeb Friend CelebFriendClub.vStartPos = CelebrityFriend.vStartPos CelebFriendClub.mModel = prop_golf_wood_01 ///Buggies parked at front of the club GolfBuggieTransport[BUGGY_CLUBFRONT1].vStartPos = << -1370.1924, 61.6015, 52.4847 >> GolfBuggieTransport[BUGGY_CLUBFRONT1].fStartHeading = 206.0 GolfBuggieTransport[BUGGY_CLUBFRONT1].mModel = caddy GolfBuggieTransport[BUGGY_CLUBFRONT2].vStartPos = << -1373.8676, 65.9104, 52.5826 >> GolfBuggieTransport[BUGGY_CLUBFRONT2].fStartHeading = 224.0 GolfBuggieTransport[BUGGY_CLUBFRONT2].mModel = caddy //Buggies parked near path GolfBuggieTransport[BUGGY_PATH1].vStartPos = << -1302.4132, -6.6432, 48.8636 >> GolfBuggieTransport[BUGGY_PATH1].fStartHeading = 20.0 GolfBuggieTransport[BUGGY_PATH1].mModel = caddy GolfBuggieTransport[BUGGY_PATH2].vStartPos = << -1328.5121, 26.7404, 52.4943 >> GolfBuggieTransport[BUGGY_PATH2].fStartHeading = 272.0 GolfBuggieTransport[BUGGY_PATH2].mModel = caddy //Buggies near celebrity GolfBuggieTransport[BUGGY_BEHINDCELEB].vStartPos = << -1102.3347, 75.7757, 53.2591 >> GolfBuggieTransport[BUGGY_BEHINDCELEB].fStartHeading = 293.0 GolfBuggieTransport[BUGGY_BEHINDCELEB].mModel = caddy //One directly behind celebs buggy, directly adjacent to celeb GolfBuggieTransport[BUGGY_NEXTTOCELEB].vStartPos = << -1103.0232, 65.6267, 53.0560 >> GolfBuggieTransport[BUGGY_NEXTTOCELEB].fStartHeading = 203.0 GolfBuggieTransport[BUGGY_NEXTTOCELEB].mModel = caddy // //Top north side car park GolfBuggieTransport[BUGGY_NORTHCARPARK].vStartPos = << -1356.70, 145.34, 55.67 >> GolfBuggieTransport[BUGGY_NORTHCARPARK].fStartHeading = 187.0 GolfBuggieTransport[BUGGY_NORTHCARPARK].mModel = caddy //Near Ambient Golfers GolfBuggieTransport[BUGGY_AMBIENTPED1].vStartPos = << -1158.52, 68.38, 55.97 >> GolfBuggieTransport[BUGGY_AMBIENTPED1].fStartHeading = 226.84 GolfBuggieTransport[BUGGY_AMBIENTPED1].mModel = caddy GolfBuggieTransport[BUGGY_AMBIENTPED2].vStartPos = << -1165.3975, 72.9072, 55.6258 >> GolfBuggieTransport[BUGGY_AMBIENTPED2].fStartHeading = 238.0 GolfBuggieTransport[BUGGY_AMBIENTPED2].mModel = caddy //Buggy used for replay ReplayVehicle.vStartPos = << -1191.22, 36.83, 52.03 >> ReplayVehicle.fStartHeading = -77.1337 ReplayVehicle.mModel = caddy //Security PEDS CelebSecurity[CELEBSEC_WEST].vStartPos = << -1105.6224, 66.4609, 53.0700 >> CelebSecurity[CELEBSEC_WEST].fStartHeading = 118.0 CelebSecurity[CELEBSEC_WEST].mModel = S_M_M_HighSec_01 CelebSecurity[CELEBSEC_EAST].vStartPos = << -1090.0902, 64.3905, 52.5607 >> CelebSecurity[CELEBSEC_EAST].fStartHeading = 238.0 CelebSecurity[CELEBSEC_EAST].mModel = S_M_M_HighSec_01 CelebSecurity[CELEBSEC_NORTH].vStartPos = << -1093.7360, 73.8568, 53.0388 >> CelebSecurity[CELEBSEC_NORTH].fStartHeading = 319.0 CelebSecurity[CELEBSEC_NORTH].mModel = S_M_M_HighSec_01 //Golf course security peds - Warn player about bringing vehicle onto course etc. CourseSecurity[COURSESEC_ENTRANCE].vStartPos = << -1298.49, -23.89, 47.99 >> CourseSecurity[COURSESEC_ENTRANCE].fStartHeading = 126.55 CourseSecurity[COURSESEC_ENTRANCE].vFleePos = << -1314.0590, -35.6361, 48.1836 >> CourseSecurity[COURSESEC_ENTRANCE].mModel = S_M_M_Security_01 CourseSecurity[COURSESEC_ROADENTRY].vStartPos = << -1344.5045, 18.8674, 51.9921 >> CourseSecurity[COURSESEC_ROADENTRY].fStartHeading = 205.0 CourseSecurity[COURSESEC_ROADENTRY].vFleePos = << -1344.40, 18.11, 52.19 >> CourseSecurity[COURSESEC_ROADENTRY].mModel = S_M_M_Security_01 CourseSecurity[COURSESEC_CARPARK].vStartPos = << -1376.71, 140.20, 55.25 >> CourseSecurity[COURSESEC_CARPARK].fStartHeading = 99.0 CourseSecurity[COURSESEC_CARPARK].vFleePos = << -1375.5769, 131.1931, 55.3238 >> CourseSecurity[COURSESEC_CARPARK].mModel = S_M_M_Security_01 //Front Concierge PEDS ConciergePed[CONSIERGE_FRONT].vStartPos = << -1377.18, 55.39, 53.70 >> ConciergePed[CONSIERGE_FRONT].fStartHeading = 101.0 ConciergePed[CONSIERGE_FRONT].mModel = S_M_Y_Valet_01 //Driver of buggy ConciergePed[CONSIERGE_DRIVER].vStartPos = << -1369.3046, 52.1333, 52.4768 >> ConciergePed[CONSIERGE_DRIVER].fStartHeading = 20.0 ConciergePed[CONSIERGE_DRIVER].mModel = S_M_Y_Valet_01 ConciergePed[CONSIERGE_RIGHTDOOR].vStartPos = << -1366.5809, 54.0400, 52.4633 >> ConciergePed[CONSIERGE_RIGHTDOOR].fStartHeading = 94.0 ConciergePed[CONSIERGE_RIGHTDOOR].mModel = S_M_Y_Valet_01 ConciergePed[CONSIERGE_LEFTDOOR].vStartPos = << -1367.6914, 60.2214, 52.4635 >> ConciergePed[CONSIERGE_LEFTDOOR].fStartHeading = 126.0 ConciergePed[CONSIERGE_LEFTDOOR].mModel = S_M_Y_Valet_01 //Ambient golf peds on course AmbientGolfer[AMBIENTPED_HOLE4WATCH1].vStartPos = << -1161.1089, 72.2742, 55.6518 >> AmbientGolfer[AMBIENTPED_HOLE4WATCH1].fStartHeading = 328.4240 AmbientGolfer[AMBIENTPED_HOLE4WATCH1].mModel = A_M_Y_Golfer_01 AmbientGolfer[AMBIENTPED_HOLE4WATCH1].mStartAnim = "idle_b" AmbientGolfer[AMBIENTPED_HOLE4WATCH2].vStartPos = << -1159.8032, 71.7432, 55.6988 >> AmbientGolfer[AMBIENTPED_HOLE4WATCH2].fStartHeading = 344.2791 AmbientGolfer[AMBIENTPED_HOLE4WATCH2].mModel = A_M_Y_Golfer_01 AmbientGolfer[AMBIENTPED_HOLE4WATCH2].mStartAnim = "idle_c" AmbientGolfer[AMBIENTPED_NORTHLAKE].vStartPos = << -1143.1727, 112.0022, 58.1151 >> AmbientGolfer[AMBIENTPED_NORTHLAKE].fStartHeading = 109.0 AmbientGolfer[AMBIENTPED_NORTHLAKE].mModel = A_M_Y_Golfer_01 AmbientGolfer[AMBIENTPED_NORTHLAKE].mStartAnim = "wood_idle_low_b" AmbientGolfer[AMBIENTPED_HOLE4PLAY].vStartPos = << -1157.1703, 79.4863, 56.7109 >> AmbientGolfer[AMBIENTPED_HOLE4PLAY].fStartHeading = 159.0 AmbientGolfer[AMBIENTPED_HOLE4PLAY].mModel = A_M_Y_Golfer_01 AmbientGolfer[AMBIENTPED_HOLE4PLAY].mStartAnim = "wedge_idle_high_c" AmbientGolfer[AMBIENTPED_NEARBANKER].vStartPos = << -1060.1726, 79.7097, 51.0781 >> AmbientGolfer[AMBIENTPED_NEARBANKER].fStartHeading = 222.0 AmbientGolfer[AMBIENTPED_NEARBANKER].mModel = A_M_Y_Golfer_01 AmbientGolfer[AMBIENTPED_NEARBANKER].mStartAnim = "wedge_idle_high_b" AmbientGolfer[AMBIENTPED_INBUNKER].vStartPos = << -1025.1515, 8.6190, 48.7672 >> AmbientGolfer[AMBIENTPED_INBUNKER].fStartHeading = 133.0 AmbientGolfer[AMBIENTPED_INBUNKER].mModel = A_M_Y_Golfer_01 AmbientGolfer[AMBIENTPED_INBUNKER].mStartAnim = "putt_idle_high_b" //Golf clubs for ambeint golfes AmbientClubs[AMBIENTPED_HOLE4WATCH1].vStartPos = AmbientGolfer[AMBIENTPED_HOLE4WATCH1].vStartPos AmbientClubs[AMBIENTPED_HOLE4WATCH1].mModel = PROP_GOLF_PUTTER_01 AmbientClubs[AMBIENTPED_HOLE4WATCH2].vStartPos = AmbientGolfer[AMBIENTPED_HOLE4WATCH2].vStartPos AmbientClubs[AMBIENTPED_HOLE4WATCH2].mModel = PROP_GOLF_PUTTER_01 AmbientClubs[AMBIENTPED_NORTHLAKE].vStartPos = AmbientGolfer[AMBIENTPED_NORTHLAKE].vStartPos AmbientClubs[AMBIENTPED_NORTHLAKE].mModel = prop_golf_wood_01 AmbientClubs[AMBIENTPED_HOLE4PLAY].vStartPos = AmbientGolfer[AMBIENTPED_HOLE4PLAY].vStartPos AmbientClubs[AMBIENTPED_HOLE4PLAY].mModel = prop_golf_wood_01 AmbientClubs[AMBIENTPED_NEARBANKER].vStartPos = AmbientGolfer[AMBIENTPED_NEARBANKER].vStartPos AmbientClubs[AMBIENTPED_NEARBANKER].mModel = PROP_GOLF_IRON_01 AmbientClubs[AMBIENTPED_INBUNKER].vStartPos = AmbientGolfer[AMBIENTPED_INBUNKER].vStartPos AmbientClubs[AMBIENTPED_INBUNKER].mModel = PROP_GOLF_PUTTER_01 //Ambient golf PEDS used during celebrity buggy chase AmbientChaseGolfer[AMBIENTCHASEPED_ONGREEN].vStartPos = << -1096.2777, -117.3159, 40.5370 >> AmbientChaseGolfer[AMBIENTCHASEPED_ONGREEN].vFleePos = << -1095.01, -56.45, 43.83 >> AmbientChaseGolfer[AMBIENTCHASEPED_ONGREEN].fStartHeading = 343.0 AmbientChaseGolfer[AMBIENTCHASEPED_ONGREEN].mModel = A_M_Y_Golfer_01 AmbientChaseGolfer[AMBIENTCHASEPED_HOLE7SIGN].vStartPos = << -1115.5482, -104.4307, 40.8407 >> AmbientChaseGolfer[AMBIENTCHASEPED_HOLE7SIGN].vFleePos = << -1139.6190, -114.8868, 40.0996 >> AmbientChaseGolfer[AMBIENTCHASEPED_HOLE7SIGN].fStartHeading = 45.0 AmbientChaseGolfer[AMBIENTCHASEPED_HOLE7SIGN].mModel = A_M_Y_Golfer_01 //Ambient golf buggies used during celebrity buggy chase AmbientGolfBuggy[AMBIENTCHASEPED_ONGREEN].vStartPos = << -1100.8177, -103.5910, 40.8740 >> AmbientGolfBuggy[AMBIENTCHASEPED_ONGREEN].fStartHeading = 99.0 AmbientGolfBuggy[AMBIENTCHASEPED_ONGREEN].mModel = caddy AmbientGolfBuggy[AMBIENTCHASEPED_HOLE7SIGN].vStartPos = << -1114.0878, -97.6378, 41.0175 >> AmbientGolfBuggy[AMBIENTCHASEPED_HOLE7SIGN].fStartHeading = 233.0 AmbientGolfBuggy[AMBIENTCHASEPED_HOLE7SIGN].mModel = caddy ENDPROC // --------------------------- // FUNCTIONS // --------------------------- /// PURPOSE: /// Sets all models as no longer needed, removes all anim dicts, removes all vehicle recordings etc. PROC UnloadEverything() INT i ///PEDS FOR i = 0 to NUM_OF_CONC_PEDS - 1 SET_MODEL_AS_NO_LONGER_NEEDED(ConciergePed[i].mModel) ENDFOR FOR i = 0 to NUM_OF_COURSE_SECURITY - 1 SET_MODEL_AS_NO_LONGER_NEEDED(CourseSecurity[i].mModel) ENDFOR FOR i = 0 to NUM_OF_SECURITY - 1 SET_MODEL_AS_NO_LONGER_NEEDED(celebSecurity[i].mModel) ENDFOR FOR i = 0 to NUM_OF_AMB_GOLFERS - 1 SET_MODEL_AS_NO_LONGER_NEEDED(AmbientGolfer[i].mModel) ENDFOR FOR i = 0 to NUM_OF_AMB_CHASE_GOLFERS - 1 SET_MODEL_AS_NO_LONGER_NEEDED(AmbientChaseGolfer[i].mModel) ENDFOR SET_MODEL_AS_NO_LONGER_NEEDED(CelebrityModel) /// //VEHICLES FOR i = 0 to NUM_OF_TRANS_BUGGIES - 1 SET_MODEL_AS_NO_LONGER_NEEDED(GolfBuggieTransport[i].mModel) ENDFOR FOR i = 0 to NUM_OF_AMB_BUGGIES - 1 SET_MODEL_AS_NO_LONGER_NEEDED(AmbientGolfBuggy[i].mModel) ENDFOR /// //PROPS FOR i = 0 TO NUM_OF_AMB_CLUBS - 1 SET_MODEL_AS_NO_LONGER_NEEDED(AmbientClubs[i].mModel) ENDFOR /// ENDPROC /// PURPOSE: /// Makes the PED passed in flee from the player /// PARAMS: /// mPedFlee - Makes this ped flee from the player. PROC MAKE_PED_FLEE(PED_INDEX mPedFlee, BOOL OnFoot = FALSE) IF IS_PED_UNINJURED(mPedFlee) IF OnFoot = FALSE CLEAR_PED_TASKS(mPedFlee) SET_PED_COMBAT_ATTRIBUTES(mPedFlee,CA_AGGRESSIVE,FALSE) SET_PED_COMBAT_ATTRIBUTES(mPedFlee,CA_ALWAYS_FLEE,TRUE) SET_PED_COMBAT_ATTRIBUTES(mPedFlee, CA_MAINTAIN_MIN_DISTANCE_TO_TARGET, FALSE) SET_PED_COMBAT_ATTRIBUTES(mPedFlee, CA_CAN_USE_FRUSTRATED_ADVANCE, FALSE) SET_PED_COMBAT_ATTRIBUTES(mPedFlee, CA_LEAVE_VEHICLES, FALSE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_USE_VEHICLE, TRUE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_DISABLE_HANDS_UP, TRUE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_PREFER_PAVEMENTS, FALSE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_USE_COVER, FALSE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_LOOK_FOR_CROWDS, FALSE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE) TASK_SMART_FLEE_PED(mPedFlee, PLAYER_PED_ID(), 200, -1,FALSE) SET_PED_KEEP_TASK(mPedFlee, TRUE) ELSE CLEAR_PED_TASKS(mPedFlee) SET_PED_COMBAT_ATTRIBUTES(mPedFlee,CA_AGGRESSIVE,FALSE) SET_PED_COMBAT_ATTRIBUTES(mPedFlee,CA_ALWAYS_FLEE,TRUE) SET_PED_COMBAT_ATTRIBUTES(mPedFlee, CA_MAINTAIN_MIN_DISTANCE_TO_TARGET, FALSE) SET_PED_COMBAT_ATTRIBUTES(mPedFlee, CA_CAN_USE_FRUSTRATED_ADVANCE, FALSE) SET_PED_COMBAT_ATTRIBUTES(mPedFlee, CA_LEAVE_VEHICLES, TRUE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_USE_VEHICLE, FALSE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_FORCE_EXIT_VEHICLE, TRUE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_DISABLE_HANDS_UP, TRUE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_PREFER_PAVEMENTS, TRUE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_USE_COVER, FALSE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_LOOK_FOR_CROWDS, TRUE) SET_PED_FLEE_ATTRIBUTES(mPedFlee, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE) OPEN_SEQUENCE_TASK(siCelebrity) // IF IS_PED_IN_ANY_VEHICLE(mPedFlee) // TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR|ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP) // ENDIF //TASK_GO_STRAIGHT_TO_COORD(NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(mPedFlee, <<-1.5, 5, 0>>), PEDMOVEBLENDRATIO_SPRINT) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 200, -1,TRUE) CLOSE_SEQUENCE_TASK(siCelebrity) TASK_PERFORM_SEQUENCE(mPedFlee, siCelebrity) CLEAR_SEQUENCE_TASK(siCelebrity) SET_PED_KEEP_TASK(mPedFlee, TRUE) ENDIF ENDIF ENDPROC // =========================================================================================================== // Termination // =========================================================================================================== /// PURPOSE: Cleanup that needs to be done as soon as mission is passed or failed. Blip removal etc PROC MissionCleanup(bool bClearText = TRUE) IF bClearText = TRUE // clear all text CLEAR_PRINTS() ENDIF CLEAR_HELP(TRUE) ENDPROC //PURPOSE: DEBUG - print string into the TTY PROC DEBUG_PRINT(STRING s) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, s) ENDIF #ENDIF // Stop release compile error s = s ENDPROC //PURPOSE: DEBUG - print int and string into the TTY PROC DEBUG_PRINT_INT(STRING s, INT i) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, s, i) ENDIF #ENDIF // Stop release compile error s = s i = i ENDPROC //PURPOSE: DEBUG - print int and string into the TTY PROC DEBUG_PRINT_FLOAT(STRING s, FLOAT f) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, s, f) ENDIF #ENDIF // Stop release compile error s = s f = f ENDPROC /// PURPOSE: /// Very efficient test for if two entities are with fRange metres of each other /// Will be more efficient than doing IS_ENTITY_AT_ENTITY() /// NOTE: I am explicitly NOT doing a dead check for this because I need the coords of a DEAD ped! /// PARAMS: /// e1 - First entity - must be the dead one! /// e2 - Second entity /// fRange - Test if the entities are this close to each other FUNC BOOL IS_ENTITY_IN_RANGE_ENTITY_DEAD(ENTITY_INDEX e1, ENTITY_INDEX e2, FLOAT fRange) RETURN ( VDIST2(GET_ENTITY_COORDS(e1, FALSE), GET_ENTITY_COORDS(e2)) <= fRange*fRange ) ENDFUNC // ----------------------------------------------------------------------------------------------------------- // Script Cleanup // ----------------------------------------------------------------------------------------------------------- PROC Script_Cleanup(BOOL bClearText = TRUE) // If the mission was triggered then additional mission cleanup will be required. IF (Random_Character_Cleanup_If_Triggered()) PRINTSTRING("...Random Character Script was triggered so additional cleanup required") PRINTNL() ENDIF MissionCleanup(bClearText) UnloadEverything() RESET_MISSION_STATS_ENTITY_WATCH() IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1D_SCENE") STOP_AUDIO_SCENE("NIGEL_1D_SCENE") ENDIF CLEAR_WEATHER_TYPE_PERSIST() // mark peds and vehicles as no longer needed here: INT i ///PEDS FOR i = 0 to NUM_OF_CONC_PEDS - 1 SAFE_RELEASE_PED(ConciergePed[i].mPed) ENDFOR FOR i = 0 to NUM_OF_COURSE_SECURITY - 1 SAFE_RELEASE_PED(CourseSecurity[i].mPed) ENDFOR FOR i = 0 to NUM_OF_SECURITY - 1 SAFE_RELEASE_PED(celebSecurity[i].mPed) ENDFOR FOR i = 0 to NUM_OF_AMB_GOLFERS - 1 SAFE_RELEASE_PED(AmbientGolfer[i].mPed) ENDFOR FOR i = 0 to NUM_OF_AMB_CHASE_GOLFERS - 1 SAFE_RELEASE_PED(AmbientChaseGolfer[i].mPed) ENDFOR SAFE_RELEASE_PED(CelebrityFriend.mPed) SAFE_RELEASE_PED(CelebrityGolfer.mPed) //VEHICLES FOR i = 0 to NUM_OF_TRANS_BUGGIES - 1 SAFE_RELEASE_VEHICLE(GolfBuggieTransport[i].mVehicle) ENDFOR FOR i = 0 to NUM_OF_AMB_BUGGIES - 1 SAFE_RELEASE_VEHICLE(AmbientGolfBuggy[i].mVehicle) ENDFOR SAFE_RELEASE_VEHICLE(CelebrityBuggy.mVehicle) /// //PROPS FOR i = 0 TO NUM_OF_AMB_CLUBS - 1 SAFE_RELEASE_OBJECT(AmbientClubs[i].mObject) ENDFOR SET_BUILDING_STATE(BUILDINGNAME_SB_N1D_GOLFER, BUILDINGSTATE_DESTROYED) g_bBuildingScenarioBlocksUpdateThisFrame = TRUE WAIT(0) REMOVE_SCENARIO_BLOCKING_AREA(sbiGolfer) REMOVE_SCENARIO_BLOCKING_AREA(sbiConc) IF iNavBlocker > -1 REMOVE_NAVMESH_BLOCKING_OBJECT(iNavBlocker) ENDIF REMOVE_ANIM_DICT("rcmnigel1d") REMOVE_ANIM_DICT("mini@golf") SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE) //Cleanup the scene created by the launcher TERMINATE_THIS_THREAD() ENDPROC // ----------------------------------------------------------------------------------------------------------- // Script Pass // ----------------------------------------------------------------------------------------------------------- PROC Script_Passed() MissionCleanup() // Set the outfit as acquired (so it appears in player's wardrobe) IF bHasAcquiredGolfOutfit = TRUE SET_PED_COMP_ITEM_ACQUIRED_SP(GET_PLAYER_PED_MODEL(CHAR_TREVOR), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF, TRUE) ENDIF Random_Character_Passed(CP_RAND_C_NIG1D) Script_Cleanup() ENDPROC /// PURPOSE: Sets the new mission stage and initialises the substate PROC SetStage(MISSION_STAGE eNewStage) eMissionStage = eNewStage // Setup new mission state eSubStage = SS_SETUP ENDPROC /// PURPOSE: /// Sets the fail reason and mission stage to be fail fade out. PROC SET_FAIL_REASON(FAIL_REASON eNewFailReason) eFailReason = eNewFailReason SETSTAGE(MS_MISSION_FAILED) ENDPROC /// PURPOSE: Resets the gameplay camera behind the player PROC ResetCamBehindPlayer() SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDPROC /// PURPOSE: /// Enable the ability to change into the golf outfit during the mission PROC ACTIVATE_OUTFIT_CHANGE(BOOL bForceActivate = FALSE) IF eOutfitState != OS_OUTFIT_CHANGED // Don't re-activate the outfit change if it has already been used OR bForceActivate = TRUE IF NOT DOES_BLIP_EXIST(biConciergeBlip) biConciergeBlip = CREATE_BLIP_FOR_COORD(<< -1377.18, 55.39, 53.70 >>) SET_BLIP_SPRITE(biConciergeBlip, RADAR_TRACE_GOLF) ENDIF eOutfitState = OS_WAIT_FOR_PLAYER // Reset the outfit change manager ENDIF ENDPROC /// PURPOSE: /// Disable the ability to change into the golf outfit during the mission PROC DEACTIVATE_OUTFIT_CHANGE() SAFE_REMOVE_BLIP(biConciergeBlip) eOutfitState = OS_DISABLED // Disable the outfit change manager ENDPROC /// PURPOSE: /// Manage the process of changing outfits when the player goes to the Golf icon during the mission PROC HANDLE_OUTFIT_CHANGE() SWITCH eOutfitState CASE OS_WAIT_FOR_PLAYER // wait for player to enter concierge area IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-1377.18, 55.39, 53.70>>, <<2,2,2>>, FALSE, TRUE, TM_ON_FOOT) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1379.153687,57.951008,52.190113>>, <<-1378.735352,53.172840,54.940182>>, 4.000000) eOutfitState = OS_DETECTED ENDIF ENDIF ENDIF BREAK CASE OS_DETECTED // Create in-transition cams IF NOT DOES_CAM_EXIST(ciOutfitTransitionHelper) ciOutfitTransitionHelper = GET_GAME_CAMERA_COPY() ENDIF IF NOT DOES_CAM_EXIST(ciOutfitTransitionIn) ciOutfitTransitionIn = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SPLINE_DEFAULT, << -1409.4524, 53.5135, 78.0868 >>, << -26.7543, 0.0000, -85.6976 >>, 50) SET_CAM_SPLINE_DURATION(ciOutfitTransitionIn , 1500*3) ADD_CAM_SPLINE_NODE_USING_CAMERA_FRAME(ciOutfitTransitionIn, ciOutfitTransitionHelper, 1500) ADD_CAM_SPLINE_NODE(ciOutfitTransitionIn, << -1382.7190, 55.2160, 58.0408 >>, << -15.6873, 0.0000, -88.6059 >>, 1500) ADD_CAM_SPLINE_NODE(ciOutfitTransitionIn, << -1409.4524, 53.5135, 78.0868 >>, << -26.7543, 0.0000, -85.6976 >>, 1500) ENDIF // turn off controls + radar SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) DISPLAY_RADAR(FALSE) // move Trev towards the doors to hide him while we change his outfit IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<-1368.3302, 56.4194, 52.4637>>, PEDMOVEBLENDRATIO_WALK) ENDIF eOutfitState = OS_DO_CAMERA_UP BREAK CASE OS_DO_CAMERA_UP // Move camera up into position IF NOT IS_CAM_ACTIVE(ciOutfitTransitionHelper) IF NOT IS_CAM_ACTIVE(ciOutfitTransitionIn) SET_CAM_ACTIVE(ciOutfitTransitionHelper, TRUE) RENDER_SCRIPT_CAMS(TRUE, TRUE) ENDIF ELIF NOT IS_CAM_ACTIVE(ciOutfitTransitionIn) SET_CAM_ACTIVE(ciOutfitTransitionIn, TRUE) RENDER_SCRIPT_CAMS(TRUE, TRUE) eOutfitState = OS_CHANGE_OUTFIT ENDIF BREAK CASE OS_CHANGE_OUTFIT // Change the outfit IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-1368.3302, 56.4194, 52.4637>>, <<2,2,2>>, FALSE, TRUE, TM_ON_FOOT) WAIT(2000) SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF, FALSE) // Do this when this function has updated!! SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR) // set outfit acquried flag bHasAcquiredGolfOutfit = TRUE // Move Trev back towards the concierge IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<-1373.09, 55.61, 52.71>>, PEDMOVEBLENDRATIO_WALK) // Make the player go back to a coord of my choice because it's safer ENDIF WAIT(500) eOutfitState = OS_DO_CAMERA_DOWN ENDIF BREAK CASE OS_DO_CAMERA_DOWN // Move camera back down to player level using a new camera to avoid the transition going through the clubhouse mesh IF NOT DOES_CAM_EXIST(ciOutfitTransitionOut) ciOutfitTransitionOut = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SPLINE_DEFAULT,<< -1373.6809, 57.0584, 54.9717 >>, << -10.6657, -0.0000, 91.5916 >>, 50) SET_CAM_SPLINE_DURATION(ciOutfitTransitionOut , 4500) ADD_CAM_SPLINE_NODE_USING_CAMERA_FRAME(ciOutfitTransitionOut, ciOutfitTransitionIn, 1500) ADD_CAM_SPLINE_NODE(ciOutfitTransitionOut, << -1382.7190, 55.2160, 58.0408 >>, << -15.6873, 0.0000, -88.6059 >>, 1500) ADD_CAM_SPLINE_NODE(ciOutfitTransitionOut, << -1373.6809, 57.0584, 54.9717 >>, << -10.6657, -0.0000, 91.5916 >>, 1500) ENDIF IF NOT IS_CAM_ACTIVE(ciOutfitTransitionOut) RENDER_SCRIPT_CAMS(TRUE, TRUE) SET_CAM_ACTIVE(ciOutfitTransitionOut, TRUE) WAIT(3500) eOutfitState = OS_OUTFIT_CHANGED ENDIF IF IS_CAM_ACTIVE(ciOutfitTransitionHelper) SET_CAM_ACTIVE(ciOutfitTransitionHelper, FALSE) ENDIF IF IS_CAM_ACTIVE(ciOutfitTransitionIn) SET_CAM_ACTIVE(ciOutfitTransitionIn, FALSE) ENDIF BREAK CASE OS_OUTFIT_CHANGED // Set the transition camera to inactive and remove the blip IF DOES_CAM_EXIST(ciOutfitTransitionOut) IF IS_CAM_ACTIVE(ciOutfitTransitionOut) RENDER_SCRIPT_CAMS(FALSE, TRUE) SET_CAM_ACTIVE(ciOutfitTransitionOut, FALSE) WAIT(2000) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DESTROY_CAM(ciOutfitTransitionHelper) DESTROY_CAM(ciOutfitTransitionIn) DESTROY_CAM(ciOutfitTransitionOut) ENDIF ENDIF SAFE_REMOVE_BLIP(biConciergeBlip) BREAK CASE OS_DISABLED // Do nothing BREAK ENDSWITCH ENDPROC /// PURPOSE: creates ped and sets heading PROC CreateMissionPed(MISSION_PED &mMissionPed, BOOL bUnloadModel = TRUE) if HAS_MODEL_LOADED(mMissionPed.mModel) mMissionPed.mPed = CREATE_PED(PEDTYPE_MISSION, mMissionPed.mModel, mMissionPed.vStartPos) if IS_ENTITY_ALIVE(mMissionPed.mPed) SET_ENTITY_HEADING(mMissionPed.mPed, mMissionPed.fStartHeading) ENDIF if bUnloadModel = TRUE SET_MODEL_AS_NO_LONGER_NEEDED(mMissionPed.mModel) ENDIF ENDIF ENDPROC /// PURPOSE: creates vehicle and sets heading and colours PROC CreateMissionVehicle(MISSION_VEHICLE &mMissionVehicle, BOOL bRemoveModel = TRUE) if HAS_MODEL_LOADED(mMissionVehicle.mModel) mMissionVehicle.mVehicle = CREATE_VEHICLE(mMissionVehicle.mModel, mMissionVehicle.vStartPos, mMissionVehicle.fStartHeading) ENDIF if bRemoveModel = TRUE SET_MODEL_AS_NO_LONGER_NEEDED(mMissionVehicle.mModel) ENDIF ENDPROC /// PURPOSE: creates props and sets heading PROC CreateMissionProp(MISSION_PROP &mMissionProp, BOOL bRemoveModel = TRUE) if HAS_MODEL_LOADED(mMissionProp.mModel) mMissionProp.mObject = CREATE_OBJECT(mMissionProp.mModel, mMissionProp.vStartPos) if DOES_ENTITY_EXIST(mMissionProp.mObject) SET_ENTITY_HEADING(mMissionProp.mObject,mMissionProp.fStartHeading) ENDIF ENDIF if bRemoveModel = TRUE SET_MODEL_AS_NO_LONGER_NEEDED(mMissionProp.mModel) ENDIF ENDPROC FUNC BOOL IS_PED_INSIDE_SOFT_BOUNDARY(PED_INDEX pedIndex) //DISPLAY_POLY2(tpGolfCourseExpanded) IF IS_POINT_IN_POLY_2D(tpGolfCourseExpanded, GET_ENTITY_COORDS(pedIndex, FALSE)) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks to see if a PED is inside the golf course area /// PARAMS: /// pedIndex - The ped passing in /// RETURNS: /// True if they are inside the area, false other wise FUNC BOOL IS_PED_INSIDE_GOLF_AREA(PED_INDEX pedIndex) //DISPLAY_POLY2(tpGolfCourse) IF IS_POINT_IN_POLY_2D(tpGolfCourse, GET_ENTITY_COORDS(pedIndex)) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC HANDLE_ABANDONMENT() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF NOT IS_PED_INSIDE_GOLF_AREA(PLAYER_PED_ID()) IF NOT IS_PED_INSIDE_SOFT_BOUNDARY(PLAYER_PED_ID()) SET_FAIL_REASON(FAIL_LION_ESCAPED) ELSE //UPDATE_CHASE_BLIP(biMissionBlip, CelebrityGolfer.mPed, LOST_RANGE, DEFAULT, TRUE) SET_BLIP_FLASHES(biMissionBlip,TRUE) ENDIF ELSE IF NOT DOES_BLIP_EXIST(biMissionBlip) DEBUG_PRINT("Recreated mission blip") biMissionBlip = CREATE_PED_BLIP(CelebrityGolfer.mPed,TRUE,FALSE,BLIPPRIORITY_MED) ELSE SET_BLIP_FLASHES(biMissionBlip,FALSE) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks to see if the player is unarmed - Including objects /// Used to see if PEDS should attack player /// RETURNS: /// TRUE - If player is unarmed, false otherwise FUNC BOOL IS_PLAYER_UNARMED() IF GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) <> WEAPONTYPE_UNARMED AND GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) <> WEAPONTYPE_OBJECT //CHECK FOR MOBILE PHONE AS THIS WILL TRIGGER // Allow the player to hold a golf club without reactions, because... it's a golf club IF GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) <> WEAPONTYPE_GOLFCLUB RETURN FALSE ENDIF // Player is armed with something, but we don't want to return true when we're in a vehicle because the weapon isn't visible and it doesn't make sense IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN FALSE // If the player's shooting in a vehicle, then the weapon is visible and we should return false ELIF IS_PED_SHOOTING(PLAYER_PED_ID()) RETURN FALSE ENDIF ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Checks to see if the player is using any sniper rifle /// RETURNS: /// True - If the player is using a sniper rifle, fasle otherwise FUNC BOOL IS_PLAYER_USING_SNIPER_RIFLE() IF GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_SNIPERRIFLE OR GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_HEAVYSNIPER OR GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_REMOTESNIPER RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if the player is on the left side of Glen as they approach him /// RETURNS: /// True if the player is on the left side, false otherwise FUNC BOOL IS_PLAYER_AT_LEFT_SIDE() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_POINT_IN_POLY_2D(tpLeftSideOfCourse, GET_ENTITY_COORDS(PLAYER_PED_ID())) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Custom flee proc for the ambient golfers to make them drop their clubs when they flee /// PARAMS: /// iPedNum - The ped array ID we're making flee PROC MAKE_AMBIENT_GOLF_PED_FLEE(int iPedNum) IF DOES_ENTITY_EXIST(AmbientClubs[iPedNum].mObject) IF IS_ENTITY_ATTACHED(AmbientClubs[iPedNum].mObject) DETACH_ENTITY(AmbientClubs[iPedNum].mObject) ENDIF ENDIF MAKE_PED_FLEE(AmbientGolfer[iPedNum].mPed,TRUE) ENDPROC PROC MAKE_ALL_AMBIENT_GOLFERS_FLEE() int i FOR i = 0 TO NUM_OF_AMB_GOLFERS - 1 IF IS_ENTITY_ALIVE(AmbientGolfer[i].mPed) MAKE_AMBIENT_GOLF_PED_FLEE(i) eAmbientState[i] = AS_FLEE ENDIF ENDFOR ENDPROC /// PURPOSE: /// Checks if any of the celeb scene peds have died or if the player is doing anything dodgy to anyone/thing in the scene /// RETURNS: /// TRUE if any of the peds are dead, the player's bumped into any of them, has jacked any of the buggies or any of the peds go to ragdoll /// FALSE otherwise FUNC BOOL HAS_PLAYER_MUCKED_ABOUT() INT i FOR i = 0 TO NUM_OF_SECURITY - 1 IF NOT IS_ENTITY_ALIVE(CelebSecurity[i].mPed) OR HAS_PED_BUMPED_PED_WITH_VEHICLE(PLAYER_PED_ID(), CelebSecurity[i].mPed) OR IS_PED_RAGDOLL(CelebSecurity[i].mPed) DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Player bumped celeb security with vehicle OR celeb security dead") RETURN TRUE ENDIF ENDFOR IF NOT IS_ENTITY_ALIVE(CelebrityGolfer.mPed) OR HAS_PED_BUMPED_PED_WITH_VEHICLE(PLAYER_PED_ID(), CelebrityGolfer.mPed) OR IS_PED_RAGDOLL(CelebrityGolfer.mPed) DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Celeb ragdoll OR player bumped celeb with vehicle OR celeb isn't alive") RETURN TRUE ENDIF IF NOT IS_ENTITY_ALIVE(CelebrityFriend.mPed) OR HAS_PED_BUMPED_PED_WITH_VEHICLE(PLAYER_PED_ID(), CelebrityFriend.mPed) OR IS_PED_RAGDOLL(CelebrityFriend.mPed) DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Celeb friend ragdoll OR player bumped friend with vehicle OR friend isn't alive") RETURN TRUE ENDIF IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), CelebrityBuggy.mVehicle) DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Player in celeb's golf cart") RETURN TRUE ENDIF ELSE // The player must've destroyed the buggy, which is a big no-no# DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Celeb golf cart not OK, player destroyed it?") RETURN TRUE ENDIF IF IS_VEHICLE_OK(GolfBuggieTransport[BUGGY_BEHINDCELEB].mVehicle) AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), GolfBuggieTransport[BUGGY_BEHINDCELEB].mVehicle) DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Player in golf cart behind celeb") RETURN TRUE ENDIF ELSE // The player must've destroyed the buggy, which is a big no-no DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Golf cart behind celeb not OK, player destroyed it?") RETURN TRUE ENDIF IF IS_VEHICLE_OK(GolfBuggieTransport[BUGGY_NEXTTOCELEB].mVehicle) AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), GolfBuggieTransport[BUGGY_NEXTTOCELEB].mVehicle) DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Player in golf cart next to celeb") RETURN TRUE ENDIF ELSE // The player must've destroyed the buggy, which is a big no-no DEBUG_PRINT("HAS_PLAYER_MUCKED_ABOUT(): Golf cart next to celeb not OK, player destroyed it?") RETURN TRUE ENDIF // The player is behaving! RETURN FALSE ENDFUNC /// PURPOSE: /// Makes security PEDS attack player OR go to alert if the player isn't close enough to start the chase /// Also makes Celebrity start to Flee in vehicle PROC MAKE_SECURITY_ATTACK() IF bSecurityAttack = FALSE INT i FOR i = 0 TO NUM_OF_SECURITY - 1 IF IS_ENTITY_ALIVE(CelebSecurity[i].mPed) CLEAR_PED_TASKS(CelebSecurity[i].mPed) OPEN_SEQUENCE_TASK(siCelebSecurity) TASK_PAUSE(NULL, GET_RANDOM_INT_IN_RANGE(250, 600)) TASK_COMBAT_PED(NULL,PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(siCelebSecurity) TASK_PERFORM_SEQUENCE(CelebSecurity[i].mPed, siCelebSecurity) CLEAR_SEQUENCE_TASK(siCelebSecurity) SET_PED_COMBAT_ATTRIBUTES(CelebSecurity[i].mPed,CA_DISABLE_SECONDARY_TARGET,TRUE) SET_ENTITY_LOAD_COLLISION_FLAG(CelebSecurity[i].mPed, TRUE) SET_PED_KEEP_TASK(CelebSecurity[i].mPed,TRUE) SET_PED_PATH_PREFER_TO_AVOID_WATER(CelebSecurity[i].mPed, TRUE) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE,relHatePlayer,RELGROUPHASH_PLAYER) eSecurityState[i] = SS_ATTACK_PLAYER IF NOT DOES_BLIP_EXIST(CelebSecurity[i].mBlip) CelebSecurity[i].mBlip = CREATE_PED_BLIP(CelebSecurity[i].mPed,FALSE,FALSE,BLIPPRIORITY_MED) ENDIF DEBUG_PRINT_INT("Attack player, security guard: ", i) ENDIF ENDFOR IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(),CelebrityBuggy.mVehicle) IF IS_PED_UNINJURED(CelebrityGolfer.mPed) IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) OPEN_SEQUENCE_TASK(siCelebSecurity) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 500) TASK_PAUSE(NULL, GET_RANDOM_INT_IN_RANGE(250, 500)) TASK_ENTER_VEHICLE(NULL,CelebrityBuggy.mVehicle,-1,VS_DRIVER) CLOSE_SEQUENCE_TASK(siCelebSecurity) TASK_PERFORM_SEQUENCE(CelebrityGolfer.mPed, siCelebSecurity) CLEAR_SEQUENCE_TASK(siCelebSecurity) DEBUG_PRINT("Making Glen get into vehicle through MAKE_SECURITY_ATTACK()") eGolferState = GS_GET_INTO_VEHICLE ENDIF ENDIF ELSE MAKE_PED_FLEE(CelebrityGolfer.mPed,TRUE) eGolferState = GS_FLEEING_ON_FOOT ENDIF ELSE MAKE_PED_FLEE(CelebrityGolfer.mPed,TRUE) ENDIF IF IS_ENTITY_ALIVE(CelebrityFriend.mPed) SET_ENTITY_LOAD_COLLISION_FLAG(CelebrityFriend.mPed,TRUE) ENDIF MAKE_PED_FLEE(CelebrityFriend.mPed,TRUE) MAKE_ALL_AMBIENT_GOLFERS_FLEE() IF eMissionStage <= MS_GET_THE_CLUB AND IS_ENTITY_ALIVE(CelebrityGolfer.mPed) // Only do this if we're pre-chase, as we want to leave the club attached to the bag otherwise // This really only ought to happen during a skip anyway //RE-ATTACH GOLF CLUB TO NEW OFFSET SO IT LOOKS OK WHEN HE IS RUNNING ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,CelebrityGolfer.mPed,GET_PED_BONE_INDEX(CelebrityGolfer.mPed,BONETAG_PH_R_HAND),<<0.06,0.04,0.0>>,<<-90,180,0>>) IF IS_ENTITY_ALIVE(CelebrityFriend.mPed) //RE-ATTACH GOLF CLUB TO NEW OFFSET SO IT LOOKS OK WHEN HE IS RUNNING ATTACH_ENTITY_TO_ENTITY(CelebFriendClub.mObject,CelebrityFriend.mPed,GET_PED_BONE_INDEX(CelebrityFriend.mPed,BONETAG_PH_R_HAND),<<0.06,0.04,0.0>>,<<-90,180,0>>) ENDIF ELSE IF IS_ENTITY_ATTACHED(golfClubPickup.objIndex) DETACH_ENTITY(golfClubPickup.objIndex) ENDIF ENDIF INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(NI1D_GOLF_CLUB_STOLEN_IN_TIME) bSecurityAttack = TRUE ENDIF ENDPROC /// PURPOSE: /// Makes all security guards alerted (AIM_AT_PLAYER) and looking at the player if the mission stage is earlier /// than get the club OR if the player is >80m away /// Otherwise, make them attack instead PROC MAKE_SECURITY_ALERT() IF DOES_ENTITY_EXIST(CelebrityGolfer.mPed) IF eMissionStage < MS_GET_THE_CLUB OR GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), CelebrityGolfer.mPed) > 100 INT i FOR i = 0 TO NUM_OF_SECURITY - 1 IF IS_PED_UNINJURED(CelebSecurity[i].mPed) SET_ENTITY_LOAD_COLLISION_FLAG(CelebSecurity[i].mPed,TRUE) // Make the east celeb security look like he's doing more than the others because of #1093056 IF i = CELEBSEC_EAST IF DOES_ENTITY_EXIST(CelebrityGolfer.mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebSecurity[i].mPed, CelebrityGolfer.mPed) TASK_GO_TO_ENTITY(CelebSecurity[i].mPed, CelebrityGolfer.mPed, DEFAULT, 6.0) ENDIF ELSE TASK_LOOK_AT_ENTITY(CelebSecurity[i].mPed, PLAYER_PED_ID(), -1) ENDIF SET_CURRENT_PED_WEAPON(CelebSecurity[i].mPed, WEAPONTYPE_PISTOL, TRUE) SET_PED_USING_ACTION_MODE(CelebSecurity[i].mPed, TRUE, -1, "DEFAULT_ACTION") DEBUG_PRINT_INT("Alerted, security guard: ", i) ENDIF eSecurityState[i] = SS_AIM_AT_PLAYER ENDFOR IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF NOT IsPedPerformingTask(CelebrityGolfer.mPed, SCRIPT_TASK_COWER) CLEAR_PED_TASKS(CelebrityGolfer.mPed) TASK_COWER(CelebrityGolfer.mPed) ENDIF ENDIF IF IS_ENTITY_ALIVE(CelebrityFriend.mPed) CLEAR_PED_TASKS(CelebrityFriend.mPed) IF IS_ENTITY_ATTACHED(CelebFriendClub.mObject) DETACH_ENTITY(CelebFriendClub.mObject) ENDIF TASK_SMART_FLEE_PED(CelebrityFriend.mPed, PLAYER_PED_ID(), 300, -1, TRUE) SAFE_RELEASE_PED(CelebrityFriend.mPed) bFriendIsFleeing = TRUE ENDIF bShouldAttackPlayer = TRUE // Possibly do other golfer stuff here, anims etc INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(NI1D_GOLF_CLUB_STOLEN_IN_TIME) ELSE // Guards are already aiming or worse, so make them attack if possible DEBUG_PRINT("Alert called, but guards need to attack instead") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDPROC /// PURPOSE: /// Monitors and adjusts chase speed PROC Monitor_Golf_Chase_Speed() IF eMissionStage < MS_COLLECT_GOLF_CLUB IF IS_PED_UNINJURED(CelebrityGolfer.mPed) IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) IF bHasGoneOppositeWay = FALSE IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(CelebrityBuggy.mVehicle) TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle,"NIGEL1DGOLF",DRIVINGMODE_AVOIDCARS_RECKLESS,0,EWAYPOINT_START_FROM_CLOSEST_POINT) ENDIF ELSE // IF THE GOLF PLAYER HAS GONE OTHER WAY AT START OF CHASE, KEEP CHECKING UNTIL HE HAS FINISH AND PUT HIM BACK ON ORIGINAL ROUTE. IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(CelebrityBuggy.mVehicle) bHasGoneOppositeWay = FALSE //IF HE HAS FINISH ALTERNATIVE ROUTE, SET THIS TO FALSE SO IT PLAYS ORIGINAL ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Plays a line of dialogue. Updates each hit. PROC PlayHitDialogue() IF NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF (GET_GAME_TIMER() - iHitDialogueTimer) >= 6000 ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_HIT", CONV_PRIORITY_MEDIUM) iHitDialogueTimer = GET_GAME_TIMER() iScaredDialogueTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks to see if the celebrity buggy has become stuck /// RETURNS: /// True - If the buggy has become stuck, false otherwise FUNC BOOL Is_Buggy_Stuck() IF GET_ENTITY_SPEED(CelebrityBuggy.mVehicle) < 0.15 AND IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) ++iBuggieStuckCounter IF iBuggieStuckCounter > STUCK_COUNT VEHICLE_WAYPOINT_PLAYBACK_PAUSE(CelebrityBuggy.mVehicle) IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) AND IS_ENTITY_ALIVE(CelebrityGolfer.mPed) BRING_VEHICLE_TO_HALT(CelebrityBuggy.mVehicle, 2, 3) IF IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) CLEAR_PED_TASKS(CelebrityGolfer.mPed) // IS_VEHICLE_DRIVEABLE() // // Sometimes the celebrity doesn't get out of the buggy when told to here, so he drives off with the clubs still attached! // // We can't have that, so let's make absolutely 100% certain he does get out... // WHILE GET_SCRIPT_TASK_STATUS(CelebrityGolfer.mPed, SCRIPT_TASK_LEAVE_ANY_VEHICLE) != PERFORMING_TASK // IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) // TASK_LEAVE_ANY_VEHICLE(CelebrityGolfer.mPed, 0, ECF_DONT_CLOSE_DOOR|ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP) // ENDIF // WAIT(0) // ENDWHILE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_GIVEUP", "NIG1D_GIVEUP_1", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("Celeb vehicle stuck") ENDIF ENDIF RETURN TRUE ENDIF ELSE iBuggieStuckCounter = 0 ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Monitors the golf course chase /// RETURNS: /// Returns true: /// If the golf buggy gets wrecked. /// If golf buggy gets stuck. /// If Celebrity gets out of buggy. /// If buggy health gets below DROP_CLUB_HEALTH. /// FALSE otherwise. FUNC BOOL Monitor_GolfCourse_Chase() IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) //Update chase hint cam CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, CelebrityBuggy.mVehicle) IF Is_Buggy_Stuck() OR IS_VEHICLE_TYRE_BURST(CelebrityBuggy.mVehicle, SC_WHEEL_CAR_FRONT_LEFT) OR IS_VEHICLE_TYRE_BURST(CelebrityBuggy.mVehicle, SC_WHEEL_CAR_FRONT_RIGHT) IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(CelebrityBuggy.mVehicle) REMOVE_WAYPOINT_RECORDING("NIGEL1DGOLF") REMOVE_WAYPOINT_RECORDING("NIGEL1DGOLF2") ENDIF ENDIF CLEAR_PED_TASKS(CelebrityGolfer.mPed) MAKE_PED_FLEE(CelebrityGolfer.mPed,TRUE) DEBUG_PRINT("*** Celeb cart stuck or a front wheel is burst - chase monitor returning True") RETURN TRUE ELSE Monitor_Golf_Chase_Speed() ENDIF IF GET_ENTITY_HEALTH(CelebrityBuggy.mVehicle) < DROP_CLUB_HEALTH bDropGolfBag = TRUE DEBUG_PRINT("*** Celeb cart below drop club threshold - chase monitor returning True") RETURN TRUE ENDIF IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) DEBUG_PRINT("*** Celeb no longer in vehicle - chase monitor returning True") RETURN TRUE ENDIF //DEALS WITH PLAYING DIALOGUE FOR DAMAGE IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(CelebrityBuggy.mVehicle,PLAYER_PED_ID(),TRUE) AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(CelebrityBuggy.mVehicle,WEAPONTYPE_INVALID,GENERALWEAPON_TYPE_ANYWEAPON) PlayHitDialogue() DEBUG_PRINT_INT("VEHICLE HEALTH IS ",GET_ENTITY_HEALTH(CelebrityBuggy.mVehicle) ) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(CelebrityBuggy.mVehicle) ELSE IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(CelebrityBuggy.mVehicle,PLAYER_PED_ID()) DEBUG_PRINT_INT("VEHICLE HEALTH IS ",GET_ENTITY_HEALTH(CelebrityBuggy.mVehicle) ) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(CelebrityBuggy.mVehicle) ENDIF ENDIF ELSE DEBUG_PRINT("Celeb dead - returning true") RETURN TRUE ENDIF ELSE // The celeb's buggy has wrecked/destroyed before any of the above checks returned true - end the chase early DEBUG_PRINT("*** Celeb cart wrecked/not OK - chase monitor returning True") MAKE_PED_FLEE(CelebrityGolfer.mPed,TRUE) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Monitors and adjusts chase speed for in the city PROC Monitor_City_Chase_Speed() IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<>) SET_DRIVE_TASK_MAX_CRUISE_SPEED(CelebrityGolfer.mPed,0.3) ELSE SET_DRIVE_TASK_MAX_CRUISE_SPEED(CelebrityGolfer.mPed,0) ENDIF ENDIF ENDPROC /// PURPOSE: /// Monitors the chase through the city /// RETURNS: /// TRUE: /// If golf buggie is wrecked. /// If golf buggy is stuck. /// If golf buggy health is below DROP_CLUB_HEALTH - 100. /// If celebrity is not in the vehicle. /// FLASE - otherwise. FUNC BOOL Monitor_City_Chase() IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) //Update chase hint cam CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, CelebrityBuggy.mVehicle) //Monitor chase speed IF IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) Monitor_City_Chase_Speed() ENDIF IF Is_Buggy_Stuck() OR IS_VEHICLE_TYRE_BURST(CelebrityBuggy.mVehicle, SC_WHEEL_CAR_FRONT_LEFT) OR IS_VEHICLE_TYRE_BURST(CelebrityBuggy.mVehicle, SC_WHEEL_CAR_FRONT_RIGHT) DEBUG_PRINT("Buggy stuck or front tyres burst in city - returning true") IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(CelebrityBuggy.mVehicle) REMOVE_WAYPOINT_RECORDING("NIGEL1DGOLF") REMOVE_WAYPOINT_RECORDING("NIGEL1DGOLF2") ENDIF CLEAR_PED_TASKS(CelebrityGolfer.mPed) MAKE_PED_FLEE(CelebrityGolfer.mPed,TRUE) RETURN TRUE ENDIF IF GET_ENTITY_HEALTH(CelebrityBuggy.mVehicle) < (DROP_CLUB_HEALTH - 100) DEBUG_PRINT("Buggy health below threshold - returning true") bDropGolfBag = TRUE RETURN TRUE ENDIF IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) DEBUG_PRINT("Celeb not in buggy while monitoring chase - returning true") RETURN TRUE ENDIF ELSE DEBUG_PRINT("Celeb dead - returning true") RETURN TRUE ENDIF ELSE DEBUG_PRINT("Buggy somehow not ok - returning true") RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Handles Celebrity chase colour dialogue - Tries to plays a conversation until all have been said PROC CelebrityChaseDialogue() // Only do this if we're still chasing the guy IF eMissionStage = MS_CHASE_THE_GOLFER OR eMissionStage = MS_CHASE_IN_CITY IF iChaseConvoCounter < 5 IF NOT IS_MESSAGE_BEING_DISPLAYED() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF (GET_GAME_TIMER() - iChaseDialogueTimer) > 15000 //DEBUG_PRINT_INT("Timer is now: ", (GET_GAME_TIMER() - iChaseDialogueTimer)) IF IS_PED_UNINJURED(CelebrityGolfer.mPed) IF GET_DISTANCE_BETWEEN_PEDS(CelebrityGolfer.mPed, PLAYER_PED_ID()) < 40 ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID() , "TREVOR") SWITCH iChaseConvoCounter CASE 0 IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_CHASE1", CONV_PRIORITY_HIGH) DEBUG_PRINT("Chase conv 1 started...") iChaseDialogueTimer = GET_GAME_TIMER() iChaseConvoCounter++ ENDIF BREAK CASE 1 IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_CHASE2", CONV_PRIORITY_HIGH) DEBUG_PRINT("Chase conv 2 started...") iChaseDialogueTimer = GET_GAME_TIMER() iChaseConvoCounter++ ENDIF BREAK CASE 2 IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_CHASE3", CONV_PRIORITY_HIGH) DEBUG_PRINT("Chase conv 3 started...") iChaseDialogueTimer = GET_GAME_TIMER() iChaseConvoCounter++ ENDIF BREAK // Only do the last two if we reach the city chase CASE 3 IF eMissionStage = MS_CHASE_IN_CITY IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_CHASE4", CONV_PRIORITY_HIGH) DEBUG_PRINT("Chase conv 4 started...") iChaseDialogueTimer = GET_GAME_TIMER() iChaseConvoCounter++ ENDIF ENDIF BREAK CASE 4 IF eMissionStage = MS_CHASE_IN_CITY IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_CHASE5", CONV_PRIORITY_HIGH) DEBUG_PRINT("Chase conv 5 started...") iChaseDialogueTimer = GET_GAME_TIMER() iChaseConvoCounter++ ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles Celebrity scared dialogue - Will play if bullet is in area around celebrity. PROC CelebrityScaredDialogue() IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(CelebrityGolfer.mPed),20.0) IF NOT IS_MESSAGE_BEING_DISPLAYED() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF (GET_GAME_TIMER() - iScaredDialogueTimer) >= 3000 SWITCH iScaredConvoCounter CASE 0 ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_HIT", "NIG1D_HIT_7", CONV_PRIORITY_MEDIUM) BREAK CASE 1 ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_HIT", "NIG1D_HIT_8", CONV_PRIORITY_MEDIUM) BREAK CASE 2 ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_HIT", "NIG1D_HIT_9", CONV_PRIORITY_MEDIUM) BREAK CASE 3 ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_HIT", "NIG1D_HIT_10", CONV_PRIORITY_MEDIUM) BREAK ENDSWITCH iScaredConvoCounter++ iHitDialogueTimer = GET_GAME_TIMER() iScaredDialogueTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if player has failed for not catching up with Celebrity PROC DISTANCE_FAIL_CHECKS() //USED FOR RETURN TO CLUB CHECKS - DISTANCE_FAIL_CHECKS() IF bPlayerHasBeenClose = FALSE IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) AND eMissionStage = MS_COLLECT_GOLF_CLUB IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), golfClubPickup.objIndex, << 25.0, 25.0, 25.0 >>) bPlayerHasBeenClose = TRUE ENDIF ENDIF ENDIF IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF bWarnedAboutLeaving = FALSE IF eGolferState = GS_CRASHED OR eMissionStage = MS_COLLECT_GOLF_CLUB IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) IF bPlayerHasBeenClose = TRUE // IF PLAYER HAS BEEN CLOSE TO CLUB WE CAN TELL HIM TO RETURN TO IT IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),golfClubPickup.objIndex,<>) PRINT_NOW("N1D_RETPICKUP",DEFAULT_GOD_TEXT_TIME,5) bWarnedAboutLeaving = TRUE ENDIF ENDIF ENDIF // Don't need to warn the player about getting too far away from Stanky via God Text anymore // ELSE // IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) // IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<>) // AND NOT IS_ENTITY_AT_COORD(CelebrityGolfer.mPed,CelebrityGolfer.vStartPos,<<20.0,20.0,20.0>>) // PRINT_NOW("N1D_DONTLOSE",DEFAULT_GOD_TEXT_TIME,5) // bWarnedAboutLeaving = TRUE // ENDIF // ENDIF ENDIF ELSE IF eGolferState = GS_CRASHED OR eMissionStage = MS_COLLECT_GOLF_CLUB IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),golfClubPickup.objIndex,<>) SET_FAIL_REASON(FAIL_LOST_GOLF_CLUB) ENDIF ENDIF ENDIF ENDIF IF eMissionStage < MS_COLLECT_GOLF_CLUB // Only do this fail check while the chase is ongoing - don't care about Glen if the golf club is around IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<>) AND NOT CAN_PED_SEE_PED(PLAYER_PED_ID(), CelebrityGolfer.mPed) SET_FAIL_REASON(FAIL_LION_ESCAPED) ENDIF ENDIF ENDIF ENDIF ENDPROC PROC HANDLE_CELEB_SWING_DIALOGUE() SWITCH eSwingSpeech CASE SWING_TRIGGER IF IS_PED_UNINJURED(CelebrityGolfer.mPed) AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), CelebrityGolfer.mPed, 35.0) AND eSecurityState[CELEBSEC_WEST] != SS_STANDDOWN AND eSecurityState[CELEBSEC_EAST] != SS_STANDDOWN AND eSecurityState[CELEBSEC_NORTH] != SS_STANDDOWN // Don't play the dialogue if security are going into standdown because of the outfit IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SWING", CONV_PRIORITY_HIGH) eSwingSpeech = SWING_SPEAKING ENDIF ENDIF ENDIF ENDIF BREAK CASE SWING_SPEAKING IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iFostLineTimer = GET_GAME_TIMER() eSwingSpeech = SWING_WAIT ENDIF BREAK CASE SWING_WAIT IF (GET_GAME_TIMER() - iFostLineTimer) > 4500 eSwingSpeech = SWING_TRIGGER ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Puts course security back in initial state so they can react to golf buggy chase /// Also sets bHelpTextDisplayed = TRUE - Stops help text displaying. PROC RESET_COURSE_SECURITY() DEBUG_PRINT("RESET COURSE SECURITY") bHelpTextDisplayed = TRUE INT i FOR i = 0 TO NUM_OF_COURSE_SECURITY - 1 IF IS_ENTITY_ALIVE(CourseSecurity[i].mPed) eCourseSecurity[i] = CS_WAIT_AT_LOCATION ENDIF ENDFOR ENDPROC /// PURPOSE: /// Deals with the celebrities behaviours PROC Monitor_Celebrity() IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) SWITCH eGolferState CASE GS_WAIT_FOR_PLAYER HANDLE_CELEB_SWING_DIALOGUE() // Handle the dialogue //CELEB THINKS ITS DEBT COLLECTORS AND RUNS IF HAS_PLAYER_THREATENED_PED(CelebrityGolfer.mPed) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF // ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") // ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") // PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_FLEE", "NIG1D_FLEE_1", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) //RE-ATTACH GOLF CLUB TO NEW OFFSET SO IT LOOKS OK WHEN HE IS RUNNING ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,CelebrityGolfer.mPed,GET_PED_BONE_INDEX(CelebrityGolfer.mPed,BONETAG_PH_R_HAND),<<0.06,0.04,0.0>>,<<-90,180,0>>) IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_PED_UNINJURED(CelebrityGolfer.mPed) IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) TASK_ENTER_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle,-1,VS_DRIVER) ENDIF ENDIF ENDIF DEBUG_PRINT("GS_WAIT_FOR_PLAYER, player threatened Glen; attacking...") ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[CELEBSEC_WEST].mPed, "Nigel1DCelebSecurity") IF IS_PLAYER_USING_SNIPER_RIFLE() PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_6", CONV_PRIORITY_MEDIUM) ELSE PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_5", CONV_PRIORITY_MEDIUM) ENDIF MAKE_SECURITY_ATTACK() eGolferState = GS_GET_INTO_VEHICLE ELSE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // Kill the conversation ASAP, everyone needs to react ENDIF ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<>) IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF) // CHECK PLAYERS OUTFIT - IS IT GOLFERS? IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_FLEE", "NIG1D_FLEE_1", CONV_PRIORITY_MEDIUM) IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_PED_UNINJURED(CelebrityGolfer.mPed) IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) TASK_ENTER_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle,-1,VS_DRIVER) ENDIF ENDIF ENDIF DEBUG_PRINT("GS_WAIT_FOR_PLAYER, player got too close to Glen (alert_dis); attacking...") MAKE_SECURITY_ATTACK() //CHANGES GOLF CLUB ORIENTATIONS TO LOOK CORRECT IN HAND ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,CelebrityGolfer.mPed,GET_PED_BONE_INDEX(CelebrityGolfer.mPed,BONETAG_PH_R_HAND),<<0.06,0.04,0.0>>,<<-90,180,0>>) // eGolferState = GS_GET_INTO_VEHICLE ELSE iCelebWarnTimer = GET_GAME_TIMER() iFostLineTimer = GET_GAME_TIMER() eGolferState = GS_PLAYER_IN_OUTFIT ENDIF ENDIF ENDIF BREAK CASE GS_PLAYER_IN_OUTFIT IF HAS_PLAYER_THREATENED_PED(CelebrityGolfer.mPed) OR bPlayerReturned = TRUE DEBUG_PRINT("GS_PLAYER_IN_OUTFIT, player threatened Glen or returned a second time; attacking...") MAKE_SECURITY_ATTACK() ELSE IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<>) ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,CelebrityGolfer.mPed,GET_PED_BONE_INDEX(CelebrityGolfer.mPed,BONETAG_PH_R_HAND),<<0.0, 0.0, 0.0>>,<<0, 0, 0>>) OPEN_SEQUENCE_TASK(siCelebrity) TASK_ACHIEVE_HEADING(NULL, 112.0) TASK_PLAY_ANIM(NULL,"rcmnigel1d","swing_a_mark",NORMAL_BLEND_IN,REALLY_SLOW_BLEND_OUT,-1,AF_DEFAULT) TASK_PLAY_ANIM(NULL,"rcmnigel1d","swing_b_mark",NORMAL_BLEND_IN,REALLY_SLOW_BLEND_OUT,-1,AF_DEFAULT) SET_SEQUENCE_TO_REPEAT(siCelebrity,REPEAT_FOREVER) CLOSE_SEQUENCE_TASK(siCelebrity) TASK_PERFORM_SEQUENCE(CelebrityGolfer.mPed, siCelebrity) CLEAR_SEQUENCE_TASK(siCelebrity) IF IS_ENTITY_ALIVE(CelebrityFriend.mPed) TASK_CLEAR_LOOK_AT(CelebrityFriend.mPed) ENDIF bPlayerReturned = TRUE int i FOR i = 0 TO NUM_OF_SECURITY - 1 eSecurityState[i] = SS_GUARD_AREA ENDFOR eGolferState = GS_WAIT_FOR_PLAYER ELSE // Check for bumping IF (GET_GAME_TIMER() - iFostLineTimer) >= 2500 IF IS_ENTITY_TOUCHING_ENTITY(CelebrityGolfer.mPed, PLAYER_PED_ID()) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_BUMPF", CONV_PRIORITY_MEDIUM) iFostLineTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) AND IS_VEHICLE_OK(GolfBuggieTransport[BUGGY_NEXTTOCELEB].mVehicle) AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(),CelebrityBuggy.mVehicle) OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(),GolfBuggieTransport[BUGGY_NEXTTOCELEB].mVehicle) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ENDIF iSecurityWarnTimer = GET_GAME_TIMER() //SET TIMER, USED INSIDE SECURITY STATE ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_BANK", "NIG1D_BANK_1", CONV_PRIORITY_MEDIUM) OPEN_SEQUENCE_TASK(siCelebrity) TASK_PLAY_ANIM(NULL,"rcmnigel1d","thanks_male_03",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_DEFAULT) TASK_TURN_PED_TO_FACE_ENTITY(NULL,PLAYER_PED_ID(),-1) CLOSE_SEQUENCE_TASK(siCelebrity) TASK_PERFORM_SEQUENCE(CelebrityGolfer.mPed,siCelebrity) CLEAR_SEQUENCE_TASK(siCelebrity) eGolferState = GS_ANGRY_AT_PLAYER ENDIF ENDIF IF (GET_GAME_TIMER() - iCelebWarnTimer) >= 15000 //PLAYER HAS BEEN IN AREA TOO LONG, CELEB GETS PISSED OFF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<>) ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_BANK", "NIG1D_BANK_2", CONV_PRIORITY_MEDIUM) OPEN_SEQUENCE_TASK(siCelebrity) TASK_TURN_PED_TO_FACE_ENTITY(NULL,PLAYER_PED_ID(),-1) CLOSE_SEQUENCE_TASK(siCelebrity) TASK_PERFORM_SEQUENCE(CelebrityGolfer.mPed,siCelebrity) CLEAR_SEQUENCE_TASK(siCelebrity) IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,CelebrityGolfer.mPed,GET_PED_BONE_INDEX(CelebrityGolfer.mPed,BONETAG_PH_R_HAND),<<0.06,0.04,0.0>>,<<-90,180,0>>) ENDIF iSecurityWarnTimer = GET_GAME_TIMER() //SET TIMER, USED INSIDE SECURITY STATE eSecurityState[CELEBSEC_WEST] = SS_GO_TO_PLAYER //MAKES SECURITY NEAR BUGGY REACT eGolferState = GS_ANGRY_AT_PLAYER ENDIF ENDIF ENDIF BREAK CASE GS_ANGRY_AT_PLAYER IF HAS_PLAYER_THREATENED_PED(CelebrityGolfer.mPed) DEBUG_PRINT("GS_ANGRY_AT_PLAYER, player threatened Glen; attacking...") MAKE_SECURITY_ATTACK() ENDIF IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<>) ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,CelebrityGolfer.mPed,GET_PED_BONE_INDEX(CelebrityGolfer.mPed,BONETAG_PH_R_HAND),<<0.0, 0.0, 0.0>>,<<0, 0, 0>>) OPEN_SEQUENCE_TASK(siCelebrity) TASK_TURN_PED_TO_FACE_COORD(NULL, <<-1094.57, 60.98, 52.67>>) TASK_PLAY_ANIM(NULL,"mini@golf","iron_idle_high_b",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_DEFAULT) TASK_PLAY_ANIM(NULL,"mini@golf","iron_swing_intro_high",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_DEFAULT) TASK_PLAY_ANIM(NULL,"mini@golf","iron_swing_action_high",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_DEFAULT) TASK_PLAY_ANIM(NULL,"mini@golf","swing_outro",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_DEFAULT) TASK_PLAY_ANIM(NULL,"mini@golf","swing_react_bad_02",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_DEFAULT) SET_SEQUENCE_TO_REPEAT(siCelebrity,REPEAT_FOREVER) CLOSE_SEQUENCE_TASK(siCelebrity) TASK_PERFORM_SEQUENCE(CelebrityGolfer.mPed, siCelebrity) CLEAR_SEQUENCE_TASK(siCelebrity) IF IS_ENTITY_ALIVE(CelebrityFriend.mPed) TASK_CLEAR_LOOK_AT(CelebrityFriend.mPed) ENDIF bPlayerReturned = TRUE int i FOR i = 0 TO NUM_OF_SECURITY - 1 eSecurityState[i] = SS_GUARD_AREA ENDFOR eGolferState = GS_WAIT_FOR_PLAYER ELSE // Check for bumping IF (GET_GAME_TIMER() - iFostLineTimer) >= 2500 IF IS_ENTITY_TOUCHING_ENTITY(CelebrityGolfer.mPed, PLAYER_PED_ID()) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_BUMPF", CONV_PRIORITY_MEDIUM) iFostLineTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE GS_GET_INTO_VEHICLE IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) AND GET_DISTANCE_BETWEEN_ENTITIES(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) < 10 AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(),CelebrityBuggy.mVehicle) AND NOT IS_ENTITY_UPSIDEDOWN(CelebrityBuggy.mVehicle) IF IS_PED_SITTING_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_FLEE", "NIG1D_FLEE_3", CONV_PRIORITY_MEDIUM) IF IS_PED_UNINJURED(CelebrityGolfer.mPed) IF NOT IS_PLAYER_AT_LEFT_SIDE() TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle,"NIGEL1DGOLF",DRIVINGMODE_AVOIDCARS_RECKLESS,0,EWAYPOINT_START_FROM_CLOSEST_POINT|EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) ELSE bHasGoneOppositeWay = TRUE TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle,"NIGEL1DGOLF2",DRIVINGMODE_AVOIDCARS_RECKLESS,0,EWAYPOINT_START_FROM_CLOSEST_POINT|EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) ENDIF ENDIF eGolferState = GS_FLEE_FROM_PLAYER_IN_BUGGY ENDIF ELSE MAKE_PED_FLEE(CelebrityGolfer.mPed,TRUE) eGolferState = GS_FLEEING_ON_FOOT ENDIF RESET_COURSE_SECURITY() BREAK CASE GS_FLEE_FROM_PLAYER_IN_BUGGY //STAYS IN HERE WHILE FLEEING FROM PLAYER CelebrityChaseDialogue() CelebrityScaredDialogue() IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) IF eMissionStage <> MS_CHASE_THE_GOLFER //NEED TO MAKE SURE CELEBRITY CONTINUES TO FLEE IF OUTSIDE THIS STATE IF GET_VEHICLE_WAYPOINT_PROGRESS(CelebrityBuggy.mVehicle) >= 200 MAKE_PED_FLEE(CelebrityGolfer.mPed) eGolferState = GS_FLEE_IN_CITY ENDIF IF Is_Buggy_Stuck() eGolferState = GS_CRASHED ENDIF ENDIF //FLEEING ELSE eGolferState = GS_CRASHED ENDIF IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(),CelebrityBuggy.mVehicle, TRUE) eGolferState = GS_CRASHED ENDIF ENDIF BREAK CASE GS_CRASH_INTO_LAKE IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) eGolferState = GS_CRASHED ENDIF ENDIF BREAK CASE GS_FLEE_IN_CITY CelebrityChaseDialogue() CelebrityScaredDialogue() IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(),CelebrityBuggy.mVehicle, TRUE) eGolferState = GS_CRASHED ENDIF ENDIF BREAK CASE GS_CRASHED //CELEB HAS CRASHED AND IS ON FOOT - CREATE PICKUP DEBUG_PRINT("Celeb crashed or forced out - quitting chase") IF eMissionStage < MS_COLLECT_GOLF_CLUB // Only set the stage to collect the golf club if we haven't passed it yet PRINT_NOW("N1D_COLLECT",DEFAULT_GOD_TEXT_TIME,5) // Collect the ~g~golf club. // SetStage(MS_COLLECT_GOLF_CLUB) ENDIF IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(CelebrityBuggy.mVehicle) REMOVE_WAYPOINT_RECORDING("NIGEL1DGOLF") REMOVE_WAYPOINT_RECORDING("NIGEL1DGOLF2") ENDIF ENDIF MAKE_PED_FLEE(CelebrityGolfer.mPed,TRUE) eGolferState = GS_FLEEING_ON_FOOT BREAK CASE GS_FLEEING_ON_FOOT //CELEB IS FLEEING ON FOOT BREAK ENDSWITCH ELSE IF NOT bReplayCelebDeadCheck DEBUG_PRINT("bReplayCelebDeadCheck tripped, recording last 2 seconds") REPLAY_RECORD_BACK_FOR_TIME(2.0, 2.0, REPLAY_IMPORTANCE_LOWEST) // Get the last two seconds of celeb's life to capture death bReplayCelebDeadCheck = TRUE ENDIF IF NOT IS_BIT_SET(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLD_KILLED_MARK)) SET_BIT(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLD_KILLED_MARK)) CPRINTLN(DEBUG_INTERNET, GET_THIS_SCRIPT_NAME(), " g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLD_KILLED_MARK) set") ENDIF ENDIF ENDPROC /// PURPOSE: /// Makes sure concierge models have loded /// PARAMS: /// bWaitForLoad - If true, will wait for all models to be loaded /// RETURNS: /// TRUE if all mdoels loaded, false otherwise. FUNC BOOL HAS_CONCIERGE_SCENE_LOADED(BOOL bWaitForLoad = FALSE) INT i FOR i = 0 TO NUM_OF_CONC_PEDS - 1 REQUEST_MODEL(ConciergePed[i].mModel) ENDFOR FOR i = 0 TO NUM_OF_TRANS_BUGGIES - 1 REQUEST_MODEL(GolfBuggieTransport[i].mModel) ENDFOR IF bWaitForLoad = FALSE // HAVE ALL PED CONCIEGRES LOADED FOR i = 0 TO NUM_OF_CONC_PEDS - 1 IF NOT HAS_MODEL_LOADED(ConciergePed[i].mModel) RETURN FALSE ENDIF ENDFOR // HAVE ALL BUGGIES LOADED FOR i = 0 TO NUM_OF_TRANS_BUGGIES - 1 IF NOT HAS_MODEL_LOADED(GolfBuggieTransport[i].mModel) RETURN FALSE ENDIF ENDFOR IF NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DTRANS") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DGOLF") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DGOLF2") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DCRASH") RETURN FALSE ENDIF ELSE // wait for everything to load- used in debug skips Bool bEverythingLoaded = FALSE WHILE bEverythingLoaded = FALSE WAIT(0) bEverythingLoaded = TRUE // HAVE ALL PED CONCIEGRES LOADED FOR i = 0 TO NUM_OF_CONC_PEDS - 1 IF NOT HAS_MODEL_LOADED(ConciergePed[i].mModel) bEverythingLoaded = FALSE ENDIF ENDFOR // HAVE ALL BUGGIES LOADED FOR i = 0 TO NUM_OF_TRANS_BUGGIES - 1 IF NOT HAS_MODEL_LOADED(GolfBuggieTransport[i].mModel) bEverythingLoaded = FALSE ENDIF ENDFOR IF NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DTRANS") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DGOLF") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DGOLF2") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DCRASH") bEverythingLoaded = FALSE ENDIF ENDWHILE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Makes all consierge peds flee the player PROC CONSIERGE_FLEE_PLAYER() INT i FOR i = 0 TO NUM_OF_CONC_PEDS - 1 MAKE_PED_FLEE(ConciergePed[i].mPed,TRUE) ENDFOR ENDPROC /// PURPOSE: /// Monitors individual conseirge peds. /// Checks if player has threatend them or shot in area. PROC Monitor_Consierge(INT iPedNum) SWITCH eConsiergeState[iPedNum] CASE CS_STAND_AND_WAIT IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), ConciergePed[iPedNum].mPed, <<6,6,6>>, FALSE, TRUE, TM_ON_FOOT) IF GET_SCRIPT_TASK_STATUS(ConciergePed[iPedNum].mPed, script_task_look_at_entity) != PERFORMING_TASK TASK_LOOK_AT_ENTITY(ConciergePed[iPedNum].mPed, PLAYER_PED_ID(), 500, SLF_EXTEND_PITCH_LIMIT|SLF_EXTEND_YAW_LIMIT) ENDIF ENDIF IF HAS_PLAYER_THREATENED_PED(ConciergePed[iPedNum].mPed) IF NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF iPedNum = 0 ADD_PED_FOR_DIALOGUE(sDialogue, 7, ConciergePed[iPedNum].mPed , "CONCIERGE") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_FLEE", "NIG1D_FLEE_9", CONV_PRIORITY_MEDIUM) ENDIF ENDIF ENDIF DEACTIVATE_OUTFIT_CHANGE() CONSIERGE_FLEE_PLAYER() eConsiergeState[iPedNum] = CS_FLEEING_PLAYER ELIF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(ConciergePed[iPedNum].mPed),30.0) IF NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF iPedNum = 0 ADD_PED_FOR_DIALOGUE(sDialogue, 7, ConciergePed[iPedNum].mPed , "CONCIERGE") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_FLEE", "NIG1D_FLEE_7", CONV_PRIORITY_MEDIUM) ENDIF ENDIF ENDIF DEACTIVATE_OUTFIT_CHANGE() CONSIERGE_FLEE_PLAYER() eConsiergeState[iPedNum] = CS_FLEEING_PLAYER ENDIF BREAK CASE CS_FLEEING_PLAYER BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Monitors the consierge scene, player will fail if he attacks them before finding golfer. PROC Monitor_Consierge_Scene() INT i FOR i = 0 TO NUM_OF_CONC_PEDS - 1 IF IS_ENTITY_ALIVE(ConciergePed[i].mPed) Monitor_Consierge(i) ENDIF ENDFOR ENDPROC /// PURPOSE: /// Handles concierge scene - Loads models, checks they are loaded. /// Also checks if everything is ok once created. PROC HANDLE_CONCIERGE_SCENE() INT i IF bConciergeSceneCreated = FALSE IF HAS_CONCIERGE_SCENE_LOADED() DEBUG_PRINT("Concierge scene loaded, creating now...") // CREATE WORKERS FOR i = 0 TO NUM_OF_CONC_PEDS -1 CreateMissionPed(ConciergePed[i],FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ConciergePed[i].mPed,TRUE) ENDFOR //CREATE BUGGY // FOR i = 0 TO NUM_OF_TRANS_BUGGIES -1 // CreateMissionVehicle(GolfBuggieTransport[i],FALSE) // SET_VEHICLE_MODEL_IS_SUPPRESSED(GolfBuggieTransport[i].mModel,TRUE) // ENDFOR //PUT A PED IN THE VEHICLE CreateMissionVehicle(GolfBuggieTransport[0],FALSE) SET_PED_INTO_VEHICLE(ConciergePed[1].mPed,GolfBuggieTransport[0].mVehicle,VS_DRIVER) SET_PED_CAN_BE_DRAGGED_OUT(ConciergePed[1].mPed,FALSE) bConciergeSceneCreated = TRUE //Unload PED models FOR i = 0 TO NUM_OF_CONC_PEDS -1 SET_MODEL_AS_NO_LONGER_NEEDED(ConciergePed[i].mModel) ENDFOR //Unload VEHICLE models FOR i = 0 TO NUM_OF_TRANS_BUGGIES -1 SET_MODEL_AS_NO_LONGER_NEEDED(GolfBuggieTransport[i].mModel) ENDFOR ENDIF ELSE Monitor_Consierge_Scene() ENDIF ENDPROC /// PURPOSE: /// Requests the models for the Celeb security. /// PARAMS: /// bWaitForLoad - Will force it to wait until the models have been loaded. /// RETURNS: /// True - If all models have loaded, false otherwise. FUNC BOOL HAS_SECURITY_LOADED(BOOL bWaitForLoad = FALSE) INT i FOR i = 0 TO NUM_OF_SECURITY - 1 REQUEST_MODEL(CelebSecurity[i].mModel) ENDFOR IF bWaitForLoad = FALSE FOR i = 0 TO NUM_OF_SECURITY - 1 IF NOT HAS_MODEL_LOADED(CelebSecurity[i].mModel) RETURN FALSE ENDIF ENDFOR ELSE // wait for everything to load- used in debug skips Bool bEverythingLoaded = FALSE WHILE bEverythingLoaded = FALSE WAIT(0) bEverythingLoaded = TRUE // HAVE ALL PED CONCIEGRES LOADED FOR i = 0 TO NUM_OF_SECURITY - 1 IF NOT HAS_MODEL_LOADED(CelebSecurity[i].mModel) bEverythingLoaded = FALSE ENDIF ENDFOR ENDWHILE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Checks if player is near security - Used when trying to escape them /// RETURNS: /// True - If player is away from security, false otherwise. FUNC BOOL IS_PLAYER_NEAR_SECURITY() INT i FOR i = 0 TO NUM_OF_SECURITY -1 IF IS_ENTITY_ALIVE(CelebSecurity[i].mPed) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[i].mPed,<<70.0,70.0,70.0>>) RETURN FALSE ENDIF ENDIF ENDFOR RETURN TRUE ENDFUNC /// PURPOSE: /// Checks if all the security are dead - Used when trying to escape them /// RETURNS: /// True - If all security are dead, false otherwise FUNC BOOL ARE_GUARDS_DEAD() INT i FOR i = 0 TO NUM_OF_SECURITY -1 IF CelebSecurity[i].bImDead = FALSE RETURN FALSE ENDIF ENDFOR RETURN TRUE ENDFUNC /// PURPOSE: /// Continually check the conditions for this mission's FOUR! stat and update if needed PROC CHECK_STATS_GOALS() IF bCheckStatFour IF NOT IS_ENTITY_ALIVE(CelebrityGolfer.mPed) AND ARE_GUARDS_DEAD() DEBUG_PRINT("Player achieved FOUR!") bCheckStatFour = FALSE INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1D_KILLED_STANKY_AND_GUARDS) ENDIF ENDIF ENDPROC /// PURPOSE: /// Controls the behaviours of each Celeb security ped /// PARAMS: /// iPedNum - The ped we want to check PROC Monitor_Security_Ped(INT iPedNum) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) AND IS_ENTITY_ALIVE(CelebSecurity[iPedNum].mPed) IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), CelebSecurity[iPedNum].mPed) < 20 IF NOT IS_PED_HEADTRACKING_PED(CelebSecurity[iPedNum].mPed, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(CelebSecurity[iPedNum].mPed, PLAYER_PED_ID(), 1000) ENDIF ENDIF ENDIF SWITCH eSecurityState[iPedNum] CASE SS_GUARD_AREA IF HAS_PLAYER_THREATENED_PED(CelebSecurity[iPedNum].mPed) OR HAS_PED_RECEIVED_EVENT(CelebSecurity[iPedNum].mPed, EVENT_POTENTIAL_GET_RUN_OVER) IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed, 110) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF IS_PLAYER_USING_SNIPER_RIFLE() //CHECK IF PLAYER IS TRYING TO SNIPE ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_6", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) ENDIF DEBUG_PRINT("SS_GUARD_AREA, player threatened Celeb security; attacking...") MAKE_SECURITY_ATTACK() ENDIF ELIF IS_FIRST_PERSON_AIM_CAM_ACTIVE() IF IS_ENTITY_ON_SCREEN(CelebSecurity[iPedNum].mPed) AND CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) AND GET_DISTANCE_BETWEEN_ENTITIES(CelebSecurity[iPedNum].mPed, PLAYER_PED_ID()) < 50 IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_6", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) DEBUG_PRINT("SS_GUARD_AREA, player tried sniping Celeb security but was spotted; attacking...") MAKE_SECURITY_ATTACK() ENDIF ELIF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(),CelebSecurity[iPedNum].mPed) IF IS_PLAYER_USING_SNIPER_RIFLE() //CHECK IF PLAYER IS TRYING TO SNIPE IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_6", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) DEBUG_PRINT("SS_GUARD_AREA, player aimed Sniper Rifle when security could see them; attacking...") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF ELSE IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //PLAYER IS NOT IN A VEHICLE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<25.0,25.0,25.0>>) IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF)// CHECK PLAYERS OUTFIT - IF NOT DO BELOW IF NOT IS_PLAYER_UNARMED() IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) AND IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<18.0,18.0,18.0>>) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_5", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("SS_GUARD_AREA, player armed, not wearing outfit, guard has LOS or player within 18m; attacking...") MAKE_SECURITY_ATTACK() ENDIF ENDIF ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<18.0,18.0,18.0>>) IF bPlayerApproached = FALSE //ONLY WANT THIS EVENT TO HAPPEN ONCE SO NEED TO SET BOOL ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_1", CONV_PRIORITY_MEDIUM) OPEN_SEQUENCE_TASK(siCelebSecurity) TASK_PLAY_ANIM(NULL,"rcmnigel1d","thanks_male_03",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_DEFAULT) TASK_TURN_PED_TO_FACE_ENTITY(NULL,PLAYER_PED_ID(),-1) CLOSE_SEQUENCE_TASK(siCelebSecurity) TASK_PERFORM_SEQUENCE(CelebSecurity[iPedNum].mPed,siCelebSecurity) CLEAR_SEQUENCE_TASK(siCelebSecurity) iSecurityWarnTimer = GET_GAME_TIMER() bPlayerApproached = TRUE eSecurityState[iPedNum] = SS_GO_TO_PLAYER ENDIF ELSE // Play the line without subtitles if we must so the guard state progresses IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_1", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) OPEN_SEQUENCE_TASK(siCelebSecurity) TASK_PLAY_ANIM(NULL,"rcmnigel1d","thanks_male_03",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_DEFAULT) TASK_TURN_PED_TO_FACE_ENTITY(NULL,PLAYER_PED_ID(),-1) CLOSE_SEQUENCE_TASK(siCelebSecurity) TASK_PERFORM_SEQUENCE(CelebSecurity[iPedNum].mPed,siCelebSecurity) CLEAR_SEQUENCE_TASK(siCelebSecurity) iSecurityWarnTimer = GET_GAME_TIMER() bPlayerApproached = TRUE eSecurityState[iPedNum] = SS_GO_TO_PLAYER ENDIF ENDIF ELSE IF bShouldAttackPlayer = TRUE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<12.0,12.0,12.0>>) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("SS_GUARD_AREA, non-outfit, player came back to area after being warned; attacking") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE //PLAYER IS IN A GOLFERS OUTFIT - DO THIS STUFF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<18.0,18.0,18.0>>) IF bPlayerApproached = FALSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND bConversationActive = FALSE IF IS_PED_UNINJURED(CelebSecurity[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebSecurity[iPedNum].mPed,PLAYER_PED_ID(),-1) ENDIF IF IS_PED_UNINJURED(CelebrityFriend.mPed) TASK_LOOK_AT_ENTITY(CelebrityFriend.mPed, PLAYER_PED_ID(), -1) ENDIF IF IS_PED_UNINJURED(CelebrityGolfer.mPed) TASK_LOOK_AT_ENTITY(CelebrityGolfer.mPed, PLAYER_PED_ID(), -1) OPEN_SEQUENCE_TASK(siCelebrity) TASK_TURN_PED_TO_FACE_ENTITY(NULL,PLAYER_PED_ID(), 1500) TASK_PLAY_ANIM(NULL, "rcmnigel1d", "idle_c", REALLY_SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(siCelebrity) TASK_PERFORM_SEQUENCE(CelebrityGolfer.mPed, siCelebrity) CLEAR_SEQUENCE_TASK(siCelebrity) // IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) // ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,CelebrityGolfer.mPed,GET_PED_BONE_INDEX(CelebrityGolfer.mPed,BONETAG_PH_R_HAND),<<0.0,0.0,0.0>>,<<0,0,0>>) // ENDIF ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") ADD_PED_FOR_DIALOGUE(sDialogue, 2,PLAYER_PED_ID(), "TREVOR") ADD_PED_FOR_DIALOGUE(sDialogue, 6,CelebrityGolfer.mPed, "FOSTENBURG") IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_OUTFIT", CONV_PRIORITY_MEDIUM) bPlayerApproached = TRUE int i FOR i = 0 TO NUM_OF_SECURITY - 1 eSecurityState[i] = SS_STANDDOWN ENDFOR ENDIF ENDIF ELSE //ONCE THIS LOOPS BACK AROUND PLAYER WILL BE SHOT FOR RETURNING AGAIN IF bShouldAttackPlayer = TRUE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<12.0,12.0,12.0>>) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) DEBUG_PRINT("SS_GUARD_AREA, outfit, player came back to area after being warned; attacking") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE //PLAYER IS IN A VEHICLE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<50.0,50.0,50.0>>) IF NOT IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()),CelebrityBuggy.mModel) //CHECK TO SEE IF VEHICLE IS A GOLF BUGGY - IF NOT DO BELOW IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) DEBUG_PRINT("SS_GUARD_AREA, player 50m away from group in non-buggy vehicle; attacking") MAKE_SECURITY_ATTACK() ENDIF ENDIF ELSE // VEHICLE MODEL IS A GOLF BUGGY IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<25.0,25.0,25.0>>) IF GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) >= 15.0 DEBUG_PRINT_FLOAT("Going too fast, going to trigger aggro: ", GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))) IF HAS_PED_RECEIVED_EVENT(CelebSecurity[iPedNum].mPed, EVENT_POTENTIAL_GET_RUN_OVER) OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<6.0,6.0,6.0>>) IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) DEBUG_PRINT("SS_GUARD_AREA, player went too fast too close to security; attacking") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF ELSE IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") // Because this line can be triggered very easily and we only want to play it once, we'll track whether it's been said through a bool // Otherwise, all three security peds say it one after the other and it's totally weird IF bSecuritySaidCannotDrive = FALSE IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_7", CONV_PRIORITY_MEDIUM) DEBUG_PRINT_INT("'You can't drive through here buddy said by ped id: ", iPedNum) IF IS_PED_UNINJURED(CelebSecurity[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebSecurity[iPedNum].mPed,PLAYER_PED_ID(),-1) ENDIF bSecuritySaidCannotDrive = TRUE iSecurityWarnTimer = GET_GAME_TIMER() eSecurityState[iPedNum] = SS_WARN_PLAYER ENDIF ELSE IF IS_PED_UNINJURED(CelebSecurity[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebSecurity[iPedNum].mPed,PLAYER_PED_ID(),-1) ENDIF bSecuritySaidCannotDrive = TRUE iSecurityWarnTimer = GET_GAME_TIMER() eSecurityState[iPedNum] = SS_WARN_PLAYER ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE SS_GO_TO_PLAYER IF NOT IS_PLAYER_UNARMED() IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), CelebSecurity[iPedNum].mPed) < 80 DEBUG_PRINT("SS_GO_TO_PLAYER, player armed, guard has LOS; attacking...") MAKE_SECURITY_ATTACK() ENDIF ENDIF ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<9.0,9.0,9.0>>) //PLAYER HAS GOT CLOSER, JUMP INTO LAST WARN STATE AND bShouldAttackPlayer = TRUE ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_3", CONV_PRIORITY_MEDIUM) IF IS_PED_UNINJURED(CelebSecurity[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebSecurity[iPedNum].mPed,PLAYER_PED_ID(),-1) ENDIF iSecurityWarnTimer = GET_GAME_TIMER() eSecurityState[iPedNum] = SS_AIM_AT_PLAYER ENDIF ELSE //PLAYER HAS LEFT OR STAYED AT SAME DISTANCE IF (GET_GAME_TIMER() - iSecurityWarnTimer) >= 8000 //PLAYER HAS STAYED AT SAME DISTANCE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<20.0,20.0,20.0>>) ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_2", CONV_PRIORITY_MEDIUM) OPEN_SEQUENCE_TASK(siCelebSecurity) TASK_TURN_PED_TO_FACE_ENTITY(NULL,PLAYER_PED_ID(),-1) TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), 7000) TASK_PLAY_ANIM(NULL,"rcmnigel1d","thanks_male_05",SLOW_BLEND_IN,SLOW_BLEND_OUT,-1,AF_DEFAULT) CLOSE_SEQUENCE_TASK(siCelebSecurity) TASK_PERFORM_SEQUENCE(CelebSecurity[iPedNum].mPed,siCelebSecurity) CLEAR_SEQUENCE_TASK(siCelebSecurity) iSecurityWarnTimer = GET_GAME_TIMER() eSecurityState[iPedNum] = SS_WARN_PLAYER DEBUG_PRINT("Guard: going into SS_WARN_PLAYER ") ENDIF ELSE //WAIT AND DO NOTHING - PLAYER LEFT ENDIF ENDIF ENDIF ENDIF BREAK CASE SS_WARN_PLAYER IF NOT IS_PLAYER_UNARMED() IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), CelebSecurity[iPedNum].mPed) < 80 DEBUG_PRINT("SS_WARN_PLAYER, player armed, guard has LOS; attacking...") MAKE_SECURITY_ATTACK() ENDIF ENDIF ELSE IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF)// CHECK PLAYERS OUTFIT IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<4.0,4.0,4.0>>) //PLAYER HAS GOT CLOSER, JUMP INTO LAST WARN STATE OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<<8.0,8.0,8.0>>) AND bShouldAttackPlayer = TRUE ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_3", CONV_PRIORITY_MEDIUM) IF IS_PED_UNINJURED(CelebSecurity[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebSecurity[iPedNum].mPed,PLAYER_PED_ID(),-1) ENDIF iSecurityWarnTimer = GET_GAME_TIMER() eSecurityState[iPedNum] = SS_AIM_AT_PLAYER ENDIF DEBUG_PRINT("SS_WARN_PLAYER, player got too close, going to aim...") ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<9.0,9.0,9.0>>) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //PLAYER IS IN A VEHICLE IF GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) >= 15.0 //Player is above 'acceptable' speed, go to Attack IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF DEBUG_PRINT_FLOAT("SS_WARN_PLAYER, going too fast: ", GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))) ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("SS_WARN_PLAYER, player in vehicle going too fast within 9m of guard; attacking...") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF IF (GET_GAME_TIMER() - iSecurityWarnTimer) >= 7000 //PLAYER HAS STAYED AT SAME DISTANCE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<20.0,20.0,20.0>>) ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_3", CONV_PRIORITY_MEDIUM) IF IS_PED_UNINJURED(CelebSecurity[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebSecurity[iPedNum].mPed,PLAYER_PED_ID(),-1) ENDIF iSecurityWarnTimer = GET_GAME_TIMER() eSecurityState[iPedNum] = SS_AIM_AT_PLAYER DEBUG_PRINT("SS_WARN_PLAYER, player took too long, going to aim...") ENDIF ELIF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), CelebSecurity[iPedNum].mPed) > 20.0 TASK_ACHIEVE_HEADING(CelebSecurity[iPedNum].mPed, CelebSecurity[iPedNum].fStartHeading) TASK_CLEAR_LOOK_AT(CelebSecurity[iPedNum].mPed) DEBUG_PRINT("SS_WARN_PLAYER, player >20m away, returning to SS_GUARD_AREA...") eSecurityState[iPedNum] = SS_GUARD_AREA //WAIT AND DO NOTHING - PLAYER LEFT ENDIF ENDIF ENDIF ELSE // Player is in golfer outfit IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<18.0,18.0,18.0>>) IF bPlayerApproached = FALSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND bConversationActive = FALSE IF IS_PED_UNINJURED(CelebSecurity[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebSecurity[iPedNum].mPed,PLAYER_PED_ID(),-1) ENDIF IF IS_PED_UNINJURED(CelebrityGolfer.mPed) TASK_TURN_PED_TO_FACE_ENTITY(CelebrityGolfer.mPed,PLAYER_PED_ID(),-1) ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") ADD_PED_FOR_DIALOGUE(sDialogue, 2,PLAYER_PED_ID(), "TREVOR") ADD_PED_FOR_DIALOGUE(sDialogue, 6,CelebrityGolfer.mPed, "FOSTENBURG") IF CREATE_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_OUTFIT", CONV_PRIORITY_MEDIUM) bPlayerApproached = TRUE // Make all peds go into standdown int i FOR i = 0 TO NUM_OF_SECURITY - 1 eSecurityState[i] = SS_STANDDOWN ENDFOR ENDIF ENDIF ELSE //ONCE THIS LOOPS BACK AROUND PLAYER WILL BE SHOT FOR RETURNING AGAIN IF bShouldAttackPlayer = TRUE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<12.0,12.0,12.0>>) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) DEBUG_PRINT("SS_WARN_PLAYER, outfit worn, player came back to area after being warned; attacking") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE SS_AIM_AT_PLAYER IF NOT IS_PLAYER_UNARMED() IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), CelebSecurity[iPedNum].mPed) < 80 IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF DEBUG_PRINT("SS_AIM_AT_PLAYER, player armed, guard has LOS; attacking...") IF bSecurityAttack = FALSE MAKE_SECURITY_ATTACK() ELSE // Has this guard got stuck here in Aim after the rest have been set to attack? CLEAR_PED_TASKS(CelebSecurity[iPedNum].mPed) OPEN_SEQUENCE_TASK(siCelebSecurity) TASK_PAUSE(NULL, GET_RANDOM_INT_IN_RANGE(5, 200)) TASK_COMBAT_PED(NULL,PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(siCelebSecurity) TASK_PERFORM_SEQUENCE(CelebSecurity[iPedNum].mPed, siCelebSecurity) CLEAR_SEQUENCE_TASK(siCelebSecurity) SET_PED_COMBAT_ATTRIBUTES(CelebSecurity[iPedNum].mPed,CA_DISABLE_SECONDARY_TARGET,TRUE) SET_ENTITY_LOAD_COLLISION_FLAG(CelebSecurity[iPedNum].mPed, TRUE) SET_PED_KEEP_TASK(CelebSecurity[iPedNum].mPed,TRUE) SET_PED_PATH_PREFER_TO_AVOID_WATER(CelebSecurity[iPedNum].mPed, TRUE) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE,relHatePlayer,RELGROUPHASH_PLAYER) eSecurityState[iPedNum] = SS_ATTACK_PLAYER IF NOT DOES_BLIP_EXIST(CelebSecurity[iPedNum].mBlip) CelebSecurity[iPedNum].mBlip = CREATE_PED_BLIP(CelebSecurity[iPedNum].mPed,FALSE,FALSE,BLIPPRIORITY_MED) ENDIF DEBUG_PRINT_INT("Attack player, FORCE security guard: ", iPedNum) ENDIF ENDIF ENDIF ELSE IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(CelebSecurity[iPedNum].mPed), 20, FALSE) AND IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<20.0,20.0,20.0>>) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("SS_AIM_AT_PLAYER, bullet detected within 20m of a ped, attacking...") MAKE_SECURITY_ATTACK() ENDIF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<7.0,7.0,5.0>>) //PLAYER HAS GOT CLOSER, TAKE HIM DOWN OR IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), <<-1097.28, 68.05, 52.99>>, 10.0) AND bShouldAttackPlayer = TRUE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("SS_AIM_AT_PLAYER, player got too close, attacking...") MAKE_SECURITY_ATTACK() ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<20.0,20.0,20.0>>) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //PLAYER IS IN A VEHICLE IF GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) >= 15.0 //Player is above 'acceptable' speed, go to Attack IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF DEBUG_PRINT_FLOAT("SS_AIM_AT_PLAYER, going too fast: ", GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))) ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("SS_AIM_AT_PLAYER, player in vehicle above acceptable speed, within 20m; attacking...") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF IF (GET_GAME_TIMER() - iSecurityWarnTimer) >= 10000 IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<25.0,25.0,25.0>>) AND NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebrityGolfer.mPed,<>) //PLAYER HAS LEFT AREA IF IS_PED_UNINJURED(CelebSecurity[iPedNum].mPed) CLEAR_PED_TASKS_IMMEDIATELY(CelebSecurity[iPedNum].mPed) TASK_GO_STRAIGHT_TO_COORD(CelebSecurity[iPedNum].mPed,CelebSecurity[iPedNum].vStartPos,3.0,-1,CelebSecurity[iPedNum].fStartHeading) ENDIF bShouldAttackPlayer = TRUE // SHOULD NOW ATTACK PLAYER IF HE RETURNS AGAIN eSecurityState[iPedNum] = SS_GUARD_AREA ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<20.0,20.0,20.0>>) //PLAYER HAS STAYED AT SAME DISTANCE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CelebSecurity[iPedNum].mPed,<<9.0,9.0,9.0>>) //PLAYER HAS GOT CLOSER OR (GET_GAME_TIMER() - iSecurityWarnTimer) >= 12000 //PLAYER STAYED IN AREA - ATTACK IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("SS_AIM_AT_PLAYER, player took too long and didn't move away, attacking...") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE SS_ATTACK_PLAYER IF GET_DISTANCE_BETWEEN_ENTITIES(CelebSecurity[iPedNum].mPed,PLAYER_PED_ID()) > 120 AND (IS_PED_IN_ANY_VEHICLE(CelebrityGolfer.mPed) OR IS_ENTITY_ALIVE(CelebrityGolfer.mPed)) IF DOES_BLIP_EXIST(CelebSecurity[iPedNum].mBlip) REMOVE_BLIP(CelebSecurity[iPedNum].mBlip) MAKE_PED_FLEE(CelebSecurity[iPedNum].mPed,TRUE) eSecurityState[iPedNum] = SS_FLEEING_AREA ENDIF ELSE // Keep checking for the current celeb NOT doing a sequence (i.e. not attacking) and retask if required IF NOT IsPedPerformingTask(CelebSecurity[iPedNum].mPed, SCRIPT_TASK_PERFORM_SEQUENCE) OPEN_SEQUENCE_TASK(siCelebSecurity) TASK_PAUSE(NULL, GET_RANDOM_INT_IN_RANGE(5, 200)) TASK_COMBAT_PED(NULL,PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(siCelebSecurity) TASK_PERFORM_SEQUENCE(CelebSecurity[iPedNum].mPed, siCelebSecurity) CLEAR_SEQUENCE_TASK(siCelebSecurity) SET_PED_COMBAT_ATTRIBUTES(CelebSecurity[iPedNum].mPed,CA_DISABLE_SECONDARY_TARGET,TRUE) SET_ENTITY_LOAD_COLLISION_FLAG(CelebSecurity[iPedNum].mPed, TRUE) SET_PED_KEEP_TASK(CelebSecurity[iPedNum].mPed,TRUE) SET_PED_PATH_PREFER_TO_AVOID_WATER(CelebSecurity[iPedNum].mPed, TRUE) ENDIF ENDIF //ATTACKING PLAYER BREAK CASE SS_STANDDOWN bShouldAttackPlayer = FALSE IF HAS_PLAYER_THREATENED_PED(CelebSecurity[iPedNum].mPed) OR HAS_PED_RECEIVED_EVENT(CelebSecurity[iPedNum].mPed, EVENT_POTENTIAL_GET_RUN_OVER) DEBUG_PRINT("SS_STANDDOWN, player threatened Glen OR guard thought he'd get run over; attacking...") MAKE_SECURITY_ATTACK() ELIF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(),CelebSecurity[iPedNum].mPed) IF IS_PLAYER_USING_SNIPER_RIFLE() IF CAN_PED_SEE_PLAYER(CelebSecurity[iPedNum].mPed) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[iPedNum].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_6", CONV_PRIORITY_MEDIUM) DEBUG_PRINT("SS_STANDDOWN, player aiming Sniper Rifle, guard has LOS; attacking...") MAKE_SECURITY_ATTACK() ENDIF ENDIF ENDIF BREAK CASE SS_FLEEING_AREA //FLEEING THE AREA / PLAYER BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Checks the security is alive - Then monitors and maintains each security PEDS behaviours PROC Monitor_Security() INT i FOR i = 0 TO NUM_OF_SECURITY - 1 IF IS_ENTITY_ALIVE(CelebSecurity[i].mPed) // Wide-ranging 'if any of these peds die, just fucking do this' check IF bSecurityAttack = FALSE AND bShouldAttackPlayer = FALSE IF HAS_PLAYER_MUCKED_ABOUT() DEBUG_PRINT("Monitor_Security, player has 'mucked about' with the celeb scene; attacking...") IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-1098.8646, 69.9792, 53.6198>>) < 45 ADD_PED_FOR_DIALOGUE(sDialogue, 7,CelebSecurity[i].mPed, "Nigel1DCelebSecurity") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_SECUR", "NIG1D_SECUR_4", CONV_PRIORITY_MEDIUM) MAKE_SECURITY_ATTACK() ELSE MAKE_SECURITY_ALERT() ENDIF ENDIF ENDIF Monitor_Security_Ped(i) ELSE IF DOES_BLIP_EXIST(CelebSecurity[i].mBlip) REMOVE_BLIP(CelebSecurity[i].mBlip) ENDIF IF DOES_ENTITY_EXIST(CelebSecurity[i].mPed) IF IS_ENTITY_DEAD(CelebSecurity[i].mPed) CelebSecurity[i].bImDead = TRUE ENDIF ENDIF ENDIF ENDFOR ENDPROC /// PURPOSE: /// Makes sure Celebrity Security models have loaded, then creates them. /// Will then monitor them once created PROC HANDLE_CELEB_SECURITY() INT i IF bSecurityCreated = FALSE IF HAS_SECURITY_LOADED() DEBUG_PRINT("Celeb security loaded, creating now...") FOR i = 0 TO NUM_OF_SECURITY - 1 CreateMissionPed(CelebSecurity[i],FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(CelebSecurity[i].mPed,TRUE) GIVE_WEAPON_TO_PED(CelebSecurity[i].mPed,WEAPONTYPE_PISTOL,-1) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(CelebSecurity[i].mPed,TRUE) SET_PED_CAN_BE_TARGETTED(CelebSecurity[i].mPed,TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(CelebSecurity[i].mPed,relHatePlayer) SET_PED_DIES_WHEN_INJURED(CelebSecurity[i].mPed,TRUE) SET_PED_MODEL_IS_SUPPRESSED(CelebSecurity[i].mModel, TRUE) ENDFOR bSecurityCreated = TRUE ENDIF ELSE Monitor_Security() ENDIF ENDPROC /// PURPOSE: /// Requests the models for the golf course security /// PARAMS: /// bWaitForLoad - Will force it to wait and load them /// RETURNS: /// True - If the models have loaded, false otherwise FUNC BOOL HAS_COURSE_SECURITY_LOADED(BOOL bWaitForLoad = FALSE) INT i FOR i = 0 TO NUM_OF_COURSE_SECURITY - 1 REQUEST_MODEL(CourseSecurity[i].mModel) ENDFOR IF bWaitForLoad = FALSE FOR i = 0 TO NUM_OF_COURSE_SECURITY - 1 IF NOT HAS_MODEL_LOADED(CourseSecurity[i].mModel) RETURN FALSE ENDIF ENDFOR ELSE // wait for everything to load- used in debug skips Bool bEverythingLoaded = FALSE WHILE bEverythingLoaded = FALSE WAIT(0) bEverythingLoaded = TRUE // HAVE ALL PED CONCIEGRES LOADED FOR i = 0 TO NUM_OF_COURSE_SECURITY - 1 IF NOT HAS_MODEL_LOADED(CourseSecurity[i].mModel) bEverythingLoaded = FALSE ENDIF ENDFOR ENDWHILE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// If the player gets into a vehicle, check if it's a Caddy (or Caddy2) and add it to the audio mix if so /// If player exits a vehicle, remove the index PROC HANDLE_CADDY_AUDIO_MIX() IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1D_SCENE") IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) IF NOT bIsInCaddy IF IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE), CADDY) OR IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE), CADDY2) viStoredCaddyIdx = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE) ADD_ENTITY_TO_AUDIO_MIX_GROUP(viStoredCaddyIdx,"NIGEL_1D_GOLF_CART_B_TREVOR") DEBUG_PRINT("Adding current player Caddy to audio mix...") bIsInCaddy = TRUE ELSE DEBUG_PRINT("Player is NOT in a Caddy - not adding to audio, but stopping checking model...") bIsInCaddy = TRUE ENDIF ENDIF ELSE IF bIsInCaddy IF DOES_ENTITY_EXIST(viStoredCaddyIdx) REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(viStoredCaddyIdx) DEBUG_PRINT("Removing player Caddy from audio mix") SET_VEHICLE_AS_NO_LONGER_NEEDED(viStoredCaddyIdx) ENDIF bIsInCaddy = FALSE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Check for the player driving a vehicle other than a golf cart in the course, and give them a wanted level /// The security guards also check for this themselves, but this will cover the whole course so the player can't get away with it /// This also manages the 'wanted' state machine generally PROC CHECK_FOR_DRIVING_IN_COURSE() SWITCH eWantedState CASE WS_NOT_WANTED IF IS_PED_INSIDE_GOLF_AREA(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF NOT IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()),CelebrityBuggy.mModel) DEBUG_PRINT("Setting wanted level for driving in the course!") SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(), 1) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) eWantedState = WS_WAITING_FOR_WANTED ENDIF ENDIF ENDIF BREAK CASE WS_WAITING_FOR_WANTED IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 eWantedState = WS_WANTED ENDIF BREAK CASE WS_WANTED IF IS_PED_INSIDE_GOLF_AREA(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF NOT IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()),CelebrityBuggy.mModel) AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(), 1) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID()) SET_PLAYER_WANTED_CENTRE_POSITION(PLAYER_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID())) ENDIF ENDIF ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 DEBUG_PRINT("Resetting wanted level state") eWantedState = WS_NOT_WANTED ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Display help text warnings about weapons and vehicles being prohibited when the player is in the right area PROC HELP_TEXT_WARNINGS() IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationOne,<>) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationTwo,<>) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationThree,<>) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CLEAR_HELP() PRINT_HELP("N1D_HELP1") // Weapons and vehicles are prohibited on the golf course. bHelpTextDisplayed = TRUE ENDIF ENDIF ENDPROC /// PURPOSE: /// Monitors the golf course security deals with their behaviours /// PARAMS: /// iPedNum - The ped we are checking PROC Monitor_Course_Security(INT iPedNum) IF eGolferState <> GS_FLEE_FROM_PLAYER_IN_BUGGY AND eGolferState <> GS_FLEEING_ON_FOOT AND eMissionStage <> MS_LOSE_THE_COPS AND eMissionStage <> MS_LOSE_SECURITY SWITCH eCourseSecurity[iPedNum] CASE CS_GET_IN_POSITION IF iPedNum = COURSESEC_ENTRANCE TASK_FOLLOW_NAV_MESH_TO_COORD(CourseSecurity[iPedNum].mPed,<< -1297.0706, -31.0982, 47.7225 >>,1.0, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, CourseSecurity[iPedNum].fStartHeading) eCourseSecurity[iPedNum] = CS_WAIT_AT_LOCATION ELSE eCourseSecurity[iPedNum] = CS_WAIT_AT_LOCATION ENDIF BREAK CASE CS_WAIT_AT_LOCATION IF IS_PED_UNINJURED(CourseSecurity[iPedNum].mPed) IF (HAS_PLAYER_THREATENED_PED(CourseSecurity[iPedNum].mPed) AND CAN_PED_SEE_PLAYER(CourseSecurity[iPedNum].mPed) ) OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) IF NOT IS_PLAYER_UNARMED() SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED MAKE_PED_FLEE(CourseSecurity[iPedNum].mPed) eCourseSecurity[iPedNum] = CS_FLEE_FROM_PLAYER ELSE SET_PLAYER_WANTED_LEVEL(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED GIVE_WEAPON_TO_PED(CourseSecurity[iPedNum].mPed,WEAPONTYPE_STUNGUN,-1, TRUE) TASK_COMBAT_PED(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID()) SET_PED_CAN_BE_TARGETTED(CourseSecurity[iPedNum].mPed,TRUE) eCourseSecurity[iPedNum] = CS_CALL_POLICE ENDIF ELSE IF bWarned = FALSE //WARN ABOUT CAR IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CourseSecurity[iPedNum].mPed,<<30.0,30.0,30.0>>) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()),CelebrityBuggy.mModel) IF IS_VEHICLE_OK(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationOne,<>) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationTwo,<>) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationThree,<>) IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(),SCRIPT_TASK_LEAVE_VEHICLE) <> WAITING_TO_START_TASK AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(),SCRIPT_TASK_LEAVE_VEHICLE) <> PERFORMING_TASK ADD_PED_FOR_DIALOGUE(sDialogue, 5,CourseSecurity[iPedNum].mPed, "NIGEL1DCONSIERGE") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_WARN", "NIG1D_WARN_1", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) TASK_TURN_PED_TO_FACE_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(),10000) GIVE_WEAPON_TO_PED(CourseSecurity[iPedNum].mPed,WEAPONTYPE_STUNGUN,-1, TRUE) DEBUG_PRINT("Security dialogue: Trevor warned about vehicles") bWarned = TRUE iGuardWarnTimer = GET_GAME_TIMER() eCourseSecurity[iPedNum] = CS_PLAYER_WARNED ENDIF ENDIF ENDIF ENDIF ELSE // If player isn't in a car but is armed, warn about guns IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),CourseSecurity[iPedNum].mPed,<<10.0,10.0,10.0>>) IF NOT IS_PLAYER_UNARMED() IF CAN_PED_SEE_PLAYER(CourseSecurity[iPedNum].mPed) ADD_PED_FOR_DIALOGUE(sDialogue, 5,CourseSecurity[iPedNum].mPed, "NIGEL1DCONSIERGE") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_WARN", "NIG1D_WARN_2", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) CLEAR_PED_TASKS(CourseSecurity[iPedNum].mPed) TASK_LOOK_AT_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(), 7000) TASK_TURN_PED_TO_FACE_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(),10000) GIVE_WEAPON_TO_PED(CourseSecurity[iPedNum].mPed,WEAPONTYPE_STUNGUN,-1, TRUE) DEBUG_PRINT("Security dialogue: Trevor warned about weapons") bWarned = TRUE iGuardWarnTimer = GET_GAME_TIMER() eCourseSecurity[iPedNum] = CS_PLAYER_WARNED ENDIF ELSE // Player is on phone or involved in a higher priority conversation TASK_LOOK_AT_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(), 7000) ENDIF ELSE // If player isn't armed or in a car and isn't wearing the golf outfit, tell them about the golf outfit ADD_PED_FOR_DIALOGUE(sDialogue, 5,CourseSecurity[iPedNum].mPed, "NIGEL1DCONSIERGE") IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF) IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_WARN", "NIG1D_WARN_3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) CLEAR_PED_TASKS(CourseSecurity[iPedNum].mPed) TASK_LOOK_AT_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(), 7000) TASK_TURN_PED_TO_FACE_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(),2000) DEBUG_PRINT("Security dialogue: Trevor told about golf outfit") eCourseSecurity[iPedNum] = CS_CHAT_TO_PLAYER ELSE // Player is on phone or involved in a higher priority conversation TASK_LOOK_AT_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(), 7000) ENDIF ELSE IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_WARN", "NIG1D_WARN_4", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) CLEAR_PED_TASKS(CourseSecurity[iPedNum].mPed) TASK_LOOK_AT_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(), 7000) TASK_TURN_PED_TO_FACE_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(),2000) DEBUG_PRINT("Security dialogue: Trevor welcomed to club") eCourseSecurity[iPedNum] = CS_CHAT_TO_PLAYER ELSE // Player is on phone or involved in a higher priority conversation TASK_LOOK_AT_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(), 7000) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE CS_PLAYER_WARNED IF (HAS_PLAYER_THREATENED_PED(CourseSecurity[iPedNum].mPed) AND CAN_PED_SEE_PLAYER(CourseSecurity[iPedNum].mPed) ) OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) IF NOT IS_PLAYER_UNARMED() SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED MAKE_PED_FLEE(CourseSecurity[iPedNum].mPed) eCourseSecurity[iPedNum] = CS_FLEE_FROM_PLAYER ELSE SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED TASK_COMBAT_PED(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID()) SET_PED_CAN_BE_TARGETTED(CourseSecurity[iPedNum].mPed,TRUE) eCourseSecurity[iPedNum] = CS_CALL_POLICE ENDIF ELSE IF IS_PED_INSIDE_GOLF_AREA(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF NOT IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()),CelebrityBuggy.mModel) IF (GET_GAME_TIMER() - iGuardWarnTimer) > 15000 // Give player 15 seconds to get out of the vehicle/drive it away SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED TASK_COMBAT_PED(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID()) SET_PED_CAN_BE_TARGETTED(CourseSecurity[iPedNum].mPed,TRUE) eCourseSecurity[iPedNum] = CS_CALL_POLICE ENDIF ENDIF ELSE IF NOT IS_PLAYER_UNARMED() IF (GET_GAME_TIMER() - iGuardWarnTimer) > 7000 // Give player 7 seconds to put weapon away SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED TASK_COMBAT_PED(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID()) SET_PED_CAN_BE_TARGETTED(CourseSecurity[iPedNum].mPed,TRUE) eCourseSecurity[iPedNum] = CS_CALL_POLICE ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE CS_CHAT_TO_PLAYER IF (HAS_PLAYER_THREATENED_PED(CourseSecurity[iPedNum].mPed) AND CAN_PED_SEE_PLAYER(CourseSecurity[iPedNum].mPed) ) OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) IF NOT IS_PLAYER_UNARMED() SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED MAKE_PED_FLEE(CourseSecurity[iPedNum].mPed) eCourseSecurity[iPedNum] = CS_FLEE_FROM_PLAYER ELSE SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED GIVE_WEAPON_TO_PED(CourseSecurity[iPedNum].mPed,WEAPONTYPE_STUNGUN,-1, TRUE) TASK_COMBAT_PED(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID()) SET_PED_CAN_BE_TARGETTED(CourseSecurity[iPedNum].mPed,TRUE) eCourseSecurity[iPedNum] = CS_CALL_POLICE ENDIF ELSE IF IS_PED_INSIDE_GOLF_AREA(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF NOT IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()),CelebrityBuggy.mModel) ADD_PED_FOR_DIALOGUE(sDialogue, 5,CourseSecurity[iPedNum].mPed, "NIGEL1DCONSIERGE") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_WARN", "NIG1D_WARN_1", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) TASK_TURN_PED_TO_FACE_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(),10000) GIVE_WEAPON_TO_PED(CourseSecurity[iPedNum].mPed,WEAPONTYPE_STUNGUN,-1, TRUE) bWarned = TRUE iGuardWarnTimer = GET_GAME_TIMER() eCourseSecurity[iPedNum] = CS_PLAYER_WARNED ENDIF ENDIF ELSE IF NOT IS_PLAYER_UNARMED() IF CAN_PED_SEE_PLAYER(CourseSecurity[iPedNum].mPed) ADD_PED_FOR_DIALOGUE(sDialogue, 5,CourseSecurity[iPedNum].mPed, "NIGEL1DCONSIERGE") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_WARN", "NIG1D_WARN_2", CONV_PRIORITY_MEDIUM,DO_NOT_DISPLAY_SUBTITLES) TASK_TURN_PED_TO_FACE_ENTITY(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID(),10000) GIVE_WEAPON_TO_PED(CourseSecurity[iPedNum].mPed,WEAPONTYPE_STUNGUN,-1, TRUE) bWarned = TRUE iGuardWarnTimer = GET_GAME_TIMER() eCourseSecurity[iPedNum] = CS_PLAYER_WARNED ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() TASK_ACHIEVE_HEADING(CourseSecurity[iPedNum].mPed, CourseSecurity[iPedNum].fStartHeading) ENDIF ENDIF BREAK CASE CS_CALL_POLICE IF (HAS_PLAYER_THREATENED_PED(CourseSecurity[iPedNum].mPed) AND CAN_PED_SEE_PLAYER(CourseSecurity[iPedNum].mPed) ) OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) IF NOT IS_PLAYER_UNARMED() SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED MAKE_PED_FLEE(CourseSecurity[iPedNum].mPed) eCourseSecurity[iPedNum] = CS_FLEE_FROM_PLAYER ELSE SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED GIVE_WEAPON_TO_PED(CourseSecurity[iPedNum].mPed,WEAPONTYPE_STUNGUN,-1, TRUE) TASK_COMBAT_PED(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID()) SET_PED_CAN_BE_TARGETTED(CourseSecurity[iPedNum].mPed,TRUE) eCourseSecurity[iPedNum] = CS_ATTACK_PLAYER ENDIF ENDIF BREAK CASE CS_ATTACK_PLAYER //ATTACKING PLAYER // Once the player has been tased, stop the course security from firing SWITCH eTaseState CASE TS_NOT_TASED IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN) DEBUG_PRINT("Player tased! Calming the tasers down...") iGuardTaserTimer = GET_GAME_TIMER() INT i for i = 0 TO NUM_OF_COURSE_SECURITY - 1 IF IS_ENTITY_ALIVE(CourseSecurity[i].mPed) IF eCourseSecurity[i] = CS_ATTACK_PLAYER CLEAR_PED_TASKS(CourseSecurity[i].mPed) TASK_AIM_GUN_AT_ENTITY(CourseSecurity[i].mPed, PLAYER_PED_ID(), -1, TRUE) ENDIF ENDIF ENDFOR CLEAR_ENTITY_LAST_WEAPON_DAMAGE(PLAYER_PED_ID()) eTaseState = TS_TASED ENDIF BREAK CASE TS_TASED IF (GET_GAME_TIMER() - iGuardTaserTimer) > 7000 DEBUG_PRINT("Tase timer expired, let the tasing begin once more") INT i for i = 0 TO NUM_OF_COURSE_SECURITY - 1 IF IS_ENTITY_ALIVE(CourseSecurity[i].mPed) IF eCourseSecurity[i] = CS_ATTACK_PLAYER CLEAR_PED_TASKS(CourseSecurity[i].mPed) TASK_COMBAT_PED(CourseSecurity[iPedNum].mPed,PLAYER_PED_ID()) //SET_PED_SHOOT_RATE(CourseSecurity[i].mPed, 70) ENDIF ENDIF ENDFOR eTaseState = TS_NOT_TASED ENDIF BREAK ENDSWITCH IF NOT IS_PLAYER_UNARMED() SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1) eWantedState = WS_WAITING_FOR_WANTED MAKE_PED_FLEE(CourseSecurity[iPedNum].mPed) eCourseSecurity[iPedNum] = CS_FLEE_FROM_PLAYER ENDIF BREAK CASE CS_FLEE_FROM_PLAYER //FLEEING FROM PLAYER BREAK ENDSWITCH ELSE SWITCH eCourseSecurity[iPedNum] CASE CS_WAIT_AT_LOCATION IF IS_ENTITY_AT_ENTITY(CelebrityBuggy.mVehicle,CourseSecurity[iPedNum].mPed,<<35.0,35.0,35.0>>) OR HAS_PLAYER_THREATENED_PED(CourseSecurity[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(CourseSecurity[iPedNum].mPed,CelebrityBuggy.mVehicle,-1) eCourseSecurity[iPedNum] = CS_TURN_TO_FACE_BUGGY ENDIF BREAK CASE CS_TURN_TO_FACE_BUGGY IF IS_ENTITY_AT_ENTITY(CelebrityBuggy.mVehicle,CourseSecurity[iPedNum].mPed,<<20.0,20.0,20.0>>) OR HAS_PLAYER_THREATENED_PED(CourseSecurity[iPedNum].mPed) CLEAR_PED_TASKS(CourseSecurity[iPedNum].mPed) TASK_FOLLOW_NAV_MESH_TO_COORD(CourseSecurity[iPedNum].mPed,CourseSecurity[iPedNum].vFleePos,3.0,DEFAULT_TIME_BEFORE_WARP) eCourseSecurity[iPedNum] = CS_AVOID_BUGGY ENDIF BREAK CASE CS_AVOID_BUGGY IF IS_ENTITY_AT_COORD(CourseSecurity[iPedNum].mPed,CourseSecurity[iPedNum].vFleePos,<<2.0,2.0,2.0>>) MAKE_PED_FLEE(CourseSecurity[iPedNum].mPed,TRUE) eCourseSecurity[iPedNum] = CS_FLEE_FROM_PLAYER ENDIF //FLEEING FROM BUGGY BREAK CASE CS_FLEE_FROM_PLAYER //FLEEING FROM PLAYER BREAK ENDSWITCH ENDIF ENDPROC /// PURPOSE: /// Checks if models have loaded for golf course security then creates them. PROC HANDLE_COURSE_SECURITY() INT i IF bCourseSecurityLoaded = FALSE IF HAS_COURSE_SECURITY_LOADED() DEBUG_PRINT("Course security loaded, creating now...") FOR i = 0 TO NUM_OF_COURSE_SECURITY - 1 CreateMissionPed(CourseSecurity[i],FALSE) SET_PED_CAN_BE_TARGETTED(CourseSecurity[i].mPed,TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(CourseSecurity[i].mPed,TRUE) SET_PED_MODEL_IS_SUPPRESSED(CourseSecurity[i].mModel, TRUE) SET_PED_COMBAT_ATTRIBUTES(CourseSecurity[i].mPed, CA_MAINTAIN_MIN_DISTANCE_TO_TARGET, TRUE) SET_PED_COMBAT_ATTRIBUTES(CourseSecurity[i].mPed, CA_USE_COVER, FALSE) SET_PED_COMBAT_ATTRIBUTES(CourseSecurity[i].mPed, CA_SWITCH_TO_ADVANCE_IF_CANT_FIND_COVER, TRUE) SET_PED_COMBAT_ATTRIBUTES(CourseSecurity[i].mPed, CA_DISABLE_SECONDARY_TARGET, TRUE) SET_PED_COMBAT_ATTRIBUTES(CourseSecurity[i].mPed, CA_AGGRESSIVE, TRUE) SET_PED_COMBAT_ATTRIBUTES(CourseSecurity[i].mPed, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE) SET_PED_COMBAT_RANGE(CourseSecurity[i].mPed, CR_NEAR) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(CourseSecurity[i].mPed, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(CourseSecurity[i].mPed,relHatePlayer) ENDFOR SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE,relHatePlayer, RELGROUPHASH_COP) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE,RELGROUPHASH_COP, relHatePlayer) bCourseSecurityLoaded = TRUE ENDIF ELSE FOR i = 0 TO NUM_OF_COURSE_SECURITY - 1 IF IS_ENTITY_ALIVE(CourseSecurity[i].mPed) Monitor_Course_Security(i) ENDIF ENDFOR IF bHelpTextDisplayed = FALSE HELP_TEXT_WARNINGS() ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles the celebrities Friend - Makes him flee etc. PROC HANDLE_CELEB_FRIEND() IF bFriendIsFleeing = FALSE // IF THE FRIEND IS NOT FLEEING, CHECK HIM. IF IS_ENTITY_ALIVE(CelebrityFriend.mPed) IF HAS_PLAYER_THREATENED_PED(CelebrityFriend.mPed) IF IS_ENTITY_ALIVE(CelebrityFriend.mPed) SET_ENTITY_LOAD_COLLISION_FLAG(CelebrityFriend.mPed,TRUE) ENDIF MAKE_PED_FLEE(CelebrityFriend.mPed,TRUE) bFriendIsFleeing = TRUE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks to see if another golfer is close to help if player attacks. /// If a golfer is close to the one being attacked, he will join in the fight. PROC CHECK_IF_HELP_IS_CLOSE() INT i FOR i = 0 TO NUM_OF_AMB_GOLFERS - 1 IF IS_ENTITY_ALIVE(AmbientGolfer[i].mPed) IF AmbientGolfer[i].bImAttacked = FALSE IF IS_ENTITY_AT_COORD(AmbientGolfer[i].mPed,vAttackedPosition,<<20.0,20.0,20.0>>) SET_PED_CAN_BE_TARGETTED(AmbientGolfer[i].mPed,TRUE) TASK_COMBAT_PED(AmbientGolfer[i].mPed,PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(AmbientClubs[i].mObject) IF IS_ENTITY_ATTACHED(AmbientClubs[i].mObject) DETACH_ENTITY(AmbientClubs[i].mObject) ENDIF ENDIF eAmbientState[i] = AS_ALERTED ENDIF ENDIF ENDIF ENDFOR ENDPROC PROC MAKE_GOLFERS_CLOSE_TO_DEAD_PED_REACT(INT iPedNum) IF DOES_ENTITY_EXIST(AmbientGolfer[iPedNum].mPed) int i FOR i = 0 TO NUM_OF_AMB_GOLFERS - 1 IF IS_ENTITY_ALIVE(AmbientGolfer[i].mPed) IF IS_ENTITY_IN_RANGE_ENTITY_DEAD(AmbientGolfer[iPedNum].mPed, AmbientGolfer[i].mPed, 20) IF eAmbientState[i] <> AS_FLEE DEBUG_PRINT_INT("Making this Ambient Golfer flee from dead ped: ", i) MAKE_AMBIENT_GOLF_PED_FLEE(i) ENDIF ENDIF ENDIF ENDFOR ENDIF ENDPROC FUNC BOOL CHECK_AMBIENT_GOLF_DEAD(INT iPedNum) IF DOES_ENTITY_EXIST(AmbientGolfer[iPedNum].mPed) IF IS_ENTITY_DEAD(AmbientGolfer[iPedNum].mPed) IF DOES_ENTITY_EXIST(AmbientClubs[iPedNum].mObject) IF IS_ENTITY_ATTACHED(AmbientClubs[iPedNum].mObject) DETACH_ENTITY(AmbientClubs[iPedNum].mObject) ENDIF ENDIF RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Handles ambient golfers behaviours /// PARAMS: /// iPedNum - The golfer we are checking PROC Monitor_Ambient_Golfers(INT iPedNum) SWITCH eAmbientState[iPedNum] CASE AS_PLAYGOLF IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(AmbientGolfer[iPedNum].mPed),50.0,FALSE) MAKE_AMBIENT_GOLF_PED_FLEE(iPedNum) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_SHOCKED_HIGH", SPEECH_PARAMS_SHOUTED) ENDIF DEBUG_PRINT("AS_PLAYGOLF, bullet in area of ambient golfer (no vehicle); alerted...") MAKE_SECURITY_ALERT() eAmbientState[iPedNum] = AS_ALERTED ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),AmbientGolfer[iPedNum].mPed,<>) IF HAS_PLAYER_THREATENED_PED(AmbientGolfer[iPedNum].mPed) IF NOT IS_PLAYER_UNARMED() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_FRIGHTENED_HIGH", SPEECH_PARAMS_SHOUTED) ENDIF MAKE_AMBIENT_GOLF_PED_FLEE(iPedNum) DEBUG_PRINT("AS_PLAYGOLF, player threatened ambient golfer; attacking...") MAKE_SECURITY_ALERT() eAmbientState[iPedNum] = AS_ALERTED ELSE vAttackedPosition = GET_ENTITY_COORDS(AmbientGolfer[iPedNum].mPed) AmbientGolfer[iPedNum].bImAttacked = TRUE CHECK_IF_HELP_IS_CLOSE() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_FUCK_YOU", SPEECH_PARAMS_SHOUTED) DEBUG_PRINT("Played aggro line from ambient golfer...") ENDIF SET_PED_CAN_BE_TARGETTED(AmbientGolfer[iPedNum].mPed,TRUE) TASK_COMBAT_PED(AmbientGolfer[iPedNum].mPed,PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(AmbientClubs[iPedNum].mObject) IF IS_ENTITY_ATTACHED(AmbientClubs[iPedNum].mObject) DETACH_ENTITY(AmbientClubs[iPedNum].mObject) ENDIF ENDIF eAmbientState[iPedNum] = AS_ALERTED ENDIF ELSE IF CAN_PED_SEE_PLAYER(AmbientGolfer[iPedNum].mPed) IF NOT IS_PLAYER_UNARMED() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_SHOCKED_HIGH", SPEECH_PARAMS_SHOUTED) ENDIF MAKE_AMBIENT_GOLF_PED_FLEE(iPedNum) DEBUG_PRINT("AS_PLAYGOLF, player armed and ambient golfer has LOS; attacking...") MAKE_SECURITY_ALERT() eAmbientState[iPedNum] = AS_ALERTED ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) >= 10.0 IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(),AmbientGolfer[iPedNum].mPed,<>) AND HAS_PED_RECEIVED_EVENT(AmbientGolfer[iPedNum].mPed, EVENT_POTENTIAL_GET_RUN_OVER) OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(AmbientGolfer[iPedNum].mPed) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_CURSE_MED", SPEECH_PARAMS_SHOUTED) ENDIF DEBUG_PRINT_INT("This ambient golfer nearly got run over and is now attacking player: ", iPedNum) SET_PED_CAN_BE_TARGETTED(AmbientGolfer[iPedNum].mPed,TRUE) TASK_COMBAT_PED(AmbientGolfer[iPedNum].mPed,PLAYER_PED_ID()) CHECK_IF_HELP_IS_CLOSE() eAmbientState[iPedNum] = AS_ALERTED ENDIF ELIF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(AmbientGolfer[iPedNum].mPed),50.0) MAKE_PED_FLEE(AmbientGolfer[iPedNum].mPed,TRUE) MAKE_GOLFERS_CLOSE_TO_DEAD_PED_REACT(iPedNum) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_SHOCKED_HIGH", SPEECH_PARAMS_SHOUTED) ENDIF DEBUG_PRINT("AS_PLAYGOLF, bullet in area of ambient golfer (in vehicle); attacking...") MAKE_SECURITY_ALERT() eAmbientState[iPedNum] = AS_ALERTED ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(AmbientGolfer[iPedNum].mPed) OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(AmbientGolfer[iPedNum].mPed, PLAYER_PED_ID(), TRUE) DEBUG_PRINT("Player damaged an ambient golfer with their vehicle (or another vehicle damaged them?)") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_FUCK_YOU", SPEECH_PARAMS_SHOUTED) ENDIF MAKE_GOLFERS_CLOSE_TO_DEAD_PED_REACT(iPedNum) MAKE_AMBIENT_GOLF_PED_FLEE(iPedNum) eAmbientState[iPedNum] = AS_FLEE ENDIF ENDIF BREAK CASE AS_ALERTED IF HAS_PLAYER_THREATENED_PED(AmbientGolfer[iPedNum].mPed) AND NOT IS_PLAYER_UNARMED() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() ADD_PED_FOR_DIALOGUE(sDialogue, 8,AmbientGolfer[iPedNum].mPed, "NIGEL1DAMBIENTGOLFER1") PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_CURSE_MED", SPEECH_PARAMS_SHOUTED) ENDIF DEBUG_PRINT("AS_ALERTED, player threatened ambient golfer and was armed; attacking...") MAKE_SECURITY_ALERT() MAKE_AMBIENT_GOLF_PED_FLEE(iPedNum) eAmbientState[iPedNum] = AS_FLEE ENDIF BREAK CASE AS_FLEE IF NOT IsPedPerformingTask(AmbientGolfer[iPedNum].mPed, SCRIPT_TASK_SMART_FLEE_PED) MAKE_AMBIENT_GOLF_PED_FLEE(iPedNum) ENDIF SAFE_RELEASE_PED(AmbientGolfer[iPedNum].mPed) BREAK CASE AS_DEAD BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Checks to see if Ambient golfer models have loaded /// PARAMS: /// bWaitForLoad - Will wait until they have loaded /// RETURNS: /// True - If models have been loaded, false otherwise FUNC BOOL HAVE_AMBIENT_GOLFERS_LOADED(BOOL bWaitForLoad = FALSE) INT i FOR i = 0 TO NUM_OF_AMB_GOLFERS - 1 REQUEST_MODEL(AmbientGolfer[i].mModel) ENDFOR FOR i = 0 TO NUM_OF_AMB_CLUBS - 1 REQUEST_MODEL(AmbientClubs[i].mModel) ENDFOR IF bWaitForLoad = FALSE FOR i = 0 TO NUM_OF_AMB_GOLFERS - 1 IF NOT HAS_MODEL_LOADED(AmbientGolfer[i].mModel) RETURN FALSE ENDIF ENDFOR FOR i = 0 TO NUM_OF_AMB_CLUBS - 1 IF NOT HAS_MODEL_LOADED(AmbientClubs[i].mModel) RETURN FALSE ENDIF ENDFOR ELSE // wait for everything to load- used in debug skips Bool bEverythingLoaded = FALSE WHILE bEverythingLoaded = FALSE WAIT(0) bEverythingLoaded = TRUE // HAVE ALL PED CONCIEGRES LOADED FOR i = 0 TO NUM_OF_AMB_GOLFERS - 1 IF NOT HAS_MODEL_LOADED(AmbientGolfer[i].mModel) bEverythingLoaded = FALSE ENDIF ENDFOR FOR i = 0 TO NUM_OF_AMB_CLUBS - 1 IF NOT HAS_MODEL_LOADED(AmbientClubs[i].mModel) bEverythingLoaded = FALSE ENDIF ENDFOR ENDWHILE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Checks if ambeint golfer models have been loaded if so creates the golfer PEDS. /// Will then start checking them. PROC HANDLE_AMBIENT_GOLFERS() INT i IF bAmbientGolfersCreated = FALSE IF HAVE_AMBIENT_GOLFERS_LOADED() FOR i = 0 TO NUM_OF_AMB_GOLFERS - 1 CreateMissionPed(AmbientGolfer[i],FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(AmbientGolfer[i].mPed,TRUE) SET_PED_CAN_BE_TARGETTED(AmbientGolfer[i].mPed,TRUE) ENDFOR FOR i = 0 TO NUM_OF_AMB_CLUBS - 1 CreateMissionProp(AmbientClubs[i],FALSE) ATTACH_ENTITY_TO_ENTITY(AmbientClubs[i].mObject,AmbientGolfer[i].mPed,GET_PED_BONE_INDEX(AmbientGolfer[i].mPed,BONETAG_PH_R_HAND),<<0.06,0.04,0.0>>,<<-90,180,0>>) ENDFOR //SPECIAL ATTACH CASES FOR GOLFERS WITH ANIMS ATTACH_ENTITY_TO_ENTITY(AmbientClubs[AMBIENTPED_HOLE4WATCH1].mObject,AmbientGolfer[AMBIENTPED_HOLE4WATCH1].mPed,GET_PED_BONE_INDEX(AmbientGolfer[AMBIENTPED_HOLE4WATCH1].mPed,BONETAG_PH_R_HAND),<<0.0, 0.0, 0.0>>,<<0, 0, 0>>) ATTACH_ENTITY_TO_ENTITY(AmbientClubs[AMBIENTPED_HOLE4WATCH2].mObject,AmbientGolfer[AMBIENTPED_HOLE4WATCH2].mPed,GET_PED_BONE_INDEX(AmbientGolfer[AMBIENTPED_HOLE4WATCH2].mPed,BONETAG_PH_R_HAND),<<0.0, 0.0, 0.0>>,<<0, 0, 0>>) ATTACH_ENTITY_TO_ENTITY(AmbientClubs[AMBIENTPED_NORTHLAKE].mObject,AmbientGolfer[AMBIENTPED_NORTHLAKE].mPed,GET_PED_BONE_INDEX(AmbientGolfer[AMBIENTPED_NORTHLAKE].mPed,BONETAG_PH_R_HAND),<<0.0, 0.0, 0.05>>,<<0, -10, -90>>) ATTACH_ENTITY_TO_ENTITY(AmbientClubs[AMBIENTPED_HOLE4PLAY].mObject,AmbientGolfer[AMBIENTPED_HOLE4PLAY].mPed,GET_PED_BONE_INDEX(AmbientGolfer[AMBIENTPED_HOLE4PLAY].mPed,BONETAG_PH_R_HAND),<<-0.01, 0.0, 0.0>>,<<10, 0, -90>>) FOR i = 0 TO 1 IF IS_PED_UNINJURED(AmbientGolfer[i].mPed) TASK_PLAY_ANIM(AmbientGolfer[i].mPed,"rcmnigel1d",AmbientGolfer[i].mStartAnim,NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_LOOPING) ENDIF ENDFOR FOR i = 2 TO 3 IF IS_PED_UNINJURED(AmbientGolfer[i].mPed) TASK_PLAY_ANIM(AmbientGolfer[i].mPed,"mini@golf",AmbientGolfer[i].mStartAnim,NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_LOOPING) ENDIF ENDFOR bAmbientGolfersCreated = TRUE ENDIF ELSE FOR i = 0 TO NUM_OF_AMB_GOLFERS - 1 IF CHECK_AMBIENT_GOLF_DEAD(i) IF eAmbientState[i] <> AS_DEAD eAmbientState[i] = AS_DEAD DEBUG_PRINT_INT("This Ambient Golfer is now dead: ", i) MAKE_GOLFERS_CLOSE_TO_DEAD_PED_REACT(i) ENDIF ENDIF IF IS_ENTITY_ALIVE(AmbientGolfer[i].mPed) Monitor_Ambient_Golfers(i) ENDIF ENDFOR ENDIF ENDPROC /// PURPOSE: /// Monitors chase golfer peds, handles thier behaviours etc. PROC Monitor_Chase_Golfers(INT iPedNum) SWITCH eChaseGolferState[iPedNum] CASE AS_PLAYGOLF IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) IF IS_ENTITY_AT_ENTITY(CelebrityGolfer.mPed,AmbientChaseGolfer[iPedNum].mPed,<<62.0,62.0,62.0>>) IF IS_PED_UNINJURED(AmbientChaseGolfer[iPedNum].mPed) TASK_TURN_PED_TO_FACE_ENTITY(AmbientChaseGolfer[iPedNum].mPed,CelebrityGolfer.mPed,-1) eChaseGolferState[iPedNum] = AS_ALERTED ENDIF ELIF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(AmbientChaseGolfer[iPedNum].mPed),15.0,TRUE) ADD_PED_FOR_DIALOGUE(sDialogue, 8, AmbientChaseGolfer[iPedNum].mPed , "NIGEL1DAMBIENTGOLFER1") IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), AmbientChaseGolfer[iPedNum].mPed) < 45 // Only play dialogue if the player is close enough to hear it PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_CURSE_MED", SPEECH_PARAMS_SHOUTED) // "What the fuck?" ENDIF MAKE_PED_FLEE(AmbientChaseGolfer[iPedNum].mPed,FALSE) eChaseGolferState[iPedNum] = AS_FLEE ENDIF ELSE IF HAS_PLAYER_THREATENED_PED(AmbientChaseGolfer[iPedNum].mPed) OR IS_ENTITY_AT_ENTITY(CelebrityGolfer.mPed,AmbientChaseGolfer[iPedNum].mPed,<<30.0,30.0,30.0>>) MAKE_PED_FLEE(AmbientChaseGolfer[iPedNum].mPed,FALSE) eChaseGolferState[iPedNum] = AS_FLEE ENDIF ENDIF ENDIF ENDIF BREAK CASE AS_ALERTED IF IS_ENTITY_AT_ENTITY(CelebrityGolfer.mPed,AmbientChaseGolfer[iPedNum].mPed,<<38.0,38.0,38.0>>) IF IS_PED_UNINJURED(AmbientChaseGolfer[iPedNum].mPed) ADD_PED_FOR_DIALOGUE(sDialogue, 8, AmbientChaseGolfer[iPedNum].mPed , "NIGEL1DAMBIENTGOLFER1") IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), AmbientChaseGolfer[iPedNum].mPed) < 45 // Only play dialogue if the player is close enough to hear it PLAY_PED_AMBIENT_SPEECH(AmbientGolfer[iPedNum].mPed, "GENERIC_CURSE_HIGH", SPEECH_PARAMS_SHOUTED) // "You god damn maniac!" ENDIF CLEAR_PED_TASKS_IMMEDIATELY(AmbientChaseGolfer[iPedNum].mPed) TASK_GO_STRAIGHT_TO_COORD(AmbientChaseGolfer[iPedNum].mPed,AmbientChaseGolfer[iPedNum].vFleePos,3.0,-1) SET_PED_KEEP_TASK(AmbientChaseGolfer[iPedNum].mPed, TRUE) eChaseGolferState[iPedNum] = AS_GO_TO_FLEE_POS ENDIF ENDIF BREAK CASE AS_GO_TO_FLEE_POS IF IS_ENTITY_AT_COORD(AmbientChaseGolfer[iPedNum].mPed,AmbientChaseGolfer[iPedNum].vFleePos,<<2.0,2.0,2.0>>) MAKE_PED_FLEE(AmbientChaseGolfer[iPedNum].mPed,FALSE) eChaseGolferState[iPedNum] = AS_FLEE ENDIF BREAK CASE AS_FLEE //FLEEING FROM SOMETHING BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Checks to see if Ambient golfer models have loaded /// PARAMS: /// bWaitForLoad - Will wait until they have loaded /// RETURNS: /// True - If models have been loaded, false otherwise FUNC BOOL HAVE_AMBIENT_CHASE_GOLFERS_LOADED(BOOL bWaitForLoad = FALSE) INT i FOR i = 0 TO NUM_OF_AMB_CHASE_GOLFERS - 1 REQUEST_MODEL(AmbientChaseGolfer[i].mModel) ENDFOR FOR i = 0 TO NUM_OF_AMB_BUGGIES - 1 REQUEST_MODEL(AmbientGolfBuggy[i].mModel) ENDFOR IF bWaitForLoad = FALSE FOR i = 0 TO NUM_OF_AMB_CHASE_GOLFERS - 1 IF NOT HAS_MODEL_LOADED(AmbientChaseGolfer[i].mModel) RETURN FALSE ENDIF ENDFOR FOR i = 0 TO NUM_OF_AMB_BUGGIES - 1 IF NOT HAS_MODEL_LOADED(AmbientGolfBuggy[i].mModel) RETURN FALSE ENDIF ENDFOR ELSE // wait for everything to load- used in debug skips Bool bEverythingLoaded = FALSE WHILE bEverythingLoaded = FALSE WAIT(0) bEverythingLoaded = TRUE // HAVE ALL PED LOADED FOR i = 0 TO NUM_OF_AMB_CHASE_GOLFERS - 1 IF NOT HAS_MODEL_LOADED(AmbientChaseGolfer[i].mModel) bEverythingLoaded = FALSE ENDIF ENDFOR //HAVE BUGGIES LOADED FOR i = 0 TO NUM_OF_AMB_BUGGIES - 1 IF NOT HAS_MODEL_LOADED(AmbientGolfBuggy[i].mModel) bEverythingLoaded = FALSE ENDIF ENDFOR ENDWHILE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Handles golfers that are present during the chase with the celebrity. PROC HANDLE_CHASE_AMBIENT_GOLFERS() INT i IF bAmbientChaseGolfersCreated = FALSE IF HAVE_AMBIENT_CHASE_GOLFERS_LOADED() FOR i = 0 TO NUM_OF_AMB_CHASE_GOLFERS - 1 CreateMissionPed(AmbientChaseGolfer[i],FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(AmbientChaseGolfer[i].mPed,TRUE) SET_PED_CAN_BE_TARGETTED(AmbientChaseGolfer[i].mPed,FALSE) ENDFOR FOR i = 0 TO NUM_OF_AMB_BUGGIES - 1 CreateMissionVehicle(AmbientGolfBuggy[i],FALSE) //KEEP GOLF BUGGY IN MEMORY FOR WHOLE MISSION SET_VEHICLE_MODEL_IS_SUPPRESSED(AmbientGolfBuggy[i].mModel,TRUE) ENDFOR bAmbientChaseGolfersCreated = TRUE ENDIF ELSE FOR i = 0 TO NUM_OF_AMB_CHASE_GOLFERS - 1 IF IS_ENTITY_ALIVE(AmbientChaseGolfer[i].mPed) Monitor_Chase_Golfers(i) ENDIF ENDFOR ENDIF ENDPROC /// PURPOSE: /// Loads celebrity models, makes sure they are loaded. /// PARAMS: /// bWaitForLoad - Makes sure the models are loaded by waiting /// RETURNS: /// True - If models have been loaded, false otherwise FUNC BOOL HAS_CELEBRITY_LOADED(BOOL bWaitForLoad = FALSE) REQUEST_MODEL(CelebrityModel) REQUEST_MODEL(A_M_Y_Golfer_01) REQUEST_MODEL(CelebrityBuggy.mModel) REQUEST_MODEL(CelebFriendClub.mModel) IF bWaitForLoad = FALSE IF NOT HAS_MODEL_LOADED(CelebrityModel) RETURN FALSE ENDIF IF NOT HAS_MODEL_LOADED(A_M_Y_Golfer_01) RETURN FALSE ENDIF IF NOT HAS_MODEL_LOADED(CelebrityBuggy.mModel) RETURN FALSE ENDIF IF NOT HAS_MODEL_LOADED(CelebFriendClub.mModel) RETURN FALSE ENDIF ELSE // wait for everything to load- used in debug skips Bool bEverythingLoaded = FALSE WHILE bEverythingLoaded = FALSE WAIT(0) bEverythingLoaded = TRUE // HAVE ALL PED CONCIEGRES LOADED IF NOT HAS_MODEL_LOADED(CelebrityModel) bEverythingLoaded = FALSE ENDIF IF NOT HAS_MODEL_LOADED(A_M_Y_Golfer_01) bEverythingLoaded = FALSE ENDIF IF NOT HAS_MODEL_LOADED(CelebrityBuggy.mModel) bEverythingLoaded = FALSE ENDIF IF NOT HAS_MODEL_LOADED(CelebFriendClub.mModel) bEverythingLoaded = FALSE ENDIF ENDWHILE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Handles creating the celebrity and pickup on back of golf buggie PROC CREATE_CELEBRITY() WHILE bCelebrityCreated = FALSE IF HAS_CELEBRITY_LOADED() //CREATE GOLFER CreateMissionPed(CelebrityGolfer,FALSE) SET_PED_PROP_INDEX(CelebrityGolfer.mPed, ANCHOR_HEAD, 0) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(CelebrityGolfer.mPed,TRUE) SET_PED_CAN_BE_TARGETTED(CelebrityGolfer.mPed,FALSE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(CelebrityGolfer.mPed,TRUE) SET_ENTITY_LOAD_COLLISION_FLAG(CelebrityGolfer.mPed,TRUE) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(CelebrityGolfer.mPed) //CREATE CELEBRITY Friend CreateMissionPed(CelebrityFriend,FALSE) //CREATE FriendS CLUB CreateMissionProp(CelebFriendClub,FALSE) ATTACH_ENTITY_TO_ENTITY(CelebFriendClub.mObject,CelebrityFriend.mPed,GET_PED_BONE_INDEX(CelebrityFriend.mPed,BONETAG_PH_R_HAND),<<0.0,0.0,0.0>>,<<0,0,0>>) TASK_PLAY_ANIM(CelebrityFriend.mPed,"rcmnigel1d","idle_a",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_LOOPING) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(CelebrityFriend.mPed,TRUE) SET_PED_CAN_BE_TARGETTED(CelebrityFriend.mPed,FALSE) //CREATE GOLF BAG - ATTACH TO BUGGIE IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) golfClubPickup.pos = GET_SAFE_PICKUP_COORDS(GET_ENTITY_COORDS(CelebrityGolfer.mPed)) ENDIF oiGolfBag = CREATE_OBJECT(PROP_GOLF_BAG_01, golfClubPickup.pos) CreateMissionVehicle(CelebrityBuggy,FALSE) IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1D_SCENE") IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) ADD_ENTITY_TO_AUDIO_MIX_GROUP(CelebrityBuggy.mVehicle, "NIGEL_1D_GOLF_CART_A") ENDIF ENDIF SET_VEHICLE_ENGINE_ON(CelebrityBuggy.mVehicle,TRUE,TRUE) SET_ENTITY_HEALTH(CelebrityBuggy.mVehicle,1200) ATTACH_ENTITY_TO_ENTITY(oiGolfBag,CelebrityBuggy.mVehicle,0,<<0.2,-1.3,0.5>>,<<0,0,0>>) SET_VEHICLE_MODEL_IS_SUPPRESSED(CelebrityBuggy.mModel,TRUE) //CREATE GOLF CLUB - ATTACH TO BAG golfClubPickup.objIndex = CREATE_OBJECT(PROP_GOLF_WOOD_01, golfClubPickup.pos) //SET_ENTITY_INVINCIBLE(golfClubPickup.objIndex,TRUE) ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,CelebrityGolfer.mPed,GET_PED_BONE_INDEX(CelebrityGolfer.mPed,BONETAG_PH_R_HAND),<<0.0, 0.0, 0.0>>,<<0, 0, 0>>) //Unload models SET_MODEL_AS_NO_LONGER_NEEDED(CelebrityGolfer.mModel) OPEN_SEQUENCE_TASK(siCelebrity) TASK_ACHIEVE_HEADING(NULL, 112.0) TASK_PLAY_ANIM(NULL,"rcmnigel1d","swing_a_mark",NORMAL_BLEND_IN,REALLY_SLOW_BLEND_OUT,-1,AF_DEFAULT) TASK_PLAY_ANIM(NULL,"rcmnigel1d","swing_b_mark",NORMAL_BLEND_IN,REALLY_SLOW_BLEND_OUT,-1,AF_DEFAULT) SET_SEQUENCE_TO_REPEAT(siCelebrity,REPEAT_FOREVER) CLOSE_SEQUENCE_TASK(siCelebrity) TASK_PERFORM_SEQUENCE(CelebrityGolfer.mPed,siCelebrity) CLEAR_SEQUENCE_TASK(siCelebrity) // Create buggies CreateMissionVehicle(GolfBuggieTransport[BUGGY_BEHINDCELEB],FALSE) CreateMissionVehicle(GolfBuggieTransport[BUGGY_NEXTTOCELEB],FALSE) DEBUG_PRINT("Celeb created!") bCelebrityCreated = TRUE ELSE DEBUG_PRINT("Waiting for celeb assets...") ENDIF WAIT(0) ENDWHILE ENDPROC /// PURPOSE: /// Detaches golf bag from buggy if needed. /// Adds blip to golf club. PROC CREATE_GOLF_PICKUP() IF bDropGolfBag = TRUE IF IS_ENTITY_ALIVE(oiGolfBag) IF IS_ENTITY_ATTACHED(oiGolfBag) DETACH_ENTITY(oiGolfBag) ENDIF ENDIF ADD_PED_FOR_DIALOGUE(sDialogue, 6, CelebrityGolfer.mPed , "FOSTENBURG") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") PLAY_SINGLE_LINE_FROM_CONVERSATION(sDialogue, "NIG1DAU", "NIG1D_HIT", "NIG1D_HIT_11", CONV_PRIORITY_MEDIUM) ENDIF IF DOES_ENTITY_EXIST(CelebrityGolfer.mPed) AND IS_ENTITY_ALIVE(golfClubPickup.objIndex) IF IS_ENTITY_ATTACHED_TO_ENTITY(golfClubPickup.objIndex, CelebrityGolfer.mPed) DETACH_ENTITY(golfClubPickup.objIndex) ENDIF ENDIF SAFE_REMOVE_BLIP(biMissionBlip) IF DOES_ENTITY_EXIST(golfClubPickup.objIndex) biMissionBlip = ADD_BLIP_FOR_ENTITY(golfClubPickup.objIndex) SET_BLIP_COLOUR(biMissionBlip, BLIP_COLOUR_GREEN) ENDIF ENDPROC PROC HANDLE_POLICE_REPORT() IF bDonePoliceReport = FALSE IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_NIGEL_1D_01", 0.0) DEBUG_PRINT("*** Played special Nigel 1D police report ***") bDonePoliceReport = TRUE ENDIF ENDIF ENDPROC /// PURPOSE: initialises mission variables such as bools, ped states, area checks and requests anims PROC InitVariables() PRINTSTRING("init variables ************************") //INIT ARRAYS INIT_ARRAYS() //GOLFER eGolferState = GS_WAIT_FOR_PLAYER eWantedState = WS_NOT_WANTED INT i FOR i = 0 TO NUM_OF_COURSE_SECURITY - 1 eCourseSecurity[i] = CS_GET_IN_POSITION ENDFOR FOR i = 0 TO NUM_OF_SECURITY - 1 eSecurityState[i] = SS_GUARD_AREA ENDFOR //Counters used for conversations iScaredConvoCounter = 0 iChaseConvoCounter = 0 iClubPickupAudioID = GET_SOUND_ID() // Commented out until audio mix makes it into a build IF NOT IS_AUDIO_SCENE_ACTIVE("NIGEL_1D_SCENE") START_AUDIO_SCENE("NIGEL_1D_SCENE") ENDIF IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1D_SCENE") IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) ADD_ENTITY_TO_AUDIO_MIX_GROUP(CelebrityBuggy.mVehicle, "NIGEL_1D_GOLF_CART_A") ENDIF ENDIF //SET BOOLS bDropGolfBag = FALSE bCourseSecurityLoaded = FALSE bAmbientGolfersCreated = FALSE bPlayerApproached = FALSE bSecuritySaidCannotDrive = FALSE bShouldAttackPlayer = FALSE bWarned = FALSE bHelpTextDisplayed = FALSE bFriendIsFleeing = FALSE bWarnedAboutLeaving = FALSE bConversationActive = FALSE bConciergeSceneCreated = FALSE bMainObjectiveDisplayed = FALSE bAmbientChaseGolfersCreated = FALSE bSecurityAttack = FALSE bHasChanged = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR) //TEMP SET PLAYERS CLOTHS TO BE GOLFER - USE THIS TO SET GOLF CLOTHS ON //SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF, FALSE) ADD_RELATIONSHIP_GROUP("SecurityGroup", relHatePlayer) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE,relHatePlayer, RELGROUPHASH_COP) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE,RELGROUPHASH_COP, relHatePlayer) REQUEST_WAYPOINT_RECORDING("NIGEL1DTRANS") REQUEST_WAYPOINT_RECORDING("NIGEL1DGOLF") REQUEST_WAYPOINT_RECORDING("NIGEL1DGOLF2") REQUEST_WAYPOINT_RECORDING("NIGEL1DCRASH") REQUEST_ANIM_DICT("rcmnigel1d") REQUEST_ANIM_DICT("mini@golf") REQUEST_ADDITIONAL_TEXT("NIGEL1D",MISSION_TEXT_SLOT) REQUEST_MODEL(caddy) WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) OR NOT HAS_ANIM_DICT_LOADED("rcmnigel1d") OR NOT HAS_ANIM_DICT_LOADED("mini@golf") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DTRANS") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DGOLF") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DGOLF2") OR NOT GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DCRASH") OR NOT HAS_MODEL_LOADED(caddy) WAIT(0) ENDWHILE //CreateMissionVehicle(GolfBuggieTransport[BUGGY_BEHINDCELEB],FALSE) //CreateMissionVehicle(GolfBuggieTransport[BUGGY_NEXTTOCELEB],FALSE) SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(TRAFFIC_MULTIPLIER) SET_PLAYER_CONTROL(PLAYER_ID(),TRUE,SPC_LEAVE_CAMERA_CONTROL_ON) sbiGolfer = ADD_SCENARIO_BLOCKING_AREA(<<-1122.2018, 48.5724, 51.4652>>, <<-1076.2333, 92.1041, 60.0617>>) SET_PED_NON_CREATION_AREA(<< -1073.19, 342.05, 63.328316 >>, << -966.24, 411.05, 84.820435 >>) sbiConc = ADD_SCENARIO_BLOCKING_AREA(<<-1379.33, 45.13, 50.68>>, <<-1368.01, 69.83, 55.90>>) IF iNavBlocker = -1 iNavBlocker = ADD_NAVMESH_BLOCKING_OBJECT(<<-1375.08, 55.55, 52.93>>, <<4, 6, 4>>, 355) ENDIF ADD_CONTACT_TO_PHONEBOOK(CHAR_NIGEL,TREVOR_BOOK, FALSE) // Temp: Fix for B*545798 IF IS_PHONE_ONSCREEN() HANG_UP_AND_PUT_AWAY_PHONE() ENDIF OPEN_TEST_POLY(tpGolfCourse) ADD_TEST_POLY_VERT(tpGolfCourse, << -1313.7141, -27.2202, 48.0314 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1294.0658, -27.0136, 47.5724 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1069.8435, -143.7690, 39.7493 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -925.2529, -89.9079, 38.3457 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1010.9485, 40.0643, 49.9277 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1122.8375, 233.7037, 64.7587 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1282.5781, 188.8798, 59.2769 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1328.1532, 192.0178, 57.8136 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1386.75, 167.32, 57.11 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1411.50, 109.64, 51.49 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1399.63, -10.83, 51.93 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1359.54, 18.93, 52.52 >>) ADD_TEST_POLY_VERT(tpGolfCourse, << -1342.27, 16.92, 52.16 >>) CLOSE_TEST_POLY(tpGolfCourse) COPY_EXPANDED_POLY(tpGolfCourseExpanded, tpGolfCourse, 100) OPEN_TEST_POLY(tpLeftSideOfCourse) ADD_TEST_POLY_VERT(tpLeftSideOfCourse, << -1100.1997, 77.1233, 53.2703 >>) ADD_TEST_POLY_VERT(tpLeftSideOfCourse, << -1040.6903, 97.3963, 51.9067 >>) ADD_TEST_POLY_VERT(tpLeftSideOfCourse, << -977.9333, -5.5166, 45.6548 >>) ADD_TEST_POLY_VERT(tpLeftSideOfCourse, << -1039.6870, -35.8720, 45.4867 >>) ADD_TEST_POLY_VERT(tpLeftSideOfCourse, << -1062.1901, -2.8635, 49.6013 >>) CLOSE_TEST_POLY(tpLeftSideOfCourse) bFinishedSkipping = TRUE // other requests here #IF IS_DEBUG_BUILD // stage skipping mSkipMenu[0].sTxtLabel = "MS_GO_TO_THE_GOLF_CLUB" mSkipMenu[1].sTxtLabel = "MS_GO_TO_CELEBRITY" mSkipMenu[2].sTxtLabel = "MS_GET_THE_CLUB" mSkipMenu[3].sTxtLabel = "MS_CHASE_THE_GOLFER" mSkipMenu[4].sTxtLabel = "MS_CHASE_IN_CITY" mSkipMenu[5].sTxtLabel = "MS_COLLECT_GOLF_CLUB" mSkipMenu[6].sTxtLabel = "MS_END_PHONECALL" mSkipMenu[7].sTxtLabel = "*** Debug: Swap between default and golf outfit" #ENDIF ENDPROC /// PURPOSE: /// Deletes everything regardless PROC DELETE_EVERYTHING() // DELETE PEDS SAFE_DELETE_PED(CelebrityGolfer.mPed) SAFE_DELETE_PED(CelebrityFriend.mPed) INT i FOR i = 0 to NUM_OF_CONC_PEDS - 1 SAFE_DELETE_PED(ConciergePed[i].mPed) ENDFOR FOR i = 0 to NUM_OF_AMB_GOLFERS - 1 SAFE_DELETE_PED(AmbientGolfer[i].mPed) ENDFOR FOR i = 0 to NUM_OF_AMB_CHASE_GOLFERS - 1 SAFE_DELETE_PED(AmbientChaseGolfer[i].mPed) ENDFOR FOR i = 0 to NUM_OF_SECURITY - 1 SAFE_DELETE_PED(CelebSecurity[i].mPed) ENDFOR FOR i = 0 to NUM_OF_COURSE_SECURITY - 1 SAFE_DELETE_PED(CourseSecurity[i].mPed) ENDFOR // DELETE VEHICLES FOR i = 0 to NUM_OF_TRANS_BUGGIES - 1 SAFE_DELETE_VEHICLE(GolfBuggieTransport[i].mVehicle) ENDFOR FOR i = 0 to NUM_OF_AMB_BUGGIES - 1 SAFE_DELETE_VEHICLE(AmbientGolfBuggy[i].mVehicle) ENDFOR SAFE_DELETE_VEHICLE(CelebrityBuggy.mVehicle) //DELETE PROPS SAFE_DELETE_OBJECT(golfClubPickup.objIndex) SAFE_DELETE_OBJECT(oiGolfBag) SAFE_DELETE_OBJECT(CelebFriendClub.mObject) FOR i = 0 to NUM_OF_AMB_CLUBS - 1 SAFE_DELETE_OBJECT(AmbientClubs[i].mObject) ENDFOR IF DOES_PICKUP_EXIST(golfClubPickup.index) REMOVE_PICKUP(golfClubPickup.index) ENDIF //REMOVE BLIPS // Main mission blip SAFE_REMOVE_BLIP(biMissionBlip) //Security Blips FOR i = 0 TO NUM_OF_SECURITY - 1 SAFE_REMOVE_BLIP(CelebSecurity[i].mBlip) ENDFOR REMOVE_RELATIONSHIP_GROUP(relHatePlayer) RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR, bHasChanged) ENDPROC /// PURPOSE: Deletes all entities and unloads everything PROC ResetMission() CLEAR_PRINTS() DELETE_EVERYTHING() //Set player wanted level to 0 SET_PLAYER_WANTED_LEVEL(PLAYER_ID(),0) eWantedState = WS_NOT_WANTED UnloadEverything() //REMOVE WAYPOINT RECORDINGS IF GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DTRANS") REMOVE_WAYPOINT_RECORDING("NIGEL1DTRANS") ENDIF IF GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DGOLF") REMOVE_WAYPOINT_RECORDING("NIGEL1DGOLF") ENDIF IF GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DGOLF2") REMOVE_WAYPOINT_RECORDING("NIGEL1DGOLF2") ENDIF IF GET_IS_WAYPOINT_RECORDING_LOADED("NIGEL1DCRASH") REMOVE_WAYPOINT_RECORDING("NIGEL1DCRASH") ENDIF bCelebrityCreated = FALSE bSecurityCreated = FALSE InitVariables() // put peds etc in start positions IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(),<< -1330.1176, -72.3159, 48.1812 >>) SET_ENTITY_HEADING(PLAYER_PED_ID(),326.0) ENDIF SetStage(MS_GO_TO_THE_GOLF_CLUB) ENDPROC /// PURPOSE: /// Z-menu debug option to quickly swap between the Golf outfit and normal clothes if desired PROC SWAP_OUTFIT() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF) SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE) ACTIVATE_OUTFIT_CHANGE(TRUE) ELSE SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF, FALSE) DEACTIVATE_OUTFIT_CHANGE() //SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR) ENDIF ENDIF ENDPROC /// PURPOSE: Skips the current stage PROC SkipStage() // stop player and buddy from doing whatever they were doing before skip IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) ENDIF IF IS_SCRIPTED_CONVERSATION_ONGOING() KILL_ANY_CONVERSATION() ENDIF SWITCH eMissionStage CASE MS_INTRO_PHONECALL DEBUG_PRINT("In INTRO_PHONECALL stage skip") IF eSubStage = SS_UPDATE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() KILL_PHONE_CONVERSATION() ENDIF bConversationActive = TRUE eSubStage = SS_CLEANUP ENDIF BREAK CASE MS_GO_TO_THE_GOLF_CLUB DEBUG_PRINT("In GO_TO_THE_GOLF_CLUB stage skip") IF HAS_CONCIERGE_SCENE_LOADED(TRUE) AND HAS_SECURITY_LOADED(TRUE) AND HAS_COURSE_SECURITY_LOADED(TRUE) IF NOT IS_REPLAY_BEING_SET_UP() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1291.5958, -12.9214, 48.5137>>) SET_ENTITY_HEADING(PLAYER_PED_ID(),303.114) ENDIF ENDIF ENDIF BREAK CASE MS_GO_TO_CELEBRITY DEBUG_PRINT("Skipping MS_GO_TO_CELBRITY...") bPlayerReturned = FALSE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ENDIF IF NOT IS_REPLAY_BEING_SET_UP() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(),<< -1190.22, 36.83, 52.03 >>) SET_ENTITY_HEADING(PLAYER_PED_ID(),299.0) ENDIF ENDIF // IF IS_REPLAY_IN_PROGRESS() // IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() // //AND IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT() // REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL() // WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED() // WAIT(0) // ENDWHILE // IF NOT IS_VEHICLE_OK(ReplayVehicle.mVehicle) // CREATE_VEHICLE_FOR_REPLAY(ReplayVehicle.mVehicle, ReplayVehicle.vStartPos, ReplayVehicle.fStartHeading, true, FALSE, FALSE, true, TRUE, CADDY) // DEBUG_PRINT("Creating replay vehicle for replay") // ENDIF // IF NOT IS_REPLAY_BEING_SET_UP() // SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), ReplayVehicle.mVehicle) // SET_VEHICLE_ON_GROUND_PROPERLY(ReplayVehicle.mVehicle) // ENDIF // ELSE // IF NOT IS_VEHICLE_OK(ReplayVehicle.mVehicle) // // Create the default Caddy replay vehicle // ReplayVehicle.mVehicle = CREATE_VEHICLE(ReplayVehicle.mModel, ReplayVehicle.vStartPos, ReplayVehicle.fStartHeading) // DEBUG_PRINT("Creating buggy for replay") // IF NOT IS_REPLAY_BEING_SET_UP() // SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), ReplayVehicle.mVehicle) // SET_VEHICLE_ON_GROUND_PROPERLY(ReplayVehicle.mVehicle) // ENDIF // ELSE // IF NOT IS_REPLAY_BEING_SET_UP() // SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), ReplayVehicle.mVehicle) // SET_VEHICLE_ON_GROUND_PROPERLY(ReplayVehicle.mVehicle) // DEBUG_PRINT("Setting ped into replay buggy") // ENDIF // ENDIF // ENDIF // ENDIF BREAK CASE MS_GET_THE_CLUB DEBUG_PRINT("In GO_TO_CELBRITY stage skip") IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ENDIF IF NOT IS_REPLAY_BEING_SET_UP() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(),<< -1102.4547, 73.6150, 53.2039 >>) SET_ENTITY_HEADING(PLAYER_PED_ID(),238.0) ENDIF IF IS_PED_UNINJURED(CelebrityGolfer.mPed) IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) SET_PED_INTO_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle,VS_DRIVER) ENDIF ENDIF ENDIF ENDIF BREAK CASE MS_CHASE_THE_GOLFER DEBUG_PRINT("Skipping MS_CHASE_THE_GOLFER...") //CELEB VEHICLE IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) //STOP VEHICLE RECORDING IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(CelebrityBuggy.mVehicle) VEHICLE_WAYPOINT_PLAYBACK_PAUSE(CelebrityBuggy.mVehicle) ENDIF SET_ENTITY_COORDS(CelebrityBuggy.mVehicle,<< -1246.9563, -89.9753, 42.9040 >>) SET_ENTITY_HEADING(CelebrityBuggy.mVehicle,238.0) IF IS_PED_UNINJURED(CelebrityGolfer.mPed) IF NOT IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) SET_PED_INTO_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle,VS_DRIVER) ENDIF ENDIF ENDIF //PLAYER VEHICLE IF NOT IS_REPLAY_BEING_SET_UP() IF IS_VEHICLE_OK(GolfBuggieTransport[4].mVehicle) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(),GolfBuggieTransport[4].mVehicle) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(),GolfBuggieTransport[4].mVehicle,VS_DRIVER) ENDIF ENDIF SET_ENTITY_COORDS(GolfBuggieTransport[4].mVehicle,<< -1273.7362, -75.3014, 44.6289 >>) SET_ENTITY_HEADING(GolfBuggieTransport[4].mVehicle,242.0) ELSE DEBUG_PRINT("Skip buggy isn't okay, probably going to fail") ENDIF ENDIF bClubCollectedByPlayer = FALSE // If we're skipping, ensure we don't assume the club has been collected eSubStage = SS_CLEANUP BREAK CASE MS_CHASE_IN_CITY DEBUG_PRINT("Skipping MS_CHASE_IN_CITY...") IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) SET_ENTITY_HEALTH(CelebrityBuggy.mVehicle,450) DEBUG_PRINT("SKIPPED CITY CHASE SETTING HEALTH TO 450 ") ENDIF IF IS_ENTITY_ALIVE(oiGolfBag) IF IS_ENTITY_ATTACHED(oiGolfBag) DETACH_ENTITY(oiGolfBag) ENDIF ENDIF SAFE_DELETE_PED(CelebrityGolfer.mPed) bCelebrityCreated = FALSE bClubCollectedByPlayer = FALSE // If we're skipping, ensure we don't assume the club has been collected SAFE_DELETE_VEHICLE(CelebrityBuggy.mVehicle) WAIT(2000) // Give the game time for the bag and Trevor to hit the ground after being detached eSubStage = SS_CLEANUP BREAK CASE MS_COLLECT_GOLF_CLUB DEBUG_PRINT("Skipping MS_COLLECT_GOLF_CLUB...") IF NOT IS_REPLAY_BEING_SET_UP() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(),GET_ENTITY_COORDS(oiGolfBag)+<<0,1.5,0>>) ENDIF ENDIF bClubCollectedByPlayer = TRUE eSubStage = SS_CLEANUP BREAK CASE MS_END_PHONECALL IF eSubStage = SS_UPDATE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() KILL_PHONE_CONVERSATION() ENDIF bConversationActive = TRUE eSubStage = SS_CLEANUP ENDIF BREAK //OPTIONAL STAGES CASE MS_LOSE_SECURITY INT i FOR i = 0 TO NUM_OF_SECURITY - 1 IF IS_ENTITY_ALIVE(CelebSecurity[i].mPed) SET_ENTITY_HEALTH(CelebSecurity[i].mPed,0) ENDIF ENDFOR BREAK CASE MS_LOSE_THE_COPS IF IS_PLAYER_PLAYING(PLAYER_ID()) CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: Jumps to the stage selected PROC JumpToStage(MISSION_STAGE eNewStage) if eMissionStage = eNewStage // skip current stage bFinishedSkipping = TRUE IF eMissionStage = MS_GET_THE_CLUB // Print the goal text when skipping to this stage, so it comes up in the replay PRINT_NOW("N1D_TAKE",DEFAULT_GOD_TEXT_TIME,5) // Steal the ~g~golf club. ENDIF IF IS_REPLAY_BEING_SET_UP() IF GET_REPLAY_MID_MISSION_STAGE() = CP_LOCATED_STANKY END_REPLAY_SETUP(ReplayVehicle.mVehicle) ELSE END_REPLAY_SETUP() ENDIF ENDIF RC_END_Z_SKIP() ELSE DEBUG_PRINT("Still skipping...") SkipStage() ENDIF ENDPROC #IF IS_DEBUG_BUILD /// PURPOSE: Goes back to the previous stage PROC PreviousStage() int iNewStage SWITCH eMissionStage CASE MS_CHASE_IN_CITY iNewStage = ENUM_TO_INT(MS_CHASE_THE_GOLFER) BREAK CASE MS_LOSE_SECURITY iNewStage = ENUM_TO_INT(MS_COLLECT_GOLF_CLUB) BREAK CASE MS_LOSE_THE_COPS iNewStage = ENUM_TO_INT(MS_COLLECT_GOLF_CLUB) BREAK CASE MS_END_PHONECALL iNewStage = ENUM_TO_INT(MS_COLLECT_GOLF_CLUB) BREAK // !! all other cases just go to the previous state in the list DEFAULT iNewStage = ENUM_TO_INT(eMissionStage)-1 BREAK ENDSWITCH if iNewStage >-1 //we can skip to a previous stage eTargetStage = INT_TO_ENUM(MISSION_STAGE, iNewStage) RC_START_Z_SKIP() ResetMission() bFinishedSkipping = FALSE JumpToStage(eTargetStage) ENDIF ENDPROC #ENDIF /// PURPOSE: /// Starts a Z skip /// PARAMS: /// iTargetStage - PROC Do_Z_Skip(INT iTargetStage, BOOL bResetMission = FALSE) RC_START_Z_SKIP() IF bResetMission = TRUE ResetMission() ENDIF eTargetStage = INT_TO_ENUM(MISSION_STAGE, iTargetStage) IF eTargetStage = MS_GET_THE_CLUB DEBUG_PRINT("We are trying to skip to Get The Club...") ELIF eTargetStage = MS_GO_TO_THE_GOLF_CLUB DEBUG_PRINT("We are trying to skip to Go to Golf Club...") ENDIF bFinishedSkipping = FALSE JumpToStage(eTargetStage) ENDPROC // =========================================================================================================== // DEBUG FUNCTIONS // =========================================================================================================== #IF IS_DEBUG_BUILD /// PURPOSE: Check for Forced Pass or Fail PROC DEBUG_Check_Debug_Keys() int iNewStage IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) // Check for Pass WAIT_FOR_CUTSCENE_TO_STOP() Script_Passed() ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) // Check for Fail WAIT_FOR_CUTSCENE_TO_STOP() SET_FAIL_REASON(FAIL_DEFAULT) ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) // Check for Skip forward SkipStage() ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) // Check for Skip backwards PreviousStage() ENDIF if LAUNCH_MISSION_STAGE_MENU(mSkipMenu, iNewStage) // Check for jumping to stage IF iNewStage = 7 SWAP_OUTFIT() ELSE Do_Z_Skip(iNewStage+1, TRUE) ENDIF ENDIF ENDPROC #ENDIF // -------------------------------------------------------------- // STAGE FUNCTIONS // -------------------------------------------------------------- /// PURPOSE: /// Main mission function for the intro phonecall stage PROC INTRO_PHONECALL() SWITCH eSubStage CASE SS_SETUP DEBUG_PRINT("ENTERING PHONE CALL 3 ") ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") ADD_PED_FOR_DIALOGUE(sDialogue, 3, NULL, "NIGEL") ADD_PED_FOR_DIALOGUE(sDialogue, 4, NULL, "MRSTHORNHILL") IF bFinishedSkipping = TRUE //backup screen fade in NEEDED for mission replay SAFE_FADE_SCREEN_IN_FROM_BLACK() ENDIF SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) bConversationActive = FALSE eSubStage = SS_UPDATE BREAK CASE SS_UPDATE IF NOT bConversationActive IF PLAYER_CALL_CHAR_CELLPHONE(sDialogue, CHAR_NIGEL, "NIG1DAU", "NIG1D_INTRO", CONV_PRIORITY_VERY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(2.0, 8.0, REPLAY_IMPORTANCE_LOW) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) bConversationActive = TRUE ENDIF ELSE IF bCelebrityCreated = FALSE //CREATE CELEBRITY BEFORE PROGRESSING CREATE_CELEBRITY() ELSE //HANDLE_COURSE_SECURITY() HANDLE_CONCIERGE_SCENE() HANDLE_CELEB_SECURITY() Monitor_Celebrity() HANDLE_AMBIENT_GOLFERS() HANDLE_CELEB_FRIEND() // CHECK_FOR_DRIVING_IN_COURSE() // Check for this now in case the player drives onto the course during the intro call ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF HAS_CELLPHONE_CALL_FINISHED() IF HAS_CELLPHONE_JUST_BEEN_FORCED_AWAY() AND bSecurityAttack = FALSE // If the phone has been forced away because the player has rushed to the celeb and they're being attacked by his security, we'll just skip it bConversationActive = FALSE ELSE eSubStage = SS_CLEANUP ENDIF ENDIF ENDIF ENDIF BREAK CASE SS_CLEANUP IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() KILL_PHONE_CONVERSATION() ENDIF REMOVE_PED_FOR_DIALOGUE(sDialogue, 3) //Nigel REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) //Mrs Thornton bConversationActive = FALSE IF IS_PED_INSIDE_GOLF_AREA(PLAYER_PED_ID()) // If the player has reached the club by the time the phone call ends, skip to "find the celeb" IF bCelebrityCreated = FALSE //CREATE CELEBRITY BEFORE PROGRESSING CREATE_CELEBRITY() ELSE SetStage(MS_GO_TO_CELEBRITY) ENDIF ELSE SetStage(MS_GO_TO_THE_GOLF_CLUB) ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Deals with approaching the front of the club house PROC GO_TO_THE_GOLF_CLUB() SWITCH eSubStage CASE SS_SETUP DEBUG_PRINT("ENTERING GO TO GOLF CLUB ") IF bMainObjectiveDisplayed = FALSE //PRINT_NOW("N1D_CLUB",DEFAULT_GOD_TEXT_TIME,5) // Go to the golf club ~y~entrance. // PRINT_NOW("N1D_TAKE",DEFAULT_GOD_TEXT_TIME,5) // Steal the ~g~golf club. bMainObjectiveDisplayed = TRUE ENDIF SAFE_REMOVE_BLIP(biMissionBlip) IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) biMissionBlip = CREATE_PED_BLIP(CelebrityGolfer.mPed,TRUE,FALSE,BLIPPRIORITY_MED) ELSE DEBUG_PRINT("Glen was not alive when trying to create the blip in GO_TO_THE_GOLF_CLUB() init") CREATE_CELEBRITY() biMissionBlip = CREATE_PED_BLIP(CelebrityGolfer.mPed,TRUE,FALSE,BLIPPRIORITY_MED) ENDIF ACTIVATE_OUTFIT_CHANGE() DEBUG_PRINT("ENTERING GO TO GOLF CLUB LOOP ") // If repeat play is active and we're not skipping anymore, fade in IF IS_REPEAT_PLAY_ACTIVE() AND bFinishedSkipping RC_END_Z_SKIP() ENDIF SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) eSubStage = SS_UPDATE BREAK CASE SS_UPDATE IF bCelebrityCreated = FALSE //CREATE CELEBRITY BEFORE PROGRESSING DEBUG_PRINT("Glen created in GO_TO_THE_GOLF_CLUB() SS_UPDATE") CREATE_CELEBRITY() ELSE HANDLE_ABANDONMENT() HANDLE_AMBIENT_GOLFERS() HANDLE_CELEB_FRIEND() HANDLE_CONCIERGE_SCENE() HANDLE_CELEB_SECURITY() //HANDLE_COURSE_SECURITY() Monitor_Celebrity() HANDLE_OUTFIT_CHANGE() IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF IS_PED_INSIDE_GOLF_AREA(PLAYER_PED_ID()) // HAS PLAYER MADE IT INTO GOLF COURSE AREA eSubStage = SS_CLEANUP ENDIF ELSE eSubStage = SS_CLEANUP ENDIF ENDIF BREAK CASE SS_CLEANUP IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) SetStage(MS_GO_TO_CELEBRITY) //GO TO THE CELEBRITY ELSE bMainObjectiveDisplayed = FALSE SetStage(MS_COLLECT_GOLF_CLUB) //SKIP TO THIS STAGE IF PLAYER KILLED CELEBRITY ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Handles getting into the golf buggie after PED has spoken. PROC GO_TO_CELEBRITY() SWITCH eSubStage CASE SS_SETUP REPLAY_RECORD_BACK_FOR_TIME(2.0, 8.0, REPLAY_IMPORTANCE_LOW) DEBUG_PRINT("ENTERING GO TO CELEBRITY ") IF bMainObjectiveDisplayed = FALSE PRINT_NOW("N1D_TAKE",DEFAULT_GOD_TEXT_TIME,5) // Steal the golf club bMainObjectiveDisplayed = TRUE ENDIF SAFE_REMOVE_BLIP(biMissionBlip) IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) biMissionBlip = CREATE_PED_BLIP(CelebrityGolfer.mPed,TRUE,FALSE,BLIPPRIORITY_MED) ELSE SCRIPT_ASSERT("CelebrityGolfer.mPed not alive in GO_TO_CELEBRITY() setup?") ENDIF eSubStage = SS_UPDATE SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) BREAK CASE SS_UPDATE SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID()) HANDLE_ABANDONMENT() HANDLE_CELEB_FRIEND() //HANDLE_COURSE_SECURITY() HANDLE_CONCIERGE_SCENE() HANDLE_AMBIENT_GOLFERS() HANDLE_CELEB_SECURITY() Monitor_Celebrity() HANDLE_OUTFIT_CHANGE() // CHECK_FOR_DRIVING_IN_COURSE() IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), CelebrityGolfer.mPed, 50) OR eGolferState = GS_GET_INTO_VEHICLE // IS CELEBRITY INSIDE GOLF BUGGY eSubStage = SS_CLEANUP ELIF IS_REPLAY_BEING_SET_UP() eSubStage = SS_CLEANUP ELIF bFinishedSkipping = FALSE IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), CelebrityGolfer.mPed, 150) eSubStage = SS_CLEANUP ENDIF ENDIF ELSE eSubStage = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP bConversationActive = FALSE IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_LOCATED_STANKY, "MS_GET_THE_CLUB", TRUE) // LOCATED CELEBRITY, SET CHECKPOINT ELSE // If the player isn't in a vehicle now, don't store one SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_LOCATED_STANKY, "MS_GET_THE_CLUB", TRUE, DEFAULT, NULL, FALSE) ENDIF IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) SetStage(MS_GET_THE_CLUB) // GET THE GOLF CLUB ELSE DETACH_ENTITY(golfClubPickup.objIndex) bMainObjectiveDisplayed = FALSE SetStage(MS_COLLECT_GOLF_CLUB) // IF CELEBRITY IS DEAD SKIP TO THIS STAGE ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Handles the journey to the golf player PROC GET_THE_CLUB() SWITCH eSubStage CASE SS_SETUP DEBUG_PRINT("ENTERING GET THE CLUB 1 ") IF bMainObjectiveDisplayed = FALSE PRINT_NOW("N1D_TAKE",DEFAULT_GOD_TEXT_TIME,5) // Steal the ~g~golf club. bMainObjectiveDisplayed = TRUE ENDIF SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING) SAFE_REMOVE_BLIP(biMissionBlip) biMissionBlip = CREATE_PED_BLIP(CelebrityGolfer.mPed,TRUE,FALSE,BLIPPRIORITY_MED) eSubStage = SS_UPDATE BREAK CASE SS_UPDATE //DISPLAY_POLY2(tpLeftSideOfCourse)//DRAW THIS FOR DEBUG PURPOSES HANDLE_ABANDONMENT() HANDLE_CELEB_FRIEND() HANDLE_AMBIENT_GOLFERS() HANDLE_CELEB_SECURITY() HANDLE_CONCIERGE_SCENE() Monitor_Celebrity() HANDLE_OUTFIT_CHANGE() CHECK_STATS_GOALS() HANDLE_POLICE_REPORT() // CHECK_FOR_DRIVING_IN_COURSE() SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID()) IF NOT IS_ENTITY_ALIVE(golfClubPickup.objIndex) CLEAR_PRINTS() IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ENDIF bConversationActive = FALSE SAFE_REMOVE_BLIP(biMissionBlip) SET_FAIL_REASON(FAIL_CLUB_DESTROYED) //PLAYER DESTROYED THE CLUB ENDIF // If we're still cycling through the stages for shitskipping, then just pass over this IF IS_REPLAY_BEING_SET_UP() eSubStage = SS_CLEANUP ENDIF IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF IS_PED_FLEEING(CelebrityGolfer.mPed) bFostenburgFleeCheck = TRUE ENDIF IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_PED_IN_VEHICLE(CelebrityGolfer.mPed,CelebrityBuggy.mVehicle) ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,oiGolfBag,0,<<0.10,0.0,-0.25>>,<<-5,155,0>>) // REMOVE GOLF CLUB FROM HAND AND ATTACH TO GOLF BAG ON BUGGY eSubStage = SS_CLEANUP ENDIF ELSE //IF BUGGY IS DESTROYED, DETACH THE GOLF BAG IF IS_ENTITY_ALIVE(oiGolfBag) IF IS_ENTITY_ATTACHED(oiGolfBag) DETACH_ENTITY(oiGolfBag) ENDIF ENDIF ENDIF ELSE eSubStage = SS_CLEANUP ENDIF IF bFostenburgFleeCheck = TRUE IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF IS_PED_RAGDOLL(CelebrityGolfer.mPed) IF IS_ENTITY_ATTACHED(golfClubPickup.objIndex) DETACH_ENTITY(golfClubPickup.objIndex) eSubStage = SS_CLEANUP ENDIF ENDIF ENDIF ENDIF BREAK CASE SS_CLEANUP CLEAR_PRINTS() IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) AND NOT bFostenburgFleeCheck SetStage(MS_CHASE_THE_GOLFER) // CHASE THE CELEBRITY ELSE bMainObjectiveDisplayed = FALSE SetStage(MS_COLLECT_GOLF_CLUB) //IF CELEBRITY IS DEAD COLLECT CLUB ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Handles the player chasing the golf player PROC CHASE_THE_GOLFER() SWITCH eSubStage CASE SS_SETUP DEBUG_PRINT("CHASE THE GOLFER ") iHitDialogueTimer = GET_GAME_TIMER() //USED FOR SINGLE HIT BUGGY DIALOGUE FROM GOLFER iScaredDialogueTimer = GET_GAME_TIMER() //USED FOR SINGLE SCARED LINES OF DIALOGUE iChaseDialogueTimer = GET_GAME_TIMER() //biMissionBlip = CREATE_VEHICLE_BLIP(CelebrityBuggy.mVehicle,FALSE,BLIPPRIORITY_MED) SET_BLIP_SCALE(biMissionBlip,1.0) SAFE_RELEASE_VEHICLE(GolfBuggieTransport[BUGGY_PATH2].mVehicle) // Releasing this vehicle as it's slightly in the way of Glen's path out of the course // Ensure the golf bag and the pickup are both attached to the buggy, in case we've skipped and this hasn't been done properly IF IS_ENTITY_ALIVE(oiGolfBag) AND IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF NOT IS_ENTITY_ATTACHED(oiGolfBag) DEBUG_PRINT("Reattaching bag to buggy!?") ATTACH_ENTITY_TO_ENTITY(oiGolfBag,CelebrityBuggy.mVehicle,0,<<0.2,-1.3,0.5>>,<<0,0,0>>) ENDIF ENDIF IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) AND IS_ENTITY_ALIVE(CelebrityGolfer.mPed) AND IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF NOT IS_ENTITY_ATTACHED(golfClubPickup.objIndex) DEBUG_PRINT("Reattaching club to bag!?") ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,oiGolfBag,0,<<0.10,0.0,-0.25>>,<<-5,155,0>>) ELIF IS_ENTITY_ATTACHED_TO_ENTITY(golfClubPickup.objIndex, CelebrityGolfer.mPed) DEBUG_PRINT("Glen still holding club, reattach to bag") DETACH_ENTITY(golfClubPickup.objIndex) ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,oiGolfBag,0,<<0.10,0.0,-0.25>>,<<-5,155,0>>) ENDIF ENDIF iBuggieStuckCounter = 0 // Reset for the chase DEACTIVATE_OUTFIT_CHANGE() // The mission can't be affected by the outfit change now, so disable it SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING) eSubStage = SS_UPDATE BREAK CASE SS_UPDATE HANDLE_CELEB_FRIEND() Monitor_Celebrity() HANDLE_CELEB_SECURITY() //HANDLE_COURSE_SECURITY() DISTANCE_FAIL_CHECKS() HANDLE_AMBIENT_GOLFERS() HANDLE_CHASE_AMBIENT_GOLFERS() CHECK_STATS_GOALS() HANDLE_POLICE_REPORT() // CHECK_FOR_DRIVING_IN_COURSE() SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID()) UPDATE_CHASE_BLIP(biMissionBlip, CelebrityGolfer.mPed, LOST_RANGE) IF NOT IS_ENTITY_ALIVE(golfClubPickup.objIndex) CLEAR_PRINTS() IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ENDIF bConversationActive = FALSE SAFE_REMOVE_BLIP(biMissionBlip) SET_FAIL_REASON(FAIL_CLUB_DESTROYED) //PLAYER DESTROYED THE CLUB ENDIF IF Monitor_GolfCourse_Chase() OR NOT IS_ENTITY_ALIVE(CelebrityGolfer.mPed) // SOMETHING HAS HAPPENED TO BUGGY OR CELEB IS DEAD. PRINT_NOW("N1D_COLLECT",DEFAULT_GOD_TEXT_TIME,5) // Collect the ~g~golf club. // SetStage(MS_COLLECT_GOLF_CLUB) // COLLECT THE GOLF CLUB ELSE IF bAllowPlayerToStealClubFromBag // If the player is on foot and gets close enough to the club sitting in the back, Trevor just 'yoinks' it out IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) AND IS_ENTITY_ALIVE(oiGolfBag) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_ENTITY_ATTACHED_TO_ENTITY(golfClubPickup.objIndex, oiGolfBag) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), golfClubPickup.objIndex, << 0.8, 0.8, 2.0 >>, FALSE, TRUE, TM_ON_FOOT) PLAY_SOUND_FROM_ENTITY(iClubPickupAudioID, "COLLECT_IN_BAG", golfClubPickup.objIndex, "NIGEL_1D_SOUNDSET") SET_CONTROL_SHAKE(PLAYER_CONTROL, 300, 128) // SHAKE PAD FOR PICKUP bClubCollectedByPlayer = TRUE eSubStage = SS_CLEANUP ENDIF ENDIF ENDIF ENDIF ENDIF IF GET_VEHICLE_WAYPOINT_TARGET_POINT(CelebrityBuggy.mVehicle) >= 200 // CELEB HAS MADE IT OUT OF GOLF COURSE INTO CITY eSubStage = SS_CLEANUP ENDIF ENDIF BREAK CASE SS_CLEANUP CLEAR_PRINTS() IF bClubCollectedByPlayer bConversationActive = FALSE IF DOES_ENTITY_EXIST(golfClubPickup.objIndex) DELETE_OBJECT(golfClubPickup.objIndex) //DELETE THE CLUB PLAYER HAS COLLECTED ENDIF SAFE_REMOVE_BLIP(biMissionBlip) IF NOT ARE_GUARDS_DEAD() AND NOT IS_PLAYER_NEAR_SECURITY() bMainObjectiveDisplayed = FALSE SetStage(MS_LOSE_SECURITY) // LOSE THE SECURITY IF PLAYER IS NEAR THEM ELSE IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) bMainObjectiveDisplayed = FALSE SetStage(MS_LOSE_THE_COPS) // LOSE COPS IF PLAYER HAS WANTED LEVEL ELSE SetStage(MS_END_PHONECALL) // END PHONECALL IF NOT THE ABOVE TWO STATES ENDIF ENDIF ELSE SetStage(MS_CHASE_IN_CITY) // CHASE CELEB IN CITY ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Handles the player chasing the golf player in the city /// Kicks in once waypoint recording has ended. PROC CHASE_IN_CITY() SWITCH eSubStage CASE SS_SETUP eGolferState = GS_FLEE_IN_CITY // SET THE CELEB STATE TO FLEE IN THE CITY MAKE_PED_FLEE(CelebrityGolfer.mPed) // SET HIM TO FLEE THE PLAYER IF IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF GET_ENTITY_HEALTH(CelebrityBuggy.mVehicle) > 600 SET_ENTITY_HEALTH(CelebrityBuggy.mVehicle,600) // LOWER VEHICLES HEALTH SO IT IS MORE LIKELY TO DROP GOLF CLUB ENDIF ENDIF // Ensure the golf bag and the pickup are both attached to the buggy, in case we've skipped and this hasn't been done properly IF IS_ENTITY_ALIVE(oiGolfBag) IF NOT IS_ENTITY_ATTACHED(oiGolfBag) DEBUG_PRINT("Reattaching bag to buggy!?") ATTACH_ENTITY_TO_ENTITY(oiGolfBag,CelebrityBuggy.mVehicle,0,<<0.2,-1.3,0.5>>,<<0,0,0>>) ENDIF ENDIF IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) AND IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF NOT IS_ENTITY_ATTACHED(golfClubPickup.objIndex) DEBUG_PRINT("Reattaching club to bag!?") ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,oiGolfBag,0,<<0.10,0.0,-0.25>>,<<-5,155,0>>) ELIF IS_ENTITY_ATTACHED_TO_ENTITY(golfClubPickup.objIndex, CelebrityGolfer.mPed) DEBUG_PRINT("Glen still holding club, reattach to bag") DETACH_ENTITY(golfClubPickup.objIndex) ATTACH_ENTITY_TO_ENTITY(golfClubPickup.objIndex,oiGolfBag,0,<<0.10,0.0,-0.25>>,<<-5,155,0>>) ENDIF ENDIF SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING) DEBUG_PRINT("ENTERING CHASE IN CITY ") SAFE_REMOVE_BLIP(biMissionBlip) biMissionBlip = CREATE_VEHICLE_BLIP(CelebrityBuggy.mVehicle,FALSE,BLIPPRIORITY_MED) eSubStage = SS_UPDATE BREAK CASE SS_UPDATE Monitor_Celebrity() DISTANCE_FAIL_CHECKS() UPDATE_CHASE_BLIP(biMissionBlip, CelebrityBuggy.mVehicle, LOST_RANGE) CHECK_STATS_GOALS() // CHECK_FOR_DRIVING_IN_COURSE() IF bAllowPlayerToStealClubFromBag // If the player is on foot and gets close enough to the club sitting in the back, Trevor just 'yoinks' it out IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) AND IS_ENTITY_ALIVE(oiGolfBag) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_ENTITY_ATTACHED_TO_ENTITY(golfClubPickup.objIndex, oiGolfBag) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), golfClubPickup.objIndex, << 0.8, 0.8, 2.0 >>, FALSE, TRUE, TM_ON_FOOT) PLAY_SOUND_FROM_ENTITY(iClubPickupAudioID, "COLLECT_IN_BAG", golfClubPickup.objIndex, "NIGEL_1D_SOUNDSET") SET_CONTROL_SHAKE(PLAYER_CONTROL, 300, 128) // SHAKE PAD FOR PICKUP bClubCollectedByPlayer = TRUE eSubStage = SS_CLEANUP ENDIF ENDIF ENDIF ENDIF ENDIF IF Monitor_City_Chase() eSubStage = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP IF bClubCollectedByPlayer CLEAR_PRINTS() bConversationActive = FALSE IF DOES_ENTITY_EXIST(golfClubPickup.objIndex) DELETE_OBJECT(golfClubPickup.objIndex) //DELETE THE CLUB PLAYER HAS COLLECTED ENDIF SAFE_REMOVE_BLIP(biMissionBlip) IF NOT ARE_GUARDS_DEAD() AND NOT IS_PLAYER_NEAR_SECURITY() bMainObjectiveDisplayed = FALSE SetStage(MS_LOSE_SECURITY) // LOSE THE SECURITY IF PLAYER IS NEAR THEM ELSE IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) bMainObjectiveDisplayed = FALSE SetStage(MS_LOSE_THE_COPS) // LOSE COPS IF PLAYER HAS WANTED LEVEL ELSE SetStage(MS_END_PHONECALL) // END PHONECALL IF NOT THE ABOVE TWO STATES ENDIF ENDIF ELSE CLEAR_PRINTS() bMainObjectiveDisplayed = FALSE SetStage(MS_COLLECT_GOLF_CLUB) // COLLECT THE GOLF CLUB ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Handles player collecting the golf club PROC COLLECT_GOLF_CLUB() SWITCH eSubStage CASE SS_SETUP IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ENDIF bWarnedAboutLeaving = FALSE //RESETS THIS BOOL SO IT CAN BE USED FOR LEAVING THE PICKUP CREATE_GOLF_PICKUP() IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) // NEED TO CHECK THIS INCASE PLAYER BLOWS IT UP IF bMainObjectiveDisplayed = FALSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 PRINT_NOW("N1D_COLLECT",DEFAULT_GOD_TEXT_TIME,5) // Collect the ~g~golf club. // bMainObjectiveDisplayed = TRUE ENDIF ENDIF ENDIF REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_LOW) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) // Ensure we get the cinematic cam back now the chase has ended DEBUG_PRINT("ENTERING COLLECT GOLF CLUB ") eSubStage = SS_UPDATE BREAK CASE SS_UPDATE Monitor_Celebrity() //HANDLE_AMBIENT_GOLFERS() HANDLE_CELEB_SECURITY() //HANDLE_COURSE_SECURITY() DISTANCE_FAIL_CHECKS() HANDLE_CHASE_AMBIENT_GOLFERS() CHECK_STATS_GOALS() IF bDonePoliceReport = FALSE IF IS_PED_INSIDE_GOLF_AREA(PLAYER_PED_ID()) HANDLE_POLICE_REPORT() ENDIF ENDIF SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID()) // Check this again, in case there was a conversation ongoing when we were in the setup state just now IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) IF bMainObjectiveDisplayed = FALSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 PRINT_NOW("N1D_COLLECT",DEFAULT_GOD_TEXT_TIME,5) // Collect the ~g~golf club. // bMainObjectiveDisplayed = TRUE ENDIF ENDIF ENDIF //BAG WILL DETACH FROM GOLF BUGGY IF IT GETS DESTROYED IF NOT IS_VEHICLE_OK(CelebrityBuggy.mVehicle) IF IS_ENTITY_ALIVE(oiGolfBag) IF IS_ENTITY_ATTACHED(oiGolfBag) DETACH_ENTITY(oiGolfBag) ENDIF ENDIF ENDIF IF IS_ENTITY_ALIVE(golfClubPickup.objIndex) // GOLF CLUB IS ALIVE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), golfClubPickup.objIndex, << 0.8, 0.8, 2.0 >>, FALSE, TRUE, TM_ON_FOOT) // IF PLAYER IS AT GOLF CLUB THEN IT IS COLLECTED IF IS_ENTITY_ATTACHED_TO_ANY_OBJECT(golfClubPickup.objIndex) DEBUG_PRINT("Golf club attached to bag - correct?") PLAY_SOUND_FROM_ENTITY(iClubPickupAudioID, "COLLECT_IN_BAG", golfClubPickup.objIndex, "NIGEL_1D_SOUNDSET") // Play sound "COLLECT_IN_BAG" ELSE DEBUG_PRINT("Golf club NOT attached to bag - correct?") PLAY_SOUND_FROM_ENTITY(iClubPickupAudioID, "COLLECT_OUT_BAG", golfClubPickup.objIndex, "NIGEL_1D_SOUNDSET") // Play sound "COLLECT_OUT_BAG" ENDIF SET_CONTROL_SHAKE(PLAYER_CONTROL, 300, 128) // SHAKE PAD FOR PICKUP bClubCollectedByPlayer = TRUE INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() eSubStage = SS_CLEANUP ELSE // IF IS_ENTITY_ATTACHED(golfClubPickup.objIndex) // RENDER_FAKE_PICKUP_GLOW((GET_ENTITY_COORDS(golfClubPickup.objIndex)+ <<0,0,1.25>>), 5) // IF PLAYER HAS NOT PICKED UP, RENDER PICKUP GLOW FROM CLUB // ELSE // RENDER_FAKE_PICKUP_GLOW((GET_ENTITY_COORDS(golfClubPickup.objIndex)+ <<0,0,0.15>>), 5) // IF PLAYER HAS NOT PICKED UP, RENDER PICKUP GLOW FROM CLUB // ENDIF ENDIF ELSE //CLUB HAS BEEN DESTROYED eSubStage = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP IF bClubCollectedByPlayer = TRUE //PLAYER COLLECTED THE CLUB TO GET INTO HERE CLEAR_PRINTS() bConversationActive = FALSE IF DOES_ENTITY_EXIST(golfClubPickup.objIndex) DELETE_OBJECT(golfClubPickup.objIndex) //DELETE THE CLUB PLAYER HAS COLLECTED ENDIF SAFE_REMOVE_BLIP(biMissionBlip) IF NOT ARE_GUARDS_DEAD() AND NOT IS_PLAYER_NEAR_SECURITY() bMainObjectiveDisplayed = FALSE SetStage(MS_LOSE_SECURITY) // LOSE THE SECURITY IF PLAYER IS NEAR THEM ELSE IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) bMainObjectiveDisplayed = FALSE SetStage(MS_LOSE_THE_COPS) // LOSE COPS IF PLAYER HAS WANTED LEVEL ELSE SetStage(MS_END_PHONECALL) // END PHONECALL IF NOT THE ABOVE TWO STATES ENDIF ENDIF ELSE //PLAYER DID NOT COLLECT THE CLUB CLEAR_PRINTS() bConversationActive = FALSE IF DOES_ENTITY_EXIST(golfClubPickup.objIndex) DELETE_OBJECT(golfClubPickup.objIndex) //DELETE CLUB IT WAS DESTROYED ENDIF SAFE_REMOVE_BLIP(biMissionBlip) SET_FAIL_REASON(FAIL_CLUB_DESTROYED) //PLAYER DESTROYED THE CLUB ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Handles losing the security if player is near them once he has the golf pickup PROC LOSE_SECURITY() SWITCH eSubStage CASE SS_SETUP IF bMainObjectiveDisplayed = FALSE PRINT_NOW("N1D_LOSESEC",DEFAULT_GOD_TEXT_TIME,5) // Escape the ~r~security // bMainObjectiveDisplayed = TRUE ENDIF INT i FOR i = 0 TO NUM_OF_SECURITY - 1 //BLIP ALL THE SECURITY FOR CELEBRITY IF DOES_BLIP_EXIST(CelebSecurity[i].mBlip) SET_BLIP_SCALE(CelebSecurity[i].mBlip,0.7) ENDIF ENDFOR DEBUG_PRINT("ENTERING LOSE THE SECURITY ") eSubStage = SS_UPDATE BREAK CASE SS_UPDATE IF NOT ARE_GUARDS_DEAD() AND NOT IS_PLAYER_NEAR_SECURITY() HANDLE_CELEB_SECURITY() ELSE eSubStage = SS_CLEANUP // IF PLAYER HAS KILLED SECURITY OR EVADED THEM ENDIF Monitor_Celebrity() //HANDLE_AMBIENT_GOLFERS() //HANDLE_COURSE_SECURITY() HANDLE_CHASE_AMBIENT_GOLFERS() CHECK_STATS_GOALS() BREAK CASE SS_CLEANUP FOR i = 0 TO NUM_OF_SECURITY - 1 MAKE_PED_FLEE(CelebSecurity[i].mPed) SAFE_REMOVE_BLIP(CelebSecurity[i].mBlip) //REMOVE SECURITY BLIPS IF VALID ENDFOR CHECK_STATS_GOALS() // Check this again - the bImDead flags should all be set now if the player killed all the guards CLEAR_PRINTS() bConversationActive = FALSE IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) bMainObjectiveDisplayed = FALSE SetStage(MS_LOSE_THE_COPS) // LOSE COPS IF PLAYER HAS WANTED LEVEL ELSE SetStage(MS_END_PHONECALL) // ENDPHONE CALL IF PLAYER IS NOT WANTED ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main mission function for losing the cops if a wanted level is gained PROC LOSE_THE_COPS() SWITCH eSubStage CASE SS_SETUP IF bMainObjectiveDisplayed = FALSE PRINT_NOW("N1D_WANTED",DEFAULT_GOD_TEXT_TIME,5) // Lose the cops. // bMainObjectiveDisplayed = TRUE ENDIF INT i FOR i = 0 TO NUM_OF_SECURITY - 1 MAKE_PED_FLEE(CelebSecurity[i].mPed) SAFE_REMOVE_BLIP(CelebSecurity[i].mBlip) ENDFOR DEBUG_PRINT("ENTERING LOSE THE COPS") eSubStage = SS_UPDATE BREAK CASE SS_UPDATE Monitor_Celebrity() //HANDLE_AMBIENT_GOLFERS() //HANDLE_COURSE_SECURITY() HANDLE_CELEB_SECURITY() // Keep updating their states if they're dead HANDLE_CHASE_AMBIENT_GOLFERS() CHECK_STATS_GOALS() IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0) // PLAYER NEEDS TO LOSE THE COPS eSubStage = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP CLEAR_PRINTS() bConversationActive = FALSE SetStage(MS_END_PHONECALL) // ENDPHONE CALL OF MISSION BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Plays the phone call at the end of the mission when player has the golf club PROC END_PHONECALL() SWITCH eSubStage CASE SS_SETUP DEBUG_PRINT("ENTERING END PHONECALL") iNigelCallDelayTimer = GET_GAME_TIMER() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) //REMOVE SECURITY BLIPS AND MAKE PEDS FLEE INCASE INT i FOR i = 0 TO NUM_OF_SECURITY - 1 MAKE_PED_FLEE(CelebSecurity[i].mPed) SAFE_REMOVE_BLIP(CelebSecurity[i].mBlip) ENDFOR // SAFE_REMOVE_BLIP(biMissionBlip) //CLEAR PEDS AND ADD THEM AGAIN TO ENSURE PHONECALL WORKS REMOVE_PED_FOR_DIALOGUE(sDialogue, 2) REMOVE_PED_FOR_DIALOGUE(sDialogue, 3) REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") ADD_PED_FOR_DIALOGUE(sDialogue, 3, NULL, "NIGEL") ADD_PED_FOR_DIALOGUE(sDialogue, 4, NULL, "MRSTHORNHILL") // eSubStage = SS_UPDATE DEBUG_PRINT("ENTERING END PHONECALL LOOP") ENDIF BREAK CASE SS_UPDATE Monitor_Celebrity() // Carry on monitoring the Celeb so he runs away appropriately, etc IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT bConversationActive IF (GET_GAME_TIMER() - iNigelCallDelayTimer) > 3000 IF PLAYER_CALL_CHAR_CELLPHONE(sDialogue, CHAR_NIGEL, "NIG1DAU", "NIG1D_OUTRO", CONV_PRIORITY_VERY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_LOW) bConversationActive = TRUE ENDIF ENDIF ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF HAS_CELLPHONE_CALL_FINISHED() eSubStage = SS_CLEANUP ENDIF ENDIF ENDIF ENDIF BREAK CASE SS_CLEANUP DEBUG_PRINT("CLEANUP END PHONECALL") CLEAR_PRINTS() Script_Passed() // MISSION COMPLETE BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Waits for the screen to fade out, then updates the fail reason for the mission PROC FAIL_WAIT_FOR_FADE() SWITCH eSubStage CASE SS_SETUP CLEAR_PRINTS() CLEAR_HELP() // remove blips SAFE_REMOVE_BLIP(biMissionBlip) STRING sFailReason SWITCH eFailReason // print fail reason CASE FAIL_DEFAULT // no fail reason to display BREAK CASE FAIL_LION_ESCAPED sFailReason = "N1D_ESCAPE" //~r~Lion Oaks escaped. BREAK CASE FAIL_DID_NOT_LOCATE_LION sFailReason = "N1D_NOLOCATE" //~r~Failed to locate Lion Oaks. BREAK CASE FAIL_CLUB_DESTROYED sFailReason = "N1D_CLUBDES" //~r~Failed to locate Lion Oaks. BREAK CASE FAIL_LOST_GOLF_CLUB sFailReason = "N1D_CLUBLOST" //~r~The golf club was lost. BREAK ENDSWITCH IF eFailReason = FAIL_DEFAULT Random_Character_Failed() ELSE Random_Character_Failed_With_Reason(sFailReason) ENDIF eSubStage = SS_UPDATE BREAK CASE SS_UPDATE IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() // Do a check here to see if we need to warp the player at all // (only set the fail warp locations if we can't leave the player where he was) // MISSION_FLOW_SET_FAIL_WARP_LOCATION(<< -1327.8684, -92.8358, 48.5237 >>, 345.2175) // SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-1324.834, -90.740, 48.783>>, -0.454195) DELETE_EVERYTHING() IF IS_SCRIPTED_CONVERSATION_ONGOING() KILL_ANY_CONVERSATION() ENDIF MissionCleanup() Script_Cleanup(FALSE) ELSE // not finished fading out // you may want to handle dialogue etc here. ENDIF BREAK ENDSWITCH ENDPROC // =========================================================================================================== // Script Loop // =========================================================================================================== SCRIPT(g_structRCScriptArgs sRCLauncherDataIn) sRCLauncherDataLocal = sRCLauncherDataIn RC_TakeEntityOwnership(sRCLauncherDataLocal) RC_CLEANUP_LAUNCHER() SET_MISSION_FLAG(TRUE) // Setup callback when player is killed, arrested or goes to multiplayer IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU)) PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]") Random_Character_Failed() Script_Cleanup() ENDIF IF Is_Replay_In_Progress() // Set up the initial scene for replays //OR IS_REPEAT_PLAY_ACTIVE() g_bSceneAutoTrigger = TRUE eInitialSceneStage = IS_REQUEST_SCENE WHILE NOT SetupScene_NIGEL_1D(sRCLauncherDataLocal, tpGolfCourse) WAIT(0) ENDWHILE RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) g_bSceneAutoTrigger = FALSE DEBUG_PRINT("Set up script for replay") ENDIF // Set script indices to launcher-generated ones CelebrityGolfer.mPed = sRCLauncherDataLocal.pedID[0] CelebrityFriend.mPed = sRCLauncherDataLocal.pedID[1] CelebSecurity[CELEBSEC_WEST].mPed = sRCLauncherDataLocal.pedID[2] CelebSecurity[CELEBSEC_EAST].mPed = sRCLauncherDataLocal.pedID[3] CelebSecurity[CELEBSEC_NORTH].mPed = sRCLauncherDataLocal.pedID[4] golfClubPickup.objIndex = sRCLauncherDataLocal.objID[0] CelebFriendClub.mObject = sRCLauncherDataLocal.objID[1] oiGolfBag = sRCLauncherDataLocal.objID[2] CelebrityBuggy.mVehicle = sRCLauncherDataLocal.vehID[0] GolfBuggieTransport[BUGGY_BEHINDCELEB].mVehicle = sRCLauncherDataLocal.vehID[1] GolfBuggieTransport[BUGGY_NEXTTOCELEB].mVehicle = sRCLauncherDataLocal.vehID[2] ADD_VEHICLE_UPSIDEDOWN_CHECK(CelebrityBuggy.mVehicle) bCelebrityCreated = TRUE bSecurityCreated = TRUE iHeadshotTimer = GET_GAME_TIMER() #IF IS_DEBUG_BUILD IF NOT DOES_WIDGET_GROUP_EXIST(widgetGroup) widgetGroup= START_WIDGET_GROUP("Nigel 1D widgets") ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintToTTY) STOP_WIDGET_GROUP() ENDIF #ENDIF REGISTER_SCRIPT_WITH_AUDIO() CLEAR_BIT(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLD_KILLED_MARK)) // ensure this bit is initially clear when starting the mission InitVariables() // initialise everything int i for i = 0 TO COUNT_OF(CelebSecurity)-1 IF IS_ENTITY_ALIVE(CelebSecurity[i].mPed) SET_PED_RELATIONSHIP_GROUP_HASH(CelebSecurity[i].mPed,relHatePlayer) SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(CelebSecurity[i].mPed,FALSE, relHatePlayer) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE,relHatePlayer,RELGROUPHASH_PLAYER) ENDIF ENDFOR IF IS_NEXT_WEATHER_TYPE("THUNDER") OR IS_PREV_WEATHER_TYPE("THUNDER") SET_WEATHER_TYPE_OVERTIME_PERSIST("OVERCAST", 25.0) ENDIF // handle replay checkpoints IF Is_Replay_In_Progress() OR IS_REPEAT_PLAY_ACTIVE() INT iReplayStage // If it's repeat play, start from the beginning of the mission, otherwise start at the checkpoint IF IS_REPEAT_PLAY_ACTIVE() AND NOT Is_Replay_In_Progress() // You can replay repeat plays... iReplayStage = CP_AFTER_MOCAP SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), <<-1291.5958, -12.9214, 48.5137>>, 294.7073) ELSE iReplayStage = GET_REPLAY_MID_MISSION_STAGE() ENDIF DEBUG_PRINT_INT("Replay stage grabbed: ", iReplayStage) IF g_bShitskipAccepted = TRUE iReplayStage++ // player is skipping this stage ENDIF SWITCH iReplayStage CASE CP_AFTER_MOCAP DEBUG_PRINT_INT("Replay skipping to stage ", Z_SKIP_AFTER_MOCAP) // Move player so skip works correctly if player dies inside course START_REPLAY_SETUP(<<-1291.5958, -12.9214, 48.5137>>, 294.7073) Do_Z_Skip(Z_SKIP_AFTER_MOCAP) // skip the mocap intro BREAK CASE CP_LOCATED_STANKY DEBUG_PRINT_INT("Replay skipping to stage ", Z_SKIP_LOCATED_STANKY) START_REPLAY_SETUP(<<-1190.22, 36.83, 52.03>>, 299.0) Do_Z_Skip(Z_SKIP_LOCATED_STANKY) // skip to get golf club BREAK CASE CP_COMPLETE DEBUG_PRINT_INT("Replay skipping to stage ", Z_SKIP_ENDPHONECALL) START_REPLAY_SETUP(<<-1324.8539, 60.2491, 52.5400>>, 94.6913) Do_Z_Skip(Z_SKIP_ENDPHONECALL) // skip to end of mission phonecall BREAK DEFAULT SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected") BREAK ENDSWITCH ENDIF WHILE(TRUE) // Loop within here until the mission passes or fails REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_VSM") WAIT(0) UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene) // Check for the player getting into a Caddy to add it to the audio mix //HANDLE_CADDY_AUDIO_MIX() // Because the stat system isn't ready as soon as the mission starts, wait a couple of seconds and then try adding Mark to headshot watch IF IS_ENTITY_ALIVE(CelebrityGolfer.mPed) IF (GET_GAME_TIMER() - iHeadshotTimer) > 2000 IF NOT bHasAddedHeadshot INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(CelebrityGolfer.mPed) DEBUG_PRINT("Added Mark to headshot watch") bHasAddedHeadshot = TRUE ENDIF ENDIF ENDIF IF eMissionStage = MS_MISSION_FAILED FAIL_WAIT_FOR_FADE() ELSE IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SWITCH eMissionStage // MAIN LOOP //MAIN STATES CASE MS_INTRO_PHONECALL INTRO_PHONECALL() BREAK CASE MS_GO_TO_THE_GOLF_CLUB GO_TO_THE_GOLF_CLUB() BREAK CASE MS_GO_TO_CELEBRITY GO_TO_CELEBRITY() BREAK CASE MS_GET_THE_CLUB GET_THE_CLUB() BREAK CASE MS_CHASE_THE_GOLFER CHASE_THE_GOLFER() BREAK CASE MS_CHASE_IN_CITY CHASE_IN_CITY() BREAK CASE MS_COLLECT_GOLF_CLUB COLLECT_GOLF_CLUB() BREAK CASE MS_LOSE_SECURITY LOSE_SECURITY() BREAK CASE MS_LOSE_THE_COPS LOSE_THE_COPS() BREAK CASE MS_END_PHONECALL END_PHONECALL() BREAK //RETURN STATES ENDSWITCH ELSE SET_FAIL_REASON(FAIL_DEFAULT) ENDIF if bFinishedSkipping = FALSE JumpToStage(eTargetStage) // still skipping stages ENDIF #IF IS_DEBUG_BUILD // STAGE SKIPPING if bFinishedSkipping = TRUE DEBUG_Check_Debug_Keys() // not skipping stages, check for debug keys ENDIF #ENDIF ENDIF ENDWHILE ENDSCRIPT