Files
gtav-src/script/dev_ng/singleplayer/scripts/missions/FBI/FBI4_Prep1.sc
T
2025-09-29 00:52:08 +02:00

2514 lines
81 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 "clearmissionarea.sch"
USING "commands_audio.sch"
USING "commands_camera.sch"
USING "commands_pad.sch"
USING "commands_vehicle.sch"
USING "commands_path.sch"
USING "commands_ped.sch"
USING "commands_physics.sch"
USING "commands_script.sch"
USING "commands_task.sch"
USING "CompletionPercentage_public.sch"
using "dialogue_public.sch"
USING "flow_public_core_override.sch"
USING "flow_public_GAME.sch"
using "ped_component_public.sch"
USING "player_ped_public.sch"
USING "replay_public.sch"
USING "script_blips.sch"
USING "script_heist.sch"
USING "script_ped.sch"
USING "selector_public.sch"
USING "flow_special_event_checks.sch"
BOOL bJumpSkip = FALSE //flag for if current MISSION state should clean up and move to the next state
USING "prep_mission_common.sch"
USING "route_manager_public.sch"
USING "flow_public_GAME.sch"
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
USING "event_public.sch"
USING "commands_recording.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
USING "shared_debug.sch"
CONST_INT MAX_SKIP_MENU_LENGTH 3
INT i_debug_jump_stage
MissionStageMenuTextStruct s_skip_menu[MAX_SKIP_MENU_LENGTH]
#ENDIF
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Template.sc
// AUTHOR : Ste Kerrigan
// DESCRIPTION :
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//----------------------
// CHECKPOINTS
//----------------------
CONST_INT CP_AFTER_MOCAP 0 //following beverly down the road
//-----------------------
// CONSTANTS
//-----------------------
//POLY TEST CONST
CONST_INT MAX_POLY_TEST_VERTS 8 //poly test
//Ambient encounter speech
CONST_INT MAX_AMBIENT_CONV_LINES 8
/// --------------------------------------------------
/// ENUMS
/// -------------------------------------------
/// PURPOSE: Mission states
ENUM MISSION_STATE
MS_SET_UP = 0, //0
// MS_GET_TO_STEAL_THING, //1
MS_STEAL, //2
MS_RETURN_WITH_THING, //3
MS_LEAVE_VEHICLE, //4
MS_LEAVE_AREA,
MS_FAILED //5
ENDENUM
/// PURPOSE:
/// Internal state machine states for mission state
ENUM STAGE_STATES
SS_INIT,
SS_ACTIVE,
SS_CLEANUP,
SS_SKIPPED
ENDENUM
/// PURPOSE: Mission requirements used for loading
/// and creating mission assets
ENUM MISSION_REQ
RQ_NONE,
RQ_TEXT,
RQ_STEAL_CAR,
RQ_STEAL_CAR_DRIVER,
RQ_STEAL_CAR_PASSENGER
ENDENUM
/// PURPOSE: Fail reason enums for picking correct fail reason
ENUM FAILED_REASONS
FR_NONE,
FR_WRECKED_STEAL_CAR,
FR_ABAN_CAR,
FR_STUCK_CAR
ENDENUM
ENUM ABM_CONV_STATES
ACS_START_LINE,
ACS_WAIT_LINE_FIN,
ACS_PICK_NEXT_LINE,
ACS_FIN
ENDENUM
ENUM BATTLE_BUDDY_CONV_TYPE
BBCT_WANTED = 0,
BBCT_LOSTWANTED,
BBCT_CHATFM,
BBCT_CHATFT,
BBCT_CHATTM,
BBCT_THERE
ENDENUM
///MISSION PED STATES
MISSION_STATE eMissionState = MS_SET_UP //track what MISSION stage we are at
STAGE_STATES eState = SS_INIT //Internal state tracking for mission stages
COP_MONITOR eCopMonitor = CM_MONITER
IN_STEAL_CAR_MONITOR eStealCarState = ISCM_NOT_IN_VEHICLE
DYNAMIC_PHONE_STATE ePhoneCallState = DPS_CHOOSE_PHONE_CALL
//*****************************************************************************
// :STRUCTS:
//*****************************************************************************
/// PURPOSE: Holds data used to create a ped
/// Contains ped specific variables for the
/// perception system
STRUCT MYPED
PED_INDEX id
VECTOR vPos
FLOAT fDir
MODEL_NAMES Mod = DUMMY_MODEL_FOR_SCRIPT
AI_BLIP_STRUCT mAIBlip
ENDSTRUCT
/// PURPOSE: Holds data for creating a
/// vehicle in an encounter
STRUCT MYVEHICLE
VEHICLE_INDEX id
VECTOR vPos
FLOAT fDir
MODEL_NAMES Mod = DUMMY_MODEL_FOR_SCRIPT
ENDSTRUCT
/// PURPOSE: Holds a string and a int
/// String is used to play a conversation
/// the int is used to expire a bit in a bit field
///
STRUCT DIALOGUE_HOLDER
STRING sConv[6]
INT iExpiredBit = 0
ENDSTRUCT
DIALOGUE_HOLDER mBBChatter[MAX_BATTLE_BUDDIES]
TEST_POLY mAreaCheck1 //Poly area 1
TEST_POLY mAreaCheck2 //Poly area 2
//****************************************************************************************************
// : MISSION FLOW VARIABLES :
//****************************************************************************************************
//mission flow
INT iMissionState = 0 //Used in skips and checkpoints
//Fail vars
STRING sFailReason = NULL //String to display when mission is failed
//GOD TEXT
STRING sGodText = "FBIPRA"
BOOL bObjectiveShown = FALSE //Has an objective been shown
//BLIPs
BLIP_INDEX biBlip //Mission blip - mainly used for go to objectives
BLIP_INDEX biVehicleBlip
//ScriptCamera
CAMERA_INDEX camMain //Script camera used in place holder cutscenes
VECTOR vSafeVec = <<0,0,0>> //safe vector used when a proper position isnt needed
VECTOR vDropOffLoc = <<1381.4722, -2072.2454, 50.9981>>
INT iTotalDelPoints
BOOL bDamageSpeedStatTurnedOn = FALSE
BOOL bWantedTimeStatTriggered = FALSE
BOOL bJackedConv = FALSE
BOOL bCallTimer = FALSE
INT iCallTimerDelay = 0
BOOL bForceStop = FALSE
BOOL bLoadedTrashAssets = FALSE
///==============| GOD TEXT BOOLS |============
BOOL bExpireReturnVehWanted = FALSE
BOOL bExpireReturnVeh = FALSE
///===============| models |===================
/// ===============| START VECTORS |==============
/// ==============| START HEADINGS |===============
/// ==============| PED INDICES |================
MYPED mGarbageTruckDriver
MYPED mGarbageTruckPassenger
/// ==============| VEHICLE INDICES |===========
MYVEHICLE mGarbageTruck
VEHICLE_INDEX viStealCar
VEHICLE_INDEX viAnyValidTruck
//End mission vehicle
VEHICLE_INDEX viLastCar
BOOL bSpawnedEndMissionVeh = FALSE
/// ===============| GROUPS |========================
/// ===============| DIALOGUE |======================
STRING sTextBlock = "FIBP1AU" //The Dialogue block for the mission
structPedsForConversation s_conversation_peds //conversation struct
TEXT_LABEL_15 sPhoneUpdateString
BOOL bAddBuddyForDialogue[MAX_BATTLE_BUDDIES]
INT iChatterTimer = -1
//Used for tracking an interupted conversation
//TEXT_LABEL_23 sResumeRoot = "NONE"
//TEXT_LABEL_23 sResumeLine = "NONE"
/// PURPOSE:
/// Resets all variables used in flow
PROC RESET_ALL()
IF eMissionState = MS_STEAL
REGISTER_PED_AS_DRIVER(mGarbageTruckDriver.id)
REGISTER_PED_AS_PASSENGER(mGarbageTruckPassenger.id)
REGISTER_VEHICLE(mGarbageTruck.id)
ACTIVATE_DELIVERY_MANAGER(iTotalDelPoints, TRUE, FALSE, TRUE)
ENDIF
bSpawnedEndMissionVeh = FALSE
bExpireReturnVehWanted = FALSE
bExpireReturnVeh = FALSE
bCallTimer = FALSE
iCallTimerDelay = 0
bForceStop = FALSE
ENDPROC
///
///
/// DEBUG ONLY MISSION STUFF ------------------------------------------------------------
///
///
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widgetGroup
BOOL bShowDebugText = TRUE
BOOL bForceFail = FALSE
/// PURPOSE:
/// Sets up a widget for this mission
PROC SETUP_FOR_RAGE_WIDGETS()
widgetGroup = START_WIDGET_GROUP("CURRENT Mission Widgets")
START_WIDGET_GROUP("Debug")
ADD_WIDGET_BOOL("Toggle Debug spew", bShowDebugText)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Force Mission Fail")
ADD_WIDGET_BOOL("Force Fail", bForceFail)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Deletes the mission widget
PROC CLEANUP_OBJECT_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(widgetGroup)
DELETE_WIDGET_GROUP(widgetGroup)
ENDIF
ENDPROC
/// PURPOSE:
/// Checks for any updates needed for the widgets
PROC UPDATE_RAG_WIDGETS()
IF bForceFail
eMissionState = MS_FAILED
eState = SS_INIT
bForceFail = FALSE
ENDIF
ENDPROC
/// PURPOSE:
/// Draws an angled area
/// PARAMS:
/// vec1 - first point of the area
/// vec2 - second point of the area
/// width - the width of the area
// PROC DRAW_DEBUG_LOCATE_SPECIAL(VECTOR vec1, VECTOR vec2, FLOAT width)
//
// VECTOR vBottom[2]
// VECTOR vTop[2]
//
// vBottom[0] = vec1
// vBottom[1] = vec2
//
// vTop[0] = vec1
// vTop[1] = vec2
//
// IF vec1.z > vec2.z
// vBottom[0].z = vec2.z
// vBottom[1].z = vec2.z
// vTop[0].z = vec1.z
// vTop[1].z = vec1.z
// ELSE
// vBottom[0].z = vec1.z
// vBottom[1].z = vec1.z
// vTop[0].z = vec2.z
// vTop[1].z = vec2.z
// ENDIF
//
// VECTOR fwd = NORMALISE_VECTOR(vBottom[1] - vBottom[0]) // normalize to get distance
// VECTOR side = <<-fwd.y, fwd.x, fwd.z>>
// VECTOR w = side * (width / 2.0)
//
// // Bottom points
// VECTOR c1 = vBottom[0] - w // base left
// VECTOR c2 = vBottom[0] + w // base right
// VECTOR c3 = vBottom[1] + w // top rt
// VECTOR c4 = vBottom[1] - w // top lt
//
// // Top points
// VECTOR d1 = vTop[0] - w // base left
// VECTOR d2 = vTop[0] + w // base right
// VECTOR d3 = vTop[1] + w // top rt
// VECTOR d4 = vTop[1] - w // top lt
//
// // Draw bottom lines
// DRAW_DEBUG_LINE(c1, c2, 128, 0, 128)
// DRAW_DEBUG_LINE(c2, c3, 128, 0, 128)
// DRAW_DEBUG_LINE(c3, c4, 128, 0, 128)
// DRAW_DEBUG_LINE(c4, c1, 128, 0, 128)
// // Draw top lines
// DRAW_DEBUG_LINE(d1, d2, 128, 0, 128)
// DRAW_DEBUG_LINE(d2, d3, 128, 0, 128)
// DRAW_DEBUG_LINE(d3, d4, 128, 0, 128)
// DRAW_DEBUG_LINE(d4, d1, 128, 0, 128)
// // Draw uprights
// DRAW_DEBUG_LINE(c1, d1, 128, 0, 128)
// DRAW_DEBUG_LINE(c2, d2, 128, 0, 128)
// DRAW_DEBUG_LINE(c3, d3, 128, 0, 128)
// DRAW_DEBUG_LINE(c4, d4, 128, 0, 128)
//
// ENDPROC
#ENDIF
///
///
/// GENERAL HELP FUNCTIONS
///
///
/// PURPOSE:
/// Set a peds position and heading safely ie check its ok then move it and set its heading
/// PARAMS:
/// index - The ped to move
/// pos - The position to move it to
/// dir - The Heading to set
PROC SET_PED_POS(PED_INDEX index, VECTOR pos, FLOAT dir)
IF IS_PED_UNINJURED(index)
CLEAR_PED_TASKS(index)
ENDIF
SAFE_TELEPORT_ENTITY(index, pos, dir)
ENDPROC
//PURPOSE:
/// PURPOSE:
/// Checkes to see if a ped is in a given vehicle, also does alive checks.
/// Returns TRUE if the given ped is in the given vehicle and they are all alive and well
/// PARAMS:
/// ped - Ped to check
/// veh - The vehicle to check they are in
/// RETURNS:
/// TRUE if the ped is in the vehicle and they are both alive and well
FUNC BOOL IS_SAFE_PED_IN_VEHICLE(PED_INDEX ped, VEHICLE_INDEX veh)
IF veh != NULL
IF IS_VEHICLE_OK(veh)
IF IS_PED_UNINJURED(ped)
IF IS_PED_IN_VEHICLE(ped,veh)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Print a warning God text string and expires a bool when the warning has been shown
/// PARAMS:
/// WarnObj - the text key of the wanrning
/// expire - the bool to change
PROC PRINT_WARNING_OBJ(STRING WarnObj, BOOL &expire)
IF NOT expire
PRINT_NOW(WarnObj, DEFAULT_GOD_TEXT_TIME,0)
expire = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Spawns and sets up the ped with a debug name
/// PARAMS:
/// index - The PED_INDEX to write the newly created ped to
/// pos - The postion to create the ped at
/// fDir - The heading to give the new ped
/// modelName - The model to create the ped with
/// i - Debug number for Debug name
/// _name - The Debug name
/// RETURNS:
/// TRUE if the ped was created
FUNC BOOL SETUP_PED(PED_INDEX &index, VECTOR pos, FLOAT fDir, MODEL_NAMES modelName, INT i, STRING _name)
IF SPAWN_PED(index, modelName, pos, fDir)
#IF IS_DEBUG_BUILD
SK_PRINT("SPAWNED")
#ENDIF
IF IS_PED_UNINJURED(index)
TEXT_LABEL tDebugName = _name
tDebugName += i
#IF IS_DEBUG_BUILD
SK_PRINT(tDebugName)
#ENDIF
SET_PED_NAME_DEBUG(index, tDebugName)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
///-----------------------------------------------------------------------------------
/// MISSION FUNCTIONS
///-----------------------------------------------------------------------------------
/// PURPOSE:
/// Tells a ped to leave a specified vehicle
/// performs dead checks on the ped and vehicle
/// PARAMS:
/// ped - The ped to leave the vechicle
/// veh - The vehicle said ped is leaving
PROC GIVE_LEAVE_VEHICLE_ORDER(PED_INDEX ped, VEHICLE_INDEX veh)
IF IS_VEHICLE_OK(veh)
IF IS_PED_UNINJURED(ped)
TASK_LEAVE_VEHICLE(ped, veh)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Tells a ped to enter a specified vehicle
/// performs dead checks on the ped and vehicle
/// PARAMS:
/// ped - The ped to leave the vechicle
/// veh - The vehicle said ped is leaving
/// seat - Seate the ped should enter the car from
PROC GIVE_ENTER_VEHICLE_ORDER(PED_INDEX ped, VEHICLE_INDEX veh, VEHICLE_SEAT seat = VS_DRIVER)
IF IS_VEHICLE_OK(veh)
IF IS_PED_UNINJURED(ped)
TASK_ENTER_VEHICLE(ped, veh, DEFAULT_TIME_BEFORE_WARP, seat)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Gives a ped a waypoint task
/// PARAMS:
/// ped - The ped to give the task to
/// waypoint - The name of the waypoint rec to give the ped
PROC GIVE_WAYPOINT_TASK(PED_INDEX ped, STRING waypoint, INT iStartPoint = 0 , EWAYPOINT_FOLLOW_FLAGS eFollow = EWAYPOINT_DEFAULT)
IF IS_PED_UNINJURED(ped)
FREEZE_ENTITY_POSITION(ped, FALSE)
CLEAR_PED_TASKS(ped)
TASK_FOLLOW_WAYPOINT_RECORDING(ped, waypoint, iStartPoint, eFollow)
ENDIF
ENDPROC
PROC GIVE_NAVMESH_TASK(PED_INDEX ped, VECTOR vGoto, FLOAT moveBlend = PEDMOVEBLENDRATIO_WALK, INT warpTime = DEFAULT_TIME_BEFORE_WARP)
IF IS_PED_UNINJURED(ped)
FREEZE_ENTITY_POSITION(ped, FALSE)
CLEAR_PED_TASKS(ped)
TASK_FOLLOW_NAV_MESH_TO_COORD(ped, vGoto, moveBlend, warpTime)
ENDIF
ENDPROC
/// PURPOSE:
/// Gives a ped an attack order after the player has been spotted
/// Only called when the player fails the mission for getting spotted or attacking a ped
/// and possibly when the player has completed the sex scene section
/// PARAMS:
/// ped - The ped to give the order to
PROC GIVE_PED_ATTACK_ORDER(PED_INDEX ped)
IF IS_PED_UNINJURED(ped)
IF NOT IsPedPerformingTask(ped, SCRIPT_TASK_COMBAT)
FREEZE_ENTITY_POSITION(ped, FALSE)
CLEAR_PED_TASKS(ped)
TASK_COMBAT_PED(ped, PLAYER_PED_ID())
SET_PED_KEEP_TASK(ped, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Tells a ped to smart flee 200m from the player
/// Checks to see if the task is already being performed
/// Checks the ped is alive
/// PARAMS:
/// ped - the ped to flee
PROC GIVE_PED_FLEE_ORDER(PED_INDEX ped, BOOL bClearTasks = TRUE)
IF IS_PED_UNINJURED(ped)
IF NOT IsPedPerformingTask(ped, SCRIPT_TASK_SMART_FLEE_PED)
FREEZE_ENTITY_POSITION(ped, FALSE)
IF bClearTasks
CLEAR_PED_TASKS(ped)
ENDIF
TASK_SMART_FLEE_PED(ped, PLAYER_PED_ID(), 200, -1)
SET_PED_KEEP_TASK(ped, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks that 2 entities are at the same height - within
/// 1.5m
/// PARAMS:
/// e1 - first entity
/// e2 - second entity
/// RETURNS:
/// TRUE if the entities are at the same height
FUNC BOOL ARE_ENTITYS_AT_SAME_HEIGHT(ENTITY_INDEX e1, ENTITY_INDEX e2)
VECTOR vE1 = GET_ENTITY_COORDS(e1)
VECTOR vE2 = GET_ENTITY_COORDS(e2)
FLOAT fDiff = ABSF(vE1.z - vE2.z) //want the absolute difference so it doesnt matter which entitys height was taken away first
IF fDiff <= 1.5
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks that the player is with in range of the hunter used when playing dialogue
/// PARAMS:
/// distance - The distance the player must be with in - defaults to 10.0
/// RETURNS:
/// TRUE if the player is with in the distance
FUNC BOOL IS_IN_CONV_DISTANCE(PED_INDEX ped, FLOAT distance = 10.0)
IF ped = NULL
RETURN TRUE
ENDIF
IF IS_PED_UNINJURED(PLAYER_PED_ID())
AND IS_PED_UNINJURED(ped)
// #IF IS_DEBUG_BUILD SK_PRINT_FLOAT(" DISTANCE BETWEEN CONVO === ", GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ped, FALSE))#ENDIF
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ped, FALSE) <= distance
AND ARE_ENTITYS_AT_SAME_HEIGHT(ped, PLAYER_PED_ID())
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Creates a conversation and then displays an objective
/// Expires a bool when the conversation has been created
/// assume the player is talking to another ped
/// kills the conversation if its started and the peds are too far away
/// PARAMS:
/// ped - the ped the conversation is with - pass in NULL if i doesnt matter where the other ped is in relation to the player
/// bExpire - The bool to expire when the conversation has been created (ref)
/// sConvo - the string of the conversation to play
/// sObj - the text key for the obj
/// distance - the distance the player and ped need to be in before the convostation happens
PROC DO_CONVO_WITH_OBJ(PED_INDEX ped, BOOL &bExpire, STRING sConvo, STRING sObj, FLOAT distance = 10.0)
IF NOT bObjectiveShown
// #IF IS_DEBUG_BUILD SK_PRINT(sConvo) #ENDIF
// #IF IS_DEBUG_BUILD SK_PRINT(" NOT bObjectiveShown") #ENDIF
//
IF NOT bExpire
// #IF IS_DEBUG_BUILD SK_PRINT("NOT bExpire") #ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND IS_SCREEN_FADED_IN()
IF IS_IN_CONV_DISTANCE(ped, distance)
bExpire = CREATE_CONVERSATION(s_conversation_peds, sTextBlock, sConvo, CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
ELSE
IF NOT IS_IN_CONV_DISTANCE(ped, distance)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0
PRINT_OBJ(sObj, bObjectiveShown)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Creates a conversation and then displays an objective
/// And then creates another conversation
/// Expires a bool when each of the conversation have been created
/// assume the player is talking to another ped
/// kills the conversation if its started and the peds are too far away
/// PARAMS:
/// ped - the ped the conversation is with - pass in NULL if i doesnt matter where the other ped is in relation to the player
/// bExpire - The expiry bool for the first conversation (ref)
/// bExpireAfterConv - bool for the second conversation (ref)
/// sConvo - the string of the 1st conversation to play
/// sConvToPlayAfterObj - the string 2nd of the conversation to play
/// sObj - the text key for the obj
/// distance - the distance the player and ped need to be in before the convostation happens
PROC DO_TWO_CONVO_WITH_OBJ(PED_INDEX ped, BOOL &bExpire, BOOL &bExpireAfterConv, STRING sConvo, STRING sConvToPlayAfterObj, STRING sObj, FLOAT distance = 10.0)
IF NOT bObjectiveShown
// #IF IS_DEBUG_BUILD SK_PRINT(" NOT bObjectiveShown") #ENDIF
IF NOT bExpire
// #IF IS_DEBUG_BUILD SK_PRINT(sConvo) #ENDIF
// #IF IS_DEBUG_BUILD SK_PRINT("NOT bExpire") #ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND IS_SCREEN_FADED_IN()
IF IS_IN_CONV_DISTANCE(ped, distance)
bExpire = CREATE_CONVERSATION(s_conversation_peds, sTextBlock, sConvo, CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
ELSE
IF NOT IS_IN_CONV_DISTANCE(ped, distance)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0
PRINT_OBJ(sObj, bObjectiveShown)
ENDIF
ENDIF
ELSE
IF NOT IS_THIS_PRINT_BEING_DISPLAYED(sObj)
OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0
IF NOT IS_STRING_NULL_OR_EMPTY(sConvToPlayAfterObj)
IF NOT bExpireAfterConv
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_IN_CONV_DISTANCE(ped, distance)
bExpireAfterConv = CREATE_CONVERSATION(s_conversation_peds, sTextBlock, sConvToPlayAfterObj, CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
ELSE
IF NOT IS_IN_CONV_DISTANCE(ped, distance)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ELSE
bExpireAfterConv = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Creates a conversation then expires a bool when the conversation has been created
/// PARAMS:
/// ped - the ped the conversation is with - pass in NULL if i doesnt matter where the other ped is in relation to the player
/// bExpire - The expiry bool for the first conversation (ref)
/// sConvo - the string of the conversation to play
/// distance - the distance the player and ped need to be in before the convostation happens
/// RETURNS:
/// true when the bool is expired
FUNC BOOL DO_CONVO(PED_INDEX ped, BOOL &bExpire, STRING sConvo, FLOAT distance = 10.0, enumConversationPriority priority = CONV_PRIORITY_MEDIUM)
IF NOT bExpire
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND IS_SCREEN_FADED_IN()
IF IS_IN_CONV_DISTANCE(ped, distance)
bExpire = CREATE_CONVERSATION(s_conversation_peds, sTextBlock, sConvo, priority)
ENDIF
ENDIF
ELSE
IF NOT IS_IN_CONV_DISTANCE(ped, distance)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
RETURN bExpire
ENDFUNC
/// PURPOSE:
/// Checks to see if the player has killed innocents then increaments the mission stat.
/// PARAMS:
/// bIsAfterOtherFail - Flag to see if the player has already failed the mission when this
/// returns true and changes the mission fail reason accordingly.
PROC CHECK_FOR_MURDER()
/*
PED_INDEX mPed
INT i = 0
IF Has_Ped_Been_Killed()
REPEAT Get_Number_Of_Ped_Killed_Events() i
IF DOES_ENTITY_EXIST(Get_Index_Of_Killed_Ped(i))
mPed = GET_PED_INDEX_FROM_ENTITY_INDEX(Get_Index_Of_Killed_Ped(i))
IF mPed <> PLAYER_PED_ID()
IF IS_ENTITY_A_PED(mPed)
IF NOT IS_ENTITY_A_MISSION_ENTITY(mPed)
AND IS_PED_HUMAN(mPed)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mPed, PLAYER_PED_ID())
//this stat has been removed
//INFORM_MISSION_STATS_OF_INCREMENT(FBI4P1_INNOCENTS_KILLED)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
*/
ENDPROC
PROC SET_STATS_WATCH_OFF()
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL, FBI4P1_VEHICLE_DAMAGE)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(TRUE, FBI4P1_LEVEL_LOSS)
ENDPROC
PROC MANAGE_PLAYER_VEHICLE_STATS()
IF NOT bDamageSpeedStatTurnedOn
IF IS_VEHICLE_OK(viStealCar)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viStealCar)
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(viStealCar)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(viStealCar, FBI4P1_VEHICLE_DAMAGE)
bDamageSpeedStatTurnedOn = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bWantedTimeStatTriggered
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FBI4P1_LEVEL_LOSS)
bWantedTimeStatTriggered = TRUE
ENDIF
ELSE
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(FALSE, FBI4P1_LEVEL_LOSS)
bWantedTimeStatTriggered = FALSE
ENDIF
ENDIF
ENDPROC
PROC MONITER_STATS()
CHECK_FOR_MURDER()
MANAGE_PLAYER_VEHICLE_STATS()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Fail
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Called when the player has failed
/// deletes blips and clears the screen of text and conversations are ended
/// PARAMS:
/// fail - An Enum of the fail reason used in a switch statment to pick the correct text to display
PROC MISSION_FAILED(FAILED_REASONS fail = FR_NONE)
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
SWITCH fail
CASE FR_NONE
BREAK
CASE FR_WRECKED_STEAL_CAR
sFailReason = "PRA_FWRECK"
BREAK
CASE FR_ABAN_CAR
sFailReason = "PRA_FFAR"
BREAK
CASE FR_STUCK_CAR
sFailReason = "PRA_FSTUCK"
BREAK
ENDSWITCH
eMissionState = MS_FAILED
eState = SS_INIT
ENDPROC
///-----------------------------------------------------------------------------------
/// STATE MACHINES
///-----------------------------------------------------------------------------------
/// PURPOSE:
/// Sets the mission check point
PROC SET_CHECKPOINT()
ENDPROC
/// PURPOSE:
/// Turn off the ambient services
PROC SERVICES_TOGGLE(BOOL bOn)
//Wanted
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, bOn)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, bOn)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, bOn)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, bOn)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, bOn)
IF bOn
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_MAX_WANTED_LEVEL(5)
ELSE
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0)
ENDIF
ENDPROC
/// PURPOSE:
/// Loads a scene around a point used to the player
/// seeing the map stream in when starting a replay or debug skipping
/// PARAMS:
/// pos - the position to stream the scene around at
/// rad - the radius of the scene to load
PROC LOAD_SCENE_SKIP(VECTOR pos, FLOAT rad)
NEW_LOAD_SCENE_START_SPHERE(pos, rad)
INT i_load_scene_timer = GET_GAME_TIMER()
WHILE (NOT IS_NEW_LOAD_SCENE_LOADED()) AND (GET_GAME_TIMER() - i_load_scene_timer < 12000)
WAIT(0)
ENDWHILE
NEW_LOAD_SCENE_STOP()
ENDPROC
/// PURPOSE:
/// Adds peds for dialogue based off the Mission state
PROC ADD_PEDS_FOR_DIALOGUE()
ADD_CURRENT_PLAYER_FOR_DIALOGUE(s_conversation_peds)
ENDPROC
FUNC BOOL IS_PLAYER_IN_CORRECT_MODEL_ON_START()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), TRASH)
SET_ENTITY_AS_MISSION_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), TRUE, FALSE)
viStealCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viStealCar)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// 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 pos, FLOAT dir=0.0)
SWITCH missionReq
CASE RQ_NONE
IF ARE_VECTORS_ALMOST_EQUAL(pos, vSafeVec)
AND dir = 0.0
RETURN TRUE
ENDIF
BREAK
CASE RQ_TEXT
REQUEST_ADDITIONAL_TEXT(sGodText, MISSION_TEXT_SLOT)
IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
#IF IS_DEBUG_BUILD
SK_PRINT("RQ_TEXT")
#ENDIF
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("TEXT FAILED")
#ENDIF
BREAK
CASE RQ_STEAL_CAR
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE)
mGarbageTruck.id = g_sTriggerSceneAssets.veh[0]
IF IS_VEHICLE_OK(mGarbageTruck.id)
SET_VEHICLE_AS_RESTRICTED(mGarbageTruck.id, 0)
SET_VEHICLE_HAS_STRONG_AXLES(mGarbageTruck.id, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(mGarbageTruck.id, TRUE)
RETURN TRUE
ENDIF
ELSE
IF SPAWN_VEHICLE(mGarbageTruck.id, mGarbageTruck.Mod, mGarbageTruck.vPos, mGarbageTruck.fDir)
SET_VEHICLE_AS_RESTRICTED(mGarbageTruck.id, 0)
SET_VEHICLE_HAS_STRONG_AXLES(mGarbageTruck.id, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(mGarbageTruck.id, TRUE)
#IF IS_DEBUG_BUILD
SK_PRINT("RQ_STEAL_CAR")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("RQ_STEAL_CAR FAILED")
#ENDIF
BREAK
CASE RQ_STEAL_CAR_DRIVER
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0])
IF NOT IS_PED_DEAD_OR_DYING(g_sTriggerSceneAssets.ped[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[0], TRUE, TRUE)
mGarbageTruckDriver.id = g_sTriggerSceneAssets.ped[0]
IF IS_PED_UNINJURED(mGarbageTruckDriver.id)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mGarbageTruckDriver.id, TRUE)
SET_PED_CONFIG_FLAG(mGarbageTruckDriver.id, PCF_ForceDirectEntry, FALSE)
SET_PED_FLEE_ATTRIBUTES(mGarbageTruckDriver.id, FA_FORCE_EXIT_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(mGarbageTruckDriver.id, CA_CAN_CHARGE, TRUE)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ELSE
IF SPAWN_PED(mGarbageTruckDriver.id, mGarbageTruckDriver.Mod, mGarbageTruckDriver.vPos, mGarbageTruckDriver.fDir)
IF IS_VEHICLE_OK(mGarbageTruck.id)
SET_PED_INTO_VEHICLE(mGarbageTruckDriver.id, mGarbageTruck.id)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mGarbageTruckDriver.id, TRUE)
SET_PED_CONFIG_FLAG(mGarbageTruckDriver.id, PCF_ForceDirectEntry, FALSE)
SET_PED_FLEE_ATTRIBUTES(mGarbageTruckDriver.id, FA_FORCE_EXIT_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(mGarbageTruckDriver.id, CA_CAN_CHARGE, TRUE) #IF IS_DEBUG_BUILD
SK_PRINT("RQ_STEAL_CAR_DRIVER")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("RQ_STEAL_CAR_DRIVER FAILED")
#ENDIF
BREAK
CASE RQ_STEAL_CAR_PASSENGER
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[1])
IF NOT IS_PED_DEAD_OR_DYING(g_sTriggerSceneAssets.ped[1])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[1], TRUE, TRUE)
mGarbageTruckPassenger.id = g_sTriggerSceneAssets.ped[1]
IF IS_PED_UNINJURED(mGarbageTruckPassenger.id)
SET_PED_CONFIG_FLAG(mGarbageTruckPassenger.id, PCF_ForceDirectEntry, FALSE)
SET_PED_FLEE_ATTRIBUTES(mGarbageTruckPassenger.id, FA_FORCE_EXIT_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(mGarbageTruckPassenger.id, CA_CAN_CHARGE, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mGarbageTruckPassenger.id, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(mGarbageTruckPassenger.id, TRUE)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ELSE
IF SPAWN_PED(mGarbageTruckPassenger.id, mGarbageTruckPassenger.Mod, mGarbageTruckPassenger.vPos, mGarbageTruckPassenger.fDir)
IF IS_VEHICLE_OK(mGarbageTruck.id)
SET_PED_INTO_VEHICLE(mGarbageTruckPassenger.id, mGarbageTruck.id, VS_FRONT_RIGHT)
SET_PED_CONFIG_FLAG(mGarbageTruckPassenger.id, PCF_ForceDirectEntry, FALSE)
SET_PED_FLEE_ATTRIBUTES(mGarbageTruckPassenger.id, FA_FORCE_EXIT_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(mGarbageTruckPassenger.id, CA_CAN_CHARGE, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mGarbageTruckPassenger.id, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(mGarbageTruckPassenger.id, TRUE)
#IF IS_DEBUG_BUILD
SK_PRINT("RQ_STEAL_CAR_DRIVER")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("RQ_STEAL_CAR_DRIVER FAILED")
#ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
/// 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:
/// TRUE if everything required for a stage is loaded properly
FUNC BOOL SETUP_MISSION_STAGE(MISSION_STATE eStage, BOOL bJumped = FALSE)
SWITCH eStage
CASE MS_SET_UP
IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions
bJumpSkip = FALSE // everything has been setup that is not key to this stage but is required to carry the mission on from this stage so reset the jump flag
RC_END_Z_SKIP()
ELSE
IF SETUP_STAGE_REQUIREMENTS(RQ_TEXT, vSafeVec)
IF IS_PLAYER_IN_CORRECT_MODEL_ON_START()
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FBI_4_PREP_1)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TRASH, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TOWTRUCK, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(S_M_Y_GARBAGE, TRUE)
eMissionState = MS_RETURN_WITH_THING//tesst
SAFE_REMOVE_BLIP(biBlip)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
SET_STATIC_BLIP_POSITION(STATIC_BLIP_MISSION_FBI_OFFICERS4_P1, <<1244.3380, -339.3197, 68.0823>>)
ADD_PEDS_FOR_DIALOGUE()
SET_SCENARIO_TYPE_ENABLED("DRIVE", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_ATTRACTOR", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_PASSENGERS", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE)
RETURN TRUE
ELSE
IF SETUP_STAGE_REQUIREMENTS(RQ_STEAL_CAR, mGarbageTruck.vPos, mGarbageTruck.fDir)
AND SETUP_STAGE_REQUIREMENTS(RQ_STEAL_CAR_DRIVER, mGarbageTruckDriver.vPos, mGarbageTruckDriver.fDir)
AND SETUP_STAGE_REQUIREMENTS(RQ_STEAL_CAR_PASSENGER, mGarbageTruckPassenger.vPos, mGarbageTruckPassenger.fDir)
AND LOAD_DELIVERY_ANIMS()
ADD_PEDS_FOR_DIALOGUE()
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FBI_4_PREP_1)
IF IS_PED_UNINJURED(mGarbageTruckDriver.id)
REGISTER_PED_AS_DRIVER(mGarbageTruckDriver.id)
ENDIF
IF IS_PED_UNINJURED(mGarbageTruckPassenger.id)
REGISTER_PED_AS_PASSENGER(mGarbageTruckPassenger.id)
ENDIF
REGISTER_VEHICLE(mGarbageTruck.id)
IF IS_PED_UNINJURED(mGarbageTruckPassenger.id)
AND IS_PED_UNINJURED(mGarbageTruckDriver.id)
ACTIVATE_DELIVERY_MANAGER(iTotalDelPoints, TRUE, FALSE, TRUE)
ENDIF
SET_VEHICLE_MODEL_IS_SUPPRESSED(TRASH, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TOWTRUCK, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(S_M_Y_GARBAGE, TRUE)
IF GET_BLIP_FROM_ENTITY(mGarbageTruck.id) != NULL
BLIP_INDEX blip
blip = GET_BLIP_FROM_ENTITY(mGarbageTruck.id)
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(TRUE)
SAFE_REMOVE_BLIP(blip)
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(FALSE)
ENDIF
ADD_SAFE_BLIP_TO_VEHICLE(biBlip, mGarbageTruck.id, TRUE)
SET_STATIC_BLIP_POSITION(STATIC_BLIP_MISSION_FBI_OFFICERS4_P1, <<1244.3380, -339.3197, 68.0823>>)
SET_SCENARIO_TYPE_ENABLED("DRIVE", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_ATTRACTOR", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_PASSENGERS", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE)
RETURN TRUE //all mission stage requirements set up return true and activate stage
ENDIF
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("MS_SET_UP, FAILED")
#ENDIF
BREAK
CASE MS_STEAL
// CLEAR_AREA_OF_VEHICLES(mGarbageTruck.vPos, 60)
IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions
IF SETUP_STAGE_REQUIREMENTS(RQ_STEAL_CAR, mGarbageTruck.vPos, mGarbageTruck.fDir)
AND SETUP_STAGE_REQUIREMENTS(RQ_STEAL_CAR_DRIVER, mGarbageTruckDriver.vPos, mGarbageTruckDriver.fDir)
AND SETUP_STAGE_REQUIREMENTS(RQ_STEAL_CAR_PASSENGER, mGarbageTruckPassenger.vPos, mGarbageTruckPassenger.fDir)
SET_PED_POS(PLAYER_PED_ID(), <<1197.8611, -353.0110, 68.0929>>, 278.9647)
RESET_ALL()
bJumpSkip = FALSE // everything has been setup that is not key to this stage but is required to carry the mission on from this stage so reset the jump flag
SET_SCENARIO_TYPE_ENABLED("DRIVE", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_ATTRACTOR", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_PASSENGERS", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE)
RC_END_Z_SKIP()
ENDIF
ELSE
// IF LOAD_DELIVERY_ANIMS()
ADD_PEDS_FOR_DIALOGUE()
RETURN TRUE //all mission stage requirements set up return true and activate stage
// ENDIf
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("MS_STEAL, FAILED")
#ENDIF
BREAK
CASE MS_RETURN_WITH_THING
IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions
IF SETUP_STAGE_REQUIREMENTS(RQ_STEAL_CAR, mGarbageTruck.vPos, mGarbageTruck.fDir)
RESET_ALL()
ADD_PEDS_FOR_DIALOGUE()
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), mGarbageTruck.id)
bJumpSkip = FALSE // everything has been setup that is not key to this stage but is required to carry the mission on from this stage so reset the jump flag
RC_END_Z_SKIP()
ENDIF
ELSE
RETURN TRUE //all mission stage requirements set up return true and activate stage
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("MS_RETURN_WITH_THING, FAILED")
#ENDIF
BREAK
CASE MS_LEAVE_VEHICLE
IF bJumped //If we have jumped to this stage set up everything that might of been cleared buy the jump to funtions
IF SETUP_STAGE_REQUIREMENTS(RQ_STEAL_CAR, vDropOffLoc, mGarbageTruck.fDir)
RESET_ALL()
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), mGarbageTruck.id)
ADD_PEDS_FOR_DIALOGUE()
bJumpSkip = FALSE // everything has been setup that is not key to this stage but is required to carry the mission on from this stage so reset the jump flag
RC_END_Z_SKIP()
ENDIF
ELSE
RETURN TRUE //all mission stage requirements set up return true and activate stage
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("MS_LEAVE_VEHICLE, FAILED")
#ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sits in the NEXT_STAGE() function and moniters for assest that
/// should be unloaded based on the mission state
/// PARAMS:
/// state - the current state we should evaluate
PROC MONITER_UNLOAD_ASSETS(MISSION_STATE state)
SWITCH state
CASE MS_SET_UP
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL DOES_BUDDY_NEED_TO_DRIVE_TRUCK(PED_INDEX hPed)
IF NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS()
IF DOES_ENTITY_EXIST(mGarbageTruck.id)
AND IS_VEHICLE_DRIVEABLE(mGarbageTruck.id)
AND NOT IS_ENTITY_AT_COORD(mGarbageTruck.id, vDropOffLoc, <<2,2,2>>)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), mGarbageTruck.id)
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
IF IS_PED_IN_VEHICLE(hPed, mGarbageTruck.id)
AND GET_PED_IN_VEHICLE_SEAT(mGarbageTruck.id, VS_DRIVER) = hPed
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_BUUDY_NEED_TO_CHASE_TRUCK(PED_INDEX hPed)
IF NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
VEHICLE_INDEX Veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(Veh)
IF IS_VEHICLE_MODEL(Veh, TRASH)
RETURN FALSE
ENDIF
IF IS_PED_IN_VEHICLE(hPed, Veh)
AND GET_PED_IN_VEHICLE_SEAT(Veh, VS_DRIVER) = hPed
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC DO_BUDDY_CHATTER(enumCharacterList eChar, BATTLE_BUDDY_CONV_TYPE eType)
IF NOT IS_BIT_SET(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(eType))
IF iChatterTimer != -1
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, mBBChatter[eChar].sConv[eType], CONV_PRIORITY_MEDIUM)
SET_BIT(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(eType))
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_MESSAGE_BEING_DISPLAYED()
iChatterTimer = GET_GAME_TIMER()
ELSE
iChatterTimer = -1
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL HAS_ANY_BB_CONV_EXPIRED_OF_TYPE(BATTLE_BUDDY_CONV_TYPE eType)
IF IS_BIT_SET(mBBChatter[CHAR_MICHAEL].iExpiredBit, ENUM_TO_INT(eType))
OR IS_BIT_SET(mBBChatter[CHAR_FRANKLIN].iExpiredBit, ENUM_TO_INT(eType))
OR IS_BIT_SET(mBBChatter[CHAR_TREVOR].iExpiredBit, ENUM_TO_INT(eType))
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC MONITOR_BUDDY_DIALOGUE(enumCharacterList eChar)
IF eMissionState > MS_STEAL
IF eCopMonitor > CM_MONITER
IF NOT IS_BIT_SET(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(BBCT_WANTED))
AND eStealCarState = ISCM_IN_VEHICLE
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, mBBChatter[eChar].sConv[BBCT_WANTED], CONV_PRIORITY_HIGH)
SET_BIT(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(BBCT_WANTED))
ENDIF
ENDIF
ENDIF
ELSE
IF IS_BIT_SET(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(BBCT_WANTED))
AND NOT IS_BIT_SET(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(BBCT_LOSTWANTED))
AND eStealCarState = ISCM_IN_VEHICLE
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, mBBChatter[eChar].sConv[BBCT_LOSTWANTED], CONV_PRIORITY_MEDIUM)
SET_BIT(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(BBCT_LOSTWANTED))
ENDIF
ENDIF
ENDIF
IF NOT IS_BIT_SET(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(BBCT_THERE))
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(viStealCar, vDropOffLoc) < 15
AND eStealCarState = ISCM_IN_VEHICLE
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF CREATE_CONVERSATION(s_conversation_peds, sTextBlock, mBBChatter[eChar].sConv[BBCT_THERE], CONV_PRIORITY_MEDIUM)
SET_BIT(mBBChatter[eChar].iExpiredBit, ENUM_TO_INT(BBCT_THERE))
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH GET_PLAYER_PED_ENUM(PLAYER_PED_ID())
CASE CHAR_MICHAEL
IF eChar = CHAR_FRANKLIN
IF NOT HAS_ANY_BB_CONV_EXPIRED_OF_TYPE(BBCT_CHATFM)
DO_BUDDY_CHATTER(eChar, BBCT_CHATFM)
ENDIF
ELIF eChar = CHAR_TREVOR
IF NOT HAS_ANY_BB_CONV_EXPIRED_OF_TYPE(BBCT_CHATTM)
DO_BUDDY_CHATTER(eChar, BBCT_CHATTM)
ENDIF
ENDIF
BREAK
CASE CHAR_FRANKLIN
IF eChar = CHAR_MICHAEL
IF NOT HAS_ANY_BB_CONV_EXPIRED_OF_TYPE(BBCT_CHATFM)
DO_BUDDY_CHATTER(eChar, BBCT_CHATFM)
ENDIF
ELIF eChar = CHAR_TREVOR
IF NOT HAS_ANY_BB_CONV_EXPIRED_OF_TYPE(BBCT_CHATFT)
DO_BUDDY_CHATTER(eChar, BBCT_CHATFT)
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF eChar = CHAR_FRANKLIN
IF NOT HAS_ANY_BB_CONV_EXPIRED_OF_TYPE(BBCT_CHATFT)
DO_BUDDY_CHATTER(eChar, BBCT_CHATFT)
ENDIF
ELIF eChar = CHAR_MICHAEL
IF NOT HAS_ANY_BB_CONV_EXPIRED_OF_TYPE(BBCT_CHATTM)
DO_BUDDY_CHATTER(eChar, BBCT_CHATTM)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
PROC MONITOR_BATTLE_BUDDIES()
// For each playable character...
enumCharacterList eChar
BOOL bUpdatedDialogue = FALSE
REPEAT MAX_BATTLE_BUDDIES eChar
PED_INDEX hBuddy = GET_BATTLEBUDDY_PED(eChar)
IF NOT IS_PED_INJURED(hBuddy)
IF IS_BATTLEBUDDY_AVAILABLE(hBuddy, FALSE)
IF NOT bUpdatedDialogue
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), hBuddy, 5)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
MONITOR_BUDDY_DIALOGUE(eChar)
bUpdatedDialogue = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bAddBuddyForDialogue[ENUM_TO_INT(eChar)]
IF eChar = CHAR_MICHAEL
ADD_PED_FOR_DIALOGUE(s_conversation_peds, ENUM_TO_INT(eChar), hBuddy, "MICHAEL")
ELIF eChar = CHAR_FRANKLIN
ADD_PED_FOR_DIALOGUE(s_conversation_peds, ENUM_TO_INT(eChar), hBuddy, "FRANKLIN")
ELIF eChar = CHAR_TREVOR
ADD_PED_FOR_DIALOGUE(s_conversation_peds, ENUM_TO_INT(eChar), hBuddy, "TREVOR")
ENDIF
bAddBuddyForDialogue[ENUM_TO_INT(eChar)] = TRUE
ENDIF
ENDIF
IF NOT IS_BATTLEBUDDY_OVERRIDDEN(hBuddy)
// Does script need to take control of buddy and drive to dest?
IF IS_BATTLEBUDDY_AVAILABLE(hBuddy, FALSE)
IF DOES_BUDDY_NEED_TO_DRIVE_TRUCK(hBuddy)
OR DOES_BUUDY_NEED_TO_CHASE_TRUCK(hBuddy)
IF OVERRIDE_BATTLEBUDDY(hBuddy, FALSE)
SET_ENTITY_AS_MISSION_ENTITY(hBuddy, TRUE, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(hBuddy, TRUE)
CLEAR_PED_TASKS(hBuddy)
ENDIF
ENDIF
ENDIF
ELSE
// Does script still need to take control of buddy and drive to dest?
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(hBuddy)
IF DOES_BUDDY_NEED_TO_DRIVE_TRUCK(hBuddy)
// Buddy drives truck to destination
IF GET_SCRIPT_TASK_STATUS(hBuddy, SCRIPT_TASK_VEHICLE_MISSION) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(hBuddy, SCRIPT_TASK_VEHICLE_MISSION) <> WAITING_TO_START_TASK
IF ARE_NODES_LOADED_FOR_AREA(623.37811, -172.26003, 1700.73169, -2115.84277)
TASK_VEHICLE_DRIVE_TO_COORD(hBuddy, GET_VEHICLE_PED_IS_IN(hBuddy), vDropOffLoc, 20.0, DRIVINGSTYLE_NORMAL, DUMMY_MODEL_FOR_SCRIPT, DRIVINGMODE_AVOIDCARS|DF_UseStringPullingAtJunctions,2.0, 10.0)
ELSE
REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(623.37811, -172.26003, 1700.73169, -2115.84277)
#IF IS_DEBUG_BUILD
SK_PRINT("LOADING NODES")
#ENDIF
ENDIF
ENDIF
ELIF DOES_BUUDY_NEED_TO_CHASE_TRUCK(hBuddy)
IF IS_VEHICLE_OK(mGarbageTruck.id)
IF NOT IS_ENTITY_IN_RANGE_ENTITY(hBuddy, mGarbageTruck.id, 17)
IF GET_SCRIPT_TASK_STATUS(hBuddy, SCRIPT_TASK_VEHICLE_MISSION) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(hBuddy, SCRIPT_TASK_VEHICLE_MISSION) <> WAITING_TO_START_TASK
TASK_VEHICLE_MISSION(hBuddy, GET_VEHICLE_PED_IS_IN(hBuddy), mGarbageTruck.id, MISSION_BLOCK, 20, DRIVINGMODE_AVOIDCARS_RECKLESS, 2, 0.5)
ENDIF
ELSE
ENDIF
ENDIF
ELSE
RELEASE_BATTLEBUDDY(hBuddy)
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC RELEASE_BATTLE_BUDDIES()
// For each playable character...
enumCharacterList eChar
REPEAT MAX_BATTLE_BUDDIES eChar
PED_INDEX hBuddy = GET_BATTLEBUDDY_PED(eChar)
IF NOT IS_PED_INJURED(hBuddy)
IF IS_BATTLEBUDDY_OVERRIDDEN(hBuddy)
RELEASE_BATTLEBUDDY(hBuddy)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
// ===========================================================================================================
// Termination
// ===========================================================================================================
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Unloads all models
PROC UNLOAD_ALL_MODELS()
SET_MODEL_AS_NO_LONGER_NEEDED(mGarbageTruck.Mod)
ENDPROC
/// PURPOSE:
/// Unloads all waypoints
PROC UNLOAD_ALL_WAYPOINTS()
ENDPROC
/// PURPOSE:
/// Unloads all anims
PROC UNLOAD_ANIMS()
IF bLoadedTrashAssets
REMOVE_VEHICLE_ASSET(TRASH)
ENDIF
ENDPROC
/// PURPOSE:
/// Unload all vehicle recordings
PROC UNLOAD_ALL_CAR_RECS()
ENDPROC
/// PURPOSE:
/// Deletes any blips that are valid
PROC REMOVE_BLIPS()
SAFE_REMOVE_BLIP(biBlip)
ENDPROC
/// PURPOSE:
/// Standard delete all function used the wait for fail state
/// Safe deletes all peds, props and vehicles
PROC DELETE_ALL()
SAFE_DELETE_VEHICLE(mGarbageTruck.id)
SAFE_DELETE_VEHICLE(viAnyValidTruck)
SAFE_DELETE_VEHICLE(viStealCar)
SAFE_DELETE_PED(mGarbageTruckDriver.id)
SAFE_DELETE_PED(mGarbageTruckPassenger.id)
SAFE_DELETE_VEHICLE(viLastCar)
RELEASE_DELIVERY_ENTITIES()
ENDPROC
PROC RELEASE_ALL()
RELEASE_DELIVERY_ENTITIES()
SAFE_RELEASE_VEHICLE(mGarbageTruck.id)
SAFE_RELEASE_VEHICLE(viAnyValidTruck)
SAFE_RELEASE_VEHICLE(viStealCar)
SAFE_RELEASE_PED(mGarbageTruckDriver.id)
SAFE_RELEASE_PED(mGarbageTruckPassenger.id)
SAFE_RELEASE_VEHICLE(viLastCar)
ENDPROC
/// PURPOSE:
/// Deletes all mission entities and any other clean up
/// This is used to clear the mission when P or Z skipping
PROC CLEANUP(BOOL bDelAll = TRUE)
IF bDelAll
#IF IS_DEBUG_BUILD SK_PRINT("CLEANUP = DEL ALL") #ENDIF
ELSE
#IF IS_DEBUG_BUILD SK_PRINT("CLEANUP = RELEASE ") #ENDIF
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_SCENARIO_TYPE_ENABLED("DRIVE", TRUE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_ATTRACTOR", TRUE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_PASSENGERS", TRUE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", TRUE)
REMOVE_BLIPS()
UNLOAD_ALL_MODELS()
UNLOAD_ALL_WAYPOINTS()
UNLOAD_ANIMS()
UNLOAD_ALL_CAR_RECS()
RELEASE_BATTLE_BUDDIES()
IF bDelAll
IF DOES_ENTITY_EXIST(viStealCar)
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viStealCar)
VECTOR vPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) // get out of vehicle
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPos)
ENDIF
ENDIF
ENDIF
ENDIF
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
CLEAR_PRINTS()
DELETE_ALL()
ELSE
RELEASE_ALL()
ENDIF
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
IF DOES_CAM_EXIST(camMain)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
DESTROY_CAM(camMain)
ENDIF
ENDPROC
/// PURPOSE:
/// Cleans up mission entities, releases the entity to be cleaned up by population
/// and will give a suitable task to the peds before clean up
PROC Script_Cleanup()
// CLEAR_ADDITIONAL_TEXT(MISSION_DIALOGUE_TEXT_SLOT,TRUE)
SERVICES_TOGGLE(TRUE)
SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TRASH, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TOWTRUCK, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(S_M_Y_GARBAGE, FALSE)
SET_STATS_WATCH_OFF()
//RELEASE_PATH_NODES()
RESET_ALL_BATTLEBUDDY_BEHAVIOUR_REQUESTS()
OPEN_MASK_SHOP_ON_OTHER_PREP()
CLEANUP(FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
//***************************************
// :MISSION FLOW FUNC:
//***************************************
//PURPOSE: Advances or reverses the mission stage
PROC NEXT_STAGE( BOOL bReverse = FALSE)
MONITER_UNLOAD_ASSETS(eMissionState)
iMissionState = ENUM_TO_INT(eMissionState)
IF NOT bReverse
eMissionState = INT_TO_ENUM(MISSION_STATE, (iMissionState + 1))
ELSE
IF iMissionState > 0
eMissionState = INT_TO_ENUM(MISSION_STATE, (iMissionState - 1))
ENDIF
ENDIF
bObjectiveShown = FALSE
eState = SS_INIT
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Pass
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Pass function calls cleanup and termination
/// if the player debug passes this function warps him to the end
/// of the chasem, it will then complete
PROC Script_Passed()
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
Mission_Flow_Mission_Passed()
Script_Cleanup()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Fail
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Sets where the player will be warped to if they accept the replay
PROC SET_REPLAY_ACCEPTED_WARP_LOCATION()
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<918.8851, -269.7890, 67.2145>>, 325.9081)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<917.5291, -263.8595, 67.3489>>, 188.0605)
ENDPROC
/// PURPOSE:
/// Waits for the screen to fade out then updates failed reason
PROC FAILED_WAIT_FOR_FADE()
SWITCH eState
CASE SS_INIT
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_BLIPS()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX veh
veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(veh)
AND GET_ENTITY_MODEL(veh) = TOWTRUCK
SET_VEHICLE_AS_RESTRICTED(veh, 2)
ENDIF
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(sFailReason)
MISSION_FLOW_MISSION_FAILED_WITH_REASON(sFailReason)
ELSE
MISSION_FLOW_MISSION_FAILED()
ENDIF
eState = SS_ACTIVE
BREAK
CASE SS_ACTIVE
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
// Do a check here to see if we need to warp the player at all
// (only set the fail warp locations if we can't leave the player where he was)
//
IF HAS_PLAYER_ACCEPTED_REPLAY()
SET_REPLAY_ACCEPTED_WARP_LOCATION()
ENDIF
DELETE_ALL()
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 30, TRUE)
Script_Cleanup()
ELSE
// not finished fading out
// you may want to handle dialogue etc here.
ENDIF
BREAK
ENDSWITCH
ENDPROC
//------------------------------------------------------------------------------------
// MISSION STATES
//------------------------------------------------------------------------------------
/// PURPOSE:
/// Jumps the mission to a specific stage
/// PARAMS:
/// stage - The state to jump to
PROC JUMP_TO_STAGE(MISSION_STATE stage)
RC_START_Z_SKIP()
bJumpSkip = TRUE //Tells the mission stage setup function that we have just jumped and special setup is required
eMissionState = stage
IF eMissionState = MS_SET_UP
#IF IS_DEBUG_BUILD SK_PRINT("eMission state = MSS_SETUP GOING TO INTRO ") #ENDIF
eMissionState = MS_SET_UP
ENDIF
// bLoadingFinCutscene = FALSE
bObjectiveShown = FALSE
eState = SS_INIT
CLEANUP() //delete everything
ENDPROC
/// PURPOSE:
/// Fills an new MYPED
/// PARAMS:
/// pos - position the ped is spawned at
/// dir - the heading it faces
/// mod - the model used to create it
/// RETURNS:
/// a newly initialised MYPED
FUNC MYPED FILL_PED(VECTOR pos, FLOAT dir, MODEL_NAMES mod)
MYPED mTempPed
mTempPed.vPos = pos
mTempPed.fDir = dir
mTempPed.Mod = mod
RETURN mTempPed
ENDFUNC
/// PURPOSE:
/// Fills a new MYVEHICLE
/// PARAMS:
/// pos - the position the vehicle is spawned at
/// dir - the heading it faces
/// mod - the model used to create it
/// RETURNS:
/// A newly initialised MYVEHICLE
FUNC MYVEHICLE FILL_VEHICLE(VECTOR pos, FLOAT dir, MODEL_NAMES mod)
MYVEHICLE mTempVeh
mTempVeh.vPos = pos
mTempVeh.fDir = dir
mTempVeh.Mod = mod
RETURN mTempVeh
ENDFUNC
/// PURPOSE:
/// Adds points to a poly
/// PARAMS:
/// polys - The points to be added to the poly
/// count - the number of points to be added to the poly
PROC POPULATE_POLY_CHECKS(VECTOR &polys[], INT count = MAX_POLY_TEST_VERTS)
OPEN_TEST_POLY(mAreaCheck1)
INT i
FOR i = 0 TO (count-1)
ADD_TEST_POLY_VERT(mAreaCheck1, polys[i])
ENDFOR
CLOSE_TEST_POLY(mAreaCheck1)
COPY_EXPANDED_POLY(mAreaCheck2, mAreaCheck1, 50)
ENDPROC
/// PURPOSE:
/// Creates a poly check area using a local array
PROC CREATE_POLY_CHECKS()
VECTOR polys[6]
polys[0] = <<1251.3082, -400.6231, 68.0926>>
polys[1] = <<1183.9928, -403.3443, 66.8734>>
polys[2] = <<1161.5404, -372.6073, 66.6034>>
polys[3] = <<1167.6444, -273.7987, 67.9705>>
polys[4] = <<1252.3618, -247.3530, 77.5631>>
polys[5] = <<1330.0615, -341.0342, 100.3476>>
POPULATE_POLY_CHECKS(polys, 6)
ENDPROC
/// PURPOSE:
/// Fill in a new dialogue holder
/// PARAMS:
/// sConv - the coversation lable to store in this holder
/// iExpireBit - the bit that will be used to expire the conversation
/// RETURNS:
/// a newly initialised DIALOGUE_HOLDER
FUNC DIALOGUE_HOLDER FILL_DIALOGUE(STRING sConv1, STRING sConv2, STRING sConv3, STRING sConvFM, STRING sConvFT, STRING sConvTM)
DIALOGUE_HOLDER TempDial
TempDial.sConv[BBCT_WANTED] = sConv1
TempDial.sConv[BBCT_LOSTWANTED] = sConv2
TempDial.sConv[BBCT_THERE] = sConv3
TempDial.sConv[BBCT_CHATFM] = sConvFM
TempDial.sConv[BBCT_CHATFT] = sConvFT
TempDial.sConv[BBCT_CHATTM] = sConvTM
RETURN TempDial
ENDFUNC
PROC POPULATE_VEHICLES()
mGarbageTruck = FILL_VEHICLE(<<1203.1462, -337.3543, 67.9314>>, 189.7047, TRASH)//
ENDPROC
PROC POPULATE_PEDS()
mGarbageTruckDriver = FILL_PED(<<1200.6096, -344.2721, 68.0424>>, 269.2015, S_M_Y_GARBAGE)
mGarbageTruckPassenger = FILL_PED(<<1202.4204, -341.6034, 67.9378>>, 273.1125, S_M_Y_GARBAGE)
ENDPROC
PROC POPULATE_DELIVERY_POINTS()
mDeliveryPoint[0] = FILL_DELIVERY_POINT_DEST_PED(<<1203.1462, -337.3543, 67.9314>>,<<1245.1176, -348.5059, 68.2099>>, 253.1908, DUMMY_MODEL_FOR_SCRIPT)
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[0], vSafeVec, FALSE, 15, 5, 270, PARK_TYPE_PULL_OVER, <<1192.0063, -631.4703, 61.6972>>, <<10,10, 5>>)
mDeliveryPoint[1] = FILL_DELIVERY_POINT_DEST_PED(<<1215.0840, -339.3139, 68.1323>>, <<964.9214, -555.2120, 58.0211>>, 39.6450, DUMMY_MODEL_FOR_SCRIPT)
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[1], vSafeVec, FALSE, 15, 10, 270, PARK_TYPE_PULL_OVER, <<1103.2896, -764.5320, 56.6330>>, <<10,10, 5>>)
mDeliveryPoint[2] = FILL_DELIVERY_POINT_DEST_PED( <<1179.5330, -361.3286, 67.4559>>, <<929.8701, -619.4534, 56.4632>>, 164.3631, DUMMY_MODEL_FOR_SCRIPT)
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[2], vSafeVec, FALSE, 15, 10, 270, PARK_TYPE_PULL_OVER, <<933.3745, -615.9453, 56.3041>>, <<10,10, 5>>)
mDeliveryPoint[3] = FILL_DELIVERY_POINT_DEST_PED(<<1107.6744, -364.0569, 65.9581>>, <<1099.2655, -775.0809, 57.3525>>, 178.2038, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[3], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1062.1489, -479.4801, 62.9454>>, <<10,10, 5>>)
mDeliveryPoint[4] = FILL_DELIVERY_POINT_DEST_PED(<<1069.2791, -393.5795, 66.0262>>, <<1065.3644, -389.9561, 66.1504>>, 220.1611, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[4], vSafeVec, FALSE, 5, 30, 128.1732, PARK_TYPE_PULL_OVER, <<1069.7177, -393.9912, 66.0261>>, <<10,10, 5>>)
mDeliveryPoint[5] = FILL_DELIVERY_POINT_DEST_PED(<<1031.6730, -424.5990, 64.5439>>, <<1027.1793, -420.6656, 64.6268>>, 178.2038, P_BINBAG_01_S )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[5], <<1028.2009, -428.3677, 64.3571>>, TRUE, 15, 2, 128.3915, PARK_TYPE_PERPENDICULAR_NOSE_IN, <<1027.1793, -420.6656, 64.6268>>, <<10,10, 5>>)
mDeliveryPoint[6] = FILL_DELIVERY_POINT_DEST_PED(<<942.1528, -488.8956, 59.3129>>, <<932.0198, -489.3886, 58.9212>>, 202.5785, P_BINBAG_01_S )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[6], <<930.7186, -494.9253, 58.6160>>, TRUE, 15, 2, 119.6518, PARK_TYPE_PERPENDICULAR_NOSE_IN, <<952.9781, -482.5082, 60.0003>>, <<10,10, 5>>)
mDeliveryPoint[7] = FILL_DELIVERY_POINT_DEST_PED(<<868.2734, -529.5473, 56.2071>>, <<865.0042, -522.4746, 56.3363>>, 241.9711, P_BINBAG_01_S)
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[7], <<865.2349, -535.8759, 56.1574>>, TRUE, 15, 2, 162.7219, PARK_TYPE_PERPENDICULAR_NOSE_IN, <<1062.1489, -479.4801, 62.9454>>, <<10,10, 5>>)
mDeliveryPoint[8] = FILL_DELIVERY_POINT_DEST_PED(<<874.8076, -571.2073, 56.2987>>, <<983.1250, -541.9902, 58.5929>>, 49.7653, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[8], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1062.1489, -479.4801, 62.9454>>, <<10,10, 5>>)
mDeliveryPoint[9] = FILL_DELIVERY_POINT_DEST_PED(<<931.5218, -614.2144, 56.3119>>, <<928.6471, -620.7110, 56.4611>>, -108.06, P_BINBAG_01_S )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[9], <<940.4086, -622.1787, 56.3003>>, TRUE, 15, 2, 228.1176, PARK_TYPE_PERPENDICULAR_NOSE_IN, <<918.6716, -602.9258, 56.3395>>, <<10,10, 5>>)
mDeliveryPoint[10] = FILL_DELIVERY_POINT_DEST_PED(<<964.9758, -645.9614, 56.4465>>, <<927.1033, -575.4162, 56.5329>>, 55.9317, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[10], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1062.1489, -479.4801, 62.9454>>, <<10,10, 5>>)
mDeliveryPoint[11] = FILL_DELIVERY_POINT_DEST_PED(<<983.4438, -683.1442, 56.4087>>, <<929.3757, -618.9091, 56.4612>>, 181.1844, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[11], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1149.1356, -981.2310, 45.0495>>, <<10,10, 5>>)
mDeliveryPoint[12] = FILL_DELIVERY_POINT_DEST_PED(<<1016.2606, -731.5460, 56.5550>>, <<1011.8010, -733.0652, 56.7435>>, 314.5626, P_BINBAG_01_S )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[12], <<1020.2507, -736.8150, 56.6235>>, TRUE, 15, 2, 220.7804, PARK_TYPE_PERPENDICULAR_NOSE_IN, <<1011.2380, -724.7085, 56.5183>>, <<10,10, 5>>)
mDeliveryPoint[13] = FILL_DELIVERY_POINT_DEST_PED(<<1164.1262, -762.2866, 56.6656>>, <<1099.3422, -775.4273, 57.3525>>, 177.5729, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[13], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1149.1356, -981.2310, 45.0495>>, <<10,10, 5>>)
mDeliveryPoint[14] = FILL_DELIVERY_POINT_DEST_PED(<<1199.3394, -678.0995, 59.9051>>, <<1205.4152, -672.1282, 60.1445>>, 105.2374, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[14], vSafeVec, FALSE, 15, 2, 12.1103, PARK_TYPE_PULL_OVER, <<1199.3394, -678.0995, 59.9051>>, <<10,10, 5>>)
mDeliveryPoint[15] = FILL_DELIVERY_POINT_DEST_PED(<<1183.4449, -582.9476, 63.0962>>, <<929.3757, -618.9091, 56.4612>>, 181.1844, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[15], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1149.1356, -981.2310, 45.0495>>, <<10,10, 5>>)
mDeliveryPoint[16] = FILL_DELIVERY_POINT_DEST_PED(<<1192.4794, -485.1086, 64.7195>>, <<1264.3593, -719.0840, 63.3280>>, 65.0519, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[16], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1149.1356, -981.2310, 45.0495>>, <<10,10, 5>>)
mDeliveryPoint[17] = FILL_DELIVERY_POINT_DEST_PED(<<1212.6934, -400.0532, 67.0971>>, <<1284.1086, -676.7280, 65.0225>>, 69.9898, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[17], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1149.1356, -981.2310, 45.0495>>, <<10,10, 5>>)
mDeliveryPoint[18] = FILL_DELIVERY_POINT_DEST_PED(<<1114.5735, -232.3706, 68.0949>>, <<929.3757, -618.9091, 56.4612>>, 181.1844, DUMMY_MODEL_FOR_SCRIPT )
FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[18], vSafeVec, FALSE, 15, 2, 270, PARK_TYPE_PULL_OVER, <<1149.1356, -981.2310, 45.0495>>, <<10,10, 5>>)
// mDeliveryPoint[19] = FILL_DELIVERY_POINT_DEST_PED(<<1281.5195, -498.2445, 67.9411>>, <<1264.4473, -499.2488, 68.1254>>, 70.1427, PROP_BIG_BAG_01 )
// FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[19], FALSE, 10, 2, 270, PARK_TYPE_PULL_OVER, <<1149.1356, -981.2310, 45.0495>>, <<10,10, 5>>)
//
// mDeliveryPoint[20] = FILL_DELIVERY_POINT_DEST_PED(<<1263.4022, -392.0704, 68.0014>>, <<929.3757, -618.9091, 56.4612>>, 181.1844, DUMMY_MODEL_FOR_SCRIPT )
// FILL_DELIVERY_POINT_PARKING(mDeliveryPoint[20], FALSE, 10, 2, 270, PARK_TYPE_PULL_OVER, <<1149.1356, -981.2310, 45.0495>>, <<10,10, 5>>)
iTotalDelPoints = 19
ENDPROC
PROC POPULATE_BATTLE_BUDDY_DIALOGUE()
bAddBuddyForDialogue[0] = FALSE
bAddBuddyForDialogue[1] = FALSE
bAddBuddyForDialogue[2] = FALSE
mBBChatter[0] = FILL_DIALOGUE("FP1_WANTM","FP1_LOSTM", "FP1_THEREM", "FP1_CHATFM", "", "FP1_CHATTM")
mBBChatter[1] = FILL_DIALOGUE("FP1_WANTT","FP1_LOSTT", "FP1_THERET", "FP1_CHATFM", "FP1_CHATFT", "")
mBBChatter[2] = FILL_DIALOGUE("FP1_WANTF","FP1_LOSTF", "FP1_THEREF", "", "FP1_CHATFT", "FP1_CHATTM")
ENDPROC
/// PURPOSE:
/// Initialises all variables and structs
PROC POPULATE_STUFF()
POPULATE_VEHICLES()
POPULATE_PEDS()
CREATE_POLY_CHECKS()
POPULATE_DELIVERY_POINTS()
POPULATE_BATTLE_BUDDY_DIALOGUE()
ENDPROC
/// PURPOSE:
/// Sets the Game world time after a replay/shit skip
PROC SET_TIME_FOR_REPLAY()
IF g_bShitskipAccepted
ELSE
ENDIF
ENDPROC
PROC CREATE_RELATIONSHIP_GROUP()
ENDPROC
///PURPOSE:
/// Initiate the mission and load the things needed
/// for the immediate gameplay
/// The skip menu is initialsed here
/// And if a replay is being done then we init and load assests for the check point
PROC INITMISSION()
SWITCH eState
CASE SS_INIT
//DO_SCREEN_FADE_OUT(0)
#IF IS_DEBUG_BUILD
IF bShowDebugText
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE (TRUE)
ENDIF
#ENDIF
#IF IS_DEBUG_BUILD SK_PRINT("INIT MISSION - THIS WILL LOOP") #ENDIF
IF SETUP_MISSION_STAGE(eMissionState)
#IF IS_DEBUG_BUILD
s_skip_menu[0].sTxtLabel = "MS_GET_TO_VAN"
s_skip_menu[1].sTxtLabel = "MS_STEAL"
s_skip_menu[2].sTxtLabel = "MS_RETURN_WITH_THING"
#ENDIF
MARK_PREP_START_CAR_AS_VEH_GEN()
INIT_BATTLEBUDDY_BEHAVIOUR_FOR_MISSION(SP_MISSION_FBI_4_PREP_1)
// ADD_RELATIONSHIP_GROUP("MYFRIEND", HASH_FRIENDS)
SET_MAX_WANTED_LEVEL(2)
SET_WANTED_LEVEL_MULTIPLIER(0.1)
// #IF IS_DEBUG_BUILD
// BREAK_ON_NATIVE_COMMAND("ENABLE_DISPATCH_SERVICE", FALSE)
// #ENDIF
IF IS_REPLAY_IN_PROGRESS()
END_REPLAY_SETUP()
SAFE_FADE_SCREEN_IN_FROM_BLACK()
eState = SS_CLEANUP
ELSE
IF IS_REPEAT_PLAY_ACTIVE()
SET_PED_POS(PLAYER_PED_ID(), <<1228.6351, -348.4277, 68.0929>>, 86.7244)
WAIT_FOR_WORLD_TO_LOAD(<<1228.6351, -348.4277, 68.0929>>)
SAFE_FADE_SCREEN_IN_FROM_BLACK()
ENDIF
CREATE_RELATIONSHIP_GROUP()
IF eMissionState = MS_RETURN_WITH_THING
eState = SS_INIT
ELSE
eState = SS_CLEANUP
ENDIF
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP INIT MISSION") #ENDIF
NEXT_STAGE()
BREAK
ENDSWITCH
ENDPROC
PROC CREATE_CUSTOM_GPS_BLIP()
IF NOT DOES_BLIP_EXIST(biBlip)
START_GPS_MULTI_ROUTE(HUD_COLOUR_BLUE, TRUE)
// ADD_POINT_TO_GPS_CUSTOM_ROUTE( GET_ENTITY_COORDS(PLAYER_PED_ID()) )
ADD_POINT_TO_GPS_CUSTOM_ROUTE( mGarbageTruck.vPos ) //END
SET_GPS_MULTI_ROUTE_RENDER(TRUE)
ADD_SAFE_BLIP_TO_VEHICLE(biBlip, mGarbageTruck.id, TRUE)
ENDIF
ENDPROC
PROC MONITOR_GARBAGE_TRUCK_ASSETS()
IF IS_VEHICLE_OK(mGarbageTruck.id)
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mGarbageTruck.id, 100)
AND NOT bLoadedTrashAssets
REQUEST_VEHICLE_ASSET(TRASH)
IF NOT HAS_VEHICLE_ASSET_LOADED(TRASH)
bLoadedTrashAssets = TRUE
ENDIF
ELIF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mGarbageTruck.id, 120)
AND bLoadedTrashAssets
REMOVE_VEHICLE_ASSET(TRASH)
bLoadedTrashAssets = FALSE
ENDIF
ENDIF
ENDPROC
PROC DO_JACKED_CONV()
STRING conv
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
conv = "FBI4_JACKSM"
BREAK
CASE CHAR_FRANKLIN
conv = "FBI4_JACKSF"
BREAK
CASE CHAR_TREVOR
conv = "FBI4_JACKST"
BREAK
ENDSWITCH
bJackedConv = CREATE_CONVERSATION(s_conversation_peds, "FBIPRAU", conv, CONV_PRIORITY_MEDIUM)
IF bJackedConv
REPLAY_RECORD_BACK_FOR_TIME(8.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ENDPROC
PROC STEAL()
MONITOR_IN_STEAL_CAR(viStealCar, viAnyValidTruck, eStealCarState, biVehicleBlip, biBlip, vDropOffLoc, mGarbageTruck.id)
MONITOR_GARBAGE_TRUCK_ASSETS()
UPDATE_ROUTE_MANAGER()
SWITCH eState
CASE SS_INIT
IF SETUP_MISSION_STAGE(eMissionState, bJumpSkip)
#IF IS_DEBUG_BUILD SK_PRINT("INIT STEAL_VAN") #ENDIF
ADD_SAFE_BLIP_TO_VEHICLE(biBlip, mGarbageTruck.id, TRUE)
PRINT_OBJ("PRA_GOVAN", bObjectiveShown)
eState = SS_ACTIVE
ENDIF
BREAK
CASE SS_ACTIVE
MONITOR_BATTLE_BUDDIES()
IF IS_VEHICLE_OK(mGarbageTruck.id)
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, mGarbageTruck.id )
ENDIF
IF NOT bJackedConv
IF IS_PED_UNINJURED(mGarbageTruckDriver.id)
AND IS_PED_BEING_JACKED(mGarbageTruckDriver.id)
DO_JACKED_CONV()
ENDIF
IF IS_PED_UNINJURED(mGarbageTruckPassenger.id)
AND IS_PED_BEING_JACKED(mGarbageTruckPassenger.id)
DO_JACKED_CONV()
ENDIF
ENDIF
IF IS_VEHICLE_OK(viStealCar)
IF eStealCarState = ISCM_IN_VEHICLE
OR eStealCarState = ISCM_IN_ANY_VEHICLE
OR eStealCarState = ISCM_IS_TOWING_VEHICLE
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
eState = SS_CLEANUP
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP STEAL_VAN") #ENDIF
SAFE_REMOVE_BLIP(biBlip)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
NEXT_STAGE()
BREAK
CASE SS_SKIPPED
SAFE_DELETE_PED(mGarbageTruckDriver.id)
SAFE_DELETE_PED(mGarbageTruckPassenger.id)
IF IS_VEHICLE_OK(mGarbageTruck.id)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), mGarbageTruck.id)
ENDIF
SERVICES_TOGGLE(TRUE)
RC_END_Z_SKIP()
eState = SS_ACTIVE
BREAK
ENDSWITCH
ENDPROC
PROC MONITOR_END_MISSION_VEH()
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vDropOffLoc, 220)
IF NOT bSpawnedEndMissionVeh
AND NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vDropOffLoc, 100)
bSpawnedEndMissionVeh = SPAWN_VEHICLE(viLastCar, CAVALCADE2, <<1370.9122, -2060.0549, 50.9983>>, 312.8686)
ENDIF
ELIF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vDropOffLoc, 240)
IF bSpawnedEndMissionVeh
SAFE_RELEASE_VEHICLE(viLastCar)
bSpawnedEndMissionVeh= FALSE
ENDIF
ENDIF
ENDPROC
PROC RETURN_THING()
MONITOR_IN_STEAL_CAR(viStealCar, viAnyValidTruck, eStealCarState, biVehicleBlip, biBlip, vDropOffLoc, mGarbageTruck.id)
UPDATE_ROUTE_MANAGER()
MONITOR_END_MISSION_VEH()
MONITOR_GARBAGE_TRUCK_ASSETS()
SWITCH eState
CASE SS_INIT
IF SETUP_MISSION_STAGE(eMissionState, bJumpSkip)
#IF IS_DEBUG_BUILD SK_PRINT("INIT TAKE_VAN_BACK") #ENDIF
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
ADD_BLIP_LOCATION(biBlip, vDropOffLoc)
PRINT_OBJ("PRA_TAKBACK", bObjectiveShown)
ENDIF
eState = SS_ACTIVE
ENDIF
BREAK
CASE SS_ACTIVE
MONITER_PLAYER_WANTED(biBlip, vDropOffLoc, eCopMonitor, eStealCarState, bObjectiveShown, bExpireReturnVehWanted)
MONITOR_BATTLE_BUDDIES()
IF RETURN_STOLEN_VEHICLE(viStealCar, vDropOffLoc, biBlip, eCopMonitor, eStealCarState, bObjectiveShown, bExpireReturnVeh)
REPLAY_RECORD_BACK_FOR_TIME(8.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
eState = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP TAKE_VAN_BACK") #ENDIF
RELEASE_BATTLE_BUDDIES()
SAFE_REMOVE_BLIP(biBlip)
SAFE_REMOVE_BLIP(biVehicleBlip)
IF STOP_MY_VEHICLE()
NEXT_STAGE()
ENDIF
BREAK
CASE SS_SKIPPED
IF IS_VEHICLE_OK(viStealCar)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viStealCar)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), viStealCar)
ELSE
SAFE_TELEPORT_ENTITY(viStealCar, vDropOffLoc, 146.5443)
RC_END_Z_SKIP()
eState = SS_ACTIVE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC LEAVE_VEHICLE()
MONITOR_IN_STEAL_CAR(viStealCar, viAnyValidTruck, eStealCarState, biVehicleBlip, biBlip, vDropOffLoc, mGarbageTruck.id)
MONITOR_GARBAGE_TRUCK_ASSETS()
UPDATE_ROUTE_MANAGER()
SWITCH eState
CASE SS_INIT
IF SETUP_MISSION_STAGE(eMissionState, bJumpSkip)
#IF IS_DEBUG_BUILD SK_PRINT("INIT LEAVE_RING_LESTER") #ENDIF
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
IF IS_VEHICLE_OK(viStealCar)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viStealCar)
PRINT_OBJ("PRA_LEVVEH", bObjectiveShown)
ENDIF
ENDIF
ENDIF
eState = SS_ACTIVE
ENDIF
BREAK
CASE SS_ACTIVE
MONITER_PLAYER_WANTED(biBlip, vDropOffLoc, eCopMonitor, eStealCarState, bObjectiveShown, bExpireReturnVehWanted)
IF LEAVE_VEHICLE_STEAL(viStealCar, vDropOffLoc, biBlip, eStealCarState, eCopMonitor, bForceStop, bExpireReturnVeh, iCallTimerDelay, bCallTimer, bObjectiveShown)
IF NOT IS_FIB4_AVAILABLE_AFTER_PASSED()
IF UPDATE_PHONE_STATES(ePhoneCallState, sPhoneUpdateString, s_conversation_peds)
SET_STATS_WATCH_OFF()
Script_Passed()
ENDIF
ELSE
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MISSION_FBI_4_UNLOCKED_FROM_PREP, TRUE)
SET_STATS_WATCH_OFF()
NEXT_STAGE()
ENDIF
ENDIF
BREAK
CASE SS_SKIPPED
IF IS_VEHICLE_OK(mGarbageTruck.id)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), mGarbageTruck.id)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), mGarbageTruck.id)
ELSE
SAFE_TELEPORT_ENTITY(mGarbageTruck.id, vDropOffLoc, 126.0705)
RC_END_Z_SKIP()
eState = SS_ACTIVE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC CC_CommID GET_CHAR_END_MISSION_CONV(enumCharacterList ePlayer)
IF ePlayer = CHAR_FRANKLIN
RETURN CALL_FIB4_P1_F_DONE
ENDIF
RETURN CALL_FIB4_P1_T_DONE
ENDFUNC
FUNC enumCharacterList GET_WHO_TO_PHONE(enumCharacterList ePlayer)
IF ePlayer = CHAR_FRANKLIN
RETURN CHAR_MIKE_TREV_CONF
ENDIF
RETURN CHAR_MIKE_FRANK_CONF
ENDFUNC
PROC LEAVE_AREA()
SWITCH eState
CASE SS_INIT
#IF IS_DEBUG_BUILD SK_PRINT("INIT LEAVE_AREA") #ENDIF
eState = SS_ACTIVE
BREAK
CASE SS_ACTIVE
IF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vDropOffLoc, 270)
eState = SS_CLEANUP
ELSE
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("PRA_LEVAREA")
PRINT_NOW("PRA_LEVAREA", 60000, 0)
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP LEAVE_AREA") #ENDIF
enumCharacterList ePlayer
ePlayer = GET_CURRENT_PLAYER_PED_ENUM()
IF IS_THIS_PRINT_BEING_DISPLAYED("PRA_LEVAREA")
CLEAR_PRINTS()
ENDIF
IF ePlayer = CHAR_MICHAEL
IF UPDATE_PHONE_STATES(ePhoneCallState, sPhoneUpdateString, s_conversation_peds)
SET_STATS_WATCH_OFF()
Script_Passed()
ENDIF
ELSE
REGISTER_BRANCHED_CALL_FROM_PLAYER_TO_CHARACTER(GET_CHAR_END_MISSION_CONV(ePlayer), CALL_FIB4_GO_TIME, CALL_FIB4_GO_TIME, FLOW_CHECK_FBI4_PREP3, CT_END_OF_MISSION, ePlayer, GET_WHO_TO_PHONE(ePlayer), 0, CC_END_OF_MISSION_QUEUE_TIME, CC_END_OF_MISSION_QUEUE_TIME)
SET_STATS_WATCH_OFF()
Script_Passed()
ENDIF
BREAK
CASE SS_SKIPPED
RC_END_Z_SKIP()
eState = SS_CLEANUP
BREAK
ENDSWITCH
ENDPROC
///DEBUG KEYS
#IF IS_DEBUG_BUILD
/// PURPOSE: Check for Forced Pass or Fail
PROC DEBUG_Check_Debug_Keys()
// Check for Pass
IF eState = SS_ACTIVE
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
KILL_ANY_CONVERSATION()
CLEAR_PRINTS()
WAIT_FOR_CUTSCENE_TO_STOP()
Script_Passed()
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
KILL_ANY_CONVERSATION()
CLEAR_PRINTS()
WAIT_FOR_CUTSCENE_TO_STOP()
MISSION_FAILED(FR_NONE)
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
KILL_ANY_CONVERSATION()
CLEAR_PRINTS()
WAIT_FOR_CUTSCENE_TO_STOP()
RC_START_Z_SKIP()
eState = SS_SKIPPED
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
AND eMissionState <> MS_SET_UP
//Work out which stage we want to reach based on the current stage
iMissionState = ENUM_TO_INT(eMissionState)
IF iMissionState > 0
MISSION_STATE e_stage = INT_TO_ENUM(MISSION_STATE, iMissionState - 1)
JUMP_TO_STAGE(e_stage)
ENDIF
ENDIF
IF LAUNCH_MISSION_STAGE_MENU(s_skip_menu, i_debug_jump_stage)
#IF IS_DEBUG_BUILD SK_PRINT_INT("Z DEBUG Initial pick = ", i_debug_jump_stage) #ENDIF
SWITCH i_debug_jump_stage
CASE 0 //MS_STEAL
i_debug_jump_stage++
BREAK
CASE 1 //MS_RETURN_WITH_THING
i_debug_jump_stage++
BREAK
ENDSWITCH
SK_PRINT_INT("Z DEBUG ACTUAL STATE = ", i_debug_jump_stage)
MISSION_STATE e_stage = INT_TO_ENUM(MISSION_STATE, i_debug_jump_stage)
JUMP_TO_STAGE(e_stage)
ENDIF
ENDIF
ENDPROC
#ENDIF
PROC MONITER_STEAL_CAR()
FLOAT fFailOutofRange = 600.0
IF NOT IS_VEHICLE_OK(viStealCar)
IF NOT IS_VEHICLE_OK(viAnyValidTruck)
AND NOT IS_VEHICLE_OK(mGarbageTruck.id)
MISSION_FAILED(FR_WRECKED_STEAL_CAR)
EXIT
ENDIF
IF IS_VEHICLE_OK(mGarbageTruck.id)
AND NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mGarbageTruck.id, fFailOutofRange)
MISSION_FAILED(FR_ABAN_CAR)
ENDIF
ELSE
INT iCountOutOfRange = 0
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), viStealCar, fFailOutofRange)
iCountOutOfRange++
#IF IS_DEBUG_BUILD SK_PRINT_INT("Player out of range of the steal car out of range count = ", iCountOutOfRange) #ENDIF
ENDIF
IF IS_VEHICLE_OK(viAnyValidTruck)
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), viAnyValidTruck, fFailOutofRange)
#IF IS_DEBUG_BUILD SK_PRINT_INT("Player out of range of the the other garbage truck out of range count = ", iCountOutOfRange) #ENDIF
iCountOutOfRange++
ENDIF
ELSE
iCountOutOfRange++
// #IF IS_DEBUG_BUILD SK_PRINT_INT("other garbage truck doesnt exist out of range count = ", iCountOutOfRange) #ENDIF
ENDIF
IF IS_VEHICLE_OK(mGarbageTruck.id)
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), mGarbageTruck.id, fFailOutofRange)
#IF IS_DEBUG_BUILD SK_PRINT_INT("Player out of range of the garbage truck out of range count = ", iCountOutOfRange) #ENDIF
iCountOutOfRange++
ENDIF
ELSE
iCountOutOfRange++
#IF IS_DEBUG_BUILD SK_PRINT_INT("garbage truck doesnt exits out of range count = ", iCountOutOfRange) #ENDIF
ENDIF
IF iCountOutOfRange >= 3
MISSION_FAILED(FR_ABAN_CAR)
EXIT
ENDIF
iCountOutOfRange = 0
IF IS_CAR_STUCK(viStealCar)
#IF IS_DEBUG_BUILD SK_PRINT_INT("vehicle stuck viStealCar = ", iCountOutOfRange) #ENDIF
iCountOutOfRange++
ENDIF
IF IS_VEHICLE_OK(viAnyValidTruck)
IF IS_CAR_STUCK(viAnyValidTruck)
#IF IS_DEBUG_BUILD SK_PRINT_INT("vehicle stuck viAnyValidTruck = ", iCountOutOfRange) #ENDIF
iCountOutOfRange++
ENDIF
ELSE
iCountOutOfRange++
ENDIF
IF IS_VEHICLE_OK(mGarbageTruck.id)
IF IS_CAR_STUCK(mGarbageTruck.id)
#IF IS_DEBUG_BUILD SK_PRINT_INT("vehicle stuck mGarbageTruck = " , iCountOutOfRange) #ENDIF
iCountOutOfRange++
ENDIF
ELSE
iCountOutOfRange++
ENDIF
IF iCountOutOfRange >= 3
#IF IS_DEBUG_BUILD SK_PRINT_INT("vehicle stuck All ", iCountOutOfRange) #ENDIF
MISSION_FAILED(FR_STUCK_CAR)
EXIT
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Holds functions that moniter for the player failing
PROC CHECK_FOR_FAIL()
IF NOT bJumpSkip
AND eMissionState <> MS_FAILED
IF eMissionState > MS_SET_UP
MONITER_STEAL_CAR()
ENDIF
ENDIF
ENDPROC
SCRIPT
SET_MISSION_FLAG(TRUE)
// Setup callback when player is killed, arrested or goes to multiplayer
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU))
PRINTSTRING("FORCE CLEAN UP") PRINTNL()
sFailReason = NULL
Mission_Flow_Mission_Force_Cleanup()
Script_Cleanup()
ENDIF
#IF IS_DEBUG_BUILD
SETUP_FOR_RAGE_WIDGETS()
#ENDIF
POPULATE_STUFF()
IF IS_REPLAY_IN_PROGRESS()
START_REPLAY_SETUP(<<918.8851, -269.7890, 67.2145>>, 68.2149)
ENDIF
CLOSE_MASK_SHOP_ON_OTHER_PREP()
// Loop within here until the mission passes or fails
WHILE(TRUE)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_TrT")
IF IS_PED_UNINJURED(PLAYER_PED_ID())
CHECK_FOR_FAIL()
MONITER_STATS()
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.8)
SWITCH eMissionState
CASE MS_SET_UP
INITMISSION()
BREAK
// CASE MS_GET_TO_STEAL_THING
// GET_TO_STEAL_THING()
// BREAK
CASE MS_STEAL
STEAL()
BREAK
CASE MS_RETURN_WITH_THING
RETURN_THING()
BREAK
CASE MS_LEAVE_VEHICLE
LEAVE_VEHICLE()
BREAK
CASE MS_LEAVE_AREA
LEAVE_AREA()
BREAK
CASE MS_FAILED
FAILED_WAIT_FOR_FADE()
BREAK
ENDSWITCH
IF eMissionState <> MS_FAILED
IF eMissionState >= MS_SET_UP
AND NOT bJumpSkip
ENDIF
#IF IS_DEBUG_BUILD
// Check debug completion/failure
DEBUG_Check_Debug_Keys()
UPDATE_RAG_WIDGETS()
#ENDIF
ENDIF
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT