Files
2025-09-29 00:52:08 +02:00

2456 lines
80 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "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