Files
gtav-src/script/dev_ng/singleplayer/scripts/RandomChar/Nigel/Nigel1D.sc
T
2025-09-29 00:52:08 +02:00

6193 lines
220 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
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,<<SLOW_DOWN_RANGE,SLOW_DOWN_RANGE,SLOW_DOWN_RANGE>>)
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,<<LOSING_RANGE,LOSING_RANGE,LOSING_RANGE>>)
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,<<LOSING_RANGE,LOSING_RANGE,LOSING_RANGE>>)
// 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,<<LOST_RANGE,LOST_RANGE,LOST_RANGE>>)
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,<<LOST_RANGE,LOST_RANGE,LOST_RANGE>>)
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,<<ALERT_DIS,ALERT_DIS,ALERT_DIS>>)
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,<<ALERT_DIS,ALERT_DIS,ALERT_DIS>>)
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,<<ALERT_DIS,ALERT_DIS,ALERT_DIS>>)
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,<<ALERT_DIS,ALERT_DIS,ALERT_DIS>>)
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,<<ALERT_DIS,ALERT_DIS,ALERT_DIS>>)
//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,<<CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS>>)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationTwo,<<CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS>>)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationThree,<<CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS>>)
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,<<CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS>>)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationTwo,<<CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS>>)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(),vStopCarLocationThree,<<CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS,CF_CAR_STOPPING_DIS>>)
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,<<GOLFER_ALERT_DIS,GOLFER_ALERT_DIS,GOLFER_ALERT_DIS>>)
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,<<ALERT_DIS,ALERT_DIS,ALERT_DIS>>)
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