//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 "cellphone_public.sch" USING "commands_cutscene.sch" USING "commands_entity.sch" USING "commands_object.sch" USING "commands_pad.sch" USING "commands_script.sch" USING "commands_vehicle.sch" USING "CompletionPercentage_public.sch" USING "cutscene_public.sch" USING "dialogue_public.sch" USING "script_player.sch" USING "rgeneral_include.sch" USING "common_Hunting.sch" USING "initial_scenes_Hunting.sch" USING "commands_recording.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" USING "shared_debug.sch" #ENDIF // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Hunting2.sc // AUTHOR : Rob Taylor // DESCRIPTION : Hunting tutorial in wilderness // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** g_structRCScriptArgs sRCLauncherDataLocal // ENUMS ENUM MISSION_STATE MS_INIT_MISSION = 0, MS_RUN_INTRO, MS_SET_UP_AFTER_INTRO, MS_SET_UP_BEFORE_FIRST_ELK, MS_FOLLOW_TO_FIRST_ELK, MS_KILL_FIRST_ELK, MS_SET_UP_BEFORE_SECOND_ELK, MS_FOLLOW_TO_SECOND_ELK, MS_WHISTLE_TO_SECOND_ELK, MS_KILL_SECOND_ELK, MS_SET_UP_BEFORE_THIRD_ELK, MS_FOLLOW_TO_THIRD_ELK, MS_WHISTLE_TO_THIRD_ELK, MS_KILL_THIRD_ELK, MS_SET_UP_BEFORE_FOURTH_ELK, MS_HUNTER_LEAVES, MS_WHISTLE_TO_FOURTH_ELK, MS_KILL_FOURTH_ELK, MS_APPROACH_FOURTH_ELK, MS_PHOTO_FOURTH_ELK, MS_SEND_PHOTO, MS_WAIT_FOR_REPLY, MS_DO_FINAL_PHONECALL, MS_SET_UP_BEFORE_MISSION_PASS, MS_MISSION_PASSED, MS_MISSION_FAILED ENDENUM ENUM SUB_STATE SS_INIT, SS_ACTIVE, SS_CLEANUP, SS_SKIPPED ENDENUM ENUM HUNTER_STATE HS_NULL = 0, HS_LEAD_TO_FIRST_ELK, HS_WAIT_FOR_PLAYER_TO_RETURN, HS_TELL_ABOUT_FIRST_ELK, HS_WAIT_KILL_FIRST_ELK, HS_AFTER_KILL_FIRST_ELK, HS_WAIT_FIND_SECOND_ELK, HS_LEAD_TO_SECOND_ELK, HS_WAIT_KILL_SECOND_ELK, HS_AFTER_KILL_SECOND_ELK, HS_WAIT_FIND_THIRD_ELK, HS_LEAD_TO_THIRD_ELK, HS_WAIT_KILL_THIRD_ELK, HS_AFTER_KILL_THIRD_ELK, HS_RELEASE_WHEN_OFF_CAMERA, HS_YELL_AT_PLAYER_FOLLOWING ENDENUM ENUM HUNTER_SUB_STATE HSS_INIT, HSS_ACTIVE, HSS_CLEANUP ENDENUM ENUM FAIL_REASON FR_NONE = 0, FR_HE_SAW_YOU, FR_HE_SMELLED_YOU, FR_HE_HEARD_YOU, FR_HUNTER_KILLED, FR_HUNTER_INJURED, FR_LEFT_HUNTER, FR_LEFT_HUNT_AREA, FR_BAD_SHOT, FR_CAR_DEAD, FR_WRONG_GUN, FR_SHOT_DOE, FR_GUNSHOT, FR_INNOCENTS, FR_DISOBEYED, FAIL_CAR_IN_HUNT_AREA ENDENUM #IF IS_DEBUG_BUILD FUNC STRING GET_STRING_FROM_FAIL_REASON(FAIL_REASON eReason) SWITCH eReason CASE FR_NONE RETURN "FR_NONE" CASE FR_HE_SAW_YOU RETURN "FR_HE_SAW_YOU" CASE FR_HE_SMELLED_YOU RETURN "FR_HE_SMELLED_YOU" CASE FR_HE_HEARD_YOU RETURN "FR_HE_HEARD_YOU" CASE FR_HUNTER_KILLED RETURN "FR_HUNTER_KILLED" CASE FR_HUNTER_INJURED RETURN "FR_HUNTER_INJURED" CASE FR_LEFT_HUNTER RETURN "FR_LEFT_HUNTER" CASE FR_LEFT_HUNT_AREA RETURN "FR_LEFT_HUNT_AREA" CASE FR_BAD_SHOT RETURN "FR_BAD_SHOT" CASE FR_CAR_DEAD RETURN "FR_CAR_DEAD" CASE FR_WRONG_GUN RETURN "FR_WRONG_GUN" CASE FR_SHOT_DOE RETURN "FR_SHOT_DOE" CASE FR_GUNSHOT RETURN "FR_GUNSHOT" CASE FR_INNOCENTS RETURN "FR_INNOCENTS" CASE FR_DISOBEYED RETURN "FR_DISOBEYED" CASE FAIL_CAR_IN_HUNT_AREA RETURN "FAIL_CAR_IN_HUNT_AREA" ENDSWITCH RETURN "unknown FAIL_REASON" ENDFUNC #ENDIF MISSION_STATE eMissionState = MS_INIT_MISSION SUB_STATE eSubState = SS_INIT HUNTER_STATE eHunterState = HS_NULL HUNTER_STATE ePreState HUNTER_SUB_STATE eHunterSubState = HSS_INIT FAIL_REASON eFailReason /// CONSTS CONST_FLOAT SIGHT_RANGE_DUCK_WARN 55.0 CONST_FLOAT ACCEPTABLE_NOISE_LEVEL 2.5 CONST_FLOAT NEAR_HUNTER_RANGE 15.0 CONST_FLOAT RETURN_HUNTER_RANGE 10.0 CONST_FLOAT CAR_NOISE_RANGE 80.0 CONST_INT CP_AFTER_INTRO 0 CONST_INT CP_AFTER_TUTORIAL 1 CONST_INT CP_AFTER_FIRST_ELK 2 CONST_INT CP_AFTER_SECOND_ELK 3 CONST_INT CP_AFTER_THIRD_ELK 4 CONST_INT CP_AFTER_FOURTH_ELK 5 // Hunter conversations CONST_INT HTC_HUNTING_TUT_1 0 // HT_CUT - You got your wish boy, we're hunting elk now... CONST_INT HTC_ARRIVE_FIRST_ELK 1 // HT2_HUNT - Right son, let's try and bag us three elk... CONST_INT HTC_GOOD_SHOT_FIRST_ELK 2 // HT2_COMP1 - Boom, great kill son... CONST_INT HTC_LEAD_TO_SECOND_ELK 3 // HT2_WHISTLE2 - Right, we don't know where the next elk is... CONST_INT HTC_WHISTLE_TO_SECOND_ELK 4 // HT2_WLK3 - Ok, this'll do. CONST_INT HTC_DISCOVER_SECOND_ELK 5 // //DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE - Same as before boy CONST_INT HTC_GOOD_SHOT_SECOND_ELK 6 // HT2_COMP2 - Good shot son! CONST_INT HTC_LEAD_TO_THIRD_ELK 7 // HT_PAIR - Follow me quietly, we might have a mating pair up ahead. CONST_INT HTC_WHISTLE_TO_THIRD_ELK 8 // HT_LEAD3 - Remember, we're only here for the male elk. CONST_INT HTC_DISCOVER_THIRD_ELK 9 // HT2_ARR3 - Same as before boy CONST_INT HTC_GOOD_SHOT_THIRD_ELK 10 // HT2_COMP1 - Boom! Great kill son. CONST_INT HTC_TELL_ABOUT_TEXTING 11 // HT2_WLKOFF - Right, you're on your own for this lask elk CONST_INT HTC_REPEAT_WHISTLE 12 CONST_INT MAX_HUNTER_CONVOS 13 CONST_INT FIRST_ELK 0 CONST_INT SECOND_ELK 1 CONST_INT THIRD_ELK 2 CONST_INT DOE_ELK 3 CONST_INT FOURTH_ELK 4 CONST_INT MAX_WIND_HELP_STRINGS 3 // Number of help strings that are associated with the wind help CONST_INT HELP_TEXT_TIME 5000 // 5 seconds CONST_INT MAX_WARNING_CONVS 6 CONST_INT WHISTLE_BUTTON_HELP 3 CONST_INT WHISTLE_INACTIVITY_TIME 15000 CONST_INT CROUCH_WARNING 0 CONST_INT UPWIND_WARNING 1 CONST_INT BOTH_WARNING 2 CONST_INT RUNNING_WARNING 3 CONST_INT GUN_WARNING 4 CONST_INT CAR_WARNING 5 CONST_INT WIND_ARROW_HELP 0 CONST_INT CROUCH_HELP 1 CONST_INT WIND_CHANGE_HELP 2 CONST_INT FIRST_CALL_HELP 3 CONST_INT SECOND_CALL_HELP 4 CONST_INT THIRD_CALL_HELP 5 CONST_INT DONT_KILL_DOE_HELP 6 CONST_INT MAX_HELP_STRINGS 7 // Number of help strings CONST_INT MAX_ELK 5 CONST_INT NICE_LITTLE_PAUSE 1700 CONST_INT PLAYER_CALL_DURATION 3000 CONST_FLOAT PROMPT_AREA_WIDTH 20.0 #IF IS_DEBUG_BUILD CONST_INT MAX_SKIP_MENU_LENGTH 5 #ENDIF structPedsForConversation mHunterConv // VARIABLES BLIP_INDEX mBlip BLIP_INDEX mHunterBlip BOOL bSetIntroExitState = FALSE BOOL bCanUpdateWindBlip = FALSE BOOL bCarNoise = FALSE BOOL bElkAssetsInMem = FALSE BOOL bFailForSpooking = FALSE BOOL bFinalElkFlee = FALSE BOOL bHunterStartedWalking = FALSE BOOL bGotBlipFadeTime = FALSE BOOL bGotFailDelay = FALSE BOOL bGotFailTimer = FALSE //BOOL bGotReturnTimer = FALSE BOOL bGroupCreated = FALSE BOOL bGotResponseDelay = FALSE BOOL bIsTrevorLooking = FALSE BOOL bNoiseDetected = FALSE BOOL bSentTextMessage = FALSE BOOL bStartTextTimer = FALSE BOOL bShitSkipping = FALSE BOOL bShotFromWrongPlace = FALSE BOOL bShotWithWrongGun = FALSE BOOL bShownFleeWarning = FALSE BOOL bShownReturnToHunter = FALSE BOOL bWindCanChange = FALSE //BOOL bIsRetry = FALSE //BOOL bShowWindInCutscene = FALSE BOOL bHadClip = FALSE BOOL bHadLargeScope = FALSE BOOL bHadMaxScope = FALSE BOOL bHunterDoneConvo[MAX_HUNTER_CONVOS] BOOL bIncreasedHeartStat[MAX_ELK] BOOL bShownHuntElkGodText[MAX_ELK] BOOL bDoneRightGunAimConvo[MAX_ELK] BOOL bDoneWrongGunAimConvo[MAX_ELK] BOOL bWarningConvGiven[MAX_ELK] BOOL bShownHelp[MAX_HELP_STRINGS] CAMERA_INDEX mCam //FLOAT fHunterOutroHead = 335.3803 // Warp positions for player FLOAT fPlayerStartHead = 301.6213 FLOAT fPlayerStartHuntHead = 255.0691 FLOAT fPlayerSecondKillHead = 280.2539 FLOAT fPlayerThirdKillHead = 265.0211 FLOAT fHunterStartHead = 301.6213 FLOAT fHunterStartHuntHead = 255.0691 FLOAT fHunterSecondKillHead = 320.8655 FLOAT fHunterThirdKillHead = 209.3795 FLOAT fElkHead[MAX_ELK] INT iBlipFadeTime INT iCutSceneState = 0 INT iDeadPeds = 0 INT iFailTimer INT iFailDelay INT iNoiseFailDelay INT iResponseDelay BOOL bGotReturnTime = FALSE INT iReturnTime INT iTimerDelay = 0 INT iTint //MODEL_NAMES mHunterModel = IG_CLETUS //IG_HUNTER MODEL_NAMES mElkModel = A_C_DEER OBJECT_INDEX mCletusGun OBJECT_INDEX mTrevorGun PED_INDEX mHunter REL_GROUP_HASH relGroupFriendly STRING sFailReason = NULL STRING sTextBlock = "HT2AUD" STRING sTrevor = "Trevor" STRING sKillString TEXT_LABEL_23 sCurConvo = "HT_CUT" TEXT_LABEL_23 sCurLine = "HT_CUT_1" TEXT_LABEL_23 txtLine VECTOR vPlayerStartPos = << -680.2113, 5848.0083, 16.2569 >> // Outside the shops (after the mocap) VECTOR vHunterStartPos = << -677.2093, 5847.6357, 16.3312 >> VECTOR vPlayerStartHuntPos = <<-623.4990, 5849.9761, 22.0710>> // Hunter on edge of woods, pointing into them. VECTOR vHunterStartHuntPos = <<-621.9225, 5849.9966, 22.1182>> VECTOR vPlayerFirstKillPos = <<-607.6183, 5853.4829, 22.7782>> // After palyer kills first elk, Trevor is here. FLOAT fPlayerFirstKillHead = 217.5379 VECTOR vHunterFirstKillPos = <<-605.1650, 5856.5386, 22.8050>> // After Trev kills first elk, hunter will be here. FLOAT fHunterFirstKillHead = 174.8695 VECTOR vPlayerSecondKillPos = <<-585.8595, 5854.5029, 27.1148>> // Hunter's position at second kill VECTOR vHunterSecondKillPos = <<-585.6373, 5857.5254, 27.2106>> VECTOR vPlayerThirdKillPos = <<-581.1332, 5844.7646, 28.2620>> VECTOR vHunterThirdKillPos = <<-585.0704, 5842.9277, 27.9043>> VECTOR SCENT_RANGE_WARN = << 0.0, 60.0, 0.0 >> VECTOR vElkSpawn[MAX_ELK] VECTOR vElkGoto_Second = <<-529.0620, 5865.1162, 32.6770>> VECTOR vElkGoto_Third = <<-572.70, 5786.51, 38.37>> FLOAT fElkGoto_ThirdHeading = 90.01 VECTOR vElkGoto_Doe = <<-575.36, 5788.60, 37.59>> FLOAT fElkGoto_DoeHeading = -92.72 VECTOR vElkGoto_Fourth = <<-618.4669, 5750.4575, 31.4123>> FLOAT fElkGoto_FourthHeading = 11.9731 VECTOR vElkGoto_Fourth_alt = <<-659.7115, 5711.5996, 23.6818>> FLOAT fElkGoto_FourthHeading_alt = 125.9914 // Elk warning area VECTOR vElkOnePromptAreaOneA = <<-626.5519, 5824.6006, 23.1475>> VECTOR vElkOnePromptAreaOneB = <<-588.3788, 5829.8975, 29.0621>> VECTOR vElkTwoPromptAreaOneA = <<-578.3123, 5876.2271, 27.3243>> VECTOR vElkTwoPromptAreaOneB = <<-536.2968, 5860.1050, 32.3228>> // Resolve vehicle VECTOR vResolveAreaA = <<-680.5353, 5847.8730, 16.0>> VECTOR vResolveAreaB = <<-686.4902, 5841.4990, 19.0>> VECTOR vResolveAreaC = <<-612.2185, 5843.3315, 25.3576>> VECTOR vResolvePos = << -691.7810, 5835.6895, 15.9653 >> FLOAT fResolveHead = 318.4915 CONST_FLOAT RESOLVE_AREA_WIDTH 5.0 CONST_FLOAT RESOLVE_AREA_WIDTH_LARGE 25.0 BOOL bHunter_InPosition1 = FALSE BOOL bWhistle_CaughtFirst = FALSE BOOL bWhistle_WaitingOnConvo = FALSE BOOL bHunter_PointedAtHuntingArea = FALSE BOOL bHunter_TaskedAfterKill2 = FALSE BOOL bHunter_PointedAtElk2 = FALSE BOOL bHunter_WaitWhistleKill3 = FALSE CONST_FLOAT VERY_NEAR_HUNTER_RANGE 6.0 CONST_INT ELK1_NO_ACTIVITY_TIME_MIN 25000 CONST_INT ELK1_NO_ACTIVITY_TIME_MAX 45000 INT iFirstElkTimer = 0 CONST_INT CLETUS_FOLLOW_COMMENT_MIN 8000 CONST_INT CLETUS_FOLLOW_COMMENT_MAX 12000 INT iCletusFollowTimer = 0 BOOL bHunter_WaitToLeave = FALSE BOOL bSpawned1stElk = FALSE BOOL bTriggered3rdElk = FALSE INT iWPR_0_1_Progress = 0 INT iWPR_1_2_Progress = 0 INT iWPR_2_3_Progress = 0 // Debug #IF IS_DEBUG_BUILD MissionStageMenuTextStruct s_skip_menu[MAX_SKIP_MENU_LENGTH] INT i_debug_jump_stage FUNC STRING GET_STRING_FROM_MISSION_STATE(MISSION_STATE eState) SWITCH eState CASE MS_INIT_MISSION RETURN "MS_INIT_MISSION" CASE MS_RUN_INTRO RETURN "MS_RUN_INTRO" CASE MS_SET_UP_AFTER_INTRO RETURN "MS_SET_UP_AFTER_INTRO" CASE MS_SET_UP_BEFORE_FIRST_ELK RETURN "MS_SET_UP_BEFORE_FIRST_ELK" CASE MS_FOLLOW_TO_FIRST_ELK RETURN "MS_FOLLOW_TO_FIRST_ELK" CASE MS_KILL_FIRST_ELK RETURN "MS_KILL_FIRST_ELK" CASE MS_SET_UP_BEFORE_SECOND_ELK RETURN "MS_SET_UP_BEFORE_SECOND_ELK" CASE MS_FOLLOW_TO_SECOND_ELK RETURN "MS_FOLLOW_TO_SECOND_ELK" CASE MS_WHISTLE_TO_SECOND_ELK RETURN "MS_WHISTLE_TO_SECOND_ELK" CASE MS_KILL_SECOND_ELK RETURN "MS_KILL_SECOND_ELK" CASE MS_SET_UP_BEFORE_THIRD_ELK RETURN "MS_SET_UP_BEFORE_THIRD_ELK" CASE MS_FOLLOW_TO_THIRD_ELK RETURN "MS_FOLLOW_TO_THIRD_ELK" CASE MS_WHISTLE_TO_THIRD_ELK RETURN "MS_WHISTLE_TO_THIRD_ELK" CASE MS_KILL_THIRD_ELK RETURN "MS_KILL_THIRD_ELK" CASE MS_SET_UP_BEFORE_FOURTH_ELK RETURN "MS_SET_UP_BEFORE_FOURTH_ELK" CASE MS_HUNTER_LEAVES RETURN "MS_HUNTER_LEAVES" CASE MS_WHISTLE_TO_FOURTH_ELK RETURN "MS_WHISTLE_TO_FOURTH_ELK" CASE MS_KILL_FOURTH_ELK RETURN "MS_KILL_FOURTH_ELK" CASE MS_APPROACH_FOURTH_ELK RETURN "MS_APPROACH_FOURTH_ELK" CASE MS_PHOTO_FOURTH_ELK RETURN "MS_PHOTO_FOURTH_ELK" CASE MS_SEND_PHOTO RETURN "MS_SEND_PHOTO" CASE MS_WAIT_FOR_REPLY RETURN "MS_WAIT_FOR_REPLY" CASE MS_DO_FINAL_PHONECALL RETURN "MS_DO_FINAL_PHONECALL" CASE MS_SET_UP_BEFORE_MISSION_PASS RETURN "MS_SET_UP_BEFORE_MISSION_PASS" CASE MS_MISSION_PASSED RETURN "MS_MISSION_PASSED" CASE MS_MISSION_FAILED RETURN "MS_MISSION_FAILED" ENDSWITCH RETURN "unknown mission state" ENDFUNC FUNC STRING GET_STRING_FROM_SUB_STATE(SUB_STATE eState) SWITCH eState CASE SS_INIT RETURN "SS_INIT" CASE SS_ACTIVE RETURN "SS_ACTIVE" CASE SS_CLEANUP RETURN "SS_CLEANUP" CASE SS_SKIPPED RETURN "SS_SKIPPED" ENDSWITCH RETURN "unknown sub state" ENDFUNC FUNC STRING GET_STRING_FROM_HUNTER_STATE(HUNTER_STATE eState) SWITCH eState CASE HS_NULL RETURN "HS_NULL" CASE HS_LEAD_TO_FIRST_ELK RETURN "HS_LEAD_TO_FIRST_ELK" CASE HS_WAIT_FOR_PLAYER_TO_RETURN RETURN "HS_WAIT_FOR_PLAYER_TO_RETURN" CASE HS_TELL_ABOUT_FIRST_ELK RETURN "HS_TELL_ABOUT_FIRST_ELK" CASE HS_WAIT_KILL_FIRST_ELK RETURN "HS_WAIT_KILL_FIRST_ELK" CASE HS_AFTER_KILL_FIRST_ELK RETURN "HS_AFTER_KILL_FIRST_ELK" CASE HS_WAIT_FIND_SECOND_ELK RETURN "HS_WAIT_FIND_SECOND_ELK" CASE HS_LEAD_TO_SECOND_ELK RETURN "HS_LEAD_TO_SECOND_ELK" CASE HS_WAIT_KILL_SECOND_ELK RETURN "HS_WAIT_KILL_SECOND_ELK" CASE HS_AFTER_KILL_SECOND_ELK RETURN "HS_AFTER_KILL_SECOND_ELK" CASE HS_WAIT_FIND_THIRD_ELK RETURN "HS_WAIT_FIND_THIRD_ELK" CASE HS_LEAD_TO_THIRD_ELK RETURN "HS_LEAD_TO_THIRD_ELK" CASE HS_WAIT_KILL_THIRD_ELK RETURN "HS_WAIT_KILL_THIRD_ELK" CASE HS_AFTER_KILL_THIRD_ELK RETURN "HS_AFTER_KILL_THIRD_ELK" CASE HS_RELEASE_WHEN_OFF_CAMERA RETURN "HS_RELEASE_WHEN_OFF_CAMERA" CASE HS_YELL_AT_PLAYER_FOLLOWING RETURN "HS_YELL_AT_PLAYER_FOLLOWING" ENDSWITCH RETURN "unknown hunter state" ENDFUNC FUNC STRING GET_STRING_FROM_HUNTER_SUB_STATE(HUNTER_SUB_STATE eState) SWITCH eState CASE HSS_INIT RETURN "HSS_INIT" CASE HSS_ACTIVE RETURN "HSS_ACTIVE" CASE HSS_CLEANUP RETURN "HSS_CLEANUP" ENDSWITCH RETURN "unknown hunter sub state" ENDFUNC #ENDIF // General Functions PROC RESET_CAM() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) ENDPROC /// PURPOSE: /// RESTORES THE PLAYERS PERSONAL SNIPER RIFLE AFTER MISSION PROC LOCAL_RETURN_PLAYERS_GUN() CPRINTLN(DEBUG_MISSION, "RETURNING PLAYERS GUN") IF IS_PED_UNINJURED(PLAYER_PED_ID()) IF bHadSniperRifle CPRINTLN(DEBUG_MISSION, "Player had a sniper rifle with", iSniperAmmoBefore, "rounds") GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, iSniperAmmoBefore, FALSE, FALSE) // Remove infinite ammo. SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE, WEAPONTYPE_SNIPERRIFLE) SET_PED_AMMO_BY_TYPE(PLAYER_PED_ID(), AMMOTYPE_SNIPER, iSniperAmmoBefore) IF bHadSuppressor CPRINTLN(DEBUG_MISSION, "with a supressor") GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, WEAPONCOMPONENT_AT_AR_SUPP_02) ENDIF IF iTint != -1 CPRINTLN(DEBUG_MISSION, "setting tint") SET_PED_WEAPON_TINT_INDEX(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, iTint) ENDIF IF bHadClip CPRINTLN(DEBUG_MISSION, "giving clip") GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, WEAPONCOMPONENT_SNIPERRIFLE_CLIP_01) ENDIF IF bHadLargeScope CPRINTLN(DEBUG_MISSION, "giving large scope") GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, WEAPONCOMPONENT_AT_SCOPE_LARGE) ENDIF IF bHadMaxScope CPRINTLN(DEBUG_MISSION, "giving max scope") GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, WEAPONCOMPONENT_AT_SCOPE_MAX) ENDIF ENDIF ENDIF ENDPROC PROC LOCAL_RECORD_PLAYERS_GUN() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, GENERALWEAPON_TYPE_INVALID) bHadSniperRifle = TRUE iTint = GET_PED_WEAPON_TINT_INDEX(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE) CPRINTLN(DEBUG_MISSION, "iTint = ", iTint) iSniperAmmoBefore = GET_PED_AMMO_BY_TYPE(PLAYER_PED_ID(), AMMOTYPE_SNIPER) CPRINTLN(DEBUG_MISSION, "iSniperAmmoBefore = ", iSniperAmmoBefore) IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, WEAPONCOMPONENT_AT_AR_SUPP_02) CPRINTLN(DEBUG_MISSION, "bHadSuppressor = TRUE") bHadSuppressor = TRUE ENDIF IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, WEAPONCOMPONENT_AT_SCOPE_LARGE) CPRINTLN(DEBUG_MISSION, "bHadLargeScope = TRUE") bHadLargeScope = TRUE ENDIF IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, WEAPONCOMPONENT_AT_SCOPE_MAX) CPRINTLN(DEBUG_MISSION, "bHadMaxScope = TRUE") bHadMaxScope = TRUE ENDIF IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, WEAPONCOMPONENT_SNIPERRIFLE_CLIP_01) CPRINTLN(DEBUG_MISSION, "bHadClip = TRUE") bHadClip = TRUE ENDIF ENDIF ENDPROC /// PURPOSE: /// Makes a ped stealth or stop stealth, checks to see if the ped is stealth first /// TODO: MAKE THIS LESS ROBOTIC PROC ALTER_STEALTH(PED_INDEX ped, BOOL bShouldDuck) IF bShouldDuck IF NOT GET_PED_STEALTH_MOVEMENT(ped) CPRINTLN(DEBUG_HUNTING, "HUNTER DUCKING") SET_PED_STEALTH_MOVEMENT(ped, TRUE, "DEFAULT_ACTION") ENDIF ELSE IF GET_PED_STEALTH_MOVEMENT(ped) CPRINTLN(DEBUG_HUNTING, "HUNTER STANDING UP") SET_PED_STEALTH_MOVEMENT(ped, FALSE) ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks to see if the player is near an entity FUNC BOOL IS_PLAYER_AT_ENTITY(ENTITY_INDEX entity, VECTOR vradius) IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_ENTITY_ALIVE(entity) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), entity, vradius) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC SAFE_FADE_OUT() IF NOT IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_OUT(500) ENDIF ENDPROC PROC SAFE_FADE_IN() IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(500) ENDIF ENDPROC PROC RESET_SOUNDS() RETURN_AUDIO() IF IS_AUDIO_SCENE_ACTIVE("HUNTING_02_SETTINGS") STOP_AUDIO_SCENE("HUNTING_02_SETTINGS") STOP_SOUND(iSoundID) RELEASE_SOUND_ID(iSoundID) iSoundID = -1 iSoundDelay = 0 ENDIF // Release audio RELEASE_MISSION_AUDIO_BANK() ENDPROC /// PURPOSE: /// Prints objective to the screen if the objective hasnt already been printed PROC PRINT_OBJ(String sString) PRINT_NOW(sString, DEFAULT_GOD_TEXT_TIME, 0) ENDPROC // Clean up /// PURPOSE: /// Removes every blip in the mission PROC REMOVE_ALL_BLIPS() SAFE_REMOVE_BLIP(mBlip) INT i REPEAT MAX_ELK i SAFE_REMOVE_BLIP(mElk[i].mElkBlip) ENDREPEAT ENDPROC /// PURPOSE: /// PROC DELETE_ALL() //DELETE PEDS IF DOES_ENTITY_EXIST(mHunter) IF IS_ENTITY_ALIVE(mHunter) SET_ENTITY_LOAD_COLLISION_FLAG(mHunter, FALSE) IF DOES_GROUP_EXIST(PLAYER_GROUP_ID()) IF IS_PED_GROUP_MEMBER(mHunter, PLAYER_GROUP_ID()) REMOVE_PED_FROM_GROUP(mHunter) ENDIF ENDIF ENDIF ENDIF SAFE_DELETE_PED(mHunter) INT i = 0 REPEAT MAX_ELKS i SAFE_DELETE_PED(mElk[i].mPed) ENDREPEAT IF DOES_CAM_EXIST(mCam) RENDER_SCRIPT_CAMS(FALSE, FALSE) DESTROY_CAM(mCam) ENDIF IF IS_AUDIO_SCENE_ACTIVE("HUNTING_02_SETTINGS") STOP_AUDIO_SCENE("HUNTING_02_SETTINGS") STOP_SOUND(iSoundID) RELEASE_SOUND_ID(iSoundID) ENDIF RELEASE_MISSION_AUDIO_BANK() ENDPROC /// PURPOSE: /// PROC Script_Cleanup() // Clear the mission title MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE() // Ensure launcher is cleaned up RC_CLEANUP_LAUNCHER() // 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 SET_SCENARIO_TYPE_ENABLED("WORLD_MOUNTAIN_LION_WANDER", TRUE) STOP_SNIPE_AUDIO() LOCAL_RETURN_PLAYERS_GUN() IF IS_AUDIO_SCENE_ACTIVE("HUNTING_02_TRAFFIC_SCENE") STOP_AUDIO_SCENE("HUNTING_02_TRAFFIC_SCENE") ENDIF REMOVE_PED_FOR_DIALOGUE(mHunterConv, 2) REMOVE_PED_FOR_DIALOGUE(mHunterConv, 3) //STOP_AUDIO_SCENE("AMBIENT_HUNTING_MIX") INT i = 0 REPEAT MAX_ELKS i IF DOES_ENTITY_EXIST(mElk[i].mPed) SET_PED_AS_NO_LONGER_NEEDED(mElk[i].mPed) ENDIF ENDREPEAT IF bElkAssetsInMem SET_MODEL_AS_NO_LONGER_NEEDED(A_C_DEER) ENDIF IF DOES_ENTITY_EXIST(mHunter) IF NOT IS_ENTITY_DEAD(mHunter) SET_ENTITY_LOAD_COLLISION_FLAG(mHunter, FALSE) ENDIF IF NOT IS_PED_INJURED(mHunter) CLEAR_PED_TASKS(mHunter) ENDIF ALTER_STEALTH(mHunter, FALSE) SET_PED_AS_NO_LONGER_NEEDED(mHunter) ENDIF IF IS_PED_UNINJURED(PLAYER_PED_ID()) ALTER_STEALTH(PLAYER_PED_ID(), FALSE) ENDIF SERVICES_TOGGLE(TRUE) STOP_AUDIO_SCENE("AMBIENT_HUNTING_MIX") DELETE_ALL() SHUTDOWN_PC_SCRIPTED_CONTROLS() IF bGroupCreated REMOVE_RELATIONSHIP_GROUP(relGroupFriendly) REMOVE_RELATIONSHIP_GROUP(mElkGroup) ENDIF RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE) ENDPROC // PASS / FAIL PROC Script_Passed() CLEAR_PRINTS() //SET_TIME_LAST_HUNTED() // TODO Don't forget to comment this back in!!! KILL_ANY_CONVERSATION() Random_Character_Passed(CP_OJ_HUN2) Script_Cleanup() TERMINATE_THIS_THREAD() ENDPROC /// PURPOSE: /// Checks to see if the Target (entity) was damaged by the sniper rifle PROC CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(ENTITY_INDEX index) IF DOES_ENTITY_EXIST(index) VECTOR pos = GET_ENTITY_COORDS(index) IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, pos, 20) CPRINTLN(DEBUG_HUNTING, "Explosion in sphere..") bShotWithWrongGun = TRUE ENDIF IF IS_PED_UNINJURED(PLAYER_PED_ID()) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(index, PLAYER_PED_ID()) IF NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(index, WEAPONTYPE_SNIPERRIFLE) AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(index, WEAPONTYPE_HEAVYSNIPER) CPRINTLN(DEBUG_HUNTING, "Damaged by non-sniper weapon..") bShotWithWrongGun = TRUE ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Waits for the screen to fade out then updates failed reason PROC FAILED_WAIT_FOR_FADE() SWITCH eSubState CASE SS_INIT CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[m_iTargetElk].mPed) IF NOT bGotFailTimer CLEAR_PRINTS() SAFE_CLEAR_THIS_PRINT("HT_CALL") REMOVE_TEXT_MESSAGE_FEED_ENTRY("HT_TXTMSG") bCanUpdateWindBlip = FALSE REMOVE_ALL_BLIPS() IF bFailForSpooking iFailTimer = GET_GAME_TIMER() + 3000 ELSE iFailTimer = GET_GAME_TIMER() + NICE_LITTLE_PAUSE ENDIF bGotFailTimer = TRUE ELSE IF GET_GAME_TIMER() > iFailTimer AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF eHunterState <> HS_RELEASE_WHEN_OFF_CAMERA AND eHunterState <> HS_NULL IF NOT IS_PED_UNINJURED(mHunter) CPRINTLN(DEBUG_HUNTING, "MISSION_FAILED FR_HUNTER_INJURED") sFailReason = "HT_FAIL4A" ENDIF IF NOT IS_ENTITY_ALIVE(mHunter) CPRINTLN(DEBUG_HUNTING, "MISSION_FAILED FR_HUNTER_KILLED") sFailReason = "HT_FAIL4" ENDIF ENDIF IF DOES_ENTITY_EXIST(mElk[m_iTargetElk].mPed) IF NOT IS_ENTITY_ALIVE(mElk[m_iTargetElk].mPed) IF eFailReason = FR_BAD_SHOT IF bShotWithWrongGun CPRINTLN(DEBUG_HUNTING, "FAILED_WAIT_FOR_FADE changing fail reason. Elk[", m_iTargetElk, "] is dead and the fail reason was ", GET_STRING_FROM_FAIL_REASON(eFailReason)) sFailReason = "HT_WGUN" eFailReason = FR_WRONG_GUN ENDIF ENDIF ENDIF ENDIF IF IS_STRING_NULL_OR_EMPTY(sFailReason) CPRINTLN(DEBUG_HUNTING, "Failed with no reason") Random_Character_Failed() ELSE CPRINTLN(DEBUG_HUNTING, "Failed with reason") Random_Character_Failed_With_Reason(sFailReason) ENDIF eSubState = SS_ACTIVE ENDIF ENDIF BREAK CASE SS_ACTIVE 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(<< -675.7826, 5870.9463, 15.7000 >>, 171.0506) //SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-690.2787, 5835.7700, 15.9219>>, 301.0914) DELETE_ALL() Script_Cleanup() TERMINATE_THIS_THREAD() ELSE // not finished fading out // you may want to handle dialogue etc here. ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Sets the fail reason enum for the mission failed message. PROC SET_FAIL_REASON(INT iFailReason) SWITCH (iFailReason) CASE 0 eFailReason = FR_NONE BREAK CASE 1 eFailReason = FR_HE_SAW_YOU BREAK CASE 2 eFailReason = FR_HE_HEARD_YOU BREAK CASE 3 eFailReason = FR_HE_SMELLED_YOU BREAK CASE 4 eFailReason = FR_HE_SAW_YOU BREAK CASE 5 eFailReason = FR_BAD_SHOT BREAK ENDSWITCH bFailForSpooking = TRUE ENDPROC /// PURPOSE: /// Sets the mission failed reason and sets the mission state to be MS_MISSION_FAILED PROC MISSION_FAILED(FAIL_REASON eFail) CPRINTLN(DEBUG_HUNTING, "MISSION FAILED") DEBUG_PRINTCALLSTACK() KILL_ANY_CONVERSATION() CLEAR_PRINTS() STOP_SNIPE_AUDIO() REMOVE_ALL_BLIPS() IF eMissionState >= MS_KILL_FOURTH_ELK m_iTargetElk = FOURTH_ELK ELIF eMissionState >= MS_KILL_THIRD_ELK m_iTargetElk = THIRD_ELK ELIF eMissionState >= MS_KILL_SECOND_ELK m_iTargetElk = SECOND_ELK ELIF eMissionState >= MS_KILL_FIRST_ELK m_iTargetElk = FIRST_ELK ENDIF IF eHunterState <> HS_NULL IF DOES_ENTITY_EXIST(mHunter) IF NOT IS_PED_UNINJURED(mHunter) CPRINTLN(DEBUG_HUNTING, "MISSION_FAILED FR_HUNTER_INJURED") eFail = FR_HUNTER_INJURED ENDIF IF NOT IS_ENTITY_ALIVE(mHunter) CPRINTLN(DEBUG_HUNTING, "MISSION_FAILED FR_HUNTER_KILLED") eFail = FR_HUNTER_KILLED ENDIF ENDIF ENDIF IF NOT IS_ENTITY_ALIVE(PLAYER_PED_ID()) eFail = FR_NONE ENDIF SWITCH eFail CASE FR_HE_SAW_YOU sFailReason = "HT_FAIL2" BREAK // The elk spotted Trevor. CASE FR_HE_SMELLED_YOU sFailReason = "HT_FAIL1A" BREAK // CASE FR_HE_HEARD_YOU sFailReason = "HT_FAIL3" BREAK CASE FR_HUNTER_KILLED sFailReason = "HT_FAIL4" BREAK CASE FR_HUNTER_INJURED sFailReason = "HT_FAIL4A" BREAK CASE FR_LEFT_HUNTER sFailReason = "HT_FAIL5" BREAK CASE FR_LEFT_HUNT_AREA sFailReason = "HH_FAIL6" BREAK CASE FR_BAD_SHOT sFailReason = "HT_MISS" BREAK CASE FR_WRONG_GUN sFailReason = "HT_WGUN" BREAK CASE FR_CAR_DEAD sFailReason = "HH_FAILCAR" BREAK CASE FAIL_CAR_IN_HUNT_AREA sFailReason = "HH_FAILCARA" BREAK CASE FR_SHOT_DOE sFailReason = "HT_DOE" BREAK CASE FR_INNOCENTS sFailReason = "HT_INNOCENT" BREAK CASE FR_DISOBEYED sFailReason = "HH_FAIL6A" BREAK CASE FR_NONE BREAK ENDSWITCH CPRINTLN(DEBUG_HUNTING, "MISSION_FAILED reason = ", sFailReason) eSubState = SS_INIT eMissionState = MS_MISSION_FAILED ENDPROC // ASSET REQUESTS PROC REQUEST_AUDIO_ASSETS() START_AUDIO_SCENE("HUNTING_02_TRAFFIC_SCENE") ENDPROC PROC REQUEST_MISSION_TEXT() REQUEST_ADDITIONAL_TEXT("HUNT2", MISSION_TEXT_SLOT) REQUEST_ADDITIONAL_TEXT(sTextBlock, MISSION_DIALOGUE_TEXT_SLOT) WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) OR NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT) WAIT(0) ENDWHILE ENDPROC PROC REQUEST_ELK_ASSETS() REQUEST_MODEL(mElkModel) REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_2_ELK_CALLS") REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_2_ELK_VOCALS") REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_MAIN_A") REQUEST_ANIM_DICT("creatures@deer@amb@world_deer_grazing@enter") REQUEST_ANIM_DICT("creatures@deer@amb@world_deer_grazing@idle_a") REQUEST_ANIM_DICT("creatures@deer@amb@world_deer_grazing@exit") REQUEST_ANIM_DICT("creatures@deer@amb@world_deer_grazing@base") WHILE NOT HAS_MODEL_LOADED(mElkModel) OR NOT REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_2_ELK_CALLS") OR NOT REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_2_ELK_VOCALS") OR NOT REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_MAIN_A") OR NOT HAS_ANIM_DICT_LOADED("creatures@deer@amb@world_deer_grazing@enter") OR NOT HAS_ANIM_DICT_LOADED("creatures@deer@amb@world_deer_grazing@idle_a") OR NOT HAS_ANIM_DICT_LOADED("creatures@deer@amb@world_deer_grazing@exit") OR NOT HAS_ANIM_DICT_LOADED("creatures@deer@amb@world_deer_grazing@base") WAIT(0) ENDWHILE bElkAssetsInMem = TRUE ENDPROC // CREATE FUNCTIONS /// PURPOSE: /// Makes the hunter friendly to the player and vice versa. PROC CREATE_REL_GROUP() IF NOT bGroupCreated ADD_RELATIONSHIP_GROUP("FRIENDLIES", relGroupFriendly) SET_PED_RELATIONSHIP_GROUP_HASH(mHunter, relGroupFriendly) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupFriendly, RELGROUPHASH_PLAYER) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, relGroupFriendly) SET_PLAYER_CAN_BE_HASSLED_BY_GANGS(PLAYER_ID(), FALSE) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, relGroupFriendly, RELGROUPHASH_HATES_PLAYER) //SET_PED_CONFIG_FLAG(mHunter, PCF_KeepRelationshipGroupAfterCleanUp, TRUE) ADD_RELATIONSHIP_GROUP("Elk Group", mElkGroup) bGroupCreated = TRUE ENDIF ENDPROC /// PURPOSE: /// Forces the gender of a spawned elk PROC FORCE_ELK_GENDER(PED_INDEX mElkIn, BOOL bIsMale = TRUE) IF bIsMale IF DECOR_EXIST_ON(mElkIn, "doe_elk") DECOR_REMOVE(mElkIn, "doe_elk") ENDIF IF IS_ENTITY_ALIVE(mElkIn) SET_PED_COMPONENT_VARIATION(mElkIn, PED_COMP_SPECIAL, 1, 0) // GIVE HIM ANTLERS ENDIF ELSE IF NOT DECOR_EXIST_ON(mElkIn, "doe_elk") IF IS_ENTITY_ALIVE(mElkIn) SET_PED_COMPONENT_VARIATION(mElkIn, PED_COMP_SPECIAL, 0, 0) ENDIF DECOR_SET_BOOL(mElkIn, "doe_elk", TRUE) ENDIF ENDIF ENDPROC /// PURPOSE: /// Spawns elk at a passed in vector FUNC BOOL SPAWN_ELK_WITH_POS(INT i, ELK_STATE elkstate, VECTOR pos, BOOL RandSpawn = FALSE, BOOL bBlipFade = TRUE) IF NOT DOES_ENTITY_EXIST(mElk[i].mPed) IF SPAWN_ELK(i, elkstate, RandSpawn, bBlipFade) SAFE_TELEPORT_ENTITY(mElk[i].mPed, pos) CPRINTLN(DEBUG_MISSION, "Spawning elk at: ", pos) RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL SPAWNED_THIS_ELK(INT i) IF NOT DOES_ENTITY_EXIST(mElk[i].mPed) IF i = FIRST_ELK IF SPAWN_ELK_WITH_POS(i, ES_ENTER_GRAZE_AND_WAIT_TO_DIE, vElkSpawn[i], FALSE, FALSE) // Don't allow the blip on the first elk to fade. IF IS_ENTITY_ALIVE(mElk[i].mPed) // Force reset the player's call... bPlayerCalling = FALSE SET_ENTITY_HEADING(mElk[i].mPed, fElkHead[i]) FORCE_ELK_GENDER(mElk[i].mPed, TRUE) // First elk is always male //INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mElk[i].mPed) SET_ELK_RANDOM_CALLS_ENABLED(mElk[i], FALSE) SET_ELK_MUST_REPLY_TO_CALL(mElk[i], TRUE) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(mElk[i].mPed) CPRINTLN(DEBUG_HUNTING, "first elk has been spawned") RETURN TRUE ENDIF ENDIF ELSE IF SPAWN_ELK_WITH_POS(i, ES_ENTER_GRAZE_AND_WAIT_TO_DIE, vElkSpawn[i], FALSE, TRUE) // Dont blip these guys until the whistle has been blown. IF IS_ENTITY_ALIVE(mElk[i].mPed) // Force reset the player's call... bPlayerCalling = FALSE SET_ENTITY_HEADING(mElk[i].mPed, fElkHead[i]) SET_ELK_RANDOM_CALLS_ENABLED(mElk[i], FALSE) SET_ENTITY_VISIBLE(mElk[i].mPed, FALSE) IF i = DOE_ELK CPRINTLN(DEBUG_HUNTING, "Forcing Doe") FORCE_ELK_GENDER(mElk[i].mPed, FALSE) ELSE CPRINTLN(DEBUG_HUNTING, "Forcing Buck") FORCE_ELK_GENDER(mElk[i].mPed, TRUE) SET_ELK_MUST_REPLY_TO_CALL(mElk[i], TRUE) ENDIF CLEAR_ENTITY_LAST_DAMAGE_ENTITY(mElk[i].mPed) //INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mElk[i].mPed) RETURN TRUE ENDIF ENDIF ENDIF ELSE //CPRINTLN(DEBUG_MISSION, "SPAWNED_THIS_ELK - Spawned the elk: ", i) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC MAKE_ELK_VISIBLE(INT i) IF DOES_ENTITY_EXIST(mElk[i].mPed) AND NOT IS_ENTITY_VISIBLE(mElk[i].mPed) SET_ENTITY_VISIBLE(mElk[i].mPed, TRUE) ENDIF ENDPROC // ELK FUNCTIONS /// PURPOSE: /// Sets up the elk with thier spawns, heading and gives them a random node number. PROC POPULATE_ELK() vElkSpawn[FIRST_ELK] = <<-588.3788, 5829.8975, 29.0621>> fElkHead[FIRST_ELK] = 319.3601 vElkSpawn[SECOND_ELK] = <<-493.6698, 5880.7144, 27.8661>> fElkHead[SECOND_ELK] = 48.4291 vElkSpawn[THIRD_ELK] = <<-609.3810, 5715.2627, 29.0551>> fElkHead[THIRD_ELK] = 52.5746 vElkSpawn[DOE_ELK] = <<-609.9327, 5713.1172, 29.1666>> fElkHead[DOE_ELK] = 57.7444 vElkSpawn[FOURTH_ELK] = <<-607.8190, 5713.6392, 28.9654>> fElkHead[FOURTH_ELK] = 60.3080 ENDPROC /// PURPOSE: /// Checks if the elk is in the player's line of sight when he's aiming FUNC BOOL IS_ELK_IN_SIGHTS(INT iCurElk) IF IS_PED_UNINJURED(mElk[iCurElk].mPed) IF IS_ENTITY_ON_SCREEN(mElk[iCurElk].mPed) IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), mElk[iCurElk].mPed) IF NOT WOULD_ENTITY_BE_OCCLUDED(mElk[iCurElk].mModel, GET_ENTITY_COORDS(mElk[iCurElk].mPed, FALSE)) RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC // PLAYER FUNCTIONS /// PURPOSE: /// Fails the mission if the player leaves the hunter too far PROC CHECK_PLAYER_FLED() IF IS_PED_UNINJURED(mHunter) IF IS_PED_UNINJURED(PLAYER_PED_ID()) FLOAT fDist = GET_DISTANCE_BETWEEN_ENTITIES(mHunter, PLAYER_PED_ID(), FALSE) IF fDist > 100.0 IF NOT bShownFleeWarning PRINT_OBJ("HT_BAC") bShownFleeWarning = TRUE ENDIF ELSE IF bShownFleeWarning SAFE_CLEAR_THIS_PRINT("HT_BAC") bShownFleeWarning = FALSE ENDIF ENDIF IF fDist > 150.0 MISSION_FAILED(FR_LEFT_HUNTER) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if the player is making too much noise while hunting. PROC CHECK_NOISY_PLAYER() IF IS_PED_UNINJURED(PLAYER_PED_ID()) IF NOT bNoiseDetected AND NOT bCarNoise VECTOR vPos vPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vPos, 40.0) CLEAR_PRINTS() KILL_ANY_CONVERSATION() TASK_WANDER_STANDARD(mHunter) SET_PED_KEEP_TASK(mHunter, TRUE) eHunterState = HS_NULL iNoiseFailDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE bNoiseDetected = TRUE ENDIF IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vElkSpawn[FIRST_ELK]) < CAR_NOISE_RANGE OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vElkSpawn[SECOND_ELK]) < CAR_NOISE_RANGE OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vElkSpawn[THIRD_ELK]) < CAR_NOISE_RANGE CLEAR_PRINTS() KILL_ANY_CONVERSATION() TASK_WANDER_STANDARD(mHunter) SET_PED_KEEP_TASK(mHunter, TRUE) eHunterState = HS_NULL iNoiseFailDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE bCarNoise = TRUE ENDIF ENDIF ELSE IF GET_GAME_TIMER() > iNoiseFailDelay IF bCarNoise MISSION_FAILED(FAIL_CAR_IN_HUNT_AREA) ENDIF IF bNoiseDetected MISSION_FAILED(FR_HE_HEARD_YOU) ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if the player is near the hunter. FUNC BOOL IS_PLAYER_NEAR_HUNTER(FLOAT fRange) FLOAT fDist IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(mHunter) fDist = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(mHunter), FALSE) IF fDist < fRange RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Triggers the hunter's speech if the player is not using the sniper rifle. FUNC BOOL DO_WRONG_GUN_LINE() IF IS_ELK_IN_SIGHTS() AND IS_PLAYER_FREE_AIMING(PLAYER_ID()) AND IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) OR bPlayerCalling IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WGUN", CONV_PRIORITY_MEDIUM) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks that the player is using the correct gun for the mission. FUNC BOOL IS_PLAYER_USING_SNIPER_RIFLE() IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND GET_WEAPONTYPE_GROUP(GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID())) = WEAPONGROUP_SNIPER RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if the bPlayerKilledElkIncorrectly flag is true, and fails the mission /// with the correct fail reason is so. PROC CHECK_FOR_INCORRECT_KILLS() IF bPlayerKillElkIncorrectly MISSION_FAILED(FR_BAD_SHOT) ENDIF ENDPROC /// PURPOSE: /// IF bShotFromWrongPlace is true the mission should fail PROC MONITOR_WRONG_LOC_KILLS() IF bShotFromWrongPlace IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() MISSION_FAILED(FR_BAD_SHOT) ELSE KILL_ANY_CONVERSATION() //Temporary - The hunter will say an angry line be fore the fail, like in hunting 1 ENDIF ENDIF ENDPROC /// PURPOSE: /// Moniters the players distance from the current elk in play (iCurElkSpot) FUNC BOOL PLAYER_IN_CROUCH_DISTANCE(INT i) IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(mElk[i].mPed) FLOAT fNoise = GET_PLAYER_CURRENT_STEALTH_NOISE(PLAYER_ID()) //SK_PRINT_FLOAT("NOISE LEVEL", fNoise) IF fNoise > ACCEPTABLE_NOISE_LEVEL FLOAT dist = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), mElk[i].mPed) IF dist <= SIGHT_RANGE_DUCK_WARN RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Moniters whether the elk is in an area that is drawn from the player to /// a point at SCENT_RANGE_WARN (<<0,60,0>> 60m in front of the player) /// if so the elk is up wind and will smell the player if they where closer. FUNC BOOL PLAYER_APPROACH_UPWIND(INT i) IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(mElk[i].mPed) VECTOR vPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) VECTOR vSmell = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vPos, fWindDirection, SCENT_RANGE_WARN) IF IS_ENTITY_IN_ANGLED_AREA(mElk[i].mPed, vPos, vSmell, 30.0, FALSE, FALSE, TM_ANY) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_RUNNING() IF IS_PED_UNINJURED(PLAYER_PED_ID()) IF IS_PED_RUNNING(PLAYER_PED_ID()) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Shows approproate help text either during the tutorial cutscene or in-game. PROC SHOW_THIS_HELP(INT i) SWITCH i CASE 0 PRINT_HELP("HT_WIND") BREAK // The small arrow shows which direction the wind is blowing. CASE 1 PRINT_HELP("HT_DUCK") BREAK // Press L3 to enter stealth mode CASE 2 PRINT_HELP("HT_CHANGE") BREAK // KEEP AN EYE ON THE WIND DIRECTION AS IT WILL CHANGE OVER TIME CASE 3 PRINT_HELP_FOREVER("HT_CALL") BREAK // Use ~PAD_Y~ to call. This will highlight any elk in the area. CASE 4 PRINT_HELP_FOREVER("HT_CALL") BREAK // Use ~PAD_Y~ to call. This will highlight any elk in the area. CASE 5 PRINT_HELP_FOREVER("HT_CALL") BREAK // Use ~PAD_Y~ to call. This will highlight any elk in the area. CASE 6 PRINT_HELP("HT_MALE") BREAK // Only kill male elk, the ones with antlers. ENDSWITCH //iHelpTextTime = GET_GAME_TIMER() + HELP_TEXT_TIME IF NOT bShownHelp[i] bShownHelp[i] = TRUE ENDIF ENDPROC /// MISSION FUNCTIONS /// PURPOSE: /// Checks to see if PLAYER_IN_CROUCH_DISTANCE() || PLAYER_APPROACH_UPWIND() /// have returned TRUE. /// Then plays the correct conversation to warn the player that they are /// getting close to being spotted by the elk /// Should only be active during the 1st and 2nd elk //PROC MONITER_PLAYERS_APPROACH() // // BOOL bCrouchWarn = PLAYER_IN_CROUCH_DISTANCE() // BOOL bWindWarn = PLAYER_APPROACH_UPWIND() // BOOL bRunningWarn = IS_PLAYER_RUNNING() // // IF bCrouchWarn // AND NOT bWindWarn // DO_WARNING_CONV(CROUCH_WARNING) // ELIF bWindWarn // AND NOT bCrouchWarn // DO_WARNING_CONV(UPWIND_WARNING) // ELIF bCrouchWarn // AND bWindWarn // DO_WARNING_CONV(BOTH_WARNING) // ELIF bRunningWarn // AND NOT bCrouchWarn // AND NOT bWindWarn // DO_WARNING_CONV(RUNNING_WARNING) // ENDIF // // //ENDPROC // HUNTER FUNCTIONS /// PURPOSE: /// Checks to see if the player has killed too many innocents. PROC CHECK_FOR_MURDER() PED_INDEX mPed INT i = 0 IF IS_PED_UNINJURED(mHunter) AND IS_PED_UNINJURED(PLAYER_PED_ID()) IF Has_Ped_Been_Injured() REPEAT Get_Number_Of_Ped_Injured_Events() i IF DOES_ENTITY_EXIST(Get_Index_Of_Injured_Ped(i)) mPed = GET_PED_INDEX_FROM_ENTITY_INDEX(Get_Index_Of_Injured_Ped(i)) IF mPed <> PLAYER_PED_ID() AND mPed <> mHunter IF NOT IS_ENTITY_A_MISSION_ENTITY(mPed) AND IS_ENTITY_A_PED(mPed) AND IS_PED_HUMAN(mPed) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mPed, PLAYER_PED_ID()) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(mPed) iDeadPeds++ ENDIF ENDIF ENDIF ENDIF ENDREPEAT IF iDeadPeds = 1 IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) // Get the hunter to warn the player about killing innocents CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_INNO", CONV_PRIORITY_MEDIUM) ENDIF ELIF iDeadPeds = 2 // If the hunter is close, get the hunter to do his angry fail speech Hunter walks off IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() MISSION_FAILED(FR_INNOCENTS) ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Toggles hunter following Player PROC SET_HUNTER_TO_BUDDY_BEHAVIOUR(BOOL bBuddy) IF IS_PED_UNINJURED(mHunter) IF bBuddy IF DOES_GROUP_EXIST(PLAYER_GROUP_ID()) IF NOT IS_PED_GROUP_MEMBER(mHunter, PLAYER_GROUP_ID()) CLEAR_PED_TASKS(mHunter) SET_PED_AS_GROUP_MEMBER(mHunter, PLAYER_GROUP_ID()) SET_PED_NEVER_LEAVES_GROUP(mHunter, TRUE) ENDIF ENDIF ELSE // Remove hunter from players group. IF IS_PED_GROUP_MEMBER(mHunter, PLAYER_GROUP_ID()) CLEAR_PED_TASKS(mHunter) REMOVE_PED_FROM_GROUP(mHunter) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Adds a friendly blip to the hunter PROC BLIP_HUNTER(BOOL bBig = TRUE, BOOL bFlash = FALSE) IF NOT DOES_BLIP_EXIST(mHunterBlip) mHunterBlip = CREATE_PED_BLIP(mHunter, TRUE, TRUE) ENDIF IF DOES_BLIP_EXIST(mHunterBlip) IF NOT bBig SET_BLIP_SCALE(mHunterBlip, 0.75) ENDIF SET_BLIP_FLASHES(mHunterBlip, bFlash) ENDIF ENDPROC /// PURPOSE: /// Resets all the hunters conversations flags to false PROC RESET_ALL_HUNTER_CONVOS() INT i = 0 REPEAT MAX_HUNTER_CONVOS i bHunterDoneConvo[i] = FALSE ENDREPEAT ENDPROC PROC RESET_ALL_CONVO_FLAGS() INT i = 0 REPEAT MAX_ELK i bShownHuntElkGodText[i] = FALSE bDoneRightGunAimConvo[i] = FALSE bDoneWrongGunAimConvo[i] = FALSE bWarningConvGiven[i] = FALSE bIncreasedHeartStat[i] = FALSE ENDREPEAT ENDPROC /// PURPOSE: /// Plays the hunters advice line if the players approach is good and he is within range of the current target. PROC DO_GUN_ADVICE_CONV(INT i) IF NOT bWarningConvGiven[i] IF bShownHuntElkGodText[i] AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_THIS_PRINT_BEING_DISPLAYED("HT_OBJ") // Make sure we don't trample over the "Hunt the Elk" godtext. AND IS_ENTITY_ON_SCREEN(mElk[i].mPed) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vElkOnePromptAreaOneA, vElkOnePromptAreaOneB, PROMPT_AREA_WIDTH) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vElkTwoPromptAreaOneA, vElkTwoPromptAreaOneB, PROMPT_AREA_WIDTH) IF NOT WOULD_ENTITY_BE_OCCLUDED(mElk[i].mModel, GET_ENTITY_COORDS(mElk[i].mPed, FALSE)) IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE) IF IS_PLAYER_USING_SNIPER_RIFLE() // That's a good distance there... IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_DIST", CONV_PRIORITY_MEDIUM) bWarningConvGiven[i] = TRUE ENDIF ELSE IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WGUN", CONV_PRIORITY_MEDIUM) bWarningConvGiven[i] = TRUE ENDIF ENDIF ELSE IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_NOWEAP", CONV_PRIORITY_MEDIUM) bWarningConvGiven[i] = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Will handle running encouragement lines for the player if he's inactive. FUNC BOOL PROCESS_ENCOURAGEMENT_LINES(INT iElkIdx) IF NOT IS_PLAYER_NEAR_HUNTER(VERY_NEAR_HUNTER_RANGE) CDEBUG3LN(DEBUG_HUNTING, "PROCESS_ENCOURAGEMENT_LINES: Cannot encourage: Player too far to encourage.") iFirstElkTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(ELK1_NO_ACTIVITY_TIME_MIN, ELK1_NO_ACTIVITY_TIME_MAX) RETURN TRUE ENDIF IF (iFirstElkTimer = 0) CDEBUG3LN(DEBUG_HUNTING, "PROCESS_ENCOURAGEMENT_LINES: Cannot encourage: Time 0!") iFirstElkTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(ELK1_NO_ACTIVITY_TIME_MIN, ELK1_NO_ACTIVITY_TIME_MAX) RETURN TRUE ENDIF IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (GET_GAME_TIMER() > iFirstElkTimer) CDEBUG3LN(DEBUG_HUNTING, "PROCESS_ENCOURAGEMENT_LINES: Cannot encourage: Conversed recently.") iFirstElkTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(ELK1_NO_ACTIVITY_TIME_MIN, ELK1_NO_ACTIVITY_TIME_MAX) RETURN TRUE ENDIF IF (GET_GAME_TIMER() > iFirstElkTimer) AND NOT IS_ELK_IN_SIGHTS(iElkIdx) IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_ENC", CONV_PRIORITY_MEDIUM) CDEBUG3LN(DEBUG_HUNTING, "PROCESS_ENCOURAGEMENT_LINES: Encouraging player!") iFirstElkTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(ELK1_NO_ACTIVITY_TIME_MIN, ELK1_NO_ACTIVITY_TIME_MAX) ENDIF ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Triggers the hunters line when the player is aiming at the elk /// Will deliver lines for right and wrong weapon PROC HANDLE_AIM_CONVO(INT i) IF IS_ELK_IN_SIGHTS(i) AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF IS_PLAYER_USING_SNIPER_RIFLE() IF NOT bDoneRightGunAimConvo[i] SWITCH i CASE FIRST_ELK // Go on, put him down IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_KILL1", CONV_PRIORITY_MEDIUM) bDoneRightGunAimConvo[i] = TRUE ENDIF BREAK CASE SECOND_ELK // You got him, pull the trigger IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_KILL2", CONV_PRIORITY_MEDIUM) bDoneRightGunAimConvo[i] = TRUE ENDIF BREAK CASE THIRD_ELK //Now lay him in the shade... IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_KILL3", CONV_PRIORITY_MEDIUM) bDoneRightGunAimConvo[i] = TRUE ENDIF BREAK CASE DOE_ELK // Not the flatheads! IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_DOE", CONV_PRIORITY_MEDIUM) bDoneRightGunAimConvo[i] = TRUE ENDIF BREAK ENDSWITCH ENDIF ELSE IF NOT bDoneWrongGunAimConvo[i] // Woah, use the sniper rifle! IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WGUN", CONV_PRIORITY_MEDIUM) bDoneWrongGunAimConvo[i] = TRUE ENDIF ENDIF ENDIF ENDIF ENDPROC PROC SAFE_DELETE_ALL_ELK() SAFE_DELETE_PED(mElk[FIRST_ELK].mPed) SAFE_DELETE_PED(mElk[SECOND_ELK].mPed) SAFE_DELETE_PED(mElk[THIRD_ELK].mPed) SAFE_DELETE_PED(mElk[DOE_ELK].mPed) ENDPROC FUNC STRING GET_KILL_COMMENT(INT i) STRING sString = "" // Get the last damaged bonetag and saves that out to the player_hunt_data_struct ehitLocation. PED_BONETAG ePedBoneTag IF DOES_ENTITY_EXIST(mElk[i].mPed) GET_PED_LAST_DAMAGE_BONE(mElk[i].mPed, ePedBoneTag) INT iBoneID = ENUM_TO_INT(ePedBoneTag) HIT_LOCATION hitLoc = GET_HIT_LOCATION_FOR_ELK_BONE_ID(iBoneID) SWITCH hitLoc CASE HL_HEART CPRINTLN(DEBUG_HUNTING, "Hunter comment on -> HEART SHOT <-") SWITCH i CASE FIRST_ELK sString = "HT2_HEART1" BREAK CASE SECOND_ELK sString = "HT2_HEART2" BREAK CASE THIRD_ELK sString = "HT2_HEART3" BREAK ENDSWITCH IF NOT bIncreasedHeartStat[i] CPRINTLN(DEBUG_MISSION, "INCREMENT HEART SHOT STAT FOR ELK NUMBER ", i) INFORM_MISSION_STATS_OF_INCREMENT(HU2_ELK_HEADSHOTS) bIncreasedHeartStat[i] = TRUE ENDIF BREAK CASE HL_NECK CPRINTLN(DEBUG_HUNTING, "Hunter comment on -> NECK SHOT <-") SWITCH i CASE FIRST_ELK sString = "HT2_NECK1" BREAK CASE SECOND_ELK sString = "HT2_NECK2" BREAK CASE THIRD_ELK sString = "HT2_NECK3" BREAK ENDSWITCH BREAK CASE HL_HEAD CPRINTLN(DEBUG_HUNTING, "Hunter comment on -> HEAD SHOT <-") SWITCH i CASE FIRST_ELK sString = "HT2_HEAD1" BREAK CASE SECOND_ELK sString = "HT2_HEAD2" BREAK CASE THIRD_ELK sString = "HT2_HEAD3" BREAK ENDSWITCH BREAK CASE HL_BODY CPRINTLN(DEBUG_HUNTING, "Hunter comment on -> BODY SHOT <-") SWITCH i CASE FIRST_ELK sString = "HT2_BODY1" BREAK CASE SECOND_ELK sString = "HT2_BODY2" BREAK CASE THIRD_ELK sString = "HT2_BODY3" BREAK ENDSWITCH BREAK CASE HL_HINDLEG CASE HL_FORELEG CPRINTLN(DEBUG_HUNTING, "Hunter comment on -> LEG SHOT <-") SWITCH i CASE FIRST_ELK sString = "HT2_LEG1" BREAK CASE SECOND_ELK sString = "HT2_LEG2" BREAK CASE THIRD_ELK sString = "HT2_LEG3" BREAK ENDSWITCH BREAK CASE HL_ASS CPRINTLN(DEBUG_HUNTING, "Hunter comment on -> ASS SHOT <-") SWITCH i CASE FIRST_ELK sString = "HT2_REAR1" BREAK CASE SECOND_ELK sString = "HT2_REAR2" BREAK CASE THIRD_ELK sString = "HT2_REAR3" BREAK ENDSWITCH BREAK DEFAULT CPRINTLN(DEBUG_HUNTING, "Hunter comment on -> DEFAULT SHOT <-") SWITCH i CASE FIRST_ELK sString = "HT2_COMP1" BREAK CASE SECOND_ELK sString = "HT2_COMP2" BREAK CASE THIRD_ELK sString = "HT2_COMP3" BREAK ENDSWITCH BREAK ENDSWITCH ENDIF RETURN sString ENDFUNC PROC HANDLE_BLIP_FADE(INT i) IF DOES_BLIP_EXIST(mElk[i].mElkBlip) mElk[i].iBlipAlpha = GET_BLIP_ALPHA(mElk[i].mElkBlip) IF mElk[i].iBlipAlpha < 0.1 IF NOT bGotBlipFadeTime iBlipFadeTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 10000) bGotBlipFadeTime = TRUE ELSE IF GET_GAME_TIMER() > iBlipFadeTime IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_BLOW", CONV_PRIORITY_MEDIUM) bGotBlipFadeTime = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC // HUNTER STATES /// PURPOSE: /// The hunter's state machine. PROC CHECK_HUNTER_STATES() CHECK_FOR_MURDER() SWITCH eHunterState CASE HS_NULL BREAK CASE HS_LEAD_TO_FIRST_ELK SWITCH eHunterSubState CASE HSS_INIT CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_FIRST_ELK - HSS_INIT state") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_FIRST_ELK - Sending hunter to first position.") TASK_FOLLOW_WAYPOINT_RECORDING(mHunter, "HT2_CLE_0_1", iWPR_0_1_Progress, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(mHunter, FALSE) SETTIMERA(0) CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_FIRST_ELK - HSS_INIT -> HSS_ACTIVE") eHunterSubState = HSS_ACTIVE ENDIF BREAK CASE HSS_ACTIVE IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) // Don't start the convo until we are on our way (and the god text has cleared) IF NOT bHunterDoneConvo[HTC_HUNTING_TUT_1] IF TIMERA() > 2500 AND NOT IS_MESSAGE_BEING_DISPLAYED() // What's this thing in my mouth? sCurConvo = "HT_CUT" IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(mHunterConv, sTextBlock, sCurConvo, sCurLine, CONV_PRIORITY_MEDIUM) // Hunter looks at player while talking IF NOT IS_PED_HEADTRACKING_PED(mHunter, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(mHunter, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(sCurLine) sCurLine = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() ENDIF CPRINTLN(DEBUG_HUNTING, "HTC_HUNTING_TUT_1 DONE") bHunterDoneConvo[HTC_HUNTING_TUT_1] = TRUE ENDIF ENDIF ELSE IF NOT bShownHelp[WIND_ARROW_HELP] txtLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL() IF ARE_STRINGS_EQUAL(txtLine, "HT_CUT_6") CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_FIRST_ELK - Activating wind meter, printing help about wind.") bCanUpdateWindBlip = TRUE SHOW_THIS_HELP(WIND_ARROW_HELP) ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(mHunter, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(mHunter, TRUE) eHunterSubState = HSS_CLEANUP ENDIF ENDIF ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(mHunter, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = PERFORMING_TASK iWPR_0_1_Progress = GET_PED_WAYPOINT_PROGRESS(mHunter) ENDIF BLIP_HUNTER(FALSE, FALSE) eHunterSubState = HSS_INIT ePreState = HS_LEAD_TO_FIRST_ELK eHunterState = HS_WAIT_FOR_PLAYER_TO_RETURN CDEBUG2LN(DEBUG_HUNTING, "FOLLOW_TO_FIRST_ELK -- Player too far! Will restore at waypoint: ", iWPR_0_1_Progress) ENDIF BREAK CASE HSS_CLEANUP CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_FIRST_ELK - HSS_CLEANUP") eHunterSubState = HSS_INIT eHunterState = HS_TELL_ABOUT_FIRST_ELK BREAK ENDSWITCH BREAK CASE HS_WAIT_FOR_PLAYER_TO_RETURN IF IS_PLAYER_NEAR_HUNTER(RETURN_HUNTER_RANGE) CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_FOR_PLAYER_TO_RETURN - Player in range! Going back to route in pre-state: ", ePreState) // So we can re-trigger the convo when we return to the hunter KILL_ANY_CONVERSATION() bHunterDoneConvo[HTC_HUNTING_TUT_1] = FALSE bHunterDoneConvo[HTC_LEAD_TO_SECOND_ELK] = FALSE BLIP_HUNTER(FALSE, FALSE) eHunterSubState = HSS_INIT eHunterState = ePreState bGotReturnTime = FALSE ELSE IF IS_THIS_PRINT_BEING_DISPLAYED("HT_BAC") // Reset our time now, so Cletus comments right away. IF NOT bGotReturnTime iReturnTime = 0 bGotReturnTime = TRUE ENDIF IF (iReturnTime = 0) iReturnTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 10000) //bGotReturnTimer = TRUE TASK_STAND_STILL(mHunter, -1) CLEAR_PED_TASKS(mHunter) TASK_TURN_PED_TO_FACE_ENTITY(mHunter, PLAYER_PED_ID()) CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_FOR_PLAYER_TO_RETURN - Tasking hunter to clear tasks, and turn around") IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() sCurLine = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ENDIF ENDIF IF GET_GAME_TIMER() > iReturnTime FLOAT fDistance fDistance = GET_DISTANCE_BETWEEN_PEDS(mHunter, PLAYER_PED_ID()) // Disable subtitles while the objective is up. enumSubtitlesState eDisplaySubs IF IS_THIS_PRINT_BEING_DISPLAYED("HT_BAC") eDisplaySubs = DO_NOT_DISPLAY_SUBTITLES ELSE eDisplaySubs = DISPLAY_SUBTITLES ENDIF // Close enough prompts. IF fDistance < 20.0 // Over here! IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WCAR", CONV_PRIORITY_MEDIUM, eDisplaySubs) iReturnTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 12000) ENDIF ELSE INT iRand iRand = GET_RANDOM_INT_IN_RANGE() IF (iRand < 20000) IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_TOOFAR", CONV_PRIORITY_MEDIUM, eDisplaySubs) iReturnTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 12000) ENDIF ELIF (iRand < 40000) IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_MOVE", CONV_PRIORITY_MEDIUM, eDisplaySubs) iReturnTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 12000) ENDIF ELSE IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WLK1", CONV_PRIORITY_MEDIUM, eDisplaySubs) iReturnTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 12000) ENDIF ENDIF ENDIF ELIF fDistance < 50.0 IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_LEAVE", CONV_PRIORITY_VERY_HIGH, eDisplaySubs) iReturnTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 12000) ENDIF ENDIF ENDIF ENDIF BREAK // Hunter is set here when skipping CASE HS_TELL_ABOUT_FIRST_ELK IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF NOT IS_HELP_MESSAGE_ON_SCREEN() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT bHunterDoneConvo[HTC_ARRIVE_FIRST_ELK] // Alright, this is a prime area here... IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_HUNT", CONV_PRIORITY_MEDIUM) SETTIMERA(0) bHunterDoneConvo[HTC_ARRIVE_FIRST_ELK] = TRUE bHunter_PointedAtHuntingArea = FALSE ENDIF ELIF bHunterDoneConvo[HTC_ARRIVE_FIRST_ELK] IF NOT bHunter_PointedAtHuntingArea AND TIMERA() > 333 IF DOES_ENTITY_EXIST(mHunter) AND NOT IS_ENTITY_DEAD(mHunter) SEQUENCE_INDEX siPoint OPEN_SEQUENCE_TASK(siPoint) TASK_TURN_PED_TO_FACE_COORD(NULL, <<-607.1139, 5851.3716, 23.0589>>) TASK_PLAY_ANIM(NULL, "gestures@m@standing@casual", "gesture_point", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, DEFAULT, AF_SECONDARY|AF_UPPERBODY) CLOSE_SEQUENCE_TASK(siPoint) TASK_PERFORM_SEQUENCE(mHunter, siPoint) CLEAR_SEQUENCE_TASK(siPoint) ENDIF TASK_LOOK_AT_ENTITY(mHunter, PLAYER_PED_ID(), -1, SLF_SLOW_TURN_RATE) bHunter_PointedAtHuntingArea = TRUE ENDIF txtLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL() IF ARE_STRINGS_EQUAL(txtLine, "HT2_HUNT_3") OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() ALTER_STEALTH(mHunter, TRUE) TASK_FOLLOW_NAV_MESH_TO_COORD(mHunter, <<-605.3600, 5856.5493, 22.7741>>, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 239.6328) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(mHunter, FALSE) CDEBUG1LN(DEBUG_HUNTING, "HS_TELL_ABOUT_FIRST_ELK - Hunter going to first elk wait pos.") eHunterState = HS_WAIT_KILL_FIRST_ELK ENDIF ENDIF ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(mHunter, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = PERFORMING_TASK iWPR_0_1_Progress = GET_PED_WAYPOINT_PROGRESS(mHunter) ENDIF eHunterSubState = HSS_INIT ePreState = HS_TELL_ABOUT_FIRST_ELK eHunterState = HS_WAIT_FOR_PLAYER_TO_RETURN ENDIF // If somehow the player kills the elk here, we need to FF so that he gets credit. IF bSpawned1stElk IF NOT IS_PED_UNINJURED(mElk[FIRST_ELK].mPed) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() bHunterDoneConvo[HTC_GOOD_SHOT_FIRST_ELK]= FALSE eHunterState = HS_WAIT_KILL_FIRST_ELK eHunterSubState = HSS_INIT ENDIF ENDIF BREAK CASE HS_WAIT_KILL_FIRST_ELK // We can't print an objective until the hunter is in position 1... IF NOT bHunter_InPosition1 CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_KILL_FIRST_ELK - Waiting for hunter to be in position...") bHunter_InPosition1 = VDIST(GET_ENTITY_COORDS(mHunter), <<-605.3600, 5856.5493, 22.7741>>) < 4.0 TASK_LOOK_AT_ENTITY(mHunter, mElk[FIRST_ELK].mPed, -1, SLF_SLOW_TURN_RATE) ENDIF // Player not has killed the elk yet.... IF IS_PED_UNINJURED(mElk[FIRST_ELK].mPed) CDEBUG2LN(DEBUG_HUNTING, "HS_WAIT_KILL_FIRST_ELK - Elk not yet dead") IF NOT mElk[FIRST_ELK].bIsSpooked IF bShownHuntElkGodText[FIRST_ELK] // Comment if the player is using the right gun or not... DO_GUN_ADVICE_CONV(FIRST_ELK) HANDLE_AIM_CONVO(FIRST_ELK) IF bHunter_InPosition1 CDEBUG2LN(DEBUG_HUNTING, "HS_WAIT_KILL_FIRST_ELK - Cletus in position, can encourage.") PROCESS_ENCOURAGEMENT_LINES(FIRST_ELK) ENDIF ENDIF ELSE // you spooked him! IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_SPOOK", CONV_PRIORITY_LOW) KILL_ANY_CONVERSATION() ALTER_STEALTH(mHunter, FALSE) eHunterState = HS_NULL ENDIF ENDIF ELSE CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_KILL_FIRST_ELK - Elk dead!") // Clear the god text CLEAR_PRINTS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[FIRST_ELK].mPed) IF NOT bShotWithWrongGun AND NOT mElk[FIRST_ELK].bIsSpooked IF NOT bHunterDoneConvo[HTC_GOOD_SHOT_FIRST_ELK] // Boom! Great shot son... sKillString = GET_KILL_COMMENT(FIRST_ELK) IF CREATE_CONVERSATION(mHunterConv, sTextBlock, sKillString, CONV_PRIORITY_MEDIUM) ALTER_STEALTH(mHunter, FALSE) TASK_CLEAR_LOOK_AT(mHunter) TASK_TURN_PED_TO_FACE_ENTITY(mHunter, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(mHunter, PLAYER_PED_ID(), -1) bHunterDoneConvo[HTC_GOOD_SHOT_FIRST_ELK] = TRUE eHunterState = HS_AFTER_KILL_FIRST_ELK ENDIF ENDIF ENDIF ENDIF BREAK CASE HS_AFTER_KILL_FIRST_ELK IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF NOT bHunterDoneConvo[HTC_LEAD_TO_SECOND_ELK] IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_PLAYER_FREE_AIMING(PLAYER_ID()) CDEBUG1LN(DEBUG_HUNTING, "HS_AFTER_KILL_FIRST_ELK -> HS_LEAD_TO_SECOND_ELK") eHunterState = HS_LEAD_TO_SECOND_ELK eHunterSubState = HSS_INIT ENDIF ENDIF ELSE //bGotReturnTimer = FALSE eHunterSubState = HSS_INIT CDEBUG1LN(DEBUG_HUNTING, "HS_AFTER_KILL_FIRST_ELK -> HS_WAIT_FOR_PLAYER_TO_RETURN") ePreState = HS_AFTER_KILL_FIRST_ELK eHunterState = HS_WAIT_FOR_PLAYER_TO_RETURN ENDIF BREAK CASE HS_LEAD_TO_SECOND_ELK SWITCH eHunterSubState CASE HSS_INIT // Alright, stick with me and lead us further in. IF (iWPR_1_2_Progress = 0) CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_SECOND_ELK - Progress 0, will trigger convo about next elk.") IF NOT bHunterDoneConvo[HTC_LEAD_TO_SECOND_ELK] IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WHISTLE2", CONV_PRIORITY_MEDIUM) CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_SECOND_ELK - Convo triggered HT2_WHISTLE2") sCurConvo = "HT2_WHISTLE2" bHunterDoneConvo[HTC_LEAD_TO_SECOND_ELK] = TRUE ENDIF ENDIF ELSE CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_SECOND_ELK - Progress not 0, we'll be picking up the conversation now.") CREATE_CONVERSATION_FROM_SPECIFIC_LINE(mHunterConv, sTextBlock, sCurConvo, sCurLine, CONV_PRIORITY_MEDIUM) ENDIF txtLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL() IF ARE_STRINGS_EQUAL(txtLine, "HT2_WHISTLE2_1") OR (iWPR_1_2_Progress != 0) CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_SECOND_ELK - Tasking the hunter to move while talking about whistling...") ALTER_STEALTH(mHunter, TRUE) TASK_CLEAR_LOOK_AT(mHunter) TASK_FOLLOW_WAYPOINT_RECORDING(mHunter, "HT2_CLE_1_2", iWPR_1_2_Progress, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_TASK_EXACTSTOP) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(mHunter, FALSE) eHunterSubState = HSS_ACTIVE ENDIF BREAK CASE HSS_ACTIVE // Has the hunter go to where he needs to be? IF NOT bHunterDoneConvo[HTC_WHISTLE_TO_SECOND_ELK] IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF GET_SCRIPT_TASK_STATUS(mHunter, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Alright, give it a good blow... IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WHISTLE1", CONV_PRIORITY_MEDIUM) CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_SECOND_ELK - Telling hunter to tell player to whistle...") ALTER_STEALTH(mHunter, FALSE) SEQUENCE_INDEX iSeq OPEN_SEQUENCE_TASK(iSeq) TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), 5000, SLF_WIDEST_YAW_LIMIT, SLF_LOOKAT_VERY_HIGH) TASK_PAUSE(NULL, 5000) TASK_PLAY_ANIM(NULL, "amb@world_human_guard_patrol@male@idle_a", "idle_b", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(iSeq) TASK_PERFORM_SEQUENCE(mHunter, iSeq) CLEAR_SEQUENCE_TASK(iSeq) bHunterDoneConvo[HTC_WHISTLE_TO_SECOND_ELK] = TRUE bPlayerCalling = FALSE ENDIF ENDIF ENDIF ELSE iWPR_1_2_Progress = GET_PED_WAYPOINT_PROGRESS(mHunter) //bGotReturnTimer = FALSE eHunterSubState = HSS_INIT ePreState = HS_LEAD_TO_SECOND_ELK eHunterState = HS_WAIT_FOR_PLAYER_TO_RETURN ENDIF ELSE // If the player has blown the whistle, we need to play the convo where he says it sounds funny. IF NOT bWhistle_CaughtFirst // Intercept the call. Don't allow the elk to respond yet. bWhistle_CaughtFirst = bPlayerCalling bPlayerCalling = FALSE SETTIMERA(0) ELIF bWhistle_CaughtFirst AND NOT bWhistle_WaitingOnConvo // Player's done calling. IF TIMERA() > 2500 IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_COMM", CONV_PRIORITY_MEDIUM) CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_SECOND_ELK - Trevor commenting on elk whistle.") SETTIMERA(0) bWhistle_WaitingOnConvo = TRUE ENDIF ENDIF ELSE eHunterSubState = HSS_CLEANUP ENDIF ENDIF ELIF bWhistle_WaitingOnConvo IF TIMERA() > 5250 CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_SECOND_ELK - Triggering elk to call back...") bPlayerCalling = TRUE eHunterSubState = HSS_CLEANUP ENDIF ENDIF ENDIF BREAK CASE HSS_CLEANUP IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_SECOND_ELK -> HS_WAIT_FIND_SECOND_ELK") eHunterState = HS_WAIT_FIND_SECOND_ELK eHunterSubState = HSS_INIT ENDIF BREAK ENDSWITCH BREAK CASE HS_WAIT_FIND_SECOND_ELK IF DOES_BLIP_EXIST(mElk[SECOND_ELK].mElkBlip) IF NOT bHunterDoneConvo[HTC_DISCOVER_SECOND_ELK] IF NOT bGotResponseDelay TASK_CLEAR_LOOK_AT(mHunter) TASK_TURN_PED_TO_FACE_COORD(mHunter, vElkSpawn[SECOND_ELK]) ALTER_STEALTH(mHunter, FALSE) iResponseDelay = GET_GAME_TIMER() + 2000 bGotResponseDelay = TRUE ELSE IF GET_GAME_TIMER() > iResponseDelay // Okay, you hear that? He's over there... IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WLK2", CONV_PRIORITY_LOW) REPLAY_RECORD_BACK_FOR_TIME(1.0, 5.0) CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_FIND_SECOND_ELK - Telling Trevor to track elk.") bGotBlipFadeTime = FALSE TASK_LOOK_AT_ENTITY(mHunter, mElk[SECOND_ELK].mPed, -1) SETTIMERA(0) bHunterDoneConvo[HTC_DISCOVER_SECOND_ELK] = TRUE CPRINTLN(DEBUG_HUNTING, "HS_WAIT_KILL_SECOND_ELK") eHunterState = HS_WAIT_KILL_SECOND_ELK eHunterSubState = HSS_INIT ENDIF ENDIF ENDIF ENDIF ENDIF // If somehow the player kills the elk here, we need to FF so that he gets credit. IF NOT IS_PED_UNINJURED(mElk[SECOND_ELK].mPed) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() bHunterDoneConvo[HTC_GOOD_SHOT_SECOND_ELK] = FALSE bHunter_TaskedAfterKill2 = FALSE eHunterState = HS_WAIT_KILL_SECOND_ELK eHunterSubState = HSS_INIT ENDIF BREAK CASE HS_WAIT_KILL_SECOND_ELK IF IS_PED_UNINJURED(mElk[SECOND_ELK].mPed) IF NOT bHunter_PointedAtElk2 AND TIMERA() > 1000 VECTOR vBetween vBetween = NORMALISE_VECTOR(GET_ENTITY_COORDS(mElk[SECOND_ELK].mPed) - GET_ENTITY_COORDS(mHunter)) VECTOR vFwd vFwd = GET_ENTITY_FORWARD_VECTOR(mHunter) FLOAT fDot fDot = DOT_PRODUCT(vFwd, vBetween) CDEBUG3LN(DEBUG_HUNTING, "Dot: ", fDot) IF (fDot > 0.92) TASK_PLAY_ANIM(mHunter, "oddjobs@hunter", "point_fwd", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, DEFAULT, AF_SECONDARY|AF_UPPERBODY) bHunter_PointedAtElk2 = TRUE iFirstElkTimer = 0 ENDIF ENDIF IF NOT mElk[SECOND_ELK].bIsSpooked // Hunter can only comment on players actions after the god text has displayed IF bShownHuntElkGodText[SECOND_ELK] IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HT_OBJ") // Don't trample the "Hunt the Elk" text. // Comment if the player is using the right gun or not... DO_GUN_ADVICE_CONV(SECOND_ELK) HANDLE_AIM_CONVO(SECOND_ELK) HANDLE_BLIP_FADE(SECOND_ELK) PROCESS_ENCOURAGEMENT_LINES(SECOND_ELK) ENDIF ENDIF ELSE // You spooked him! IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_SPOOK", CONV_PRIORITY_LOW) KILL_ANY_CONVERSATION() ALTER_STEALTH(mHunter, FALSE) eHunterState = HS_NULL ENDIF ENDIF ELSE CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_KILL_SECOND_ELK - Player killed second elk!") // Clear the god text CLEAR_PRINTS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[SECOND_ELK].mPed) // Player has just killed second elk... IF NOT bHunterDoneConvo[HTC_GOOD_SHOT_SECOND_ELK] IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT bShotWithWrongGun AND NOT mElk[SECOND_ELK].bIsSpooked IF NOT bHunter_TaskedAfterKill2 ALTER_STEALTH(mHunter, FALSE) IF GET_SCRIPT_TASK_STATUS(mHunter, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK TASK_FOLLOW_NAV_MESH_TO_COORD(mHunter, GET_ENTITY_COORDS(PLAYER_PED_ID()), PEDMOVEBLENDRATIO_RUN, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fHunterThirdKillHead) ENDIF sKillString = GET_KILL_COMMENT(SECOND_ELK) bHunter_TaskedAfterKill2 = TRUE ELSE IF IS_PLAYER_NEAR_HUNTER(VERY_NEAR_HUNTER_RANGE) CLEAR_PED_TASKS(mHunter) TASK_LOOK_AT_ENTITY(mHunter, PLAYER_PED_ID(), -1) // Good kill, son! IF CREATE_CONVERSATION(mHunterConv, sTextBlock, sKillString, CONV_PRIORITY_MEDIUM) iTimerDelay = GET_GAME_TIMER() + 10000 bHunterDoneConvo[HTC_GOOD_SHOT_SECOND_ELK] = TRUE CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_KILL_SECOND_ELK - Cletus commenting on Elk Kill #2, -> HS_AFTER_KILL_SECOND_ELK") REPLAY_RECORD_BACK_FOR_TIME(2.5, 5.0, REPLAY_IMPORTANCE_HIGHEST) eHunterState = HS_AFTER_KILL_SECOND_ELK eHunterSubState = HSS_INIT ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE HS_AFTER_KILL_SECOND_ELK IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF NOT bHunterDoneConvo[HTC_LEAD_TO_THIRD_ELK] IF NOT IS_PED_INJURED(mHunter) CLEAR_PED_TASKS(mHunter) TASK_CLEAR_LOOK_AT(mHunter) ENDIF eHunterSubState = HSS_INIT eHunterState = HS_LEAD_TO_THIRD_ELK ENDIF ENDIF ENDIF BREAK CASE HS_LEAD_TO_THIRD_ELK SWITCH eHunterSubState CASE HSS_INIT IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) // Alright, stick with me and lead us further in. IF (iWPR_2_3_Progress = 0) IF NOT bHunterDoneConvo[HTC_LEAD_TO_THIRD_ELK] IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT_PAIR", CONV_PRIORITY_MEDIUM) sCurConvo = "HT_PAIR" bHunterDoneConvo[HTC_LEAD_TO_THIRD_ELK] = TRUE ENDIF ENDIF ELSE CREATE_CONVERSATION_FROM_SPECIFIC_LINE(mHunterConv, sTextBlock, sCurConvo, sCurLine, CONV_PRIORITY_MEDIUM) ENDIF CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_THIRD_ELK - Telling Cletus to start moving...") ALTER_STEALTH(mHunter, TRUE) TASK_LOOK_AT_COORD(mHunter, vElkSpawn[THIRD_ELK], -1) TASK_FOLLOW_WAYPOINT_RECORDING(mHunter, "HT2_CLE_2_3", iWPR_2_3_Progress, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT) eHunterSubState = HSS_ACTIVE ENDIF BREAK CASE HSS_ACTIVE // Remember, we're only here for the male elk.. IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT bHunterDoneConvo[HTC_WHISTLE_TO_THIRD_ELK] IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT_LEAD3", CONV_PRIORITY_LOW) CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_THIRD_ELK - Cletus talking about Males only...") bHunterDoneConvo[HTC_WHISTLE_TO_THIRD_ELK] = TRUE ENDIF ENDIF ENDIF IF GET_SCRIPT_TASK_STATUS(mHunter, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) TASK_CLEAR_LOOK_AT(mHunter) TASK_TURN_PED_TO_FACE_ENTITY(mHunter, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(mHunter, PLAYER_PED_ID(), -1) eHunterSubState = HSS_CLEANUP ENDIF ENDIF ELSE IF eMissionState = MS_FOLLOW_TO_THIRD_ELK iWPR_2_3_Progress = GET_PED_WAYPOINT_PROGRESS(mHunter) //bGotReturnTimer = FALSE eHunterSubState = HSS_INIT ePreState = HS_LEAD_TO_THIRD_ELK eHunterState = HS_WAIT_FOR_PLAYER_TO_RETURN ELSE CDEBUG1LN(DEBUG_HUNTING, "HS_LEAD_TO_THIRD_ELK moving to substate cleanup, mission is no longer in this state.") eHunterSubState = HSS_CLEANUP ENDIF ENDIF BREAK CASE HSS_CLEANUP eHunterSubState = HSS_INIT eHunterState = HS_WAIT_FIND_THIRD_ELK BREAK ENDSWITCH BREAK CASE HS_WAIT_FIND_THIRD_ELK IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND DOES_BLIP_EXIST(mElk[THIRD_ELK].mElkBlip) IF NOT bHunter_WaitWhistleKill3 CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_FIND_THIRD_ELK - Caught whistle, triggering NICE_LITTLE_PAUSE") SETTIMERA(0) bHunter_WaitWhistleKill3 = TRUE ELIF TIMERA() > NICE_LITTLE_PAUSE IF NOT bHunterDoneConvo[HTC_DISCOVER_THIRD_ELK] // Same as before boy... IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_ARR3", CONV_PRIORITY_LOW) CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_FIND_THIRD_ELK - Cletus speech: 'Same as before...'") REPLAY_RECORD_BACK_FOR_TIME(2.0, 5.0, REPLAY_IMPORTANCE_HIGH) SAFE_REMOVE_BLIP(mHunterBlip) bHunterDoneConvo[HTC_DISCOVER_THIRD_ELK] = TRUE ALTER_STEALTH(mHunter, TRUE) GROUP_INDEX giPlayer giPlayer = GET_PED_GROUP_INDEX(PLAYER_PED_ID()) SET_PED_AS_GROUP_MEMBER(mHunter, giPlayer) // IS_PED_IN_GROUP // TASK_FOLLOW_TO_OFFSET_OF_ENTITY(mHunter, PLAYER_PED_ID(), <<0.1, -5.0, 0.0>>, PEDMOVEBLENDRATIO_WALK, -1, 7.0) iFirstElkTimer = 0 eHunterSubState = HSS_INIT eHunterState = HS_WAIT_KILL_THIRD_ELK ENDIF ENDIF ENDIF ENDIF // If the player kills the elk before Cletus is ready... IF DOES_ENTITY_EXIST(mElk[THIRD_ELK].mPed) IF NOT IS_PED_UNINJURED(mElk[THIRD_ELK].mPed) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() bHunterDoneConvo[HTC_GOOD_SHOT_THIRD_ELK] = FALSE bHunter_TaskedAfterKill2 = FALSE eHunterState = HS_WAIT_KILL_THIRD_ELK eHunterSubState = HSS_INIT BREAK ENDIF ENDIF IF DOES_ENTITY_EXIST(mElk[DOE_ELK].mPed) IF NOT IS_PED_UNINJURED(mElk[DOE_ELK].mPed) // I said no females! KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_SHDOE", CONV_PRIORITY_MEDIUM) IF NOT IS_PED_INJURED(mHunter) ALTER_STEALTH(mHunter, FALSE) CLEAR_PED_TASKS(mHunter) TASK_WANDER_STANDARD(mHunter) SET_PED_KEEP_TASK(mHunter, TRUE) MISSION_FAILED(FR_SHOT_DOE) eHunterState = HS_NULL BREAK ENDIF ENDIF ENDIF ENDIF BREAK CASE HS_WAIT_KILL_THIRD_ELK IF IS_PED_UNINJURED(mElk[THIRD_ELK].mPed) IF NOT mElk[THIRD_ELK].bIsSpooked // Make the hunter stand up and leg it if the player kill wrong elk. IF NOT IS_PED_UNINJURED(mElk[DOE_ELK].mPed) CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_FIND_THIRD_ELK - Player killed doe elk!!!") // I said no females! IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_SHDOE", CONV_PRIORITY_MEDIUM) IF NOT IS_PED_INJURED(mHunter) ALTER_STEALTH(mHunter, FALSE) CLEAR_PED_TASKS(mHunter) TASK_WANDER_STANDARD(mHunter) SET_PED_KEEP_TASK(mHunter, TRUE) MISSION_FAILED(FR_SHOT_DOE) eHunterState = HS_NULL ENDIF ENDIF ENDIF IF bShownHuntElkGodText[THIRD_ELK] AND NOT IS_THIS_PRINT_BEING_DISPLAYED("HT_OBJ") // Comment if the player is using the right gun or not... DO_GUN_ADVICE_CONV(THIRD_ELK) HANDLE_AIM_CONVO(THIRD_ELK) HANDLE_AIM_CONVO(DOE_ELK) HANDLE_BLIP_FADE(THIRD_ELK) PROCESS_ENCOURAGEMENT_LINES(THIRD_ELK) ENDIF ELSE // You spooked him! IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_SPOOK", CONV_PRIORITY_LOW) CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_FIND_THIRD_ELK - Player spooked third elk!") KILL_ANY_CONVERSATION() ALTER_STEALTH(mHunter, FALSE) eHunterState = HS_NULL ENDIF ENDIF ELSE CDEBUG1LN(DEBUG_HUNTING, "HS_WAIT_FIND_THIRD_ELK - Player killed third elk!") // Clear the god text CLEAR_PRINTS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[THIRD_ELK].mPed) IF NOT bShotWithWrongGun // Boom, good kill son! IF NOT bHunterDoneConvo[HTC_GOOD_SHOT_THIRD_ELK] sKillString = GET_KILL_COMMENT(THIRD_ELK) IF CREATE_CONVERSATION(mHunterConv, sTextBlock, sKillString, CONV_PRIORITY_MEDIUM) CLEAR_PED_TASKS_IMMEDIATELY(mHunter) ALTER_STEALTH(mHunter, FALSE) bHunterDoneConvo[HTC_GOOD_SHOT_THIRD_ELK] = TRUE ENDIF ELSE IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT bHunterDoneConvo[HTC_TELL_ABOUT_TEXTING] // Right, you're on your own for this last elk... IF CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_WLKOFF", CONV_PRIORITY_MEDIUM) IF NOT IS_PED_INJURED(mHunter) CLEAR_PED_TASKS(mHunter) TASK_TURN_PED_TO_FACE_ENTITY(mHunter, PLAYER_PED_ID(), -1) TASK_LOOK_AT_ENTITY(mHunter, PLAYER_PED_ID(), -1) bHunterDoneConvo[HTC_TELL_ABOUT_TEXTING] = TRUE REPLAY_RECORD_BACK_FOR_TIME(2.0, 5.0, REPLAY_IMPORTANCE_HIGHEST) eHunterState = HS_AFTER_KILL_THIRD_ELK ENDIF ENDIF ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(mHunter, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK TASK_FOLLOW_NAV_MESH_TO_COORD(mHunter, mElk[THIRD_ELK].vPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fHunterThirdKillHead) ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE HS_AFTER_KILL_THIRD_ELK txtLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR ARE_STRINGS_EQUAL(txtLine, "HT2_WLKOFF_4") TASK_CLEAR_LOOK_AT(mHunter) SAFE_REMOVE_BLIP(mHunterBlip) ALTER_STEALTH(mHunter, FALSE) TASK_FOLLOW_NAV_MESH_TO_COORD(mHunter, vHunterStartPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fHunterThirdKillHead) eHunterState = HS_RELEASE_WHEN_OFF_CAMERA ENDIF BREAK CASE HS_RELEASE_WHEN_OFF_CAMERA IF DOES_ENTITY_EXIST(mHunter) IF IS_ENTITY_OCCLUDED(mHunter) AND NOT IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) SET_PED_AS_NO_LONGER_NEEDED(mHunter) SAFE_DELETE_PED(mHunter) eHunterState = HS_NULL ELSE IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) // Monitor the player following Cletus... IF (iCletusFollowTimer = 0) iCletusFollowTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(CLETUS_FOLLOW_COMMENT_MIN, CLETUS_FOLLOW_COMMENT_MAX) ELSE IF iCletusFollowTimer < GET_GAME_TIMER() CLEAR_PED_TASKS(mHunter) TASK_TURN_PED_TO_FACE_ENTITY(mHunter, PLAYER_PED_ID(), -1) TASK_LOOK_AT_ENTITY(mHunter, PLAYER_PED_ID(), -1) SETTIMERA(0) eHunterState = HS_YELL_AT_PLAYER_FOLLOWING ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE HS_YELL_AT_PLAYER_FOLLOWING IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) VECTOR vBetween vBetween = NORMALISE_VECTOR(GET_ENTITY_COORDS(PLAYER_PED_ID()) - GET_ENTITY_COORDS(mHunter)) VECTOR vFwd vFwd = GET_ENTITY_FORWARD_VECTOR(mHunter) FLOAT fDot fDot = DOT_PRODUCT(vFwd, vBetween) CDEBUG3LN(DEBUG_HUNTING, "Dot: ", fDot) IF fDot > 0.92 IF NOT bHunter_WaitToLeave IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CREATE_CONVERSATION(mHunterConv, sTextBlock, "HT2_PLYFOL", CONV_PRIORITY_MEDIUM) iCletusFollowTimer = 0 SETTIMERA(0) bHunter_WaitToLeave = TRUE ENDIF ELSE IF TIMERA() > 1750 TASK_FOLLOW_NAV_MESH_TO_COORD(mHunter, vHunterStartPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fHunterThirdKillHead) eHunterState = HS_RELEASE_WHEN_OFF_CAMERA ENDIF ENDIF ENDIF ELSE IF NOT bHunter_WaitToLeave SETTIMERA(0) bHunter_WaitToLeave = TRUE ELSE IF TIMERA() > 500 TASK_FOLLOW_NAV_MESH_TO_COORD(mHunter, vHunterStartPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fHunterThirdKillHead) eHunterState = HS_RELEASE_WHEN_OFF_CAMERA ENDIF ENDIF ENDIF BREAK ENDSWITCH IF DOES_ENTITY_EXIST(mHunter) IF eMissionState != MS_MISSION_FAILED // AND eHunterState != HS_RELEASE_WHEN_OFF_CAMERA AND eHunterState != HS_NULL IF NOT bGotFailDelay IF IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID()) OR IS_PED_PERFORMING_MELEE_ACTION(PLAYER_PED_ID()) IF IS_PED_RAGDOLL(mHunter) KILL_ANY_CONVERSATION() iFailDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE bGotFailDelay = TRUE ENDIF ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mHunter, PLAYER_PED_ID()) OR HAS_PED_BEEN_DAMAGED_BY_WEAPON(mHunter, WEAPONTYPE_INVALID , GENERALWEAPON_TYPE_ANYWEAPON) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(mHunter, FALSE), 10.0) KILL_ANY_CONVERSATION() iFailDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE bGotFailDelay = TRUE ENDIF ELSE IF GET_GAME_TIMER() > iFailDelay IF NOT IS_PED_INJURED(mHunter) CLEAR_PED_TASKS(mHunter) TASK_SMART_FLEE_PED(mHunter, PLAYER_PED_ID(), 100, -1) SET_PED_KEEP_TASK(mHunter, TRUE) ENDIF IF NOT IS_ENTITY_DEAD(mHunter) CPRINTLN(DEBUG_MISSION, "Mission Failed hunter injured Called from Hunter state ") MISSION_FAILED(FR_HUNTER_INJURED) ELSE CPRINTLN(DEBUG_MISSION, "Mission Failed hunter killed Called from hunter state ") MISSION_FAILED(FR_HUNTER_KILLED) ENDIF eHunterState = HS_NULL ENDIF ENDIF ENDIF ENDIF ENDPROC // PLAYER STATES /// PURPOSE: /// Initiate the mission variables and states. PROC INIT_MISSION() SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) SET_PLAYER_CAN_BE_HASSLED_BY_GANGS(PLAYER_ID(), FALSE) SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), TRUE) SET_SCENARIO_TYPE_ENABLED("WORLD_MOUNTAIN_LION_WANDER", FALSE) INIT_PC_SCRIPTED_CONTROLS("HUNTING ELK CALL") ADD_PED_FOR_DIALOGUE(mHunterConv, 2, PLAYER_PED_ID(), "TREVOR") ADD_PED_FOR_DIALOGUE(mHunterConv, 3, mHunter, "CLETUS") CREATE_REL_GROUP() POPULATE_ELK() REQUEST_MISSION_TEXT() REQUEST_ELK_ASSETS() SERVICES_TOGGLE(FALSE) RESET_ALL_HUNTER_CONVOS() RESET_ALL_CONVO_FLAGS() REQUEST_AUDIO_ASSETS() // Comment this back in once it made it into the build. //START_AUDIO_SCENE("AMBIENT_HUNTING_MIX") REQUEST_STREAMED_TEXTURE_DICT("Hunting") REQUEST_ANIM_DICT("facials@p_m_one@variations@elkcall") REQUEST_ANIM_DICT("gestures@m@standing@casual") REQUEST_ANIM_DICT("amb@world_human_guard_patrol@male@idle_a") REQUEST_ANIM_DICT("oddjobs@hunter") REQUEST_WAYPOINT_RECORDING("HT2_CLE_0_1") REQUEST_WAYPOINT_RECORDING("HT2_CLE_1_2") REQUEST_WAYPOINT_RECORDING("HT2_CLE_2_3") ADD_CONTACT_TO_PHONEBOOK(CHAR_HUNTER, TREVOR_BOOK, FALSE) IF NOT IS_PED_INJURED(mHunter) SET_PED_DIES_IN_WATER(mHunter, FALSE) SET_PED_DEFAULT_COMPONENT_VARIATION(mHunter) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(mHunter, TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(mHunter, FALSE) GIVE_WEAPON_TO_PED(mHunter, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO, FALSE) ENDIF bAllowCall = FALSE bSuppressNearMissMessage = TRUE fWindDirection = 0.0 START_AUDIO_SCENE("AMBIENT_HUNTING_MIX") // Block all those damn bushes. ADD_NAVMESH_BLOCKING_OBJECT(<<-641.6511, 5846.5786, 20.3501>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-642.2120, 5851.6021, 19.9536>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-627.1213, 5833.1846, 22.5278>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-636.4395, 5829.7349, 22.0155>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-607.6405, 5834.4507, 24.6594>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-594.2007, 5834.4136, 27.2229>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-589.8816, 5832.7466, 28.4124>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-586.3449, 5834.0439, 29.0145>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-581.4914, 5839.4307, 29.0466>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-587.1396, 5844.6973, 27.3273>>, << 3, 3, 3>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-601.9974, 5850.2031, 24.0529>>, << 4, 4, 4>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-634.3944, 5857.5425, 20.5354>>, << 4, 4, 4>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-637.6848, 5858.0264, 20.1080>>, << 2, 2, 2>>, 0.0) ADD_NAVMESH_BLOCKING_OBJECT(<<-599.4448, 5841.0630, 25.5058>>, << 3, 3, 3>>, 0.0) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "STARTING WIND DIRECTION IS ", fWindDirection) #ENDIF #IF IS_DEBUG_BUILD s_skip_menu[0].sTxtLabel = "Go to Hunting Location" s_skip_menu[1].sTxtLabel = "First Elk" s_skip_menu[2].sTxtLabel = "Second Elk" s_skip_menu[3].sTxtLabel = "Third Elk" s_skip_menu[4].sTxtLabel = "Fourth Elk" #ENDIF INT iReplayState IF IS_REPLAY_IN_PROGRESS() CPRINTLN(DEBUG_MISSION, "*Replay in progress*") iReplayState = GET_REPLAY_MID_MISSION_STAGE() eSubState = SS_INIT // Allow shit skipping past the intro. IF g_bShitSkipAccepted //AND iReplayState > CP_AFTER_INTRO iReplayState++ ENDIF CLEAR_PRINTS() KILL_ANY_CONVERSATION() RESET_ALL_HUNTER_CONVOS() RESET_ALL_CONVO_FLAGS() CPRINTLN(DEBUG_MISSION, "iReplay State = ", iReplayState) SWITCH iReplayState CASE CP_AFTER_INTRO CPRINTLN(DEBUG_MISSION, "REPLAY IN PROGRESS - MS_SET_UP_AFTER_INTRO") START_REPLAY_SETUP(vPlayerStartPos, fPlayerStartHead) // needs to be a point after the mocap has played. eMissionState = MS_SET_UP_AFTER_INTRO BREAK CASE CP_AFTER_TUTORIAL CPRINTLN(DEBUG_MISSION, "REPLAY IN PROGRESS - CP_AFTER_TUTORIAL") START_REPLAY_SETUP(vPlayerStartHuntPos, fPlayerStartHuntHead) eMissionState = MS_SET_UP_BEFORE_FIRST_ELK BREAK CASE CP_AFTER_FIRST_ELK CPRINTLN(DEBUG_MISSION, "REPLAY IN PROGRESS - CP_AFTER_FIRST_ELK") START_REPLAY_SETUP(vPlayerFirstKillPos, fPlayerFirstKillHead) eMissionState = MS_SET_UP_BEFORE_SECOND_ELK BREAK CASE CP_AFTER_SECOND_ELK CPRINTLN(DEBUG_MISSION, "REPLAY IN PROGRESS - CP_AFTER_SECOND_ELK") START_REPLAY_SETUP(vPlayerSecondKillPos, fPlayerSecondKillHead) eMissionState = MS_SET_UP_BEFORE_THIRD_ELK BREAK CASE CP_AFTER_THIRD_ELK CPRINTLN(DEBUG_MISSION, "REPLAY IN PROGRESS - CP_AFTER_THIRD_ELK") START_REPLAY_SETUP(vPlayerThirdKillPos, fPlayerThirdKillHead) eMissionState = MS_SET_UP_BEFORE_FOURTH_ELK BREAK CASE CP_AFTER_FOURTH_ELK CPRINTLN(DEBUG_MISSION, "REPLAY IN PROGRESS - CP_AFTER_FOURTH_ELK") START_REPLAY_SETUP(vPlayerSecondKillPos, fPlayerSecondKillHead) eMissionState = MS_SET_UP_BEFORE_MISSION_PASS BREAK DEFAULT SCRIPT_ASSERT("Replay in progress - unknown checkpoint selected") BREAK ENDSWITCH ELSE CPRINTLN(DEBUG_HUNTING, "MS_RUN_INTRO") eHunterState = HS_NULL eMissionState = MS_RUN_INTRO eSubState = SS_INIT ENDIF ENDPROC // Mission Player States PROC RUN_INTRO() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT //IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-681.3436, 5843.4287, 16.9395>>) < 2.0 iCutSceneState = 0 RC_REQUEST_CUTSCENE("HUN_2_MCS_1") CPRINTLN(DEBUG_HUNTING, "RUN_INTRO Active") eSubState = SS_ACTIVE //ENDIF BREAK CASE SS_ACTIVE SWITCH iCutSceneState CASE 0 CPRINTLN(DEBUG_HUNTING, "INTRO: SS_ACTIVE") IF RC_IS_CUTSCENE_OK_TO_START() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sTrevor, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_HUNTING, "Registered Trevor for intro") ENDIF IF IS_ENTITY_ALIVE(mHunter) REGISTER_ENTITY_FOR_CUTSCENE(mHunter, "Cletus", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cletus", PLAYER_PED_ID()) mCletusGun = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(mHunter, WEAPONTYPE_PUMPSHOTGUN) mTrevorGun = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(mHunter, WEAPONTYPE_SNIPERRIFLE) GIVE_WEAPON_COMPONENT_TO_WEAPON_OBJECT(mTrevorGun, WEAPONCOMPONENT_AT_AR_SUPP_02) CPRINTLN(DEBUG_HUNTING, "Registered Cletus for intro") ENDIF IF DOES_ENTITY_EXIST(mCletusGun) REGISTER_ENTITY_FOR_CUTSCENE(mCletusGun, "Cletus_Gun", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_HUNTING, "Registered Cletus gun for intro") ENDIF IF DOES_ENTITY_EXIST(mTrevorGun) REGISTER_ENTITY_FOR_CUTSCENE(mTrevorGun, "Trevors_Weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_HUNTING, "Registered trevors gun for intro") ENDIF // Start mocap scene RC_CLEANUP_LAUNCHER() START_CUTSCENE() REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) WAIT(0) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(vResolveAreaA, vResolveAreaB, RESOLVE_AREA_WIDTH, vResolvePos, fResolveHead) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(vResolveAreaA, vResolveAreaC, RESOLVE_AREA_WIDTH_LARGE, vResolvePos, fResolveHead) RC_START_CUTSCENE_MODE(vPlayerStartPos, TRUE, FALSE) iCutsceneState++ ENDIF BREAK CASE 1 CPRINTLN(DEBUG_HUNTING, "INTRO: CASE 1") IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Cletus", P_CLETUS_NECKLACE_S) IF NOT bHunterStartedWalking CPRINTLN(DEBUG_HUNTING, "Hunter started walking in CASE 1") //SAFE_TELEPORT_ENTITY(mHunter, vHunterStartPos, fHunterStartHead) eHunterState = HS_LEAD_TO_FIRST_ELK bHunterStartedWalking = TRUE ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_Weapon", GET_WEAPONTYPE_MODEL(WEAPONTYPE_SNIPERRIFLE)) CPRINTLN(DEBUG_HUNTING, "giving weapon object to player ") GIVE_WEAPON_OBJECT_TO_PED(mTrevorGun, PLAYER_PED_ID()) IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, GENERALWEAPON_TYPE_INVALID) SET_AMMO_IN_CLIP(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, 10) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Cletus_Gun", GET_WEAPONTYPE_MODEL(WEAPONTYPE_SNIPERRIFLE)) GIVE_WEAPON_OBJECT_TO_PED(mCletusGun, mHunter) FORCE_PED_MOTION_STATE(mHunter, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sTrevor) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK, 2500) //FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) bSetIntroExitState = TRUE ENDIF // unfortunately the only way to ensure the mocap camera blends out to gameplay cam at a sensible position // is to spam this until the player's character exit state has fired IF NOT bSetIntroExitState RESET_CAM() ENDIF IF HAS_CUTSCENE_FINISHED() REPLAY_STOP_EVENT() CPRINTLN(DEBUG_HUNTING, "INTRO: CUTSCENE FINISHED IN CASE 1") iCutsceneState++ ENDIF BREAK CASE 2 CPRINTLN(DEBUG_HUNTING, "INTRO: CASE 2") IF WAS_CUTSCENE_SKIPPED() AND IS_SCREEN_FADED_OUT() CPRINTLN(DEBUG_HUNTING, "WARPING HUNTER TO CUTSCENE SKIP POS") SAFE_TELEPORT_ENTITY(mHunter, vHunterStartPos, fHunterStartHead) eHunterState = HS_LEAD_TO_FIRST_ELK //SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, TRUE) ENDIF IF NOT IS_CUTSCENE_PLAYING() CPRINTLN(DEBUG_HUNTING, "CUTSCENE IS NOT PLAYING") iCutsceneState++ ENDIF BREAK CASE 3 CPRINTLN(DEBUG_HUNTING, "INTRO: CASE 3") IF IS_CUTSCENE_PLAYING() STOP_CUTSCENE() ELSE IF HAS_CUTSCENE_LOADED() REMOVE_CUTSCENE() ENDIF IF NOT bHunterStartedWalking CPRINTLN(DEBUG_HUNTING, "Hunter start walking from CASE 3") eHunterState = HS_LEAD_TO_FIRST_ELK ENDIF RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE, FALSE) RC_END_CUTSCENE_MODE(TRUE, FALSE) eSubState = SS_CLEANUP ENDIF BREAK ENDSWITCH BREAK CASE SS_SKIPPED SAFE_FADE_OUT() KILL_ANY_CONVERSATION() IF IS_SCREEN_FADED_OUT() IF IS_PED_UNINJURED(mHunter) IF NOT bHunterStartedWalking CLEAR_PED_TASKS(mHunter) IF HAS_PED_GOT_WEAPON(mHunter, WEAPONTYPE_PUMPSHOTGUN) SET_CURRENT_PED_WEAPON(mHunter, WEAPONTYPE_PUMPSHOTGUN, TRUE) ENDIF SAFE_TELEPORT_ENTITY(mHunter, vHunterStartPos, fHunterStartHead) eHunterState = HS_LEAD_TO_FIRST_ELK bHunterStartedWalking = TRUE ENDIF ENDIF IF IS_PED_UNINJURED(PLAYER_PED_ID()) CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF RESET_CAM() CPRINTLN(DEBUG_HUNTING, "SS_CLEANUP") eSubState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP //RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE, FALSE) BLIP_HUNTER(TRUE, FALSE) SAFE_FADE_IN() // Follow Cletus PRINT_NOW("HT_FOLLOW", 6500, 0) CPRINTLN(DEBUG_HUNTING, "SET_REPLAY_MID_MISSION_STAGE_WITH_NAME = CP_AFTER_INTRO") SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_INTRO, "Mocap Intro Done") CPRINTLN(DEBUG_HUNTING, "MS_FOLLOW_TO_FIRST_ELK") eMissionState = MS_FOLLOW_TO_FIRST_ELK eSubState = SS_INIT BREAK ENDSWITCH ENDPROC // Should be a point after the intro mocap has played... PROC SET_UP_AFTER_INTRO() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT SAFE_FADE_OUT() CPRINTLN(DEBUG_HUNTING, "SET_UP_AFTER_INTRO - SS_ACTIVE") eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE IF IS_SCREEN_FADED_OUT() IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerStartPos, fPlayerStartHead) WAIT_FOR_WORLD_TO_LOAD(vPlayerStartPos) RESET_CAM() ENDIF SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_INTRO, "Mocap Intro Done") SAFE_TELEPORT_ENTITY(mHunter, vHunterStartPos, fHunterStartHead) RESET_ALL_HUNTER_CONVOS() SAFE_GIVE_SNIPER_TO_PLAYER() CPRINTLN(DEBUG_HUNTING, "SET_UP_AFTER_INTRO - SS_CLEANUP") eSubState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP END_REPLAY_SETUP() SAFE_FADE_IN() BLIP_HUNTER(TRUE, FALSE) eHunterState = HS_LEAD_TO_FIRST_ELK eHunterSubState = HSS_INIT SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) // Follow Cletus PRINT_NOW("HT_FOLLOW", 6500, 0) CPRINTLN(DEBUG_HUNTING, "eMission State = MS_FOLLOW_TO_FIRST_ELK") eMissionState = MS_FOLLOW_TO_FIRST_ELK eSubState = SS_INIT BREAK ENDSWITCH ENDPROC PROC SET_UP_BEFORE_FIRST_ELK() CDEBUG1LN(DEBUG_HUNTING, "SET_UP_BEFORE_FIRST_ELK") SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT SAFE_FADE_OUT() SAFE_DELETE_ALL_ELK() KILL_ANY_CONVERSATION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE IF IS_SCREEN_FADED_OUT() REMOVE_ALL_BLIPS() SAFE_GIVE_SNIPER_TO_PLAYER(FALSE) IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerStartHuntPos, fPlayerStartHuntHead) WAIT_FOR_WORLD_TO_LOAD(vPlayerStartHuntPos) ENDIF IF NOT IS_PED_INJURED(mHunter) CLEAR_PED_TASKS(mHunter) ENDIF SAFE_TELEPORT_ENTITY(mHunter, vHunterStartHuntPos, fHunterStartHuntHead) eSubState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP IF IS_PLAYER_PLAYING(PLAYER_ID()) SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) END_REPLAY_SETUP() SAFE_FADE_IN() RESET_CAM() KILL_ANY_CONVERSATION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // To make the scale form arrow appear. bCanUpdateWindBlip = TRUE SHOW_THIS_HELP(WIND_ARROW_HELP) CPRINTLN(DEBUG_HUNTING, "HS_TELL_ABOUT_FIRST_ELK from skip") eHunterSubState = HSS_INIT eHunterState = HS_TELL_ABOUT_FIRST_ELK CPRINTLN(DEBUG_HUNTING, "FOLLOW_TO_FIRST_ELK from skip") eSubState = SS_INIT eMissionState = MS_FOLLOW_TO_FIRST_ELK ENDIF BREAK ENDSWITCH ENDPROC PROC FOLLOW_TO_FIRST_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.25) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF NOT mElk[FIRST_ELK].bIsSpooked IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF bShownReturnToHunter BLIP_HUNTER(FALSE, FALSE) SAFE_CLEAR_THIS_PRINT("HT_BAC") bShownReturnToHunter = FALSE ENDIF // Right son, lets try and bag us three elk IF bHunterDoneConvo[HTC_ARRIVE_FIRST_ELK] bSpawned1stElk = FALSE IF SPAWNED_THIS_ELK(FIRST_ELK) bSpawned1stElk = TRUE CDEBUG1LN(DEBUG_HUNTING, "Spawned first elk!") eSubState = SS_CLEANUP ENDIF ENDIF ELSE CHECK_PLAYER_FLED() IF NOT bShownReturnToHunter BLIP_HUNTER(FALSE, FALSE) PRINT_OBJ("HT_BAC") bShownReturnToHunter = TRUE ENDIF IF bIsTrevorLooking SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), FALSE) bIsTrevorLooking = FALSE ENDIF ENDIF ELSE FORCE_ELK_FLEE(FIRST_ELK) INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(HU2_DETECTED_BY_ELK) SET_FAIL_REASON(GET_SPOOKED_REASON(FIRST_ELK)) CPRINTLN(DEBUG_MISSION, " Mission Failed spooked elk called from FOLLOW_TO_FIRST_ELK") MISSION_FAILED(eFailReason) ENDIF ENDIF BREAK CASE SS_CLEANUP SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), FALSE) CPRINTLN(DEBUG_HUNTING, "MS_KILL_FIRST_ELK from mission state") eSubState = SS_INIT eMissionState = MS_KILL_FIRST_ELK BREAK ENDSWITCH ENDPROC PROC KILL_FIRST_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) CHECK_FOR_CALLS() CHECK_ELK_STATES(FIRST_ELK) SWITCH eSubState CASE SS_INIT CPRINTLN(DEBUG_HUNTING, "SET_REPLAY_MID_MISSION_STAGE_WITH_NAME = CP_AFTER_TUTORIAL") SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_TUTORIAL, "Player has done Hunter's tutorial") eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE IF NOT bShownHuntElkGodText[FIRST_ELK] // We haven't shown the god text yet... IF bHunterDoneConvo[HTC_ARRIVE_FIRST_ELK] // The hunter has started talking... AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Wait until he stops... AND bHunter_InPosition1 CDEBUG1LN(DEBUG_HUNTING, "Printing objective to hunt first elk!") // Hunt the elk. PRINT_OBJ("HT_OBJ") bPlayerCalling = TRUE // Blip the first elk automatically. IF IS_THIS_PRINT_BEING_DISPLAYED("HT_OBJ") bShownHuntElkGodText[FIRST_ELK] = TRUE // Only flag this as having displayed once its actually on-screen. SAFE_REMOVE_BLIP(mHunterBlip) ENDIF ENDIF ELSE IF NOT IS_THIS_PRINT_BEING_DISPLAYED("HT_OBJ") IF NOT bShownHelp[CROUCH_HELP] AND NOT GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID()) CDEBUG1LN(DEBUG_HUNTING, "Telling player to crouch") SHOW_THIS_HELP(CROUCH_HELP) ENDIF ENDIF ENDIF IF NOT mElk[FIRST_ELK].bIsSpooked IF NOT IS_PED_UNINJURED(mElk[FIRST_ELK].mPed) CDEBUG1LN(DEBUG_HUNTING, "FIRST ELK KILLED!!!") SAFE_CLEAR_THIS_PRINT("HT_OBJ") REMOVE_ALL_BLIPS() CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[FIRST_ELK].mPed) IF NOT bShotWithWrongGun IF bHunterDoneConvo[HTC_GOOD_SHOT_FIRST_ELK] IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) IF bShownReturnToHunter SAFE_CLEAR_THIS_PRINT("HT_BAC") bShownReturnToHunter = FALSE ENDIF BLIP_HUNTER(FALSE, FALSE) SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) eSubState = SS_CLEANUP ELSE IF NOT bShownReturnToHunter AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() BLIP_HUNTER(FALSE, FALSE) PRINT_OBJ("HT_BAC") bShownReturnToHunter = TRUE ENDIF ENDIF ENDIF ENDIF ELSE CLEAR_HELP() MISSION_FAILED(FR_WRONG_GUN) ENDIF ENDIF ELSE CLEAR_HELP() REMOVE_ALL_BLIPS() CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[FIRST_ELK].mPed) IF bShotWithWrongGun MISSION_FAILED(FR_WRONG_GUN) ELSE INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(HU2_DETECTED_BY_ELK) SET_FAIL_REASON(GET_SPOOKED_REASON(FIRST_ELK)) MISSION_FAILED(eFailReason) ENDIF ENDIF BREAK CASE SS_CLEANUP CPRINTLN(DEBUG_HUNTING, "SET_REPLAY_MID_MISSION_STAGE_WITH_NAME = CP_AFTER_FIRST_ELK") SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_FIRST_ELK, "Player has done first elk") eSubState = SS_INIT CPRINTLN(DEBUG_HUNTING, "MS_WHISTLE_TO_SECOND_ELK from normal mission flow") eMissionState = MS_FOLLOW_TO_SECOND_ELK BREAK ENDSWITCH ENDPROC PROC SET_UP_BEFORE_SECOND_ELK() CDEBUG1LN(DEBUG_HUNTING, "SET_UP_BEFORE_SECOND_ELK") SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT CPRINTLN(DEBUG_HUNTING, "SET_UP_BEFORE_SECOND_ELK SS_INIT") SAFE_FADE_OUT() SAFE_DELETE_ALL_ELK() KILL_ANY_CONVERSATION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE CPRINTLN(DEBUG_HUNTING, "SET_UP_BEFORE_SECOND_ELK SS_ACTIVE") IF IS_SCREEN_FADED_OUT() REMOVE_ALL_BLIPS() IF NOT IS_PED_INJURED(mHunter) CLEAR_PED_TASKS(mHunter) SAFE_TELEPORT_ENTITY(mHunter, vHunterFirstKillPos, fHunterFirstKillHead) BLIP_HUNTER(FALSE, FALSE) ENDIF IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerFirstKillPos, fPlayerFirstKillHead) WAIT_FOR_WORLD_TO_LOAD(vPlayerStartHuntPos) ENDIF SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_FIRST_ELK, "Player has done first elk") SAFE_GIVE_SNIPER_TO_PLAYER() bCanUpdateWindBlip = TRUE bAllowCall = FALSE eSubState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP CPRINTLN(DEBUG_HUNTING, "SET_UP_BEFORE_SECOND_ELK SS_CLEANUP") END_REPLAY_SETUP() SAFE_FADE_IN() bHunterDoneConvo[HTC_LEAD_TO_SECOND_ELK] = FALSE CPRINTLN(DEBUG_HUNTING, "HS_AFTER_KILL_FIRST_ELK from skipper") eHunterSubState = HSS_INIT eHunterState = HS_AFTER_KILL_FIRST_ELK CPRINTLN(DEBUG_HUNTING, "MS_WHISTLE_TO_SECOND_ELK from skipper") eSubState = SS_INIT eMissionState = MS_FOLLOW_TO_SECOND_ELK BREAK ENDSWITCH ENDPROC PROC FOLLOW_TO_SECOND_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) // Clean up the return to hunter message... IF bShownReturnToHunter BLIP_HUNTER(FALSE, FALSE) SAFE_CLEAR_THIS_PRINT("HT_BAC") bShownReturnToHunter = FALSE ENDIF eSubState = SS_ACTIVE ENDIF BREAK CASE SS_ACTIVE // Are we close enough to the hunter? IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) bShownReturnToHunter = FALSE // Right, this'll do. Give a blow on that whistle IF bHunterDoneConvo[HTC_WHISTLE_TO_SECOND_ELK] IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Show the help prompt about calling elk IF NOT bShownHelp[FIRST_CALL_HELP] // So the player can whistle straight away iWhistleDelay = -1 // Okay, this elk needs to walk out into the open, not just be made visible when the whistle is blown. IF SPAWNED_THIS_ELK(SECOND_ELK) CDEBUG1LN(DEBUG_HUNTING, "FOLLOW_TO_SECOND_ELK - Showing help to call the elk!") MAKE_ELK_VISIBLE(SECOND_ELK) mElk[SECOND_ELK].iDestNode = 0 elkSpawn[0].vCoord = vElkGoto_Second mElk[SECOND_ELK].elkState = ES_TRAVEL_THEN_ENTER_GRAZE_AND_WAIT_TO_DIE SHOW_THIS_HELP(FIRST_CALL_HELP) bAllowCall = TRUE ENDIF ELSE // If we've tasked the player to return, but the help isn't up, draw it again. IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HT_CALL") IF IS_THIS_PRINT_BEING_DISPLAYED("HT_BAC") CLEAR_THIS_PRINT("HT_BAC") ENDIF SHOW_THIS_HELP(FIRST_CALL_HELP) ENDIF CHECK_FOR_CALLS() CHECK_ELK_STATES(SECOND_ELK) IF IS_CONTROL_JUST_RELEASED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_LEFT) SAFE_REMOVE_BLIP(mHunterBlip) CLEAR_HELP(TRUE) eSubState = SS_CLEANUP ENDIF ENDIF ENDIF ENDIF ELSE CHECK_PLAYER_FLED() // Player needs to stay close to the hunter before being told about the whistle. IF NOT bShownReturnToHunter CLEAR_HELP() BLIP_HUNTER(FALSE, FALSE) PRINT_OBJ("HT_BAC") bShownReturnToHunter = TRUE ENDIF ENDIF BREAK CASE SS_CLEANUP SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), FALSE) TASK_LOOK_AT_COORD(PLAYER_PED_ID(), vElkSpawn[SECOND_ELK], -1) TASK_FOLLOW_NAV_MESH_TO_COORD(mElk[SECOND_ELK].mPed, vElkGoto_Second, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_NEVER_WARP, DEFAULT, ENAV_DEFAULT) // Time stamp this call, we don't want the Hunter replying too soon.. iTimerDelay = GET_GAME_TIMER() + PLAYER_CALL_DURATION CDEBUG2LN(DEBUG_HUNTING, "FOLLOW_TO_SECOND_ELK - iTimerDelay is set...") CDEBUG1LN(DEBUG_HUNTING, "FOLLOW_TO_SECOND_ELK -> MS_KILL_SECOND_ELK") eMissionState = MS_KILL_SECOND_ELK eSubState = SS_INIT BREAK ENDSWITCH ENDPROC PROC KILL_SECOND_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) CHECK_FOR_CALLS() CHECK_ELK_STATES(SECOND_ELK) SWITCH eSubState CASE SS_INIT eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE IF NOT mElk[SECOND_ELK].bIsSpooked IF NOT IS_PED_UNINJURED(mElk[SECOND_ELK].mPed) IF bAllowCall REMOVE_ALL_BLIPS() SAFE_CLEAR_THIS_PRINT("HT_OBJ") TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[SECOND_ELK].mPed) bAllowCall = FALSE ENDIF IF NOT bShotWithWrongGun IF bHunterDoneConvo[HTC_GOOD_SHOT_SECOND_ELK] IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0 IF IS_PLAYER_NEAR_HUNTER(VERY_NEAR_HUNTER_RANGE) IF bShownReturnToHunter BLIP_HUNTER(FALSE, FALSE) SAFE_CLEAR_THIS_PRINT("HT_BAC") bShownReturnToHunter = FALSE ENDIF // Timestamp this kill, we don't want the help text appearing instantly... iTimerDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE eSubState = SS_CLEANUP ELSE IF NOT bShownReturnToHunter AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() BLIP_HUNTER(FALSE, FALSE) PRINT_OBJ("HT_BAC") bShownReturnToHunter = TRUE ENDIF ENDIF ENDIF ENDIF ELSE MISSION_FAILED(FR_WRONG_GUN) ENDIF ELSE IF DOES_BLIP_EXIST(mElk[SECOND_ELK].mElkBlip) AND NOT bShownHuntElkGodText[SECOND_ELK] // We haven't shown the godtext yet... AND bHunterDoneConvo[HTC_DISCOVER_SECOND_ELK] // The hunter has started talking ("Same as before boy") AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Wait until he stops... // Hunt the elk. PRINT_OBJ("HT_OBJ") bShownHuntElkGodText[SECOND_ELK] = TRUE ENDIF ENDIF ELSE CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[SECOND_ELK].mPed) IF bShotWithWrongGun MISSION_FAILED(FR_WRONG_GUN) ELSE INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(HU2_DETECTED_BY_ELK) SET_FAIL_REASON(GET_SPOOKED_REASON(SECOND_ELK)) MISSION_FAILED(eFailReason) ENDIF ENDIF BREAK CASE SS_CLEANUP IF GET_GAME_TIMER() > iTimerDelay SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_SECOND_ELK, "Player has done second elk") CPRINTLN(DEBUG_HUNTING, "CP_AFTER_SECOND_ELK") eSubState = SS_INIT CPRINTLN(DEBUG_HUNTING, "FOLLOW_TO_THIRD_ELK") eMissionState = MS_FOLLOW_TO_THIRD_ELK ENDIF BREAK ENDSWITCH ENDPROC PROC SET_UP_BEFORE_THIRD_ELK() CDEBUG1LN(DEBUG_HUNTING, "SET_UP_BEFORE_THIRD_ELK") SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT CPRINTLN(DEBUG_HUNTING, " SS_INIT SET_UP_BEFORE_THIRD_ELK") SAFE_FADE_OUT() SAFE_DELETE_ALL_ELK() KILL_ANY_CONVERSATION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CPRINTLN(DEBUG_HUNTING, " SS_ACTIVE SET_UP_BEFORE_THIRD_ELK") eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE IF IS_SCREEN_FADED_OUT() REMOVE_ALL_BLIPS() IF NOT IS_PED_INJURED(mHunter) CLEAR_PED_TASKS(mHunter) SAFE_TELEPORT_ENTITY(mHunter, vHunterSecondKillPos, fHunterSecondKillHead) BLIP_HUNTER(FALSE, FALSE) ENDIF IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerSecondKillPos, fPlayerSecondKillHead) WAIT_FOR_WORLD_TO_LOAD(vPlayerThirdKillPos) ENDIF SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_SECOND_ELK, "Player has done second elk") SAFE_GIVE_SNIPER_TO_PLAYER() RESET_ALL_HUNTER_CONVOS() bAllowCall = FALSE bCanUpdateWindBlip = TRUE CPRINTLN(DEBUG_HUNTING, " SS_CLEANUP SET_UP_BEFORE_THIRD_ELK") eSubState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP END_REPLAY_SETUP() RESET_CAM() SAFE_FADE_IN() SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) // Initialise this so the hunter's comment about knowing where the elk are doesn't kick in too soon iTimerDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE // Reset this so we can show the "call elk" help text again. bShownHelp[SECOND_CALL_HELP] = FALSE CPRINTLN(DEBUG_HUNTING, "eHunterState = HS_AFTER_KILL_SECOND_ELK") eHunterSubState = HSS_INIT eHunterState = HS_AFTER_KILL_SECOND_ELK CPRINTLN(DEBUG_HUNTING, "eMissionState = MS_WHISTLE_TO_THIRD_ELK") eSubState = SS_INIT eMissionState = MS_FOLLOW_TO_THIRD_ELK BREAK ENDSWITCH ENDPROC PROC FOLLOW_TO_THIRD_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) // Are we close enough to the hunter? IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) BLIP_HUNTER(FALSE, FALSE) // Clean up the return to hunter message... IF bShownReturnToHunter SAFE_CLEAR_THIS_PRINT("HT_BAC") bShownReturnToHunter = FALSE ENDIF // Remember, we're only here for the male elk IF bHunterDoneConvo[HTC_WHISTLE_TO_THIRD_ELK] AND eHunterState <> HS_WAIT_FOR_PLAYER_TO_RETURN IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT bShownHelp[SECOND_CALL_HELP] AND NOT bAllowCall iWhistleDelay = -1 bAllowCall = TRUE SHOW_THIS_HELP(SECOND_CALL_HELP) ELSE IF NOT bTriggered3rdElk CHECK_FOR_CALLS() IF IS_CONTROL_JUST_RELEASED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_LEFT) MAKE_ELK_VISIBLE(THIRD_ELK) MAKE_ELK_VISIBLE(DOE_ELK) iTimerDelay = GET_GAME_TIMER() + PLAYER_CALL_DURATION CLEAR_HELP(TRUE) bTriggered3rdElk = TRUE ENDIF ELSE IF SPAWNED_THIS_ELK(THIRD_ELK) AND SPAWNED_THIS_ELK(DOE_ELK) SET_ELK_SPOOKED_BLIP_ENABLED(mElk[DOE_ELK], FALSE) CDEBUG1LN(DEBUG_HUNTING, "FOLLOW_TO_THIRD_ELK - Showing help to call the elk!") MAKE_ELK_VISIBLE(THIRD_ELK) MAKE_ELK_VISIBLE(DOE_ELK) mElk[THIRD_ELK].iDestNode = 0 elkSpawn[0].vCoord = vElkGoto_Third mElk[THIRD_ELK].elkState = ES_TRAVEL_THEN_ENTER_GRAZE_AND_WAIT_TO_DIE mElk[DOE_ELK].iDestNode = 0 elkSpawn[0].vCoord = vElkGoto_Doe mElk[DOE_ELK].elkState = ES_TRAVEL_THEN_ENTER_GRAZE_AND_WAIT_TO_DIE TASK_FOLLOW_NAV_MESH_TO_COORD(mElk[THIRD_ELK].mPed, vElkGoto_Third, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_NEVER_WARP, DEFAULT, ENAV_DEFAULT, fElkGoto_ThirdHeading) TASK_FOLLOW_NAV_MESH_TO_COORD(mElk[DOE_ELK].mPed, vElkGoto_Doe, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_NEVER_WARP, DEFAULT, ENAV_DEFAULT, fElkGoto_DoeHeading) CPRINTLN(DEBUG_HUNTING, "eMissionState = MS_FOLLOW_TO_THIRD_ELK") eMissionState = MS_KILL_THIRD_ELK eSubState = SS_INIT ENDIF ENDIF ENDIF ENDIF ENDIF ELSE CHECK_PLAYER_FLED() // Player needs to stay close to the hunter before being told about the whistle. IF NOT bShownReturnToHunter bAllowCall = FALSE CLEAR_HELP(TRUE) bShownHelp[SECOND_CALL_HELP] = FALSE BLIP_HUNTER(FALSE, FALSE) PRINT_OBJ("HT_BAC") bShownReturnToHunter = TRUE ENDIF ENDIF ENDPROC PROC KILL_THIRD_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) CHECK_FOR_CALLS() CHECK_ELK_STATES(THIRD_ELK) CHECK_ELK_STATES(DOE_ELK) SWITCH eSubState CASE SS_INIT eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE // Monitor the target elk IF NOT mElk[THIRD_ELK].bIsSpooked IF NOT IS_PED_UNINJURED(mElk[THIRD_ELK].mPed) IF bAllowCall REMOVE_ALL_BLIPS() CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[THIRD_ELK].mPed) bAllowCall = FALSE ENDIF IF NOT bFinalElkFlee // Get the doe to flee IF IS_PED_UNINJURED(mElk[DOE_ELK].mPed) FORCE_ELK_FLEE(DOE_ELK) ENDIF bFinalElkFlee = TRUE ENDIF IF NOT bShotWithWrongGun IF IS_PLAYER_NEAR_HUNTER(NEAR_HUNTER_RANGE) CLEAR_HELP() IF bShownReturnToHunter BLIP_HUNTER(FALSE, FALSE) SAFE_CLEAR_THIS_PRINT("HT_BAC") bShownReturnToHunter = FALSE ENDIF TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) // Timestamp this kill, we don't want the help text appearing instantly... iTimerDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE eSubState = SS_CLEANUP ELSE IF NOT bShownReturnToHunter AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CLEAR_HELP() BLIP_HUNTER(FALSE, FALSE) PRINT_OBJ("HT_BAC") bShownReturnToHunter = TRUE TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) ENDIF ENDIF ELSE CPRINTLN(DEBUG_HUNTING, "Mission Failed from KILL_THIRD_ELK - Wrong Gun") CLEAR_HELP() MISSION_FAILED(FR_WRONG_GUN) ENDIF ELSE IF NOT bShownHuntElkGodText[THIRD_ELK] // We haven't shown the godtext yet... IF bHunterDoneConvo[HTC_DISCOVER_THIRD_ELK] // The hunter has started talking ("Same as before, boy...") AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Wait until he stops... // Hunt the elk. PRINT_OBJ("HT_OBJ") SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), FALSE) TASK_LOOK_AT_COORD(PLAYER_PED_ID(), vElkSpawn[THIRD_ELK], -1) bShownHuntElkGodText[THIRD_ELK] = TRUE ENDIF ELSE IF NOT IS_THIS_PRINT_BEING_DISPLAYED("HT_OBJ") IF NOT bShownHelp[DONT_KILL_DOE_HELP] SHOW_THIS_HELP(DONT_KILL_DOE_HELP) ENDIF ENDIF ENDIF // Monitor the doe IF NOT IS_PED_UNINJURED(mElk[DOE_ELK].mPed) IF NOT bFinalElkFlee FORCE_ELK_FLEE(THIRD_ELK) bFinalElkFlee = TRUE MISSION_FAILED(FR_HE_SAW_YOU) ELSE // Wait for the hunter to finish his line... IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CPRINTLN(DEBUG_HUNTING, "Mission Failed from KILL_THIRD_ELK") MISSION_FAILED(FR_SHOT_DOE) ENDIF ENDIF ENDIF ENDIF ELSE CLEAR_HELP() CDEBUG2LN(DEBUG_HUNTING, "Elk three has been spooked!") CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[THIRD_ELK].mPed) IF bShotWithWrongGun MISSION_FAILED(FR_WRONG_GUN) ELSE INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(HU2_DETECTED_BY_ELK) SET_FAIL_REASON(GET_SPOOKED_REASON(THIRD_ELK)) MISSION_FAILED(eFailReason) ENDIF ENDIF BREAK CASE SS_CLEANUP IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HT_MISS") CLEAR_HELP() ENDIF IF NOT bFinalElkFlee IF IS_PED_UNINJURED(mElk[DOE_ELK].mPed) FORCE_ELK_FLEE(DOE_ELK) ENDIF bFinalElkFlee = TRUE ENDIF IF GET_GAME_TIMER() > iTimerDelay SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), FALSE) SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_THIRD_ELK, "Player has done third elk", TRUE) CDEBUG2LN(DEBUG_HUNTING, "CP_AFTER_THIRD_ELK") eSubState = SS_INIT eMissionState = MS_HUNTER_LEAVES ENDIF BREAK ENDSWITCH ENDPROC PROC SET_UP_BEFORE_FOURTH_ELK() CDEBUG1LN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK") SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT CDEBUG2LN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK - SS_INIT") SAFE_FADE_OUT() SAFE_DELETE_ALL_ELK() KILL_ANY_CONVERSATION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CDEBUG2LN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK -> SS_ACTIVE ") eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE CDEBUG2LN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK - SS_ACTIVE") IF IS_SCREEN_FADED_OUT() REMOVE_ALL_BLIPS() IF IS_PED_UNINJURED(mHunter) CLEAR_PED_TASKS(mHunter) SAFE_TELEPORT_ENTITY(mHunter, vHunterThirdKillPos, fHunterThirdKillHead) BLIP_HUNTER(FALSE, FALSE) ENDIF IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerThirdKillPos, fPlayerThirdKillHead) WAIT_FOR_WORLD_TO_LOAD(vPlayerThirdKillPos) ENDIF SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_THIRD_ELK, "Player has done third elk", TRUE) SAFE_GIVE_SNIPER_TO_PLAYER() RESET_ALL_HUNTER_CONVOS() bAllowCall = FALSE bCanUpdateWindBlip = TRUE CDEBUG2LN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK -> SS_CLEANUP") eSubState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP CDEBUG2LN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK - SS_CLEANUP") END_REPLAY_SETUP() RESET_CAM() SAFE_FADE_IN() SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) // Initialise this so the hunter's comment about knowing where the elk are doesn't kick in too soon iTimerDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE // Reset this so we can show the "call elk" help text again. bShownHelp[THIRD_CALL_HELP] = FALSE // So the hunter goes straigt into his explainination bHunterDoneConvo[HTC_GOOD_SHOT_THIRD_ELK] = TRUE CDEBUG2LN(DEBUG_HUNTING, "eHunterState = HS_WAIT_KILL_THIRD_ELK") eHunterSubState = HSS_INIT eHunterState = HS_WAIT_KILL_THIRD_ELK CDEBUG2LN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK - SS_INIT") CDEBUG2LN(DEBUG_HUNTING, "eMissionState = MS_HUNTER_LEAVES") eSubState = SS_INIT eMissionState = MS_HUNTER_LEAVES BREAK ENDSWITCH ENDPROC PROC HUNTER_LEAVES() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) // Has he said his lines? IF bHunterDoneConvo[HTC_TELL_ABOUT_TEXTING] IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT bShownHelp[THIRD_CALL_HELP] IF SPAWNED_THIS_ELK(FOURTH_ELK) CDEBUG1LN(DEBUG_HUNTING, "HUNTER_LEAVES - Setting up 4th elk.") MAKE_ELK_VISIBLE(FOURTH_ELK) VECTOR vElkGoto = vElkGoto_Fourth FLOAT fElkGoto = fElkGoto_FourthHeading FLOAT fRedirectElkRange = k_ELK_SPOOK_RANGE * k_ELK_SPOOK_RANGE_MULT #IF IS_DEBUG_BUILD DEBUG_RECORD_SPHERE( "vElkGoto", vElkGoto, fRedirectElkRange, (<< 150, 150, 150 >>) ) DEBUG_RECORD_SPHERE( "PlayerPos", GET_ENTITY_COORDS( PLAYER_PED_ID(), FALSE ), 1.0, (<< 255, 255, 0 >>) ) #ENDIF IF VDIST( GET_ENTITY_COORDS( PLAYER_PED_ID(), FALSE ), vElkGoto ) <= fRedirectElkRange CDEBUG2LN(DEBUG_HUNTING, "HUNTER_LEAVES picking alt fourth position, player is too close to original spawn.") vElkGoto = vElkGoto_Fourth_alt fElkGoto = fElkGoto_FourthHeading_alt ENDIF TASK_FOLLOW_NAV_MESH_TO_COORD(mElk[FOURTH_ELK].mPed, vElkGoto, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_NEVER_WARP, DEFAULT, ENAV_DEFAULT, fElkGoto) mElk[FOURTH_ELK].iDestNode = 0 elkSpawn[0].vCoord = vElkGoto mElk[FOURTH_ELK].elkState = ES_TRAVEL_THEN_ENTER_GRAZE_AND_WAIT_TO_DIE iWhistleDelay = -1 SHOW_THIS_HELP(THIRD_CALL_HELP) bAllowCall = TRUE ENDIF ELSE CHECK_ELK_STATES(FOURTH_ELK) CHECK_FOR_CALLS() IF IS_CONTROL_JUST_RELEASED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_LEFT) CLEAR_HELP(TRUE) TASK_LOOK_AT_COORD(PLAYER_PED_ID(), vElkSpawn[FOURTH_ELK], -1) // Time stamp this call, we don't want the Hunter replying too soon.. iTimerDelay = GET_GAME_TIMER() + PLAYER_CALL_DURATION CPRINTLN(DEBUG_HUNTING, "iTimerDelay is set...") CPRINTLN(DEBUG_HUNTING, "MS_KILL_FOURTH_ELK") eMissionState = MS_KILL_FOURTH_ELK eSubState = SS_ACTIVE ELSE IF mElk[FOURTH_ELK].bIsSpooked CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[FOURTH_ELK].mPed) IF bShotWithWrongGun MISSION_FAILED(FR_WRONG_GUN) ELSE INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(HU2_DETECTED_BY_ELK) SET_FAIL_REASON(GET_SPOOKED_REASON(FOURTH_ELK)) MISSION_FAILED(eFailReason) ENDIF ELIF NOT IS_PED_UNINJURED(mElk[FOURTH_ELK].mPed) CPRINTLN(DEBUG_HUNTING, "Fourth Elk is dead...") CLEAR_HELP() eMissionState = MS_KILL_FOURTH_ELK // remove the kill objective SAFE_CLEAR_THIS_PRINT("HT_OBJ") REMOVE_ALL_BLIPS() CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[FOURTH_ELK].mPed) bAllowCall = FALSE IF NOT bShotWithWrongGun // Timestamp this kill, we don't want the help text appearing instantly... iTimerDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE eSubState = SS_CLEANUP ELSE MISSION_FAILED(FR_WRONG_GUN) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC PROC KILL_FOURTH_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) CHECK_FOR_CALLS() IF (eSubState != SS_CLEANUP) CHECK_ELK_STATES(FOURTH_ELK) ENDIF SWITCH eSubState CASE SS_ACTIVE IF NOT mElk[FOURTH_ELK].bIsSpooked IF NOT IS_PED_UNINJURED(mElk[FOURTH_ELK].mPed) CPRINTLN(DEBUG_HUNTING, "Fourth Elk is dead...") // remove the kill objective SAFE_CLEAR_THIS_PRINT("HT_OBJ") REMOVE_ALL_BLIPS() CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[FOURTH_ELK].mPed) bAllowCall = FALSE IF NOT bShotWithWrongGun // Timestamp this kill, we don't want the help text appearing instantly... REPLAY_RECORD_BACK_FOR_TIME(2.0, 5.0, REPLAY_IMPORTANCE_HIGHEST) iTimerDelay = GET_GAME_TIMER() + NICE_LITTLE_PAUSE eSubState = SS_CLEANUP ELSE MISSION_FAILED(FR_WRONG_GUN) ENDIF ELSE // Elk is still alive and not spooked IF NOT bShownHuntElkGodText[FOURTH_ELK] // We haven't shown the godtext yet... IF DOES_BLIP_EXIST(mElk[FOURTH_ELK].mElkBlip) CPRINTLN(DEBUG_HUNTING, "Show God Text - hunt fourth elk....") // Hunt the elk. PRINT_OBJ("HT_OBJ") bShownHuntElkGodText[FOURTH_ELK] = TRUE ENDIF ELSE IF NOT bShownHelp[WIND_CHANGE_HELP] IF NOT IS_THIS_PRINT_BEING_DISPLAYED("HT_OBJ") // Keep an eye on the wind direction as it will change over time... SHOW_THIS_HELP(WIND_CHANGE_HELP) bWindCanChange = TRUE ENDIF ENDIF ENDIF ENDIF ELSE CHECK_TARGET_DAMAGED_BY_SNIPER_RIFLE(mElk[FOURTH_ELK].mPed) IF bShotWithWrongGun MISSION_FAILED(FR_WRONG_GUN) ELSE INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(HU2_DETECTED_BY_ELK) SET_FAIL_REASON(GET_SPOOKED_REASON(FOURTH_ELK)) MISSION_FAILED(eFailReason) ENDIF ENDIF BREAK CASE SS_CLEANUP IF GET_GAME_TIMER() > iTimerDelay SET_ENTITY_AS_MISSION_ENTITY(mElk[FOURTH_ELK].mPed, TRUE, TRUE) mBlip = ADD_BLIP_FOR_ENTITY(mElk[FOURTH_ELK].mPed) IF DOES_BLIP_EXIST(mBlip) SET_BLIP_COLOUR(mBlip, BLIP_COLOUR_RED) ENDIF //SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AFTER_FOURTH_ELK, "Player has killed fourth elk", TRUE) // No need to show the wind direction... bCanUpdateWindBlip = FALSE // Approach the elk's corpse. PRINT_OBJ("HT_APP") CPRINTLN(DEBUG_HUNTING, "APPROACH_FOURTH_ELK") eMissionState = MS_APPROACH_FOURTH_ELK ENDIF BREAK ENDSWITCH ENDPROC PROC APPROACH_FOURTH_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.25) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) VECTOR vElk IF DOES_ENTITY_EXIST(mElk[FOURTH_ELK].mPed) vElk = GET_ENTITY_COORDS(mElk[FOURTH_ELK].mPed, FALSE) ENDIF IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vElk, FALSE) < 5.0 // Reset the Player_Hunt_Data.fLastCamZoom = GET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR() ENABLE_PICTURE_MESSAGE_SENDING_AND_HELP(FALSE) BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE(TRUE) // Photograph the dead elk. PRINT_OBJ("HT_PHOTO") eMissionState = MS_PHOTO_FOURTH_ELK ENDIF ENDPROC PROC PHOTO_FOURTH_ELK() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) VECTOR vElk IF DOES_ENTITY_EXIST(mElk[FOURTH_ELK].mPed) vElk = GET_ENTITY_COORDS(mElk[FOURTH_ELK].mPed, FALSE) ENDIF IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vElk, FALSE) < 40.0 Player_Hunt_Data.fLastCamZoom = GET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR() IF HAS_CELLPHONE_CAM_JUST_TAKEN_PIC() FLOAT fDist2 FLOAT fScreenX, fScreenY fDist2 = VDIST2(vElk, GET_ENTITY_COORDS(PLAYER_PED_ID())) IF GET_SCREEN_COORD_FROM_WORLD_COORD(vElk, fScreenX, fScreenY) CPRINTLN(DEBUG_MISSION, "fScreenX = ", fScreenX ) CPRINTLN(DEBUG_MISSION, "fScreenY = ", fScreenY ) CPRINTLN(DEBUG_MISSION, "fDist2 = ", fDist2 ) CPRINTLN(DEBUG_MISSION, "all the other shit = ", 100.0 * Player_Hunt_Data.fLastCamZoom * Player_Hunt_Data.fLastCamZoom) IF (fScreenX > 0.1 AND fScreenX < 0.9 AND fScreenY > 0.1 AND fScreenY < 0.9) AND (fDist2 < (100.0 * Player_Hunt_Data.fLastCamZoom * Player_Hunt_Data.fLastCamZoom)) ENABLE_PICTURE_MESSAGE_SENDING_AND_HELP(TRUE) BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE(TRUE) IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HT_NOGOOD") CLEAR_PRINTS() ENDIF TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) SAFE_REMOVE_BLIP(mBlip) // Send this picture to Cletus... PRINT_OBJ("HT_SENDPIC") eMissionState = MS_SEND_PHOTO ELSE PRINT_HELP("HT_NOGOOD") ENDIF ELSE PRINT_HELP("HT_NOGOOD") ENDIF ENDIF ELSE BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE(FALSE) // Return to the elk's corpse. PRINT_OBJ("HT_RETURN") eMissionState = MS_APPROACH_FOURTH_ELK ENDIF ENDPROC PROC SEND_PHOTO() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) // If we're here, and we go back to the camera, need to remove the prompt to send photo. IF NOT IS_CONTACTS_LIST_ON_SCREEN() IF Is_Phone_Control_Just_Pressed(FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT)) BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE(TRUE) ENABLE_PICTURE_MESSAGE_SENDING_AND_HELP(FALSE) mBlip = ADD_BLIP_FOR_ENTITY(mElk[FOURTH_ELK].mPed) IF DOES_BLIP_EXIST(mBlip) SET_BLIP_COLOUR(mBlip, BLIP_COLOUR_RED) ENDIF Cellphone_Pic_Just_Taken = FALSE PRINT_OBJ("HT_PHOTO") eMissionState = MS_PHOTO_FOURTH_ELK EXIT ENDIF ENDIF IF HAS_PICTURE_MESSAGE_BEEN_SENT_TO_ANY_CONTACT() IF HAS_CONTACT_RECEIVED_PICTURE_MESSAGE(CHAR_HUNTER) HANG_UP_AND_PUT_AWAY_PHONE() BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE(FALSE) ENABLE_PICTURE_MESSAGE_SENDING_AND_HELP(FALSE) BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE(FALSE) iTimerDelay = GET_GAME_TIMER() + 3000 eMissionState = MS_WAIT_FOR_REPLY ELSE BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE(TRUE) ENABLE_PICTURE_MESSAGE_SENDING_AND_HELP(FALSE) mBlip = ADD_BLIP_FOR_ENTITY(mElk[FOURTH_ELK].mPed) IF DOES_BLIP_EXIST(mBlip) SET_BLIP_COLOUR(mBlip, BLIP_COLOUR_RED) ENDIF Cellphone_Pic_Just_Taken = FALSE PRINT_OBJ("HT_PHOTO") PRINT_HELP("HT_BADREC") eMissionState = MS_PHOTO_FOURTH_ELK ENDIF ENDIF ENDPROC PROC SET_UP_BEFORE_MISSION_PASS() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) SWITCH eSubState CASE SS_INIT SAFE_FADE_OUT() SAFE_DELETE_ALL_ELK() KILL_ANY_CONVERSATION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CPRINTLN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK SS_ACTIVE ") eSubState = SS_ACTIVE BREAK CASE SS_ACTIVE CPRINTLN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK SS_ACTIVE") IF IS_SCREEN_FADED_OUT() REMOVE_ALL_BLIPS() IF IS_PED_UNINJURED(mHunter) CLEAR_PED_TASKS(mHunter) SAFE_DELETE_PED(mHunter) ENDIF IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerThirdKillPos, fPlayerThirdKillHead) WAIT_FOR_WORLD_TO_LOAD(vPlayerThirdKillPos) ENDIF SAFE_GIVE_SNIPER_TO_PLAYER() RESET_ALL_HUNTER_CONVOS() bAllowCall = FALSE bCanUpdateWindBlip = FALSE CPRINTLN(DEBUG_HUNTING, "SET_UP_BEFORE_FOURTH_ELK - SS_CLEANUP") eSubState = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP END_REPLAY_SETUP() RESET_CAM() SAFE_FADE_IN() // Initialise this so the hunter's comment about knowing where the elk are doesn't kick in too soon iTimerDelay = GET_GAME_TIMER() + 3500 bShitSkipping = TRUE CPRINTLN(DEBUG_HUNTING, "eMissionState = MS_WAIT_FOR_REPLY") eMissionState = MS_WAIT_FOR_REPLY BREAK ENDSWITCH ENDPROC PROC WAIT_FOR_REPLY() SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) IF GET_GAME_TIMER() > iTimerDelay IF HAS_CONTACT_RECEIVED_PICTURE_MESSAGE(CHAR_HUNTER) OR bShitSkipping IF NOT bStartTextTimer iTimerDelay = GET_GAME_TIMER() + 8000 bStartTextTimer = TRUE ELIF NOT bSentTextMessage SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_HUNTER, "HT_TXTMSG", TXTMSG_UNLOCKED) iTimerDelay = GET_GAME_TIMER() + 10000 bSentTextMessage = TRUE ELSE ADD_PED_FOR_DIALOGUE(mHunterConv, 2, PLAYER_PED_ID(), "TREVOR") ADD_PED_FOR_DIALOGUE(mHunterConv, 3, NULL, "CLETUS") IF CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(mHunterConv, CHAR_HUNTER, sTextBlock, "HT2_END", CONV_PRIORITY_HIGH) REMOVE_TEXT_MESSAGE_FEED_ENTRY("HT_TXTMSG") eMissionState = MS_DO_FINAL_PHONECALL ENDIF ENDIF ELSE PRINT_HELP("HT_BADREC") ENDIF ENDIF ENDPROC PROC DO_FINAL_PHONECALL() SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0, 0.0) IF HAS_CELLPHONE_CALL_FINISHED() eMissionState = MS_MISSION_PASSED ENDIF ENDPROC PROC MISSION_PASSED() SAFE_FADE_IN() Script_Passed() ENDPROC // DEBUG MENU #IF IS_DEBUG_BUILD /// PURPOSE: Check for Forced Pass or Fail PROC DEBUG_Check_Debug_Keys() INT iMissionState // Check for Pass IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) CLEAR_PRINTS() KILL_ANY_CONVERSATION() WAIT_FOR_CUTSCENE_TO_STOP() Script_Passed() ENDIF // Check for Fail IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) CLEAR_PRINTS() KILL_ANY_CONVERSATION() WAIT_FOR_CUTSCENE_TO_STOP() MISSION_FAILED(FR_NONE) ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) AND eMissionState != MS_INIT_MISSION CLEAR_PRINTS() KILL_ANY_CONVERSATION() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() RESET_ALL_HUNTER_CONVOS() RESET_ALL_CONVO_FLAGS() iMissionState = ENUM_TO_INT(eMissionState) CPRINTLN(DEBUG_HUNTING, "** J SKIPPING **") #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_HUNTING, "iMisisonState = ", iMissionState) #ENDIF eSubState = SS_INIT IF iMissionState < ENUM_TO_INT(MS_KILL_FIRST_ELK) CDEBUG1LN(DEBUG_HUNTING, "Debug skipping to MS_SET_UP_BEFORE_FIRST_ELK") eMissionState = MS_SET_UP_BEFORE_FIRST_ELK ELIF iMissionState < ENUM_TO_INT(MS_SET_UP_BEFORE_SECOND_ELK) CDEBUG1LN(DEBUG_HUNTING, "Debug skipping to MS_SET_UP_BEFORE_SECOND_ELK") eMissionState = MS_SET_UP_BEFORE_SECOND_ELK ELIF iMissionState < ENUM_TO_INT(MS_SET_UP_BEFORE_THIRD_ELK) CDEBUG1LN(DEBUG_HUNTING, "Debug skipping to MS_SET_UP_BEFORE_THIRD_ELK") eMissionState = MS_SET_UP_BEFORE_THIRD_ELK ELIF iMissionState < ENUM_TO_INT(MS_HUNTER_LEAVES) CDEBUG1LN(DEBUG_HUNTING, "Debug skipping to MS_SET_UP_BEFORE_OUTRO") eMissionState = MS_HUNTER_LEAVES ELIF iMissionState < ENUM_TO_INT(MS_WAIT_FOR_REPLY) CDEBUG1LN(DEBUG_HUNTING, "Debug Skipping to MS_WAIT_FOR_REPLY") eMissionState = MS_WAIT_FOR_REPLY ELSE CDEBUG1LN(DEBUG_HUNTING, "Debug skipping to Script_Passed") Script_Passed() ENDIF IF DOES_CAM_EXIST(mCam) SET_CAM_ACTIVE(mCam, FALSE) RENDER_SCRIPT_CAMS(FALSE, FALSE) DESTROY_CAM(mCam) ENDIF ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) AND eMissionState <> MS_INIT_MISSION AND eMissionState <> MS_RUN_INTRO CLEAR_PRINTS() KILL_ANY_CONVERSATION() RESET_ALL_HUNTER_CONVOS() RESET_ALL_CONVO_FLAGS() iMissionState = ENUM_TO_INT(eMissionState) CPRINTLN(DEBUG_HUNTING, " *** DEBUG SKIP P *** ") #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_HUNTING, "iMisisonState = ", iMissionState) #ENDIF eSubState = SS_INIT IF iMissionState >= ENUM_TO_INT(MS_KILL_FOURTH_ELK) eMissionState = MS_SET_UP_BEFORE_FOURTH_ELK ELIF iMissionState >= ENUM_TO_INT(MS_KILL_THIRD_ELK) eMissionState = MS_SET_UP_BEFORE_SECOND_ELK ELIF iMissionState >= ENUM_TO_INT(MS_KILL_SECOND_ELK) eMissionState = MS_SET_UP_BEFORE_FIRST_ELK ELSE CPRINTLN(DEBUG_MISSION, "MS_SET_UP_AFTER_INTRO") eMissionState = MS_SET_UP_AFTER_INTRO ENDIF IF DOES_CAM_EXIST(mCam) SET_CAM_ACTIVE(mCam, FALSE) RENDER_SCRIPT_CAMS(FALSE, FALSE) DESTROY_CAM(mCam) ENDIF ENDIF IF LAUNCH_MISSION_STAGE_MENU(s_skip_menu, i_debug_jump_stage) CLEAR_PRINTS() KILL_ANY_CONVERSATION() RESET_ALL_HUNTER_CONVOS() RESET_ALL_CONVO_FLAGS() SWITCH i_debug_jump_stage CASE 0 i_debug_jump_stage = ENUM_TO_INT(MS_SET_UP_AFTER_INTRO) BREAK // Set up hunter walking off at start CASE 1 i_debug_jump_stage = ENUM_TO_INT(MS_SET_UP_BEFORE_FIRST_ELK) BREAK // Set up first elk to shoot CASE 2 i_debug_jump_stage = ENUM_TO_INT(MS_SET_UP_BEFORE_SECOND_ELK) BREAK // Set up second elk CASE 3 i_debug_jump_stage = ENUM_TO_INT(MS_SET_UP_BEFORE_THIRD_ELK) BREAK // Set up third elk CASE 4 i_debug_jump_stage = ENUM_TO_INT(MS_SET_UP_BEFORE_FOURTH_ELK) BREAK // Outro ENDSWITCH MISSION_STATE e_stage = INT_TO_ENUM(MISSION_STATE, i_debug_jump_stage) eSubState = SS_INIT eMissionState = e_stage ENDIF ENDPROC PROC HUNTING_PRINT_DEBUG_INFO_TO_SCREEN() FLOAT fDisplayAtX = 0.7 FLOAT fDisplayAtY = 0.1 FLOAT fDisplayAdd = 0.0125 TEXT_LABEL_63 texDisplay texDisplay = "eMissionState: " texDisplay += GET_STRING_FROM_MISSION_STATE(eMissionState) DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd texDisplay = "eSubState: " texDisplay += GET_STRING_FROM_SUB_STATE(eSubState) DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd texDisplay = "eHunterSubState: " texDisplay += GET_STRING_FROM_HUNTER_SUB_STATE(eHunterSubState) DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd texDisplay = "eHunterState: " texDisplay += GET_STRING_FROM_HUNTER_STATE(eHunterState) DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd texDisplay = "ePreState: " texDisplay += GET_STRING_FROM_HUNTER_STATE(ePreState) DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd ENDPROC /// PURPOSE: /// Handles all debug recording of Hunting mission PROC HUNTING_DEBUG_RECORDS() DEBUG_RECORD_CLEAR_ENTITIES() DEBUG_RECORD_ENTITY( PLAYER_PED_ID() ) INT i REPEAT MAX_ELKS i IF IS_PED_UNINJURED( mElk[i].mPed ) DEBUG_RECORD_ENTITY( mElk[i].mPed ) ENDIF ENDREPEAT ENDPROC #ENDIF // SCRIPT LOOP SCRIPT(g_structRCScriptArgs sRCLauncherDataIn) sRCLauncherDataLocal = sRCLauncherDataIn RC_TakeEntityOwnership(sRCLauncherDataLocal) // Now on mission... 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|FORCE_CLEANUP_FLAG_REPEAT_PLAY) PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]") Random_Character_Failed() Script_Cleanup() TERMINATE_THIS_THREAD() ENDIF LOCAL_RECORD_PLAYERS_GUN() SAFE_GIVE_SNIPER_TO_PLAYER(FALSE) RANDOM_CHAR_DISPLAY_MISSION_TITLE(RC_HUNTING_2) IF Is_Replay_In_Progress() // Set up the initial scene for replays CPRINTLN(DEBUG_HUNTING, "REPLAY IN PROGRESS") g_bSceneAutoTrigger = TRUE eInitialSceneStage = IS_REQUEST_SCENE WHILE NOT SetupScene_HUNTING_2(sRCLauncherDataLocal) WAIT(0) ENDWHILE RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE, FALSE) g_bSceneAutoTrigger = FALSE ENDIF mHunter = sRCLauncherDataLocal.pedID[0] // Loop within here until the mission passes or fails WHILE(TRUE) #IF IS_DEBUG_BUILD HUNTING_PRINT_DEBUG_INFO_TO_SCREEN() HUNTING_DEBUG_RECORDS() #ENDIF REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_FG") UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene) SET_DISABLE_RANDOM_TRAINS_THIS_FRAME(TRUE) IF IS_PED_UNINJURED(PLAYER_PED_ID()) // This is needed so that common_hunting can put proper sized blips on the random elk calls. vHuntingPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF eMissionState != MS_MISSION_FAILED AND eMissionState != MS_INIT_MISSION AND eMissionState != MS_SET_UP_AFTER_INTRO CHECK_HUNTER_STATES() MONITER_PLAYER_AIMING_SOUNDS() ENDIF // We don't need to monitor the players noise levels after last elk has died. IF eMissionState != MS_MISSION_FAILED AND eMissionState != MS_INIT_MISSION AND eMissionState != MS_APPROACH_FOURTH_ELK AND eMissionState != MS_PHOTO_FOURTH_ELK AND eMissionState != MS_SEND_PHOTO AND eMissionState != MS_WAIT_FOR_REPLY AND eMissionState != MS_DO_FINAL_PHONECALL CHECK_NOISY_PLAYER() ENDIF IF bCanUpdateWindBlip SET_SNIPER_SCOPE_UNDER_HUD_THIS_FRAME() IF bWindCanChange UPDATE_WIND_BLIP(FALSE) ELSE UPDATE_WIND_BLIP(TRUE, 100.0) ENDIF ENDIF SWITCH eMissionState CASE MS_INIT_MISSION INIT_MISSION() BREAK CASE MS_RUN_INTRO RUN_INTRO() BREAK CASE MS_SET_UP_AFTER_INTRO SET_UP_AFTER_INTRO() BREAK CASE MS_SET_UP_BEFORE_FIRST_ELK SET_UP_BEFORE_FIRST_ELK() BREAK CASE MS_FOLLOW_TO_FIRST_ELK FOLLOW_TO_FIRST_ELK() BREAK CASE MS_KILL_FIRST_ELK KILL_FIRST_ELK() BREAK CASE MS_SET_UP_BEFORE_SECOND_ELK SET_UP_BEFORE_SECOND_ELK() BREAK CASE MS_FOLLOW_TO_SECOND_ELK FOLLOW_TO_SECOND_ELK() BREAK CASE MS_KILL_SECOND_ELK KILL_SECOND_ELK() BREAK CASE MS_SET_UP_BEFORE_THIRD_ELK SET_UP_BEFORE_THIRD_ELK() BREAK CASE MS_FOLLOW_TO_THIRD_ELK FOLLOW_TO_THIRD_ELK() BREAK CASE MS_KILL_THIRD_ELK KILL_THIRD_ELK() BREAK CASE MS_SET_UP_BEFORE_FOURTH_ELK SET_UP_BEFORE_FOURTH_ELK() BREAK CASE MS_HUNTER_LEAVES HUNTER_LEAVES() BREAK CASE MS_KILL_FOURTH_ELK KILL_FOURTH_ELK() BREAK CASE MS_APPROACH_FOURTH_ELK APPROACH_FOURTH_ELK() BREAK CASE MS_PHOTO_FOURTH_ELK PHOTO_FOURTH_ELK() BREAK CASE MS_SEND_PHOTO SEND_PHOTO() BREAK CASE MS_WAIT_FOR_REPLY WAIT_FOR_REPLY() BREAK CASE MS_DO_FINAL_PHONECALL DO_FINAL_PHONECALL() BREAK CASE MS_SET_UP_BEFORE_MISSION_PASS SET_UP_BEFORE_MISSION_PASS()BREAK CASE MS_MISSION_PASSED MISSION_PASSED() BREAK CASE MS_MISSION_FAILED FAILED_WAIT_FOR_FADE() BREAK ENDSWITCH WAIT(0) #IF IS_DEBUG_BUILD IF eMissionState != MS_MISSION_FAILED AND eMissionState != MS_INIT_MISSION DEBUG_Check_Debug_Keys() ENDIF #ENDIF ENDIF ENDWHILE #IF IS_DEBUG_BUILD //COMPILER HACK CHALLENGE_BACK_X = CHALLENGE_BACK_X CHALLENGE_BACK_Y = CHALLENGE_BACK_Y CHALLENGE_BACK_WIDTH = CHALLENGE_BACK_WIDTH CHALLENGE_BACK_HEIGHT = CHALLENGE_BACK_HEIGHT CHALLENGE_TEXT_OFFSET_X = CHALLENGE_TEXT_OFFSET_X CHALLENGE_TEXT_OFFSET_Y = CHALLENGE_TEXT_OFFSET_Y CHALLENGE_TEXT_TABBED_OFFSET_X = CHALLENGE_TEXT_TABBED_OFFSET_X CHALLENGE_TEXT_GOAL_BUFFER_Y = CHALLENGE_TEXT_GOAL_BUFFER_Y CHALLENGE_TEXT_OBJ_BUFFER_Y = CHALLENGE_TEXT_OBJ_BUFFER_Y #ENDIF // Script should never reach here. Always terminate with cleanup function. ENDSCRIPT