//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 "commands_brains.sch" USING "commands_camera.sch" USING "commands_pad.sch" USING "commands_script.sch" USING "common_Hunting.sch" USING "common_Hunting_freemode.sch" USING "common_hunting_challenges.sch" USING "common_hunting_corpse.sch" USING "common_hunting_leaderboards.sch" USING "flow_public_game.sch" USING "mission_control_public.sch" USING "randomChar_private.sch" USING "commands_pad.sch" USING "minigame_uiinputs.sch" USING "hud_drawing.sch" USING "screens_header.sch" USING "UIUtil.sch" USING "script_oddjob_funcs.sch" USING "script_usecontext.sch" USING "Amb_Select_Screen.sch" USING "script_camera.sch" USING "script_drawing.sch" USING "LauncherInclude.sch" USING "mission_titles_private.sch" // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Hunting_Ambient.sc // AUTHOR : Rob Taylor // DESCRIPTION : The main script which handles all ambient hunting events. // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** //HUNT CREATOR #IF IS_DEBUG_BUILD WIDGET_GROUP_ID widgetGroup BOOL bDebugGrazePoints = FALSE BOOL bDebugAnimalSpawns = FALSE BOOL bDebugTempPoints = FALSE BOOL bDebugTempArea = FALSE BOOL bDisplayChallengeTracking = FALSE BOOL bCreateGrazePos[MAX_GRAZE_AREAS] BOOL bPrintTempPoint[MAX_GRAZE_AREAS] BOOL bDisplayingElk = FALSE BOOL bDisplayingAnimals = FALSE BOOL bDisplayCoyotes = FALSE BOOL bCreateTempAreaPos[MAX_POLY_TEST_VERTS] BOOL bPrintTempArea[MAX_POLY_TEST_VERTS] BOOL bRecreateHuntArea = FALSE BOOL bDoHuntCreation = FALSE VECTOR vTempGrazePos[MAX_GRAZE_AREAS] VECTOR vTempArea[MAX_POLY_TEST_VERTS] VECTOR vTempAnimalSpawn[MAX_ANIMAL_SPAWN_POS] INT iHunterRank, iWeaponRank, iPhotoRank INT iHunterPrevRank, iWeaponPrevRank, iPhotoPrevRank, iDebugMoneyAddAmount BOOL bAddPoint, bAutoGold, bAdd10Pts, bAddMoney BOOL bForceSpawnCougar BOOL bDebugHuntArea = FALSE PROC SETUP_HUNT_CREATOR_WIDGET() START_WIDGET_GROUP("HUNT CREATOR") ADD_WIDGET_INT_SLIDER("Hunter Challenge Rank", iHunterRank, 0, 5, 1) ADD_WIDGET_INT_SLIDER("Weapon Challenge Rank", iWeaponRank, 0, 5, 1) ADD_WIDGET_INT_SLIDER("Photo Challenge Rank", iPhotoRank, 0, 5, 1) ADD_WIDGET_BOOL("Dislay Challenge Tracking", bDisplayChallengeTracking) //ADD_WIDGET_FLOAT_SLIDER("Wind Meter X", WIND_METER_X, -1.0, 1.0, 0.001) //ADD_WIDGET_FLOAT_SLIDER("Wind Meter Y", WIND_METER_Y, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Back X", CHALLENGE_BACK_X, 0.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Back Y", CHALLENGE_BACK_Y, 0.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Back W", CHALLENGE_BACK_WIDTH, 0.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Back H", CHALLENGE_BACK_HEIGHT, 0.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Text X", CHALLENGE_TEXT_OFFSET_X, 0.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Text Y", CHALLENGE_TEXT_OFFSET_Y, 0.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Text Tab X", CHALLENGE_TEXT_TABBED_OFFSET_X, 0.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Text Goal Buff Y", CHALLENGE_TEXT_GOAL_BUFFER_Y, 0.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("Chall Text Ob Buff Y", CHALLENGE_TEXT_OBJ_BUFFER_Y, 0.0, 1.0, 0.001) ADD_WIDGET_BOOL("Give Player a Point", bAddPoint) ADD_WIDGET_BOOL("Give Player 10 Points", bAdd10Pts) ADD_WIDGET_BOOL("Set Player To Gold", bAutoGold) ADD_WIDGET_INT_SLIDER("Debug Money Addition", iDebugMoneyAddAmount, 0, 9999999, 5) ADD_WIDGET_BOOL("Give Player Money", bAddMoney) ADD_WIDGET_BOOL("Do Hunt Creation", bDoHuntCreation) ADD_WIDGET_BOOL("Debug Graze Points", bDebugGrazePoints) ADD_WIDGET_BOOL("Debug Temp Points", bDebugTempPoints) ADD_WIDGET_BOOL("Debug Hunt Area", bDebugHuntArea) ADD_WIDGET_BOOL("Debug Temp Hunt Area", bDebugTempArea) ADD_WIDGET_BOOL("Debug Animal Spawns", bDebugAnimalSpawns) ADD_WIDGET_BOOL("Debug Draw Elk", bDisplayingElk) ADD_WIDGET_BOOL("Debug Draw Animals", bDisplayingAnimals) ADD_WIDGET_BOOL("Debug Draw Coyotes", bDisplayCoyotes) ADD_WIDGET_BOOL("Force Spawn Cougar", bForceSpawnCougar) START_WIDGET_GROUP("GRAZE POSITIONS") INT idx START_WIDGET_GROUP("Positions 0 - 4") FOR idx = 0 TO 4 TEXT_LABEL_31 txtToDraw = "Graze Pos " txtToDraw += idx ADD_WIDGET_VECTOR_SLIDER(txtToDraw, vTempGrazePos[idx], -7000.0, 7000.0, 0.1) txtToDraw = "Create Graze Pos " txtToDraw += idx ADD_WIDGET_BOOL(txtToDraw, bCreateGrazePos[idx]) txtToDraw = "Print Graze Pos " txtToDraw += idx ADD_WIDGET_BOOL(txtToDraw, bPrintTempPoint[idx]) ENDFOR STOP_WIDGET_GROUP() START_WIDGET_GROUP("Positions 5 - 9") FOR idx = 5 TO 9 TEXT_LABEL_31 txtToDraw = "Graze Pos " txtToDraw += idx ADD_WIDGET_VECTOR_SLIDER(txtToDraw, vTempGrazePos[idx], -7000.0, 7000.0, 0.1) txtToDraw = "Create Graze Pos " txtToDraw += idx ADD_WIDGET_BOOL(txtToDraw, bCreateGrazePos[idx]) txtToDraw = "Print Graze Pos " txtToDraw += idx ADD_WIDGET_BOOL(txtToDraw, bPrintTempPoint[idx]) ENDFOR STOP_WIDGET_GROUP() START_WIDGET_GROUP("Positions 10 - 13") FOR idx = 10 TO 13 TEXT_LABEL_31 txtToDraw = "Graze Pos " txtToDraw += idx ADD_WIDGET_VECTOR_SLIDER(txtToDraw, vTempGrazePos[idx], -7000.0, 7000.0, 0.1) txtToDraw = "Create Graze Pos " txtToDraw += idx ADD_WIDGET_BOOL(txtToDraw, bCreateGrazePos[idx]) txtToDraw = "Print Graze Pos " txtToDraw += idx ADD_WIDGET_BOOL(txtToDraw, bPrintTempPoint[idx]) ENDFOR STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() START_WIDGET_GROUP("HUNT AREA") FOR idx = 0 TO 7 TEXT_LABEL_31 txtToDraw = "Hunt Area Pos " txtToDraw += idx ADD_WIDGET_VECTOR_SLIDER(txtToDraw, vTempArea[idx], -7000.0, 7000.0, 0.1) txtToDraw = "Create Hunt Area Pos " txtToDraw += idx ADD_WIDGET_BOOL(txtToDraw, bCreateTempAreaPos[idx]) txtToDraw = "Print Hunt Area Pos " txtToDraw += idx ADD_WIDGET_BOOL(txtToDraw, bPrintTempArea[idx]) ENDFOR STOP_WIDGET_GROUP() START_WIDGET_GROUP("ANIMAL SPAWNS") FOR idx = 0 TO MAX_ANIMAL_SPAWN_POS-1 TEXT_LABEL_31 txtToDraw = "Animal Spawn Pos " txtToDraw += idx ADD_WIDGET_VECTOR_SLIDER(txtToDraw, vTempAnimalSpawn[idx], -7000.0, 7000.0, 0.1) ENDFOR STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() ENDPROC /// PURPOSE: /// Creates mission widget and adds the needed sliders etc. PROC SETUP_FOR_RAGE_WIDGETS() widgetGroup = START_WIDGET_GROUP("MISSION WIDG") SETUP_HUNT_CREATOR_WIDGET() STOP_WIDGET_GROUP() ENDPROC /// PURPOSE: /// Deletes the widget group PROC CLEANUP_OBJECT_WIDGETS() IF DOES_WIDGET_GROUP_EXIST(widgetGroup) DELETE_WIDGET_GROUP(widgetGroup) ENDIF ENDPROC /// PURPOSE: /// Saves a vector to the debug file /// PARAMS: /// name - Name of the vector /// thing - the VECTOR you want to save PROC WRITE_VECTOR_TO_DEBUG(STRING name, VECTOR thing) SAVE_STRING_TO_DEBUG_FILE(name) SAVE_VECTOR_TO_DEBUG_FILE(thing) SAVE_NEWLINE_TO_DEBUG_FILE() ENDPROC /// PURPOSE: /// Moniters for changes to the widgets PROC UPDATE_RAG_WIDGETS() INT idx IF bDoHuntCreation IF NOT bDebugTempPoints bDebugTempPoints = TRUE ENDIF IF NOT bDebugHuntArea bDebugHuntArea = TRUE ENDIF REPEAT MAX_GRAZE_AREAS idx IF bCreateGrazePos[idx] vTempGrazePos[idx] = GET_SCRIPT_MOUSE_POINTER_IN_WORLD_COORDS() ENDIF ENDREPEAT FOR idx = 0 TO (MAX_POLY_TEST_VERTS-1) IF bCreateTempAreaPos[idx] vTempArea[idx] = GET_SCRIPT_MOUSE_POINTER_IN_WORLD_COORDS() ENDIF ENDFOR IF bRecreateHuntArea POPULATE_POLY_CHECKS(vTempArea) bRecreateHuntArea = FALSE ENDIF ENDIF IF bAddPoint bAddPoint = FALSE Player_Hunt_Data.iScore++ ENDIF IF bAdd10Pts bAdd10Pts = FALSE Player_Hunt_Data.iScore += 10 ENDIF IF bAutoGold bAutoGold = FALSE Player_Hunt_Data.iScore = Player_Hunt_Data.iScoreForGold ENDIF IF bAddMoney bAddMoney = FALSE Player_Hunt_Data.iMoney += iDebugMoneyAddAmount ENDIF IF bForceSpawnCougar bForceSpawnCougar = FALSE IF NOT DOES_ENTITY_EXIST(mCougar[0].mPed) mCougar[0].iSpawnDelayTime = 0 ELIF NOT DOES_ENTITY_EXIST(mCougar[1].mPed) mCougar[1].iSpawnDelayTime = 0 ENDIF ENDIF IF bDebugTempPoints REPEAT MAX_GRAZE_AREAS idx DRAW_DEBUG_SPHERE(vTempGrazePos[idx], 2,0,0,255,100) IF bPrintTempPoint[idx] TEXT_LABEL GrazeName = "vGrazePos[" GrazeName += idx GrazeName += "] = " OPEN_DEBUG_FILE() WRITE_VECTOR_TO_DEBUG(GrazeName, vTempGrazePos[idx]) CLOSE_DEBUG_FILE() bPrintTempPoint[idx] = FALSE ENDIF ENDREPEAT ENDIF FOR idx = 0 TO MAX_POLY_TEST_VERTS-1 IF bDebugTempArea DRAW_DEBUG_SPHERE(vTempArea[idx], 5, 255, 255, 0) ENDIF IF bPrintTempArea[idx] TEXT_LABEL AreaName = "vPoly[" AreaName += idx AreaName += "] = " OPEN_DEBUG_FILE() WRITE_VECTOR_TO_DEBUG(AreaName, vTempArea[idx]) CLOSE_DEBUG_FILE() bPrintTempArea[idx] = FALSE ENDIF ENDFOR IF bDebugGrazePoints REPEAT MAX_GRAZE_AREAS idx DRAW_DEBUG_SPHERE(elkSpawn[idx].vCoord, 5, 255,0,0,100) TEXT_LABEL_31 txtTemp = "Can spawn in: " txtTemp += elkSpawn[idx].iNextSpawnTime - GET_GAME_TIMER() DRAW_DEBUG_TEXT(txtTemp, elkSpawn[idx].vCoord + <<0,0,3>>) ENDREPEAT ENDIF IF bDebugHuntArea FOR idx = 0 TO mAreaCheck1.iVertCount-1 DRAW_DEBUG_SPHERE(mAreaCheck1.v[idx], 5, 0, 255, 0) ENDFOR ENDIF IF bDebugAnimalSpawns FOR idx = 0 TO MAX_ANIMAL_SPAWN_POS-1 DRAW_DEBUG_SPHERE(vAnimalSpawnPos[idx], 5, 255, 255, 0, 100) ENDFOR ENDIF IF bDisplayCoyotes REPEAT MAX_RANDOM_ANIMALS idx IF (mAnimal[idx].animalType = ANIMAL_TYPE_COYOTE) IF DOES_ENTITY_EXIST(mAnimal[idx].mPed) AND NOT IS_ENTITY_DEAD(mAnimal[idx].mPed) VECTOR vCoord = GET_ENTITY_COORDS(mAnimal[idx].mPed) DRAW_DEBUG_SPHERE(vCoord, 2, 0, 255, 255, 100) ENDIF ENDIF ENDREPEAT ENDIF IF iHunterRank != ENUM_TO_INT(Player_Hunt_Data.challengeData[HC_MASTER_HUNTER].hcRank) IF iHunterRank = iHunterPrevRank // The player ranked up on his own iHunterRank = ENUM_TO_INT(Player_Hunt_Data.challengeData[HC_MASTER_HUNTER].hcRank) ELSE // The widget hit Player_Hunt_Data.challengeData[HC_MASTER_HUNTER].hcRank = INT_TO_ENUM(HUNTING_CHALLENGE_RANK, iHunterRank) Player_Hunt_Data.bChallengeScreenSetup = FALSE ENDIF ENDIF iHunterPrevRank = iHunterRank IF iPhotoRank != ENUM_TO_INT(Player_Hunt_Data.challengeData[HC_PHOTOJOURNALIST].hcRank) IF iPhotoRank = iPhotoPrevRank // The player ranked up on his own iPhotoRank = ENUM_TO_INT(Player_Hunt_Data.challengeData[HC_PHOTOJOURNALIST].hcRank) ELSE // The widget hit Player_Hunt_Data.challengeData[HC_PHOTOJOURNALIST].hcRank = INT_TO_ENUM(HUNTING_CHALLENGE_RANK, iPhotoRank) Player_Hunt_Data.bChallengeScreenSetup = FALSE ENDIF ENDIF iPhotoPrevRank = iPhotoRank IF iWeaponRank != ENUM_TO_INT(Player_Hunt_Data.challengeData[HC_WEAPONS_MASTER].hcRank) IF iWeaponRank = iWeaponPrevRank // The player ranked up on his own iWeaponRank = ENUM_TO_INT(Player_Hunt_Data.challengeData[HC_WEAPONS_MASTER].hcRank) ELSE // The widget hit Player_Hunt_Data.challengeData[HC_WEAPONS_MASTER].hcRank = INT_TO_ENUM(HUNTING_CHALLENGE_RANK, iWeaponRank) Player_Hunt_Data.bChallengeScreenSetup = FALSE ENDIF ENDIF iWeaponPrevRank = iWeaponRank IF bDisplayingElk REPEAT MAX_ELKS idx IF DOES_ENTITY_EXIST(mElk[idx].mPed) AND NOT IS_ENTITY_DEAD(mElk[idx].mPed) VECTOR vElkCoord = GET_ENTITY_COORDS(mElk[idx].mPed) IF mElk[idx].bIsHerdLeader DRAW_DEBUG_SPHERE(vElkCoord, 2, 0, 0, 255, 255) ELIF mElk[idx].bIsHerdMember DRAW_DEBUG_SPHERE(vElkCoord, 2, 0, 255, 0, 255) ELSE DRAW_DEBUG_SPHERE(vElkCoord, 2, 255, 0, 0, 255) ENDIF ENDIF ENDREPEAT ENDIF IF bDisplayingAnimals REPEAT MAX_RANDOM_ANIMALS idx IF DOES_ENTITY_EXIST(mAnimal[idx].mPed) AND NOT IS_ENTITY_DEAD(mAnimal[idx].mPed) VECTOR vAnimalCoord = GET_ENTITY_COORDS(mAnimal[idx].mPed) DRAW_DEBUG_SPHERE(vAnimalCoord, 2, 0, 255, 0, 255) ENDIF ENDREPEAT ENDIF ENDPROC #ENDIF INT iHuntCandidateID = NO_CANDIDATE_ID ENUM HUNTSTATE HS_SETUP, HS_HUNT, HS_RESULTS ENDENUM ENUM STATE_STAGE SS_INIT, SS_POST_INIT, SS_ACTIVE, SS_TRANSIT, SS_CLEANUP, SS_SKIPPED ENDENUM ENUM MISSION_REQ RQ_NONE, RQ_INTRO, RQ_ANIMS, RQ_DEER_MODEL, RQ_RIFLE, RQ_CAMERA, RQ_CHALLENGES, RQ_SOUND, RQ_TEXTURES ENDENUM ENUM FINISH_STATE FS_NULL, FS_PASSED, FS_FAILED_TIME, FS_FAILED_SPOOKED, FS_FAILED_LEFT, FS_FAILED_WRONG_WEAPON, FS_FAILED_WANTED, FS_CANCELLED ENDENUM HUNTSTATE eHuntState = HS_SETUP STATE_STAGE eStage = SS_INIT FINISH_STATE eFinishState = FS_NULL // =========================== // VARIABLES // =========================== structTimer tCutsceneTimer INT iMissionState = 0 //Used in NEXT_STAGE( BOOL bReverse = FALSE) and during jump skips INT iMissionEndTime = 0 BOOL bShowingCancelScreen = FALSE BOOL bMissionEnded = FALSE BOOL bIsContinuing = FALSE // RSP: Results menu. BOOL bSentFailText = FALSE BOOL bSentWarnText = FALSE BOOL bGaveRifle = FALSE BOOL bHuntTitleReady = FALSE VECTOR vIntroCamRot VECTOR vPlayerStartPos FLOAT fPlayerStartDir VEHICLE_INDEX vehTruck BOOL bTruckGrabbedAtStart = FALSE STREAMVOL_ID streamVolResults // HUD TIMER INT iMissionTitleState = 0 INT iNavMeshLoadTime = 0 CONST_INT HUNTING_NAVMESH_LOAD_DELAY 5000 SCENARIO_BLOCKING_INDEX mBlockArea BOOL bShownBronzeToast = FALSE BOOL bShownSilverToast = FALSE BOOL bShownGoldToast = FALSE // INTRO DATA INT iSceneID CAMERA_INDEX camScene CAMERA_INDEX camSky INT iQuitSceneState = 0 INT iQuitMenuDelay = 0 INT iLBDWarning = 0 BOOL bPredictionSetup = FALSE // ========================== // MISSION FLOW CONTROL // ========================== /// PURPOSE: /// Advances or reverses the mission stage /// PARAMS: /// bReverse - if true the mission state is reversed PROC NEXT_STAGE( BOOL bReverse = FALSE) iMissionState = ENUM_TO_INT(eHuntState) IF NOT bReverse eHuntState = INT_TO_ENUM(HUNTSTATE, (iMissionState + 1)) ELSE IF iMissionState > 0 eHuntState = INT_TO_ENUM(HUNTSTATE, (iMissionState - 1)) ENDIF ENDIF eStage = SS_INIT ENDPROC PROC DELETE_ALL_HUNTING_TEXT_MESSAGES(BOOL bOnlyCletusTexts = TRUE) INT iMsgIdx REPEAT MAX_TEXT_MESSAGES iMsgIdx IF NOT IS_STRING_NULL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[iMsgIdx].TxtMsgLabel) IF (bOnlyCletusTexts AND (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[iMsgIdx].TxtMsgSender = CHAR_HUNTER)) OR NOT bOnlyCletusTexts DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[iMsgIdx].TxtMsgLabel) ENDIF ENDIF ENDREPEAT ENDPROC // =========================================================================================================== // Termination // =========================================================================================================== // ----------------------------------------------------------------------------------------------------------- // Mission Cleanup // ----------------------------------------------------------------------------------------------------------- PROC Mission_Cleanup(BOOL bForceCleanup = FALSE) PRINTLN("...Ambient Hunting Cleanup") // Emergency write, in the event that the script shuts down, but we haven't finished our predictive write. IF bPredictionSetup AND NOT scLB_rank_predict.bFinishedWrite HUNTING_WRITE_TO_LEADERBOARD() ENDIF CLEAR_RANK_REDICTION_DETAILS() CLEANUP_SOCIAL_CLUB_LEADERBOARD(Player_Hunt_Data.huntLB_control) // Restores the paler's gun state, and takes away infinite ammo. RETURN_PLAYERS_GUN(bForceCleanup) SET_MODEL_AS_NO_LONGER_NEEDED(A_C_DEER) ACTION_MANAGER_ENABLE_ACTION(GET_HASH_KEY("AR_knife_low_kick_far"), TRUE) ACTION_MANAGER_ENABLE_ACTION(GET_HASH_KEY("AR_knife_low_kick_close"), TRUE) ACTION_MANAGER_ENABLE_ACTION(GET_HASH_KEY("ACT_low_kick_close"), TRUE) ACTION_MANAGER_ENABLE_ACTION(GET_HASH_KEY("ACT_low_kick_far"), TRUE) CLEANUP_RANDOM_ANIMALS() SET_RANDOM_TRAINS(TRUE) REMOVE_SCENARIO_BLOCKING_AREA(mBlockArea) CLEAR_PED_NON_CREATION_AREA() REMOVE_RELATIONSHIP_GROUP(mElkGroup) IF IS_AUDIO_SCENE_ACTIVE("HUNTING_02_SETTINGS") STOP_AUDIO_SCENE("HUNTING_02_SETTINGS") STOP_SOUND(iSoundID) RELEASE_SOUND_ID(iSoundID) ENDIF RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\HUNTING_MAIN_A") RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\HUNTING_2_ELK_CALLS") RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\HUNTING_2_ELK_VOCALS") UNREGISTER_SCRIPT_WITH_AUDIO() IF DOES_ENTITY_EXIST(vehTruck) AND NOT IS_ENTITY_DEAD(vehTruck) SET_VEHICLE_HAS_STRONG_AXLES(vehTruck, TRUE) ENDIF REMOVE_NAVMESH_REQUIRED_REGIONS() RC_END_CUTSCENE_MODE() STOP_AUDIO_SCENE("AMBIENT_HUNTING_MIX") DELETE_ALL_HUNTING_TEXT_MESSAGES() #IF IS_DEBUG_BUILD CLEANUP_OBJECT_WIDGETS() #ENDIF MISSION_OVER(iHuntCandidateID) RC_MISSION_OVER(NO_RC_MISSION, FALSE) DISABLE_CELLPHONE(FALSE) RELEASE_PRELOADED_OUTFIT(PLAYER_PED_ID()) BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE(FALSE) // Allow Hunting to be launched again as likely to be within trigger distance of the world point REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE("launcher_Hunting_Ambient") SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) SET_AUDIO_FLAG("AllowPlayerAIOnMission", FALSE) PAUSE_CLOCK(FALSE) SET_CINEMATIC_BUTTON_ACTIVE(TRUE) SHUTDOWN_PC_SCRIPTED_CONTROLS() TERMINATE_THIS_THREAD() ENDPROC // ----------------------------------------------------------------------------------------------------------- // Mission Pass // ----------------------------------------------------------------------------------------------------------- PROC Mission_Passed() PRINTLN("...Ambient Hunting Passed") // Play mission passed audio //MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC(TRUE) Mission_Cleanup() ENDPROC // ----------------------------------------------------------------------------------------------------------- // Mission Fail // ----------------------------------------------------------------------------------------------------------- PROC Mission_Failed() PRINTLN("...Ambient Hunting Failed") Mission_Cleanup() ENDPROC /// PURPOSE: /// Creates a camera - Used for cutscenes /// PARAMS: /// pos - The position to create the camera at /// rot - The rotation of the camera (VECTOR not Matrix) /// RETURNS: /// TRUE if the camera was created FUNC BOOL SETUP_CAMERA(VECTOR pos, VECTOR rot) IF IS_PED_UNINJURED(PLAYER_PED_ID()) IF NOT DOES_CAM_EXIST(camScene) camScene = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA",pos,rot, 50, TRUE) //RENDER_SCRIPT_CAMS(TRUE, FALSE) IF DOES_CAM_EXIST(camScene) SET_CAM_PARAMS(camScene,pos,rot,50.000000) //SHAKE_CAM(camMain, "HAND_SHAKE") RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Sets up poly area and graze positions for the specific hunt location PROC SET_UP_HUNT_AREA() // Chilead Mountain Hunting VECTOR vPoly[MAX_POLY_TEST_VERTS] vPoly[0] = <<-2151.1272, 4431.3477, 61.9329>> vPoly[1] = <<-1899.1481, 4044.1296, 246.3255>> vPoly[2] = <<-224.7574, 3868.3560, 37.5636>> vPoly[3] = <<-58.7894, 4365.2559, 52.7727>> vPoly[4] = <<-316.4930, 4684.7959, 248.4118>> vPoly[5] = <<-884.8384, 4907.8447, 273.6012>> vPoly[6] = <<-1263.8662, 5396.5322, -0.0613>> vPoly[7] = <<-1753.4866, 5058.2876, 20.8162>> POPULATE_POLY_CHECKS(vPoly, MAX_POLY_TEST_VERTS) elkSpawn[0].vCoord = <<-1511.7775, 4784.5337, 59.8112>> elkSpawn[1].vCoord = <<-1398.8132, 4454.7363, 23.8370>> elkSpawn[2].vCoord = <<-1352.4169, 4698.8076, 64.4277>> elkSpawn[3].vCoord = <<-1461.1115, 4598.0430, 47.5845>> elkSpawn[4].vCoord = <<-1599.1580, 4833.4448, 55.0841>> elkSpawn[5].vCoord = <<-1937.9379, 4543.3823, 9.0519>> elkSpawn[6].vCoord = <<-1517.0697, 4718.6260, 45.1539>> elkSpawn[7].vCoord = <<-1339.6239, 4434.0605, 26.5921>> elkSpawn[8].vCoord = <<-1493.7471, 4438.7080, 17.6355>> elkSpawn[9].vCoord = <<-1553.9728, 4448.3848, 11.3850>> elkSpawn[10].vCoord = <<-1671.2791, 4772.9170, 45.7077>> elkSpawn[11].vCoord = <<-1586.5284, 4522.0059, 16.6437>> elkSpawn[12].vCoord = <<-1437.8397, 4718.1875, 41.1638>> elkSpawn[13].vCoord = <<-1660.6385, 4558.4946, 40.7479>> elkSpawn[14].vCoord = <<-1663.3369, 4601.2656, 46.9536>> elkSpawn[15].vCoord = <<-1722.6177, 4690.5630, 31.0306>> elkSpawn[16].vCoord = <<-1522.1996, 4530.8843, 44.9653>> elkSpawn[17].vCoord = <<-1550.4271, 4770.5918, 61.3469>> elkSpawn[18].vCoord = <<-1583.5095, 4669.6318, 44.7582>> elkSpawn[19].vCoord = <<-1738.6082, 4630.1387, 29.7174>> elkSpawn[20].vCoord = <<-425.1335, 4331.4390, 58.2179>> elkSpawn[21].vCoord = <<-1227.6572, 4959.6426, 171.8550>> elkSpawn[22].vCoord = <<-756.1689, 4744.0537, 229.8765>> elkSpawn[23].vCoord = <<-237.4276, 4428.7231, 54.4526>> elkSpawn[24].vCoord = <<-952.6023, 4363.2085, 10.8284>> elkSpawn[25].vCoord = <<-1415.1010, 4398.0420, 44.0559>> elkSpawn[26].vCoord = <<-1267.3019, 4411.9858, 9.6374>> elkSpawn[27].vCoord = <<-1259.8344, 4347.8838, 7.0597>> elkSpawn[28].vCoord = <<-1655.3364, 4453.8853, 0.6491>> elkSpawn[29].vCoord = <<-1817.8634, 4509.4414, 25.4081>> elkSpawn[30].vCoord = <<-1815.6727, 4420.2090, 45.1439>> elkSpawn[31].vCoord = <<-1657.9868, 4281.4907, 80.7132>> elkSpawn[32].vCoord = <<-1518.7003, 4235.5576, 63.0872>> elkSpawn[33].vCoord = <<-1405.1924, 4251.4434, 42.5107>> elkSpawn[34].vCoord = <<-1148.8406, 4580.3638, 140.3432>> elkSpawn[35].vCoord = <<-1314.3433, 4523.1592, 28.3174>> elkSpawn[36].vCoord = <<-1269.1595, 4665.2861, 92.2077>> elkSpawn[37].vCoord = <<-1060.3892, 4461.9741, 85.3426>> elkSpawn[38].vCoord = <<-960.9619, 4404.7988, 15.1577>> elkSpawn[39].vCoord = <<-798.0543, 4421.8691, 16.6733>> elkSpawn[40].vCoord = <<-765.4644, 4600.2295, 123.3193>> elkSpawn[41].vCoord = <<-729.2116, 4628.9199, 128.4458>> elkSpawn[42].vCoord = <<-622.1554, 4514.7295, 82.0527>> elkSpawn[43].vCoord = <<-368.5648, 4375.5923, 49.8344>> elkSpawn[44].vCoord = <<-299.4890, 4294.9604, 40.4718>> elkSpawn[45].vCoord = <<-291.6694, 4600.0454, 139.0713>> elkSpawn[46].vCoord = <<-167.2124, 4336.2563, 49.6604>> elkSpawn[47].vCoord = <<-160.3564, 4279.9766, 35.9502>> elkSpawn[48].vCoord = <<-326.4175, 4210.2095, 48.8774>> elkSpawn[49].vCoord = <<-353.8134, 4276.1997, 46.2023>> elkSpawn[50].vCoord = <<-304.5437, 4335.7002, 31.2610>> elkSpawn[51].vCoord = <<-1211.7333, 4801.1953, 212.5187>> elkSpawn[52].vCoord = <<-1116.1746, 4790.0840, 222.5111>> elkSpawn[53].vCoord = <<-973.5195, 4338.3721, 13.6037>> elkSpawn[54].vCoord = <<-755.8174, 4505.7480, 83.2461>> elkSpawn[55].vCoord = <<-1175.0583, 4435.0938, 26.3625>> elkSpawn[56].vCoord = <<-1223.8759, 4458.6499, 29.3014>> elkSpawn[57].vCoord = <<-173.0567, 4480.7612, 69.3354>> vAnimalSpawnPos[0] = <<-1381.4938, 4416.4858, 27.8185>> vAnimalSpawnPos[1] = <<-1538.3176, 4823.2402, 72.7811>> vAnimalSpawnPos[2] = <<-1499.8807, 4563.8755, 36.7863>> vAnimalSpawnPos[3] = <<-1636.7708, 4576.7969, 42.0251>> vAnimalSpawnPos[4] = <<-1700.8790, 4598.8154, 45.4030>> vAnimalSpawnPos[5] = <<-1643.5792, 4651.7920, 29.0423>> vAnimalSpawnPos[6] = <<-1817.5378, 4509.4966, 25.4984>> vAnimalSpawnPos[7] = <<-1479.5502, 4654.1011, 43.9694>> vAnimalSpawnPos[8] = <<-1492.2996, 4481.0200, 17.2195>> vAnimalSpawnPos[9] = <<-1474.0715, 4409.0679, 22.5295>> vAnimalSpawnPos[10] = <<-1633.4824, 4734.9858, 52.2606>> vAnimalSpawnPos[11] = <<-1607.5784, 4641.0571, 47.0786>> vAnimalSpawnPos[12] = <<-1532.2561, 4566.3496, 39.2169>> vAnimalSpawnPos[13] = <<-1430.2557, 4409.0273, 45.7995>> vAnimalSpawnPos[14] = <<-1531.6063, 4613.4048, 28.4776>> vAnimalSpawnPos[15] = <<-1583.5251, 4506.5020, 19.5027>> vAnimalSpawnPos[16] = <<-1625.8840, 4792.8696, 50.1408>> vAnimalSpawnPos[17] = <<-1496.5253, 4736.5146, 54.6202>> vAnimalSpawnPos[18] = <<-1518.8767, 4423.6802, 11.3467>> vAnimalSpawnPos[19] = <<-1706.0890, 4717.6768, 39.8586>> vAnimalSpawnPos[20] = <<-354.4631, 3932.3337, 72.4634>> vAnimalSpawnPos[21] = <<-319.2273, 4281.0005, 48.6787>> vAnimalSpawnPos[22] = <<-1659.1747, 5006.9360, 35.1188>> vAnimalSpawnPos[23] = <<-906.1866, 4822.8911, 304.3815>> vAnimalSpawnPos[24] = <<-964.5157, 4402.6396, 15.0070>> vAnimalSpawnPos[25] = <<-1216.5475, 4454.5537, 29.5726>> vAnimalSpawnPos[26] = <<-1259.2340, 4675.2837, 88.2272>> vAnimalSpawnPos[27] = <<-1295.1776, 4747.4429, 95.7002>> vAnimalSpawnPos[28] = <<-1257.1818, 4920.1128, 176.1196>> vAnimalSpawnPos[29] = <<-764.3734, 4216.8989, 179.9306>> vAnimalSpawnPos[30] = <<-1294.6312, 4605.9229, 120.0947>> vAnimalSpawnPos[31] = <<-1289.1989, 4495.6924, 13.2293>> vAnimalSpawnPos[32] = <<-1930.0492, 4541.5229, 9.7390>> vAnimalSpawnPos[33] = <<-1886.6348, 4489.0132, 26.3309>> vAnimalSpawnPos[34] = <<-1682.3026, 4422.8516, 10.8683>> vAnimalSpawnPos[35] = <<-1543.6766, 4341.0200, 0.9957>> vAnimalSpawnPos[36] = <<-1407.6846, 4309.8545, 3.1902>> vAnimalSpawnPos[37] = <<-1272.5139, 4401.5811, 9.3275>> vAnimalSpawnPos[38] = <<-1215.9462, 4304.0557, 73.9030>> vAnimalSpawnPos[39] = <<-1240.0525, 4302.0342, 68.3904>> vAnimalSpawnPos[40] = <<-1078.8168, 4554.2168, 94.6354>> vAnimalSpawnPos[41] = <<-1058.0194, 4463.2783, 85.9198>> vAnimalSpawnPos[42] = <<-808.1082, 4427.5737, 15.6468>> vAnimalSpawnPos[43] = <<-688.2943, 4412.1401, 16.9693>> vAnimalSpawnPos[44] = <<-555.9728, 4502.3765, 68.8630>> vAnimalSpawnPos[45] = <<-644.8114, 4566.9487, 123.9569>> vAnimalSpawnPos[46] = <<-410.4391, 4655.3677, 238.8684>> vAnimalSpawnPos[47] = <<-226.5519, 4488.9829, 51.3667>> vAnimalSpawnPos[48] = <<-189.8527, 4433.2510, 45.4967>> vAnimalSpawnPos[49] = <<-121.9785, 4376.0630, 67.7734>> vAnimalSpawnPos[50] = <<-121.9785, 4376.0630, 67.7734>> vAnimalSpawnPos[51] = <<-121.9785, 4376.0630, 67.7734>> vAnimalSpawnPos[52] = <<-121.9785, 4376.0630, 67.7734>> vAnimalSpawnPos[53] = <<-121.9785, 4376.0630, 67.7734>> vAnimalSpawnPos[54] = <<-398.0512, 4352.7363, 54.0697>> vPlayerStartPos = <<-1706.6096, 4657.9590, 21.9050>> fPlayerStartDir = 327.0001 CPRINTLN(DEBUG_MISSION,"SET UP HUNT AREA = HUNT 3") ENDPROC /// PURPOSE: /// Set the additional elk to be herd members that only spawn in when specifically requested. PROC SETUP_HERD_STATES() INT i = HERD_MEMBER_INDEX_START WHILE i < MAX_ELKS mElk[i].elkState = ES_NULL ++i ENDWHILE ENDPROC /// PURPOSE: /// Sets up a stage requirment via a switch using an ENUM /// Stage requirements include the hunter the saleform or the mission text etc. /// PARAMS: /// missionReq - The Enum of the required mission element e.g. RQ_TEXT /// pos - The position the thing is spawned at - if no position is required the use vSafeVec /// If spawning multiple things at once then have the postions already in the switch statement /// as calling this func multiple times wont work as well with the other function that calls it /// dir - This is the heading or direction you want the thing to face when spawned. Defaults to /// 0.0 /// RETURNS: /// TRUE when the thing required is created/loaded/setup or whatever. FUNC BOOL SETUP_STAGE_REQUIREMENTS(MISSION_REQ missionReq, VECTOR vPosition, BOOL bHideHUD = TRUE) IF bHideHUD HIDE_HUD_AND_RADAR_THIS_FRAME() ENDIF SWITCH missionReq CASE RQ_INTRO REQUEST_ANIM_DICT("oddjobs@hunterIntro") REQUEST_ANIM_DICT("oddjobs@hunterOutro") IF HAS_ANIM_DICT_LOADED("oddjobs@hunterIntro") AND HAS_ANIM_DICT_LOADED("oddjobs@hunterOutro") RETURN TRUE ENDIF BREAK CASE RQ_ANIMS 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") REQUEST_ANIM_DICT("creatures@cougar@melee@") REQUEST_ANIM_DICT("facials@p_m_one@variations@elkcall") IF HAS_ANIM_DICT_LOADED ("creatures@deer@amb@world_deer_grazing@enter") //amb@medic@standing@kneel@enter") AND HAS_ANIM_DICT_LOADED ("creatures@deer@amb@world_deer_grazing@idle_a") //amb@medic@standing@kneel@enter") AND HAS_ANIM_DICT_LOADED ("creatures@deer@amb@world_deer_grazing@exit") //amb@medic@standing@kneel@enter") AND HAS_ANIM_DICT_LOADED ("creatures@deer@amb@world_deer_grazing@base") //amb@medic@standing@kneel@enter") AND HAS_ANIM_DICT_LOADED("creatures@cougar@melee@") AND HAS_ANIM_DICT_LOADED("facials@p_m_one@variations@elkcall") RETURN TRUE ENDIF BREAK CASE RQ_CAMERA IF SETUP_CAMERA(vPosition, vIntroCamRot) RETURN TRUE ENDIF BREAK CASE RQ_DEER_MODEL CPRINTLN(DEBUG_MISSION,"REQUESTING MODELS... DEER") REQUEST_MODEL (A_C_DEER) IF HAS_MODEL_LOADED(A_C_DEER) CPRINTLN(DEBUG_MISSION,"LOADED MODELS ... DEER") RETURN TRUE ENDIF BREAK CASE RQ_RIFLE SAFE_GIVE_SNIPER_TO_PLAYER() RETURN TRUE BREAK CASE RQ_CHALLENGES CPRINTLN(DEBUG_MISSION,"REQUESTING SCALEFORM MOVIE FOR CHALLENGES..") REQUEST_STREAMED_TEXTURE_DICT("CommonMenu") Player_Hunt_Data.challengeScreen.splash = REQUEST_SCALEFORM_MOVIE("MP_BIG_MESSAGE_FREEMODE") IF HAS_SCALEFORM_MOVIE_LOADED(Player_Hunt_Data.challengeScreen.splash) AND HAS_STREAMED_TEXTURE_DICT_LOADED("CommonMenu") CPRINTLN(DEBUG_MISSION,"LOADED .... SCALEFORM MOVIE") RETURN TRUE ENDIF BREAK CASE RQ_SOUND CPRINTLN(DEBUG_MISSION,"REQUESTING AUDIO...") IF REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_2_ELK_CALLS") AND REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_2_ELK_VOCALS") AND REQUEST_MISSION_AUDIO_BANK("SCRIPT\\HUNTING_MAIN_A") CPRINTLN(DEBUG_MISSION,"LOADED ... AUDIO") RETURN TRUE ENDIF BREAK CASE RQ_TEXTURES CPRINTLN(DEBUG_MISSION,"REQUESTING TEXTURES...") REQUEST_PTFX_ASSET() REQUEST_STREAMED_TEXTURE_DICT("Hunting") REQUEST_STREAMED_TEXTURE_DICT("MPLeaderboard") REQUEST_STREAMED_TEXTURE_DICT("MPHud") IF HAS_STREAMED_TEXTURE_DICT_LOADED("Hunting") AND HAS_STREAMED_TEXTURE_DICT_LOADED("MPLeaderboard") AND HAS_STREAMED_TEXTURE_DICT_LOADED("MPHud") AND HAS_PTFX_ASSET_LOADED() CPRINTLN(DEBUG_MISSION,"TEXTURES LOADED") RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Basic setup of the mission /// turns of player control /// creates poly area /// populates graze points /// turns off police /// sets the ambient flag for the hunting common.sch file PROC INIT_HUNT() CPRINTLN(DEBUG_MISSION,"INIT_HUNT") HIDE_HUD_AND_RADAR_THIS_FRAME() SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ADD_CONTACT_TO_PHONEBOOK(CHAR_HUNTER, TREVOR_BOOK, FALSE) SET_UP_HUNT_AREA() SET_UP_SCORES() UNBOOK_EVERY_GRAZE_POS() bIsAmbient = TRUE iMissionTitleState = 0 bSentFailText = FALSE bSentWarnText = FALSE START_AUDIO_SCENE("AMBIENT_HUNTING_MIX") ADD_RELATIONSHIP_GROUP("Elk Group", mElkGroup) INIT_PC_SCRIPTED_CONTROLS("HUNTING ELK CALL") #IF IS_DEBUG_BUILD SETUP_FOR_RAGE_WIDGETS() #ENDIF Player_Hunt_Data.splashUI.siMovie = REQUEST_MG_MIDSIZED_MESSAGE() SETUP_HERD_STATES() SET_AUDIO_FLAG("AllowPlayerAIOnMission", TRUE) // If the palyer is trying to be cheeky and drops a grenade in the vicinity before the mission, just delete it. CLEAR_AREA_OF_PROJECTILES(<< -1702.6951, 4666.9414, 22.7091>>, 50.0) // Set next random bleat in the future. iBleatInitiateTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(BLEAT_TRIGGER_MIN_DELAY, BLEAT_TRIGGER_MAX_DELAY) REQUEST_ADDITIONAL_TEXT("AMBHT", MISSION_TEXT_SLOT) REQUEST_SCRIPT_AUDIO_BANK ("HUD_AWARDS") //CANCEL_COMMUNICATION(TEXT_SRANGE_UNLOCK) // We need the intro animations immediately! request them here! SETUP_STAGE_REQUIREMENTS(RQ_INTRO, <<0,0,0>>) IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) PRELOAD_OUTFIT(PLAYER_PED_ID(), OUTFIT_P2_HUNTING) ENDIF UNUSED_PARAMETER(m_iTargetElk) ENDPROC /// PURPOSE: /// Used to setup a mission stage(or state if you call it that) Uses a switch statement to pick which /// set of SETUP_STAGE_REQUIREMENTS() to call. It checks to see if all the stage requirements are /// setup and then does any other setup needed. such as setting the players position or switching a /// bool to true or false etc. /// Handles setting up stuff needed after a Z or p skip first then the normal setup takes place /// PARAMS: /// eStage - The mission state/stage that needs setting up /// bJumped - Wether or not the state/stage has been jumped to using Z or P skips /// RETURNS: /// FUNC BOOL SETUP_MISSION_STAGE(HUNTSTATE Stage, BOOL bJumped = FALSE) SWITCH Stage CASE HS_SETUP IF bJumped bJumped = FALSE RC_END_Z_SKIP() ELSE IF SETUP_STAGE_REQUIREMENTS(RQ_DEER_MODEL, <<0,0,0>>) AND SETUP_STAGE_REQUIREMENTS(RQ_CHALLENGES, <<0,0,0>>) AND SETUP_STAGE_REQUIREMENTS(RQ_SOUND, <<0,0,0>>) AND SETUP_STAGE_REQUIREMENTS(RQ_ANIMS, <<0,0,0>>) AND SETUP_STAGE_REQUIREMENTS(RQ_TEXTURES, <<0,0,0>>) CPRINTLN(DEBUG_MISSION,"All Assets loaded") RETURN TRUE ENDIF ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Updates the player's selection on the results screen. /// RETURNS: /// TRUE when we're done processing. FALSE to continue processing. FUNC BOOL HAS_PLAYER_CHOSEN_RESULTS(BOOL bDisableRetry = FALSE) HIDE_HUD_AND_RADAR_THIS_FRAME() BOOL bDisplayResults BOOL bRetVal = PROCESS_HUNT_RESULTS_INPUT(bIsContinuing, bDisplayResults, bDisableRetry, bPredictionSetup) IF IS_SCREEN_FADED_IN() // Pad instructions IF NOT bIsWaitingToQuit AND (GET_GAME_TIMER() > iInputDelayTime) AND (iInputDelayTime != 0) UPDATE_SIMPLE_USE_CONTEXT(resultsInstructions) ENDIF // Okay, so if the leaderboard is done predictions, re-create the prompts to allow for social club. IF IS_PLAYER_ONLINE() // If the palyer wasn't online for the prediction setup, do that now. IF NOT Player_Hunt_Data.bOnlineForPrediction Player_Hunt_Data.bOnlineForPrediction = TRUE bPredictionSetup = FALSE READ_HUNTING_SOCIAL_CLUB_LEADERBOARD() // Redo our prompts, as there's no leaderboard access for a bit. INIT_SIMPLE_USE_CONTEXT(resultsInstructions, FALSE, FALSE, TRUE, TRUE) ADD_SIMPLE_USE_CONTEXT_INPUT(resultsInstructions, "HCONT", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT) IF NOT bDisableRetry ADD_SIMPLE_USE_CONTEXT_INPUT(resultsInstructions, "HRETRY", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_EXPAND) ENDIF SET_SIMPLE_USE_CONTEXT_MINIGAME_ATTACHED(resultsInstructions) ENDIF IF NOT bPredictionSetup IF scLB_rank_predict.bFinishedRead AND NOT scLB_rank_predict.bFinishedWrite HUNTING_WRITE_TO_LEADERBOARD() scLB_rank_predict.bFinishedWrite = TRUE ENDIF IF GET_RANK_PREDICTION_DETAILS(Player_Hunt_Data.huntLB_control) CDEBUG1LN(DEBUG_HUNTING, "HAS_PLAYER_CHOSEN_RESULTS - Prediction done! Adding leaderboard button!") // Resetup controls INIT_SIMPLE_USE_CONTEXT(resultsInstructions, FALSE, FALSE, TRUE, TRUE) ADD_SIMPLE_USE_CONTEXT_INPUT(resultsInstructions, "HCONT", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT) IF NOT bDisableRetry ADD_SIMPLE_USE_CONTEXT_INPUT(resultsInstructions, "HRETRY", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_EXPAND) ENDIF ADD_SIMPLE_USE_CONTEXT_INPUT(resultsInstructions, "HLEADR", FRONTEND_CONTROL, INPUT_FRONTEND_LEADERBOARD) SET_SIMPLE_USE_CONTEXT_MINIGAME_ATTACHED(resultsInstructions) bPredictionSetup = TRUE sclb_useRankPrediction = TRUE ENDIF ENDIF ENDIF IF bDisplayLeaderboard IF IS_PLAYER_ONLINE() DISPLAY_HUNTING_SOCIAL_CLUB_LEADERBOARD() ELSE IF DO_SIGNED_OUT_WARNING(iLBDWarning) iLBDWarning = 0 bDisplayLeaderboard = FALSE // Resetup controls INIT_SIMPLE_USE_CONTEXT(resultsInstructions, FALSE, FALSE, TRUE, TRUE) ADD_SIMPLE_USE_CONTEXT_INPUT(resultsInstructions, "HCONT", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT) IF NOT bDisableRetry ADD_SIMPLE_USE_CONTEXT_INPUT(resultsInstructions, "HRETRY", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_EXPAND) ENDIF ADD_SIMPLE_USE_CONTEXT_INPUT(resultsInstructions, "HLEADR", FRONTEND_CONTROL, INPUT_FRONTEND_LEADERBOARD) SET_SIMPLE_USE_CONTEXT_MINIGAME_ATTACHED(resultsInstructions) ENDIF HUNTING_SET_QUITTING_TIMER(0) bIsWaitingToQuit = FALSE bIsContinuing = FALSE // Can't return TRUE until we're done with the warning screen RETURN FALSE ENDIF ELIF NOT bIsWaitingToQuit AND bDisplayResults IF Player_Hunt_Data.bNeedLoserSound PLAY_SOUND_FRONTEND(-1,"LOSER", "HUD_AWARDS") Player_Hunt_Data.bNeedLoserSound = FALSE ENDIF DRAW_HUNT_RESULTS(Player_Hunt_Data.challengeScreen) ENDIF ENDIF // Keep going till we either push the button to Launch a challenge or Exit. RETURN bRetVal ENDFUNC FUNC BOOL HAS_PLAYER_CANCELLED() IF NOT bShowingCancelScreen IF IS_PHONE_ONSCREEN() OR IS_BROWSER_OPEN() OR IS_PLAYER_PRESSING_WEAPON_SWAP_BUTTON() OR IS_HUD_COMPONENT_ACTIVE(NEW_HUD_WEAPON_WHEEL) OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SELECT_WEAPON) PRINTLN("Blocking the input for quitting hunting!") iQuitMenuDelay = GET_GAME_TIMER() + 1000 RETURN FALSE ENDIF IF GET_GAME_TIMER() > iQuitMenuDelay SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, INPUT_CONTEXT) IF IS_CONTROL_JUST_RELEASED(PLAYER_CONTROL, INPUT_CONTEXT) HIDE_HUD_AND_RADAR_THIS_FRAME() // Disable the cinematic cam. SET_CINEMATIC_BUTTON_ACTIVE(FALSE) DISABLE_CELLPHONE(TRUE) HT_MENU_SFX_PLAY_NAV_BACK() SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) SET_GAME_PAUSED(TRUE) bPauseTimer = TRUE bShowingCancelScreen = TRUE ENDIF ENDIF ELSE HIDE_HUD_AND_RADAR_THIS_FRAME() SET_WARNING_MESSAGE_WITH_HEADER("HT_QTITLE", "HT_QUIT", (FE_WARNING_YES | FE_WARNING_NO)) // Clear any help text while the cancel session screen is displaying. IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AHT_CALL") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AHT_CANC1") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AHT_CANC2") CLEAR_HELP() ENDIF // Cancel the session IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) INIT_RESULT_SCREEN_BUTTONS() INIT_HUNTING_RESULTS_SCREEN(Player_Hunt_Data.challengeScreen) SET_GAME_PAUSED(FALSE) Player_Hunt_Data.sFailReason = "HCHEND" // You ended the hunting session. eFinishState = FS_CANCELLED SET_CINEMATIC_BUTTON_ACTIVE(TRUE) RETURN TRUE // Choose not to cancel... ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) SET_GAME_PAUSED(FALSE) //PLAY_SOUND_FRONTEND(-1, "NO", "HUD_FRONTEND_DEFAULT_SOUNDSET") SET_CINEMATIC_BUTTON_ACTIVE(TRUE) bPauseTimer = FALSE bShowingCancelScreen = FALSE DISABLE_CELLPHONE(FALSE) ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL HAS_PLAYER_FAILED_MISSION() IF DID_PLAYER_LEAVE_AREA() CPRINTLN(DEBUG_MISSION,"MISSION FAILED - PLAYER LEFT AREA") Player_Hunt_Data.sFailReason = "HLEFT" eFinishState = FS_FAILED_LEFT THEFEED_FLUSH_QUEUE() RETURN TRUE ENDIF // Shooting an elk from outside the hunt area? IF bPlayerKillElkIncorrectly Player_Hunt_Data.sFailReason = "HWRONG" eFinishState = FS_FAILED_WRONG_WEAPON THEFEED_FLUSH_QUEUE() RETURN TRUE ENDIF TEXT_LABEL txtMsg INT iHour = GET_CLOCK_HOURS() IF (iHour > 19 OR iHour < 5) AND bIsAmbient IF (iHour > 20 OR iHour < 5) IF NOT bSentFailText txtMsg = GET_HUNTING_TEXT_VARIATION("LATE_QUIT", 5) SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_HUNTER, txtMsg, TXTMSG_UNLOCKED) bSentFailText = TRUE ELSE IF NOT IS_TIMER_STARTED(Player_Hunt_Data.textTimer) START_TIMER_NOW(Player_Hunt_Data.textTimer) ENDIF IF TIMER_DO_ONCE_WHEN_READY(Player_Hunt_Data.textTimer, 5.0) CLEAR_AUTO_LAUNCH_TO_TEXT_MESSAGE_APP_FOR_THIS_SP_CHARACTER(CHAR_TREVOR) Player_Hunt_Data.sFailReason = "HNOTIME" eFinishState = FS_FAILED_TIME THEFEED_FLUSH_QUEUE() RETURN TRUE ENDIF ENDIF ELIF NOT bSentWarnText txtMsg = GET_HUNTING_TEXT_VARIATION("LATE", 5) SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_HUNTER, txtMsg, TXTMSG_UNLOCKED) bSentWarnText = TRUE CLEAR_AUTO_LAUNCH_TO_TEXT_MESSAGE_APP_FOR_THIS_SP_CHARACTER(CHAR_TREVOR) ENDIF ENDIF IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) Player_Hunt_Data.sFailReason = "REASON_WANTED" eFinishState = FS_FAILED_WANTED THEFEED_FLUSH_QUEUE() RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Initialises variables for all modes and sets /// up how many elk allowed to spawn at once, or kills required for the seperate challenges. /// Gets used to re-set the game if the challenge is cancelled, failed /// or re-tried. PROC INIT_VARS_FOR_THIS_MODE() bAllowCall = TRUE bMissionEnded = FALSE bShowingCancelScreen = FALSE bPauseTimer = FALSE bGotPauseTime = FALSE bPlayerCalling = FALSE bSentFailText = FALSE bSentWarnText = FALSE iEndTime = 0 bShownBronzeToast = FALSE bShownSilverToast = FALSE bShownGoldToast = FALSE //bDisplayResults = TRUE bDisplayLeaderboard = FALSE // Set our first bleat initiator sometime in the future. iBleatInitiateTime = GET_GAME_TIMER() + 5000 Player_Hunt_Data.iScore = 0 Player_Hunt_Data.iKillCount = 0 Player_Hunt_Data.iMoney = 0 Player_Hunt_Data.bGivenMoney = FALSE INT i = 0 REPEAT NUM_HIT_LOCATIONS i Player_Hunt_Data.iHitsOnLocation[i] = 0 ENDREPEAT Player_Hunt_Data.iPhotosSent = 0 Player_Hunt_Data.iCougarKills = 0 Player_Hunt_Data.iBoarKills = 0 Player_Hunt_Data.iCoyoteKills = 0 Player_Hunt_Data.bGoldAchieved = FALSE IF Player_Hunt_Data.todHuntStarted = INVALID_TIMEOFDAY Player_Hunt_Data.todHuntStarted = GET_CURRENT_TIMEOFDAY() ENDIF IF eFinishState <> FS_NULL eFinishState = FS_NULL ENDIF INITIALIZE_CHALLENGES() REPEAT COUNT_OF(Player_Hunt_Data.iKillTimes) i Player_Hunt_Data.iKillTimes[i] = 0 ENDREPEAT // Clean up the itemsets for photos and corpses. IF IS_ITEMSET_VALID(Player_Hunt_Data.setCorpses) CLEAN_ITEMSET(Player_Hunt_Data.setCorpses) ELSE Player_Hunt_Data.setCorpses = CREATE_ITEMSET(FALSE) ENDIF IF IS_ITEMSET_VALID(Player_Hunt_Data.setPhoto) CLEAN_ITEMSET(Player_Hunt_Data.setPhoto) ELSE Player_Hunt_Data.setPhoto = CREATE_ITEMSET(FALSE) ENDIF // Ensure a clean hunting ground. REMOVE_DECALS_IN_RANGE(mAreaCheck1.vCentre, 800.0) CLEAR_AREA_OF_PEDS(mAreaCheck1.vCentre, 800.0) ENDPROC // Checks the players kill count and time taken. // If the values are better than bronze, or better than previously, record them. PROC GRAB_STATS() BOOL bNeedAutosave = FALSE BOOL bAwesomeHunt = FALSE CPRINTLN(DEBUG_MISSION, "Grabbing stats... for Free Mode") IF Player_Hunt_Data.iScore > g_SavedGlobals.sAmbient.iHighScoreFreeMode CPRINTLN(DEBUG_MISSION, "Kills total was higher that prev record") g_SavedGlobals.sAmbient.iHighScoreFreeMode = Player_Hunt_Data.iScore Player_Hunt_Data.iHighScore = g_SavedGlobals.sAmbient.iHighScoreFreeMode bNeedAutosave = TRUE ENDIF // Next time we call Cletus, we will trigger this. IF (Player_Hunt_Data.iScore > Player_Hunt_Data.iScoreForGold) bAwesomeHunt = TRUE ENDIF HUNTING_CHALLENGE challengeIndex REPEAT COUNT_OF(HUNTING_CHALLENGE) challengeIndex IF ENUM_TO_INT(Player_Hunt_Data.challengeData[challengeIndex].hcRank) > g_SavedGlobals.sAmbient.iChallengeRankFreeMode[challengeIndex] CPRINTLN(DEBUG_MISSION, "Challenge ", challengeIndex, " was higher than previous. Storing it.") g_SavedGlobals.sAmbient.iChallengeRankFreeMode[challengeIndex] = ENUM_TO_INT(Player_Hunt_Data.challengeData[challengeIndex].hcRank) bNeedAutosave = TRUE ENDIF ENDREPEAT // Log that we've recently hunted, only if we've managed to kill something. // Conversations all have to do with Cletus getting stuff from Trevor for hunting. IF (Player_Hunt_Data.iScore > 0) SET_TIME_LAST_HUNTED(bAwesomeHunt) ENDIF // We do this so that we only trigger one autosave, rather than 1 for the hich score, then 1 for each challenge. IF bNeedAutosave MAKE_AUTOSAVE_REQUEST() ENDIF // Process completion percentages. IF g_SavedGlobals.sAmbient.iHighScoreFreeMode >= Player_Hunt_Data.iScoreForBronze CPRINTLN(DEBUG_MISSION,"REGISTERING SCRIPT IN COMPLETION PERCENTAGE TOTAL") REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_OJ_HUNTCHALL) ELSE CPRINTLN(DEBUG_MISSION,"CONDITIONS FOR REGISTERING COMPLETION % HAVE NOT YET BEEN MET") ENDIF ENDPROC /// PURPOSE: /// Sets the player back to the start point of the challenge /// Takes him out of stealth mode and resets the camera behind him. PROC RESET_PLAYER_TO_SPAWN() CPRINTLN(DEBUG_MISSION," RESETTING PLAYER TO SPAWN ") PED_INDEX pedPlayer = PLAYER_PED_ID() // Warp the player back to the start point // and set his heading SET_ENTITY_COORDS(pedPlayer, vPlayerStartPos) SET_ENTITY_HEADING(pedPlayer, fPlayerStartDir) // Clear any decals on the player. CLEAR_PED_BLOOD_DAMAGE(pedPlayer) RESET_PED_VISIBLE_DAMAGE(pedPlayer) CLEAR_PED_WETNESS(pedPlayer) // Stand him up IF GET_PED_STEALTH_MOVEMENT(pedPlayer) SET_PED_STEALTH_MOVEMENT(pedPlayer, FALSE) ENDIF // reset camera behind player SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) ENDPROC /// PURPOSE: /// Destroys the main camera. PROC DESTROY_MAIN_CAM() IF DOES_CAM_EXIST(camScene) RENDER_SCRIPT_CAMS(FALSE, FALSE) DESTROY_CAM(camScene) ENDIF ENDPROC /// PURPOSE: /// When hunting starts, we kick off a timer that's meant to track how long it takes the player to achieve gold medal status. /// When the player gets there, we pause the timer so that it can be read for leaderboards. PROC UPDATE_GOLD_MEDAL_TIMER() IF NOT Player_Hunt_Data.bGoldAchieved IF Player_Hunt_Data.iScore >= Player_Hunt_Data.iScoreForGold // We're done tracking! PAUSE_TIMER(Player_Hunt_Data.tTimeToGold) Player_Hunt_Data.bGoldAchieved = TRUE PRINTLN("======================= GOLD ACHIEVED =======================") #IF IS_DEBUG_BUILD INT iTotalMS = ROUND(GET_TIMER_IN_SECONDS(Player_Hunt_Data.tTimeToGold) * 1000.0) INT iHours = iTotalMS / (1000 * 60 * 60) iTotalMS -= iHours * 60 * 60 * 1000 INT iMins = iTotalMS / (1000 * 60) iTotalMS -= iMins * 60 * 1000 INT iSecs = iTotalMS / 1000 iTotalMS -= iSecs * 1000 INT iMS = iTotalMS PRINTLN("UPDATE_GOLD_MEDAL_TIMER - Player achieved gold status! Time was ", iHours, ":", iMins, ":", iSecs, ":", iMS) #ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles medal splashes and hunting timers. PROC UPDATE_HUNTING_MEDALS() IF NOT bShownBronzeToast IF Player_Hunt_Data.iScore >= Player_Hunt_Data.iScoreForBronze BEGIN_TEXT_COMMAND_THEFEED_POST("HUNT") END_TEXT_COMMAND_THEFEED_POST_AWARD("Hunting", "Hunting_Bronze_128", 0, HUD_COLOUR_BRONZE, "HUD_MED_UNLKED") PLAY_SOUND_FRONTEND(-1, "MEDAL_BRONZE", "HUD_AWARDS") bShownBronzeToast = TRUE ENDIF ELIF NOT bShownSilverToast IF Player_Hunt_Data.iScore >= Player_Hunt_Data.iScoreForSilver BEGIN_TEXT_COMMAND_THEFEED_POST("HUNT") END_TEXT_COMMAND_THEFEED_POST_AWARD("Hunting", "Hunting_Silver_128", 0, HUD_COLOUR_SILVER, "HUD_MED_UNLKED") PLAY_SOUND_FRONTEND(-1, "MEDAL_SILVER", "HUD_AWARDS") bShownSilverToast = TRUE ENDIF ELIF NOT bShownGoldToast IF Player_Hunt_Data.iScore >= Player_Hunt_Data.iScoreForGold BEGIN_TEXT_COMMAND_THEFEED_POST("HUNT") END_TEXT_COMMAND_THEFEED_POST_AWARD("Hunting", "Hunting_Gold_128", 0, HUD_COLOUR_GOLD, "HUD_MED_UNLKED") PLAY_SOUND_FRONTEND(-1, "MEDAL_GOLD", "HUD_AWARDS") bShownGoldToast = TRUE ENDIF ENDIF // Always process the gold medal timer. UPDATE_GOLD_MEDAL_TIMER() ENDPROC /// PURPOSE: /// Grabs all peds in the area, and attempts to use them in hunting. If they're not onscreen and they're far away, simply removes them. PROC HUNTING_INTEGRATE_LOCAL_WILDLIFE() INT iAnimalsAdded = 0 INT iElkAdded = 0 PED_INDEX pedNearby[30] INT iFound IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) iFound = GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), pedNearby) ENDIF IF (iFound != 0) INT iPed REPEAT iFound iPed IF NOT IS_PED_INJURED(pedNearby[iPed]) // Okay, now go through all of those peds, and add the ones that are at least visible. MODEL_NAMES modelPed = GET_ENTITY_MODEL(pedNearby[iPed]) IF (modelPed = A_C_COYOTE OR modelPed = A_C_BOAR) IF (iAnimalsAdded < MAX_RANDOM_ANIMALS) // If it's visible, it can be an animal. VECTOR vPos = GET_ENTITY_COORDS(pedNearby[iPed], FALSE) IF IS_SPHERE_VISIBLE(vPos, 4.0) SET_ENTITY_AS_MISSION_ENTITY(pedNearby[iPed], TRUE, TRUE) mAnimal[iAnimalsAdded].mPed = pedNearby[iPed] SETUP_ANIMAL(mAnimal[iAnimalsAdded], AS_IDLE, TRUE) iAnimalsAdded++ ELSE SET_ENTITY_AS_MISSION_ENTITY(pedNearby[iPed], TRUE, TRUE) DELETE_PED(pedNearby[iPed]) ENDIF ELSE // Don't delete, simply take them, make them flee the player, and release. SET_ENTITY_AS_MISSION_ENTITY(pedNearby[iPed], TRUE, TRUE) SET_PED_KEEP_TASK(pedNearby[iPed], TRUE) TASK_SMART_FLEE_PED(pedNearby[iPed], PLAYER_PED_ID(), 1000.0, -1) SET_PED_AS_NO_LONGER_NEEDED(pedNearby[iPed]) ENDIF ELIF (modelPed = A_C_DEER) IF (iElkAdded < MAX_ELKS) VECTOR vPos = GET_ENTITY_COORDS(pedNearby[iPed], FALSE) IF IS_SPHERE_VISIBLE(vPos, 4.0) SET_ENTITY_AS_MISSION_ENTITY(pedNearby[iPed], TRUE, TRUE) mElk[iElkAdded].mPed = pedNearby[iPed] SETUP_ELK(mElk[iElkAdded], ES_PAUSE_THEN_GRAZE) mElk[iElkAdded].iCurNode = 0 SET_ELK_SPOOKED(iElkAdded, FALSE) // Give it a further 7.5 second delay, because from here, the intro takes another 7.5 seconds. mElk[iElkAdded].iWaitTime = GET_GAME_TIMER() + 7500 + (iElkAdded * 666) // Need to determine if it's a doe or not... INT iVariant = GET_PED_DRAWABLE_VARIATION(pedNearby[iPed], PED_COMP_SPECIAL) IF (iVariant = 0) // It's a doe! DECOR_SET_BOOL(pedNearby[iPed], "doe_elk", TRUE) iDoeInPlay++ ENDIF iElksInPlay++ iElkAdded++ ELSE SET_ENTITY_AS_MISSION_ENTITY(pedNearby[iPed], TRUE, TRUE) DELETE_PED(pedNearby[iPed]) ENDIF ELSE // Don't delete, simply take them, make them flee the player, and release. SET_ENTITY_AS_MISSION_ENTITY(pedNearby[iPed], TRUE, TRUE) SET_PED_KEEP_TASK(pedNearby[iPed], TRUE) TASK_SMART_FLEE_PED(pedNearby[iPed], PLAYER_PED_ID(), 1000.0, -1) SET_PED_AS_NO_LONGER_NEEDED(pedNearby[iPed]) ENDIF ELIF (modelPed = A_C_MTLION) // Don't delete, simply take them, make them flee the player, and release. SET_ENTITY_AS_MISSION_ENTITY(pedNearby[iPed], TRUE, TRUE) SET_PED_KEEP_TASK(pedNearby[iPed], TRUE) TASK_SMART_FLEE_PED(pedNearby[iPed], PLAYER_PED_ID(), 1000.0, -1) SET_PED_AS_NO_LONGER_NEEDED(pedNearby[iPed]) ENDIF ENDIF ENDREPEAT ENDIF ENDPROC /// PURPOSE: /// PRocesses the title for hunting when the player first start FUNC BOOL MANAGE_HUNTING_TITLE() IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) SWITCH iMissionTitleState CASE 0 MINIGAME_DISPLAY_MISSION_TITLE(ENUM_TO_INT(MINIGAME_HUNTING)) iMissionTitleState = 1 BREAK CASE 1 TEXT_LABEL_23 txtEmpty UPDATE_MISSION_NAME_DISPLAYING(txtEmpty) IF (g_iFlowTimeBeganDisplayMissionTitle >= GET_GAME_TIMER()) // Don't notify the player about challenges in the opening help unless they've been unlocked. IF NOT g_savedGlobals.sAmbient.bChallengeHelpDisplayed PRINT_HELP("AHT_WLCOME") ELSE PRINT_HELP("AHT_WLCOME_CHAL") ENDIF bHuntTitleReady = TRUE ENDIF IF (g_eMissionTitleState = MTS_DONE) // All done! MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE() iMissionTitleState = 2 ENDIF BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC // ============== // HUNTING STATES // ============== PROC SETUP_INTRO_SCENE(HUNTING_LAUNCH_STRUCT & launchData) HIDE_HUD_AND_RADAR_THIS_FRAME() SWITCH eStage CASE SS_INIT PRINTLN("SS_INIT") // Get the truck. IF NOT DOES_ENTITY_EXIST(vehTruck) // Handle the vehicle. vehTruck = launchData.vehTrailer IF DOES_ENTITY_EXIST(vehTruck) AND NOT IS_ENTITY_DEAD(vehTruck) // Awesome. Trigger the intro. SET_ENTITY_AS_MISSION_ENTITY(vehTruck, TRUE, TRUE) bTruckGrabbedAtStart = TRUE ELSE // No journey? Uh oh... //IF SETUP_MISSION_STAGE(HS_SETUP) // NEXT_STAGE() // EXIT //ENDIF // Trigger streaming here... this'll get us started at least. SETUP_MISSION_STAGE(HS_SETUP) EXIT ENDIF ELSE IF NOT IS_ENTITY_DEAD(vehTruck) // Okay, we've grabbed the truck, make sure we're ready to process the intro. // Wait here for the printing stuff to be loaded. //IF SETUP_STAGE_REQUIREMENTS(RQ_INTRO, <<0,0,0>>) AND bHuntTitleReady bHuntTitleReady = bHuntTitleReady SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 25.0) STOP_ENTITY_FIRE(vehTruck) VECTOR vSceneCoord vSceneCoord = GET_ENTITY_COORDS(vehTruck, FALSE) VECTOR vSceneOrient vSceneOrient = GET_ENTITY_ROTATION(vehTruck) iSceneID = CREATE_SYNCHRONIZED_SCENE(vSceneCoord, vSceneOrient) camScene = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camScene, iSceneID, "_Trevor_cam", "oddjobs@hunterIntro") SET_CAM_ACTIVE(camScene, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-1703.123, 4665.463, 21.2>>, <<-1704.077, 4660.555, 25.4>>, 7.0, <<-1710.8226, 4656.9639, 21.8008>>, 82.9948) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSceneID, "oddjobs@hunterIntro", "_Trevor", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT) SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE) PLAY_SYNCHRONIZED_ENTITY_ANIM(vehTruck, iSceneID, "_Trevor_journey", "oddjobs@hunterIntro", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT) eStage = SS_POST_INIT //ENDIF ELSE // Journey is dead... Just move on. NEXT_STAGE() EXIT ENDIF ENDIF // Try to get that quad... IF NOT DOES_ENTITY_EXIST(Player_Hunt_Data.vehQuad) Player_Hunt_Data.vehQuad = launchData.vehQuad IF DOES_ENTITY_EXIST(Player_Hunt_Data.vehQuad) AND NOT IS_ENTITY_DEAD(Player_Hunt_Data.vehQuad) SET_ENTITY_AS_MISSION_ENTITY(Player_Hunt_Data.vehQuad, TRUE, TRUE) SET_VEHICLE_UNDRIVEABLE(Player_Hunt_Data.vehQuad, FALSE) IF NOT IS_SPHERE_VISIBLE(<<-1707.4337, 4666.5625, 22.1095>>, 3.0) AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(Player_Hunt_Data.vehQuad, <<-1707.4337, 4666.5625, 22.1095>>) > 5.0 CLEAR_AREA_OF_VEHICLES(<<-1707.4337, 4666.5625, 22.1095>>, 2.0) SET_ENTITY_COORDS(Player_Hunt_Data.vehQuad, <<-1707.4337, 4666.5625, 22.1095>>) SET_ENTITY_HEADING(Player_Hunt_Data.vehQuad, 323.2491) SET_ENTITY_HEALTH(Player_Hunt_Data.vehQuad, GET_ENTITY_MAX_HEALTH(Player_Hunt_Data.vehQuad)) ENDIF ENDIF ENDIF BREAK CASE SS_POST_INIT PRINTLN("SS_POST_INIT") // Here, we load everything we'll need for the game. Menus and all. IF SETUP_MISSION_STAGE(eHuntState) LOAD_RANDOM_ANIMAL_MODELS() LOAD_ELK_MODEL() // Need to grab and use as many local animals as we can. HUNTING_INTEGRATE_LOCAL_WILDLIFE() CLEAR_RANK_REDICTION_DETAILS() CLEANUP_SOCIAL_CLUB_LEADERBOARD(Player_Hunt_Data.huntLB_control) VECTOR vMin, vMax vMin = mAreaCheck1.vCentre - <<700.0, 700.0, 200.0>> vMax = mAreaCheck1.vCentre + <<700.0, 700.0, 200.0>> mBlockArea = ADD_SCENARIO_BLOCKING_AREA(vMin, vMax) SET_PED_NON_CREATION_AREA(vMin, vMax) REMOVE_TEXT_MESSAGE_FEED_ENTRY("CHI2_U") eStage = SS_ACTIVE ENDIF BREAK CASE SS_ACTIVE PRINTLN("SS_ACTIVE") // Waiting until the right time to trigger Trevor's clothing change... IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneID) > 0.99 IS_ENTITY_DEAD(vehTruck) // Eat an assert. // Set Trevor into hunting outfit STORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID(), FALSE) SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_HUNTING, FALSE) VECTOR vSceneCoord vSceneCoord = GET_ENTITY_COORDS(vehTruck, FALSE) VECTOR vSceneOrient vSceneOrient = GET_ENTITY_ROTATION(vehTruck) iSceneID = CREATE_SYNCHRONIZED_SCENE(vSceneCoord, vSceneOrient) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSceneID, FALSE) camScene = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camScene, iSceneID, "_Trevor_cam", "oddjobs@hunterOutro") SET_CAM_ACTIVE(camScene, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSceneID, "oddjobs@hunterOutro", "_Trevor", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT) SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE) PLAY_SYNCHRONIZED_ENTITY_ANIM(vehTruck, iSceneID, "_Trevor_journey", "oddjobs@hunterOutro", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT) eStage = SS_TRANSIT ENDIF BREAK CASE SS_TRANSIT PRINTLN("SS_TRANSIT") IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneID) > 0.99 eStage = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP PRINTLN("SS_CLEANUP") STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP() //CLEAR_PED_TASKS(PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(vehTruck) AND NOT IS_ENTITY_DEAD(vehTruck) STOP_SYNCHRONIZED_ENTITY_ANIM(vehTruck, INSTANT_BLEND_IN, TRUE) ENDIF // All done! NEXT_STAGE() BREAK CASE SS_SKIPPED CLEAR_PRINTS() eStage = SS_CLEANUP BREAK ENDSWITCH ENDPROC PROC HUNTING_MONITOR_CHALLENGES_HELP() IF NOT g_SavedGlobals.sAmbient.bChallengeHelpDisplayed AND NOT IS_HELP_MESSAGE_ON_SCREEN("") IF Player_Hunt_Data.challengeData[HC_MASTER_HUNTER].hcRank != HCR_LOCKED OR Player_Hunt_Data.challengeData[HC_PHOTOJOURNALIST].hcRank != HCR_LOCKED OR Player_Hunt_Data.challengeData[HC_WEAPONS_MASTER].hcRank != HCR_LOCKED g_SavedGlobals.sAmbient.bChallengeHelpDisplayed = TRUE ENDIF ENDIF ENDPROC /// PURPOSE: /// Runs updates for all huntign wildlife. PROC HUNTING_UPDATE_WILDLIFE() INT idx // Update animal death. REPEAT MAX_RANDOM_ANIMALS idx HAS_PLAYER_KILLED_RANDOM_ANIMAL(mAnimal[idx]) ENDREPEAT // Update cougar death. REPEAT MAX_COUGARS idx HAS_PLAYER_KILLED_RANDOM_ANIMAL(mCougar[idx]) ENDREPEAT // Update all elk. UPDATE_HUNTING_ELK(DEFAULT, iMissionTitleState >= 2) ENDPROC PROC HUNT() SWITCH eStage CASE SS_INIT HIDE_HUD_AND_RADAR_THIS_FRAME() CPRINTLN(DEBUG_MISSION, "HUNTING START!!!!!!!!!!!!!") // *** MUST *** do this first or we won't know how mant elk to spawn // Also initializes the end time for the timed challenges. INIT_VARS_FOR_THIS_MODE() SPAWN_FIRST_ELK() SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) bPlayerKillElkIncorrectly = FALSE ALLOW_SONAR_BLIPS(TRUE) // Disable knife kicking mode so that knife kills work. ACTION_MANAGER_ENABLE_ACTION(GET_HASH_KEY("AR_knife_low_kick_far"), FALSE) ACTION_MANAGER_ENABLE_ACTION(GET_HASH_KEY("AR_knife_low_kick_close"), FALSE) ACTION_MANAGER_ENABLE_ACTION(GET_HASH_KEY("ACT_low_kick_close"), FALSE) ACTION_MANAGER_ENABLE_ACTION(GET_HASH_KEY("ACT_low_kick_far"), FALSE) // Restart the timer to gold. RESTART_TIMER_NOW(Player_Hunt_Data.tTimeToGold) SETTIMERA(0) bGaveRifle = FALSE // Restart time spent hunting timer. RESTART_TIMER_NOW(Player_Hunt_Data.tTimeSpentHunting) eStage = SS_ACTIVE BREAK CASE SS_ACTIVE DIAL_DOWN_TRAFFIC() UPDATE_HUNTING_MEDALS() IF NOT bGaveRifle IF TIMERA() > 500 // Give him the gun. SETUP_STAGE_REQUIREMENTS(RQ_RIFLE, <<0,0,0>>, FALSE) bGaveRifle = TRUE ENDIF ENDIF // Make sure the palyer isn't attacking his ride... IF bTruckGrabbedAtStart IF IS_ENTITY_DEAD(vehTruck) SET_MAX_WANTED_LEVEL(1) SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 1, FALSE) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) ENDIF ENDIF // Have we passed or failed? IF NOT bMissionEnded FORCE_SONAR_BLIPS_THIS_FRAME() HUNTING_UPDATE_WILDLIFE() HANDLE_NON_MINIGAME_KILLS() CORPSE_MANAGER_UPDATE() UPDATE_HUNTING_CHALLENGES(Player_Hunt_Data) MONITER_PLAYER_AIMING_SOUNDS() IF WOULD_SCALEFORM_SHARD_MESSAGE_BE_VISIBLE(Player_Hunt_Data.splashUI) IF IS_AIMING_THROUGH_SNIPER_SCOPE(PLAYER_PED_ID()) CANCEL_TIMER(Player_Hunt_Data.splashUI.movieTimer) ELSE UPDATE_SHARD_BIG_MESSAGE(Player_Hunt_Data.splashUI) ENDIF ENDIF IF HAS_PLAYER_FAILED_MISSION() CPRINTLN(DEBUG_MISSION,"MISSION FAILED") // Pause the timer iMissionEndTime = GET_GAME_TIMER() + 2000 IF eFinishState = FS_FAILED_LEFT iMissionEndTime = GET_GAME_TIMER() + 5000 PRINT_HELP("HLEFT1", 10000) // Hunting abandoned because you left the area. CLEAR_PRINTS() ELIF eFinishState = FS_FAILED_WANTED CLEAR_PRINTS() PRINT_HELP("HWANTED", 10000) // Hunting abandoned because you left the area. ELSE INIT_RESULT_SCREEN_BUTTONS() ENDIF //IF IS_SCREEN_FADED_OUT() Player_Hunt_data.eCorpseState = CS_UPDATE Player_Hunt_data.bNearCorpse = FALSE THEFEED_FLUSH_QUEUE() DELETE_ALL_HUNTING_TEXT_MESSAGES() //ENDIF bMissionEnded = TRUE // Have we cancelled? This should be immediate - no delay when cancelling... ELIF HAS_PLAYER_CANCELLED() CPRINTLN(DEBUG_MISSION,"MISSION ENDED - CANCELLED") RESTART_TIMER_NOW(tCutsceneTimer) DO_SCREEN_FADE_OUT(0) eStage = SS_CLEANUP ENDIF ELSE // Keep showing the hud, with the timer paused if applicable. HUNTING_UPDATE_WILDLIFE() IF GET_GAME_TIMER() > iMissionEndTime // If the player has left for any reason other than going wanted, transition with a fade. // Reason being that we don't want to punish the player by doing fancy transitions for being wanted. IF (eFinishState != FS_FAILED_WANTED) AND (eFinishState != FS_FAILED_LEFT) DO_SCREEN_FADE_OUT(500) ENDIF CPRINTLN(DEBUG_MISSION, "POP THE RESULTS SCREEN AFTER A SMALL DELAY") RESTART_TIMER_NOW(tCutsceneTimer) eStage = SS_CLEANUP ENDIF ENDIF BREAK CASE SS_TRANSIT IF TIMER_DO_WHEN_READY(tCutsceneTimer, 1.0) eStage = SS_CLEANUP ENDIF BREAK CASE SS_CLEANUP CPRINTLN(DEBUG_MISSION," *** CLEAN UP HUNTING STATE *** ") // Stop the sniper aiming audio from playing on the results screen // if the player was aiming when hunting ended STOP_SNIPE_AUDIO() GRAB_STATS() CLEAR_PRINTS() REMOVE_ALL_ELK() SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) NEXT_STAGE() BREAK CASE SS_SKIPPED BREAK ENDSWITCH ENDPROC FUNC BOOL HUNTING_RUN_LEFT_AREA_CUTSCENE() SWITCH iQuitSceneState CASE 0 ANIMPOSTFX_PLAY("MinigameTransitionIn", 0, FALSE) iQuitSceneState = 1 BREAK CASE 1 IF bQuittingMG ANIMPOSTFX_STOP("MinigameTransitionIn") ANIMPOSTFX_PLAY("MinigameTransitionOut", 0, FALSE) iQuitSceneState = 2 ENDIF BREAK CASE 2 RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL HUNTING_RUN_QUITTING_CUTSCENE() #IF IS_DEBUG_BUILD TEXT_LABEL_63 texDisplay FLOAT fDisplayAtX = 0.5 FLOAT fDisplayAtY = 0.5 FLOAT fDisplayAdd = 0.0125 texDisplay = "iQuitSceneState = " texDisplay += iQuitSceneState DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneID) texDisplay = "scene phase = " texDisplay += GET_STRING_FROM_FLOAT(GET_SYNCHRONIZED_SCENE_PHASE(iSceneID)) DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd ENDIF texDisplay = "iQuittingTimer = " texDisplay += HUNTING_GET_QUITTING_TIMER() DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd texDisplay = "GET_GAME_TIMER() = " texDisplay += GET_GAME_TIMER() DRAW_DEBUG_TEXT_2D(texDisplay, (<< fDisplayAtX, fDisplayAtY, 0.0 >>)) fDisplayAtY += fDisplayAdd #ENDIF SWITCH iQuitSceneState CASE 0 CDEBUG1LN(DEBUG_HUNTING, "HUNTING_RUN_QUITTING_CUTSCENE - Setting up quitting cutscene!") IF DOES_CAM_EXIST(camScene) DESTROY_CAM(camScene) ENDIF IF DOES_CAM_EXIST(camSky) DESTROY_CAM(camSky) ENDIF ANIMPOSTFX_PLAY("MinigameTransitionIn", 0, FALSE) camSky = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-1705.3109, 4664.6797, 38.8278>>, <<10.2934, -1.8316, -85.2144>>, 42.79, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) streamVolResults = STREAMVOL_CREATE_FRUSTUM(<<-1708.5167, 4663.8687, 44.9329>>, <<6.5082, -0.0, -85.7712>>, 200.0, FLAG_MAPDATA) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-1703.123, 4665.463, 21.2>>, <<-1704.077, 4660.555, 25.4>>, 7.0, <<-1710.8226, 4656.9639, 21.8008>>, 82.9948) iQuitSceneState = 1 BREAK CASE 1 IF STREAMVOL_IS_VALID(streamVolResults) CDEBUG1LN(DEBUG_HUNTING, "HUNTING_RUN_QUITTING_CUTSCENE - Streaming cutscene view.") IF STREAMVOL_HAS_LOADED(streamVolResults) OR HUNTING_GET_QUITTING_TIMER() < GET_GAME_TIMER() IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) ENDIF STREAMVOL_DELETE(streamVolResults) // Stop the pad from taking input for a couple of seconds, so the results screen // doesn't get accidently skipped. bGotInputDelayTime = FALSE iQuitSceneState = 2 ENDIF ENDIF BREAK CASE 2 IF bQuittingMG CDEBUG1LN(DEBUG_HUNTING, "HUNTING_RUN_QUITTING_CUTSCENE - Removing weapons & setting a delay.") SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) STOP_SNIPE_AUDIO() CLEAR_PRINTS() REMOVE_ALL_ELK() HUNTING_SET_QUITTING_TIMER(GET_GAME_TIMER() + 500) iQuitSceneState = 3 ENDIF BREAK CASE 3 IF HUNTING_GET_QUITTING_TIMER() < GET_GAME_TIMER() CDEBUG1LN(DEBUG_HUNTING, "HUNTING_RUN_QUITTING_CUTSCENE - Triggering scene!") IF NOT DOES_ENTITY_EXIST(vehTruck) OR IS_ENTITY_DEAD(vehTruck) ANIMPOSTFX_STOP("MinigameTransitionIn") ANIMPOSTFX_PLAY("MinigameTransitionOut", 0, FALSE) RETURN TRUE ENDIF // Trigger the outro scene here, and drop the cam down. VECTOR vSceneCoord vSceneCoord = GET_ENTITY_COORDS(vehTruck, FALSE) VECTOR vSceneOrient vSceneOrient = GET_ENTITY_ROTATION(vehTruck) iSceneID = CREATE_SYNCHRONIZED_SCENE(vSceneCoord, vSceneOrient) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSceneID, FALSE) camScene = CREATE_CAMERA(CAMTYPE_ANIMATED) PLAY_SYNCHRONIZED_CAM_ANIM(camScene, iSceneID, "_Trevor_cam", "oddjobs@hunterOutro") TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSceneID, "oddjobs@hunterOutro", "_Trevor", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT) SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE) PLAY_SYNCHRONIZED_ENTITY_ANIM(vehTruck, iSceneID, "_Trevor_journey", "oddjobs@hunterOutro", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT) SET_CAM_ACTIVE_WITH_INTERP(camScene, camSky, 700) PLAY_SOUND_FRONTEND(-1, "QUIT_WHOOSH", "HUD_MINI_GAME_SOUNDSET") ANIMPOSTFX_STOP("MinigameTransitionIn") ANIMPOSTFX_PLAY("MinigameTransitionOut", 0, FALSE) RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID()) HUNTING_SET_QUITTING_TIMER(GET_GAME_TIMER() + 15000) iQuitSceneState = 4 ENDIF BREAK CASE 4 IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneID) > 0.99 OR (HUNTING_GET_QUITTING_TIMER() < GET_GAME_TIMER()) CDEBUG1LN(DEBUG_HUNTING, "HUNTING_RUN_QUITTING_CUTSCENE - Cutscene over!") //CLEAR_PED_TASKS(PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(vehTruck) AND NOT IS_ENTITY_DEAD(vehTruck) STOP_SYNCHRONIZED_ENTITY_ANIM(vehTruck, INSTANT_BLEND_IN, TRUE) ENDIF STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP() RETURN TRUE ELSE CDEBUG1LN(DEBUG_HUNTING, "HUNTING_RUN_QUITTING_CUTSCENE - Cutscene phase at: ", GET_SYNCHRONIZED_SCENE_PHASE(iSceneID)) ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC RESULTS(BOOL bForDeath = FALSE, BOOL bOutOfTime = FALSE, BOOL bWanted = FALSE, BOOL bLeftArea = FALSE, BOOL bCancelled = FALSE) HIDE_HUD_AND_RADAR_THIS_FRAME() THEFEED_HIDE_THIS_FRAME() SWITCH eStage CASE SS_INIT IF NOT IS_SCREEN_FADING_OUT() // Show the results screen against the appropriate backdrop CLEAR_HELP() DISABLE_CELLPHONE(TRUE) INIT_RESULT_SCREEN_BUTTONS(bForDeath | bOutOfTime | bWanted | bLeftArea) INIT_HUNTING_RESULTS_SCREEN(Player_Hunt_Data.challengeScreen, bForDeath) IF IS_PLAYER_ONLINE() READ_HUNTING_SOCIAL_CLUB_LEADERBOARD() Player_Hunt_Data.bOnlineForPrediction = TRUE ELSE Player_Hunt_Data.bOnlineForPrediction = FALSE ENDIF HUNTING_SET_QUITTING_TIMER(GET_GAME_TIMER() + 10000) iInputDelayTime = 0 bGotInputDelayTime = FALSE iQuitSceneState = 0 SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) PAUSE_CLOCK(TRUE) // Wanted and out of time apply the same effect. IF bWanted ANIMPOSTFX_PLAY("MinigameTransitionIn", 0, FALSE) ENDIF eStage = SS_ACTIVE ENDIF BREAK CASE SS_ACTIVE // Add money, once. IF (Player_Hunt_Data.iMoney != 0) AND NOT Player_Hunt_Data.bGivenMoney IF IS_SCREEN_FADED_IN() Player_Hunt_Data.bGivenMoney = TRUE DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR, BAA_CREDIT, BAAC_HUNTING, Player_Hunt_Data.iMoney, TRUE) ENDIF ENDIF // Need to handle the cutscene differently depending on what it's for. IF bCancelled OR bOutOfTime // Player chose to quit. IF HUNTING_RUN_QUITTING_CUTSCENE() Mission_Cleanup() ENDIF ELIF bLeftArea IF HUNTING_RUN_LEFT_AREA_CUTSCENE() Mission_Cleanup() ENDIF ENDIF // Display results, leaderboards, poll on input. IF NOT bQuittingMG IF HAS_PLAYER_CHOSEN_RESULTS(bForDeath | bOutOfTime | bWanted | bLeftArea) //Set endscreen to animate out, wait till done ENDSCREEN_START_TRANSITION_OUT(Player_Hunt_Data.challengeScreen) bQuittingMG = TRUE bWaitingEndScreen = TRUE ENDIF ENDIF IF bWaitingEndScreen IF RENDER_ENDSCREEN(Player_Hunt_Data.challengeScreen) PAUSE_CLOCK(FALSE) IF bForDeath CPRINTLN(DEBUG_MISSION, "Player is quitting due to death!") DO_SCREEN_FADE_OUT(500) Mission_Cleanup() ELSE IF bIsContinuing // Player has chosen continue from the menu. CPRINTLN(DEBUG_MISSION, "Player has opted to continue.") DO_SCREEN_FADE_OUT(500) iInputDelayTime = 0 HUNTING_SET_QUITTING_TIMER(-1) bQuittingMG = FALSE eStage = SS_TRANSIT ELSE // The player has opted to cancel from the results menu. iInputDelayTime = 0 // HUNTING_SET_QUITTING_TIMER(-1) IF bWanted ANIMPOSTFX_STOP("MinigameTransitionIn") ANIMPOSTFX_PLAY("MinigameTransitionOut", 0, FALSE) eStage = SS_TRANSIT ENDIF ENDIF ENDIF bWaitingEndScreen = FALSE ENDIF ENDIF BREAK CASE SS_TRANSIT IF bQuittingMG Mission_Cleanup() ELSE // We're here due to a replay. Handle that. IF IS_SCREEN_FADED_OUT() IF (HUNTING_GET_QUITTING_TIMER() = -1) // Blitz all random animals and deer. STOP_SNIPE_AUDIO() CLEANUP_RANDOM_ANIMALS() REMOVE_ALL_ELK() ANIMPOSTFX_STOP("MinigameTransitionIn") ANIMPOSTFX_PLAY("MinigameTransitionOut", 0, FALSE) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) RENDER_SCRIPT_CAMS(FALSE, FALSE) CLEAR_AREA_OF_PEDS(mAreaCheck1.vCentre, 1000.0, TRUE) CLEAR_AREA(mAreaCheck1.vCentre, 1000.0, TRUE) // Restore the time of day before the retry. IF (Player_Hunt_Data.todHuntStarted != INVALID_TIMEOFDAY) SET_CLOCK_TIME(GET_TIMEOFDAY_HOUR(Player_Hunt_Data.todHuntStarted), GET_TIMEOFDAY_MINUTE(Player_Hunt_Data.todHuntStarted), GET_TIMEOFDAY_SECOND(Player_Hunt_Data.todHuntStarted)) ENDIF CANCEL_TIMER(Player_Hunt_data.textTimer) Player_Hunt_data.eCorpseState = CS_UPDATE Player_Hunt_data.bNearCorpse = FALSE // Setup the LBD for a restart. CLEAR_RANK_REDICTION_DETAILS() CLEANUP_SOCIAL_CLUB_LEADERBOARD(Player_Hunt_Data.huntLB_control) bPredictionSetup = FALSE THEFEED_FLUSH_QUEUE() DELETE_ALL_HUNTING_TEXT_MESSAGES() RESET_PLAYER_TO_SPAWN() SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE) DESTROY_MAIN_CAM() INIT_VARS_FOR_THIS_MODE() DISABLE_CELLPHONE(FALSE) Player_Hunt_Data.bSetupHuntingControls = FALSE Player_Hunt_Data.bChallengeScreenSetup = FALSE // Reset all challenge progress. HUNTING_CHALLENGES_CLEAR_PROGRESS(Player_Hunt_Data) IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE, TRUE) ENDIF IF DOES_ENTITY_EXIST(Player_Hunt_Data.vehQuad) DELETE_VEHICLE(Player_Hunt_Data.vehQuad) ENDIF // Respawn that blazer... REQUEST_MODEL(BLAZER) WHILE NOT HAS_MODEL_LOADED(BLAZER) WAIT(0) ENDWHILE // We should probably make the quad here... CLEAR_AREA_OF_VEHICLES(<<-1707.4337, 4666.5625, 22.1095>>, 2.0) Player_Hunt_Data.vehQuad = CREATE_VEHICLE(BLAZER, <<-1707.4337, 4666.5625, 22.1095>>, 323.2491) SET_MODEL_AS_NO_LONGER_NEEDED(BLAZER) CLEAN_ALL_CORPSES() HUNTING_SET_QUITTING_TIMER(GET_GAME_TIMER() + 1000) ELIF HUNTING_GET_QUITTING_TIMER() < GET_GAME_TIMER() DO_SCREEN_FADE_IN(500) eHuntState = HS_HUNT eStage = SS_INIT ENDIF ENDIF ENDIF BREAK CASE SS_SKIPPED PRINTLN("RESULTS() :: SS_SKIPPED") BREAK ENDSWITCH ENDPROC #IF IS_DEBUG_BUILD PROC DEBUG_MONITOR() // Check for Pass IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) OR (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) Mission_Passed() ENDIF // Check for Fail IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) Mission_Failed() ENDIF UPDATE_RAG_WIDGETS() IF bDisplayChallengeTracking UPDATE_CHALLENGE_DEBUG() ENDIF ENDPROC PROC HUNTING_UPDATE_DEBUG() IF IS_DEBUG_KEY_JUST_PRESSED( KEY_E, KEYBOARD_MODIFIER_SHIFT, "removeElk" ) REMOVE_ALL_ELK() ENDIF ENDPROC #ENDIF CONST_INT RADAR_ZOOM_STEALTH 1 CONST_INT RADAR_ZOOM_NORMAL 400 CONST_INT RADAR_ZOOM_CALLING 700 PROC MANAGE_HUNTING_RADAR() INT radarZoom = RADAR_ZOOM_NORMAL IF bPlayerCalling radarZoom = RADAR_ZOOM_CALLING ELIF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID()) radarZoom = RADAR_ZOOM_STEALTH ENDIF DONT_ZOOM_MINIMAP_WHEN_RUNNING_THIS_FRAME() SET_RADAR_ZOOM(radarZoom) ENDPROC /// PURPOSE: /// We need to ensure that the navmesh around the palyer is loaded, so that animals move. /// To do this, every 5 seconds we remove all required navmesh, then request a new area around the player. /// Previously, we were loading a 1km square area, but this blocks streaming. PROC MANAGE_HUNTING_REQUIRED_NAVMESH() IF iNavMeshLoadTime < GET_GAME_TIMER() REMOVE_NAVMESH_REQUIRED_REGIONS() ADD_NAVMESH_REQUIRED_REGION(vHuntingPlayerCoords.x, vHuntingPlayerCoords.y, 225.0) iNavMeshLoadTime = GET_GAME_TIMER() + HUNTING_NAVMESH_LOAD_DELAY ENDIF ENDPROC PROC MANAGE_HUNTING_EXTERNAL_UI() HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME) DISABLE_SELECTOR_THIS_FRAME() SUPRESS_HELP_TEXT() ENDPROC // =========================================================================================================== // Script Loop // =========================================================================================================== SCRIPT(HUNTING_LAUNCH_STRUCT structHuntData) PRINTLN("***** hunting_ambient.sc : SCRIPT STARTED *****") iHuntCandidateID = structHuntData.iCandidateID CLEAR_HELP() CLEAR_PRINTS() HIDE_HUD_AND_RADAR_THIS_FRAME() SET_RANDOM_TRAINS(FALSE) IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) ENDIF IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_DEBUG_MENU|DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_REPEAT_PLAY) PRINTLN("***** hunting_ambient.sc : FORCE CLEANUP *****") Mission_Cleanup(TRUE) ENDIF SET_MISSION_FLAG(TRUE) INIT_HUNT() #IF IS_DEBUG_BUILD SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE (TRUE) #ENDIF WHILE (TRUE) IF IS_PED_UNINJURED(PLAYER_PED_ID()) IF IS_PLAYER_BEING_ARRESTED(PLAYER_ID()) Mission_Cleanup() ENDIF vHuntingPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID()) MANAGE_HUNTING_REQUIRED_NAVMESH() DIAL_DOWN_TRAFFIC() MANAGE_HUNTING_TITLE() MANAGE_HUNTING_EXTERNAL_UI() SWITCH eHuntState CASE HS_SETUP SETUP_INTRO_SCENE(structHuntData) BREAK CASE HS_HUNT HUNT() HANDLE_RANDOM_ANIMALS() BREAK CASE HS_RESULTS RESULTS(FALSE, GET_CLOCK_HOURS() > 20 OR GET_CLOCK_HOURS() < 5, eFinishState = FS_FAILED_WANTED, eFinishState = FS_FAILED_LEFT, eFinishState = FS_CANCELLED) // Dont show 'rety' if we are too late BREAK ENDSWITCH #IF IS_DEBUG_BUILD DEBUG_MONITOR() HUNTING_UPDATE_DEBUG() #ENDIF ENDIF WAIT(0) ENDWHILE // Script should never reach here. Always terminate with cleanup function. ENDSCRIPT