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

1089 lines
30 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"
USING "RC_Area_public.sch"
USING "RC_helper_functions.sch"
USING "RC_threat_public.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
CONST_INT MAX_INVALIDMODS 2
/// --------------------------------------------------
/// ENUMS
/// -------------------------------------------
/// PURPOSE: Mission states
ENUM MISSION_STATE
MS_SET_UP = 0, //0
// MS_LEAVE, //1
// MS_GET_PETROL, //2
MS_LEAVE_AREA, //3
MS_FAILED //5
ENDENUM
/// PURPOSE:
/// Internal state machine states for mission state
ENUM STAGE_STATES
SS_INIT,
SS_ACTIVE,
SS_CLEANUP,
SS_SKIPPED
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
//*****************************************************************************
// :STRUCTS:
//*****************************************************************************
//****************************************************************************************************
// : MISSION FLOW VARIABLES :
//****************************************************************************************************
//mission flow
INT iMissionState = 0 //Used in skips and checkpoints
BOOL bJumpSkip = FALSE //flag for if current MISSION state should clean up and move to the next state
//GOD TEXT
BOOL bObjectiveShown = FALSE
///MISSION PED VARS SCRIPT AI
INT iMissTimer = 0 //Generic timer
BOOL bScriptCleanedupCar = FALSE
VEHICLE_SETUP_STRUCT mChosenCarSetup
BLIP_INDEX biBlip
///==============| GOD TEXT BOOLS |============
BOOL bGunShopHelp = FALSE
///===============| models |===================
/// ===============| START VECTORS |==============
VECTOR vStartPos
/// ==============| START HEADINGS |===============
FLOAT fHeading
/// ==============| PED INDICES |================
/// ==============| VEHICLE INDICES |===========
//VEHICLE_INDEX viChosenCar
/// ===============| GROUPS |========================
/// ===============| DIALOGUE |======================
STRING sTextBlock = "FBIPRAU"
//Used for tracking an interupted conversation
/// PURPOSE:
/// Resets all variables used in flow
PROC RESET_ALL()
ENDPROC
///
///
/// DEBUG ONLY MISSION STUFF ------------------------------------------------------------
///
///
#IF IS_DEBUG_BUILD
BOOL bShowDebugText = TRUE
WIDGET_GROUP_ID widgetGroup
BOOL bForceFail = FALSE
/// PURPOSE:
/// Prints a string to a TTY Channel
/// PARAMS:
/// s - The string to print
/// ddc - The debug channel to print to
PROC SK_PRINT(String s, DEBUG_CHANNELS ddc = DEBUG_MISSION)
IF bShowDebugText
CPRINTLN(ddc, s)
PRINTNL()
PRINTNL()
ENDIF
ENDPROC
/// PURPOSE:
/// Prints a string and an int to a TTY Channel
/// PARAMS:
/// s - The string to print
/// i - the int to print
/// ddc - the debug channel to print to
PROC SK_PRINT_INT(String s, INT i, DEBUG_CHANNELS ddc = DEBUG_MISSION)
IF bShowDebugText
CPRINTLN(ddc, s,i)
PRINTNL()
PRINTNL()
ENDIF
ENDPROC
/// PURPOSE:
/// Prints a string and a Float to a TTY Channel
/// PARAMS:
/// s - the string to print
/// f - the float to print
/// ddc - the debug channel
PROC SK_PRINT_FLOAT(String s, FLOAT f, DEBUG_CHANNELS ddc = DEBUG_MISSION)
IF bShowDebugText
CPRINTLN(ddc, s,f)
PRINTNL()
PRINTNL()
ENDIF
ENDPROC
/// 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:
/// Prints objective to the screen if the objective hasnt already been printed
/// Checks and expired bObjectiveShown
/// PARAMS:
/// objstr - The text key to print
PROC PRINT_OBJ(String objstr)
IF NOT bObjectiveShown
PRINT_NOW(objstr, DEFAULT_GOD_TEXT_TIME,0)
bObjectiveShown = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Requests a model and waits for it to load
/// PARAMS:
/// _modname - The name of the model to load
/// _debugstring - used to debug
/// i - used to debug
/// RETURNS:
/// TRUE when the model is loaded
FUNC BOOL REQUEST_AND_CHECK_MODEL(MODEL_NAMES _modname, STRING _debugstring, INT i = 0)
REQUEST_MODEL(_modname)
IF NOT Is_String_Null_Or_Empty(_debugstring)
AND i <> -1
#IF IS_DEBUG_BUILD
SK_PRINT_INT(_debugstring, i)
#ENDIF
ENDIF
IF HAS_MODEL_LOADED(_modname)
#IF IS_DEBUG_BUILD
SK_PRINT("MODEL LOADED")
#ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Unloads a model - Sets it as no longer needed
/// PARAMS:
/// _modname - The model to unload
PROC UNLOAD_MODEL(MODEL_NAMES _modname, BOOL bCheckLoaded = TRUE)
IF bCheckLoaded
IF HAS_MODEL_LOADED(_modname)
SET_MODEL_AS_NO_LONGER_NEEDED(_modname)
ENDIF
ELSE
SET_MODEL_AS_NO_LONGER_NEEDED(_modname)
ENDIF
ENDPROC
/// PURPOSE:
/// Spawns a vehicle and returns true if it was succesful - why does the is mission entity check return true
/// no matter what the out come of said check?
/// PARAMS:
/// vehicleindex - The VEHICLE_INDEX to write the newly create vehicle to
/// model - The model to load and use to create the vehicle
/// pos - The position the vehicle should be created
/// dir - The heading the vehicle should have when created
/// RETURNS:
/// TRUE if the vehicle was created
FUNC BOOL SPAWN_VEHICLE(VEHICLE_INDEX &vehicleindex, MODEL_NAMES model, VECTOR pos, FLOAT dir, BOOL bUnloadAfterSpawn = TRUE)
IF NOT DOES_ENTITY_EXIST(vehicleindex)
IF REQUEST_AND_CHECK_MODEL(model,"Loading")
vehicleindex = CREATE_VEHICLE(model, pos, dir)
IF DOES_ENTITY_EXIST(vehicleindex)
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehicleindex)
SET_ENTITY_AS_MISSION_ENTITY(vehicleindex)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(vehicleindex)
IF bUnloadAfterSpawn
UNLOAD_MODEL(model)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
IF IS_VEHICLE_OK(vehicleindex)
SET_ENTITY_COORDS(vehicleindex, pos)
SET_ENTITY_HEADING(vehicleindex, dir)
ENDIF
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehicleindex)
SET_ENTITY_AS_MISSION_ENTITY(vehicleindex)
RETURN TRUE
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
///-----------------------------------------------------------------------------------
/// MISSION FUNCTIONS
///-----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------------------
// 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()
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
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:
/// 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
REQUEST_ADDITIONAL_TEXT("FBIPRC", MISSION_TEXT_SLOT)
REQUEST_ADDITIONAL_TEXT(sTextBlock, MISSION_DIALOGUE_TEXT_SLOT)
IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT)
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// viChosenCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// vStartPos = GET_ENTITY_COORDS(viChosenCar)
// fHeading = GET_ENTITY_HEADING(viChosenCar)
// SET_ENTITY_AS_MISSION_ENTITY(viChosenCar, TRUE)
// GET_VEHICLE_SETUP(viChosenCar, mChosenCarSetup)
// MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FBI_4_PREP_3)
// RETURN TRUE
// ELSE
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE)
// viChosenCar = g_sTriggerSceneAssets.veh[0]
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(g_sTriggerSceneAssets.veh[0])
vStartPos = GET_ENTITY_COORDS(g_sTriggerSceneAssets.veh[0])
fHeading = GET_ENTITY_HEADING(g_sTriggerSceneAssets.veh[0])
GET_VEHICLE_SETUP(g_sTriggerSceneAssets.veh[0], mChosenCarSetup)
RETURN TRUE
ENDIF
// ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
SK_PRINT("MS_SET_UP, 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
// ===========================================================================================================
// Termination
// ===========================================================================================================
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Unloads all models
PROC UNLOAD_ALL_MODELS()
ENDPROC
/// PURPOSE:
/// Unloads all waypoints
PROC UNLOAD_ALL_WAYPOINTS()
ENDPROC
/// PURPOSE:
/// Unloads all anims
PROC UNLOAD_ANIMS()
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(viChosenCar)
ENDPROC
PROC RELEASE_ALL()
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FBI_4_PREP_3)
// SAFE_RELEASE_VEHICLE(viChosenCar)
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
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
CLEAR_PRINTS()
WAIT_FOR_CUTSCENE_TO_STOP()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
REMOVE_BLIPS()
UNLOAD_ALL_MODELS()
UNLOAD_ALL_WAYPOINTS()
UNLOAD_ANIMS()
UNLOAD_ALL_CAR_RECS()
IF bDelAll
DELETE_ALL()
ELSE
RELEASE_ALL()
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)
IF IS_PED_UNINJURED(PLAYER_PED_ID())
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
ENDIF
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)
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()
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
SET_MISSION_VEHICLE_GEN_VEHICLE(g_sTriggerSceneAssets.veh[0], <<0.0,0.0,0.0>>, 0.0, VEHGEN_MISSION_VEH_FBI4_PREP)
ENDIF
Mission_Flow_Mission_Passed()
Script_Cleanup()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Fail
// -----------------------------------------------------------------------------------------------------------
/// 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()
/* (not supported for story missions atm)
// set if we want to delay the fade
BOOL bDelayFade
bDelayFade = FALSE
IF NOT IS_STRING_NULL_OR_EMPTY(sFailReason)
bDelayFade = TRUE // delay the fade if we failed for one of these reasons
ENDIF
*/
MISSION_FLOW_MISSION_FAILED(TRUE)
eState = SS_ACTIVE
BREAK
CASE SS_ACTIVE
// IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
int iTimer
iTimer = GET_GAME_TIMER()
PRINT_HELP_FOREVER("PRC_FCAR")
WHILE (GET_GAME_TIMER() - iTimer) < 7500
WAIT(0)
ENDWHILE
CLEAR_HELP()
RELEASE_ALL()
Script_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)
//
// 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:
/// 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
#IF IS_DEBUG_BUILD SK_PRINT("INIT MISSION - THIS WILL LOOP") #ENDIF
IF SETUP_MISSION_STAGE(eMissionState, bJumpSkip)
IF IS_REPEAT_PLAY_ACTIVE()
SAFE_FADE_SCREEN_IN_FROM_BLACK()
ENDIF
eState = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP INIT MISSION") #ENDIF
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
IF STOP_MY_VEHICLE()
NEXT_STAGE()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MONITER_PLAYER_MOVING_CAR()
IF NOT IS_ENTITY_IN_RANGE_COORDS(g_sTriggerSceneAssets.veh[0], vStartPos, 25)
MISSION_FAILED()
ELIF NOT IS_ENTITY_IN_RANGE_COORDS(g_sTriggerSceneAssets.veh[0], vStartPos, 10)
IF NOT DOES_BLIP_EXIST(biBlip)
biBlip = CREATE_BLIP_FOR_COORD(vStartPos, TRUE)
PRINT_OBJ("PRC_RTN")
ENDIF
ELSE
IF IS_THIS_PRINT_BEING_DISPLAYED("PRC_RTN")
CLEAR_PRINTS()
ENDIF
SAFE_REMOVE_BLIP(biBlip)
ENDIF
ENDPROC
PROC MONITOR_PLAYER_MOVING_PETROL()
IF NOT DOES_PICKUP_OF_TYPE_EXIST_IN_AREA(PICKUP_WEAPON_PETROLCAN, vStartPos, 10)
IF NOT DOES_BLIP_EXIST(biBlip)
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
biBlip = CREATE_BLIP_FOR_VEHICLE(g_sTriggerSceneAssets.veh[0], FALSE)
PRINT_OBJ("PRC_GAS")
ENDIF
ENDIF
ELSE
SAFE_REMOVE_BLIP(biBlip)
ENDIF
ENDPROC
PROC MONITOR_PLAYER_LEAVING_AREA()
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), g_sTriggerSceneAssets.veh[0], 225)
bScriptCleanedupCar = TRUE
SAFE_DELETE_VEHICLE(g_sTriggerSceneAssets.veh[0])
ENDIF
ELSE
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vStartPos, 200)
IF bScriptCleanedupCar
IF SPAWN_VEHICLE(g_sTriggerSceneAssets.veh[0], mChosenCarSetup.eModel, vStartPos, fHeading)
SET_VEHICLE_SETUP(g_sTriggerSceneAssets.veh[0], mChosenCarSetup)
bScriptCleanedupCar = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC LEAVE()
SWITCH eState
CASE SS_INIT
#IF IS_DEBUG_BUILD SK_PRINT("INIT LEAVE") #ENDIF
eState = SS_ACTIVE
BREAK
CASE SS_ACTIVE
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_sTriggerSceneAssets.veh[0])
eState = SS_CLEANUP
ELSE
MONITER_PLAYER_MOVING_CAR()
ENDIF
ELSE
MISSION_FAILED()
ENDIF
BREAK
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP LEAVE") #ENDIF
NEXT_STAGE()
BREAK
CASE SS_SKIPPED
RC_END_Z_SKIP()
eState = SS_ACTIVE
BREAK
ENDSWITCH
ENDPROC
PROC SET_CLOSEST_GUN_SHOP_BLIPS_LONG_RANGE(BOOL bOn)
SET_SHOP_BLIP_LONG_RANGE(GET_CLOSEST_SHOP_OF_TYPE(GET_ENTITY_COORDS(PLAYER_PED_ID()), SHOP_TYPE_GUN), bOn)
ENDPROC
PROC GET_PETROL()
MONITOR_PLAYER_LEAVING_AREA()
SWITCH eState
CASE SS_INIT
#IF IS_DEBUG_BUILD SK_PRINT("INIT GET_PETROL") #ENDIF
PRINT_OBJ("PRC_GAS")
bObjectiveShown = FALSE
SET_CLOSEST_GUN_SHOP_BLIPS_LONG_RANGE(TRUE)
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
biBlip = CREATE_BLIP_FOR_COORD(vStartPos)
//CREATE_BLIP_FOR_VEHICLE(viChosenCar, FALSE)
ENDIF
iMissTimer = GET_GAME_TIMER()
eState = SS_ACTIVE
BREAK
CASE SS_ACTIVE
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
IF NOT bGunShopHelp
IF (GET_GAME_TIMER() - iMissTimer) > 2000
PRINT_HELP("PRC_HGAS" , DEFAULT_GOD_TEXT_TIME)
bGunShopHelp = TRUE
ENDIF
ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vStartPos, 10)
AND DOES_PICKUP_OF_TYPE_EXIST_IN_AREA(PICKUP_WEAPON_PETROLCAN, vStartPos, 10)
SAFE_REMOVE_BLIP(biBlip)
eState = SS_CLEANUP
ENDIF
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_sTriggerSceneAssets.veh[0])
SAFE_REMOVE_BLIP(biBlip)
MONITER_PLAYER_MOVING_CAR()
ELSE
IF NOT DOES_BLIP_EXIST(biBlip)
biBlip = CREATE_BLIP_FOR_COORD(vStartPos)
//CREATE_BLIP_FOR_VEHICLE(viChosenCar, FALSE)
ENDIF
ENDIF
ELSE
IF NOT bScriptCleanedupCar
MISSION_FAILED()
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP GET_PETROL") #ENDIF
SET_CLOSEST_GUN_SHOP_BLIPS_LONG_RANGE(FALSE)
SAFE_REMOVE_BLIP(biBlip)
NEXT_STAGE()
BREAK
CASE SS_SKIPPED
RC_END_Z_SKIP()
eState = SS_ACTIVE
BREAK
ENDSWITCH
ENDPROC
PROC SET_FAST_CAR_STAT()
MODEL_NAMES mnTemp = GET_ENTITY_MODEL(g_sTriggerSceneAssets.veh[0])
IF GET_VEHICLE_MODEL_ACCELERATION(mnTemp) > 0.219
AND GET_VEHICLE_MODEL_ESTIMATED_MAX_SPEED(mnTemp) > 45
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_MISSION, "GET_VEHICLE_MODEL_ACCELERATION == ", GET_VEHICLE_MODEL_ACCELERATION(mnTemp))
CPRINTLN(DEBUG_MISSION, "GET_VEHICLE_MODEL_ESTIMATED_MAX_SPEED == ", GET_VEHICLE_MODEL_ESTIMATED_MAX_SPEED(mnTemp))
#ENDIF
//INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI4P3_SPORTSCAR_PICKED)
ENDIF
ENDPROC
PROC LEAVE_AREA()
SWITCH eState
CASE SS_INIT
#IF IS_DEBUG_BUILD SK_PRINT("INIT LEAVE_AREA") #ENDIF
PRINT_OBJ("PRC_LEAVE")
bObjectiveShown = FALSE
eState = SS_ACTIVE
BREAK
CASE SS_ACTIVE
IF IS_VEHICLE_OK(g_sTriggerSceneAssets.veh[0])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_sTriggerSceneAssets.veh[0])
IF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vStartPos, 60)
eState = SS_CLEANUP
ENDIF
ELSE
MONITER_PLAYER_MOVING_CAR()
MONITOR_PLAYER_MOVING_PETROL()
ENDIF
ELSE
MISSION_FAILED()
ENDIF
BREAK
CASE SS_CLEANUP
#IF IS_DEBUG_BUILD SK_PRINT("CLEANEDUP LEAVE_AREA") #ENDIF
SET_FAST_CAR_STAT()
GET_PLAYERS_LAST_VEHICLE()
Script_Passed()
BREAK
CASE SS_SKIPPED
RC_END_Z_SKIP()
eState = SS_ACTIVE
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()
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
i_debug_jump_stage++
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
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()
Mission_Flow_Mission_Force_Cleanup()
Script_Cleanup()
ENDIF
#IF IS_DEBUG_BUILD
SETUP_FOR_RAGE_WIDGETS()
#ENDIF
// Loop within here until the mission passes or fails
WHILE(TRUE)
IF IS_PED_UNINJURED(PLAYER_PED_ID())
SWITCH eMissionState
CASE MS_SET_UP
INITMISSION()
BREAK
// CASE MS_LEAVE
// LEAVE()
// BREAK
//
// CASE MS_GET_PETROL
// GET_PETROL()
// BREAK
CASE MS_LEAVE_AREA
LEAVE_AREA()
BREAK
CASE MS_FAILED
FAILED_WAIT_FOR_FADE()
BREAK
ENDSWITCH
IF eMissionState <> MS_FAILED
#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