Files
gtav-src/script/dev_ng/singleplayer/scripts/RandomChar/Extreme/Extreme2.sc
T
2025-09-29 00:52:08 +02:00

3338 lines
141 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.
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Extreme2.sc
// AUTHOR : Kev Edwards
// DESCRIPTION : Sneak onto cargo plane in airport and jump out on a jetski.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
USING "rage_builtins.sch"
USING "globals.sch"
USING "cutscene_public.sch"
USING "commands_cutscene.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "script_player.sch"
USING "randomChar_public.sch"
USING "cutscene_public.sch"
USING "commands_cutscene.sch"
USING "dialogue_public.sch"
USING "RC_Helper_Functions.sch"
USING "rc_launcher_public.sch"
USING "initial_scenes_Extreme.sch"
USING "area_checks.sch"
USING "script_ped.sch"
USING "CompletionPercentage_public.sch"
USING "RC_Threat_public.sch"
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
USING "commands_recording.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
#ENDIF
g_structRCScriptArgs sRCLauncherDataLocal
CONST_INT CP_FOLLOW_DOM 0
CONST_INT CP_SKYDIVE 1
CONST_INT CP_LANDED 2
CONST_INT CP_MISSION_PASSED 3 // Only used for shitskips
CONST_INT Z_SKIP_INTRO 0
CONST_INT Z_SKIP_GO_IN_AIRPORT 1
CONST_INT Z_SKIP_DRIVE_OUT_PLANE 2
CONST_INT Z_SKIP_LANDED_AFTER_SKYDIVE 3
CONST_INT Z_SKIP_MISSION_PASSED 4
ENUM EXT2_MISSION_STATE
stateNULL,
stateIntro,
stateGoIntoAirport,
stateMidtroPlane,
stateJumpOutPlane,
stateSkydive,
stateGoToDom,
stateFinalConversation,
stateMissionPassed,
stateFailed,
NUM_MISSION_STATES
ENDENUM
ENUM EXT2_STATE_MACHINE
EXT2_STATE_MACHINE_SETUP,
EXT2_STATE_MACHINE_LOOP,
EXT2_STATE_MACHINE_CLEANUP
ENDENUM
ENUM FAILED_REASON
FAILED_DEFAULT = 0,
FAILED_DOM_DIED,
FAILED_ATV_WRECKED,
FAILED_ABANDONED_DOM,
FAILED_DIDNT_FOLLOW_DOM,
FAILED_DOM_INJURED,
FAILED_DOM_ATV_DAMAGED,
FAILED_GUARD_INJURED,
FAILED_DIDNT_DRIVE_ATV,
FAILED_DOM_SCARED,
FAILED_OUTSIDE_ZONE,
FAILED_FAILED_SKY_DIVE,
FAILED_DIDNT_ATTEMPT_SKYDIVE
ENDENUM
ENUM DOM_STATUS
DOM_IN_PLANE,
DOM_DRIVING_OUT_PLANE,
DOM_GETTING_OFF_ATV,
DOM_SKYDIVING,
DOM_LANDED
ENDENUM
ENUM STATUS_DOM_ATV
ATV_INTO_AIRPORT,
ATV_CHASE_PLANE,
ATV_ATTACHED
ENDENUM
ENUM STATUS_SKYDIVE
SKYDIVE_ON_ATV,
SKYDIVE_PARACHUTING,
SKYDIVE_LANDING,
SKYDIVE_LANDED_OK,
SKYDIVE_LANDED_FAR_AWAY
ENDENUM
EXT2_MISSION_STATE missionState = stateIntro // Stores the current EXT2_MISSION_STATE
EXT2_MISSION_STATE missionStateSkip = stateNULL // Used if needing to change to a EXT2_MISSION_STATE out of sequence
EXT2_STATE_MACHINE missionStateMachine = EXT2_STATE_MACHINE_SETUP
FAILED_REASON failReason
STRING failString
DOM_STATUS domStatus = DOM_IN_PLANE
STATUS_DOM_ATV statusDomATV
STATUS_SKYDIVE statusSkydive
BOOL bZSkipping = FALSE
INT iCutsceneWaitTime
BOOL bHasChanged // variable for storing the state of "player has changed outfit"
#IF IS_DEBUG_BUILD
CONST_INT MAX_SKIP_MENU_LENGTH 4
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
WIDGET_GROUP_ID widgetGroup
BOOL bDebug_PrintToTTY = TRUE
INT iDebugSkipTime // Prevents skipping instantaneously
#ENDIF
VECTOR vPlayerCarRespot = <<-964.1799, -2751.0134, 12.7848>>
CONST_FLOAT fPlayerCarRespot 273.2345
VECTOR vPlayerOutro = << 139.8692, 3660.7466, 30.4814 >>
CONST_FLOAT fPlayerOutro 288.2311
SEQUENCE_INDEX seqFranklinLeadIn
CAMERA_INDEX camCutscene
INT iCutsceneStage = 0
BOOL bCutsceneSkipped
INT iLeadInTimer
PED_INDEX pedDom
SEQUENCE_INDEX seqDomAnim
BOOL bStartedDomTricks
CONST_INT NUM_VEHICLE_MODELS 5
MODEL_NAMES modelVehicle[NUM_VEHICLE_MODELS]
CONST_INT EXT2_MODEL_BLAZER 0
CONST_INT EXT2_MODEL_CARGOPLANE 1
CONST_INT EXT2_MODEL_JET 2
CONST_INT EXT2_MODEL_SEASHARK 3
CONST_INT EXT2_MODEL_FLATBED 4
CONST_INT NUM_ATVS 2
VEHICLE_INDEX vehATV[NUM_ATVS]
VECTOR vATVOnPlane[NUM_ATVS]
VECTOR vATV[NUM_ATVS]
FLOAT fATV[NUM_ATVS]
BOOL bCheckPlayerATV
CONST_INT VEHICLE_PLAYER 0
CONST_INT VEHICLE_DOM 1
VEHICLE_INDEX vehAirportPlane
INT iPlayerAttachedTimer
INT iPlayerCurseTimer
CONST_INT NUM_PED_MODELS 3
MODEL_NAMES modelPed[NUM_PED_MODELS]
CONST_INT EXT2_MODEL_SECURITY 0
CONST_INT EXT2_MODEL_DOM 1
CONST_INT EXT2_MODEL_PILOT 2
VECTOR vPlayerAfterIntro = <<-948.2926, -2755.0151, 12.8068>>
CONST_FLOAT fPlayerAfterIntro 331.4214
PED_INDEX pedAirportBooth
VECTOR vAirportBoothPed = << -966.79, -2799.24, 12.96 >>
CONST_FLOAT fAirportBoothPed 58.770409
PED_INDEX pedPlanePilot[2]
BLIP_INDEX blipDom
BLIP_INDEX blipPlayerATV
VEHICLE_INDEX vehPlaneChase
VEHICLE_INDEX vehPlaneSkydive
BLIP_INDEX blipPlane
CONST_FLOAT fPlaneEnd -73.338570
VECTOR vATVOffsetFromPlane
VECTOR vPlayerRampOffset
VECTOR vDomRampOffset
FLOAT fCurrentDomPlaybackPosition
FLOAT fCurrentPlanePlaybackPosition
INT iCheckEngineTimer
VECTOR vJetPlaneEngineRear[4]
VECTOR vJetPlaneEngineFront[4]
VECTOR vCargoPlaneEngineRear[4]
VECTOR vCargoPlaneEngineFront[4]
structPedsForConversation sConversation
BOOL bStartedFirstConversation
BOOL bStartedGuardConversation
BOOL bStartedLetsGoConversation
BOOL bStartedHurryUpConversation
BOOL bStartedDrivingOutConversation
BOOL bStartedThreatenDomConversation
BOOL bStartedDidntUseATVConversation
BOOL bStartedDriveInPlaneConversation1
BOOL bStartedDriveInPlaneConversation2
BOOL bStartedDriveInPlaneConversation3
BOOL bStartedPerformTricksConversation
BOOL bStoppedPerformTricksConversation
BOOL bRestartedPerformTricksConversation
BOOL bStartedJumpedOffATVConversation
BOOL bStoppedJumpedOffATVConversation
BOOL bStartedDeployedParachuteConversation
INT iDoneRemindConversation
INT iRemindConversationTimer
BOOL bPlayerIsOnATV = FALSE
VECTOR vLandingPos = << 145.57, 3661.28, 30.49 >>
BLIP_INDEX blipCheckpoint
VECTOR vCheckpoint = << 156.0000, 3665.3, 31.6 >>
VECTOR vMarkerRotation = << -90, 0, 0>>
BOOL bDisplayedSkydiveHelpText
BOOL bDisplayedJumpOffHelpText
BOOL bDisplayedGoToLandingZoneText
BOOL bDisplayedWaitDomLandText
INT iFailedLandingTimer
PTFX_ID ptfx_gen_sparks
PTFX_ID ptfx_moving_clouds
PTFX_ID ptfx_wind_and_smoke
FLOAT fCloudsCurrentAlpha
INT iSparksSound = GET_SOUND_ID()
MODEL_NAMES modelInvisibleProp
OBJECT_INDEX objectInvisibleProp
INT iATVFallingSound = GET_SOUND_ID()
BOOL bDisplayedGetBackOnATV
INT iTimesDisplayedRideATVObjective
BOOL bShutCargoPlaneDoors
VEHICLE_INDEX vehJetski
VECTOR vJetski = <<181.8,3676.0,35>>
CONST_FLOAT fJetski -71.712914
SEQUENCE_INDEX endSequence
REL_GROUP_HASH relGroupFriendly
VEHICLE_INDEX vehIntroTruck
VECTOR vIntroTruck = <<-957.23, -2764.89, 13.99>>
CONST_FLOAT fIntroTruck 147.61
INT iDomRideOutPlaneTimer
INT iSkydiveHelpTextTimer
VEHICLE_INDEX vehForReplay
BOOL bPlayerDeployedParachute
BOOL bResetStuntValues
FLOAT fPreviousPitch
FLOAT fCurrentPitch
FLOAT fTotalPitch
BOOL bStartedRunwayMusicEvent
BOOL bStartedEnterPlaneMusicEvent
BOOL bPreparedParachuteMusicEvent
BOOL bStartedParachuteMusicEvent
BOOL bPlayingPlaneStream
FLOAT fStreamInOut = 0.0
BOOL bReachedDom
BOOL bNearToDomStoppedConversation
RC_CONV_RESTORE_STATE stateRestoreConversation
TEXT_LABEL_23 tSavedConversationRoot
TEXT_LABEL_23 tSavedConversationLabel
TEXT_LABEL_23 tStoredTricksConversationLabel
STREAMVOL_ID streamVolumeExtreme2
INT iSynchedScene
OBJECT_INDEX lightRigObject
/// PURPOSE:
/// Used in every EXT2_STATE_MACHINE_SETUP. Advances state machine to EXT2_STATE_MACHINE_LOOP.
PROC EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD STRING s_text #ENDIF)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Initialising ", s_text) ENDIF #ENDIF
bZSkipping = FALSE
#IF IS_DEBUG_BUILD iDebugSkipTime = GET_GAME_TIMER() #ENDIF
missionStateMachine = EXT2_STATE_MACHINE_LOOP
ENDPROC
/// PURPOSE:
/// Used in every EXT2_STATE_MACHINE_CLEANUP. Advances state machine to EXT2_STATE_MACHINE_SETUP.
PROC EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD STRING s_text #ENDIF)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Cleaning up ", s_text) ENDIF #ENDIF
CLEAR_PRINTS()
CLEAR_HELP(TRUE)
IF missionStateSkip = stateNULL
missionState = INT_TO_ENUM(EXT2_MISSION_STATE, ENUM_TO_INT(missionState) + 1)
ELSE
missionState = missionStateSkip
ENDIF
missionStateSkip = stateNULL
missionStateMachine = EXT2_STATE_MACHINE_SETUP
ENDPROC
/// PURPOSE:
/// Safely remove all blips in this mission.
PROC EXT2_REMOVE_ALL_BLIPS()
SAFE_REMOVE_BLIP(blipDom)
SAFE_REMOVE_BLIP(blipPlane)
SAFE_REMOVE_BLIP(blipPlayerATV)
SAFE_REMOVE_BLIP(blipCheckpoint)
ENDPROC
/// PURPOSE:
/// Models required for a mission state are all loaded when the mission state inits, but this is a safety check to ensure a model is loaded before subsequently creating an entity using it.
PROC EXT2_ENSURE_MODEL_IS_LOADED(MODEL_NAMES e_model)
REQUEST_MODEL(e_model)
IF NOT HAS_MODEL_LOADED(e_model)
WHILE NOT HAS_MODEL_LOADED(e_model)
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
/// PURPOSE:
/// Safely creates a vehicle.
PROC EXT2_CREATE_VEHICLE(VEHICLE_INDEX &veh_to_create, MODEL_NAMES e_model, VECTOR v_pos, FLOAT f_heading = 0.0, INT i_colour = -1, FLOAT f_dirt = 0.0, INT i_use_specific_colours = -1)
IF NOT DOES_ENTITY_EXIST(veh_to_create)
IF HAS_MODEL_LOADED(e_model)
EXT2_ENSURE_MODEL_IS_LOADED(e_model)
veh_to_create = CREATE_VEHICLE(e_model, v_pos, f_heading)
IF i_colour >= 0
SET_VEHICLE_COLOURS(veh_to_create, i_colour, i_colour)
ENDIF
IF i_use_specific_colours > -1
SET_VEHICLE_COLOUR_COMBINATION(veh_to_create, i_use_specific_colours)
ENDIF
SET_VEHICLE_DIRT_LEVEL(veh_to_create, f_dirt)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Safely creates a ped.
PROC EXT2_CREATE_PED(PED_INDEX &ped_to_create, MODEL_NAMES e_model, VECTOR v_pos, FLOAT f_heading = 0.0)
IF NOT DOES_ENTITY_EXIST(ped_to_create)
EXT2_ENSURE_MODEL_IS_LOADED(e_model)
ped_to_create = CREATE_PED(PEDTYPE_MISSION, e_model, v_pos, f_heading)
SET_PED_DEFAULT_COMPONENT_VARIATION(ped_to_create)
REMOVE_ALL_PED_WEAPONS(ped_to_create)
ENDIF
ENDPROC
/// PURPOSE:
/// Safely creates a ped inside a vehicle.
PROC EXT2_CREATE_PED_IN_VEHICLE(VEHICLE_INDEX veh, PED_INDEX &ped_to_create, MODEL_NAMES e_model, VEHICLE_SEAT seat)
IF NOT DOES_ENTITY_EXIST(ped_to_create)
AND DOES_ENTITY_EXIST(veh)
EXT2_ENSURE_MODEL_IS_LOADED(e_model)
ped_to_create = CREATE_PED_INSIDE_VEHICLE(veh, PEDTYPE_MISSION, e_model, seat)
SET_PED_DEFAULT_COMPONENT_VARIATION(ped_to_create)
REMOVE_ALL_PED_WEAPONS(ped_to_create)
ENDIF
ENDPROC
/// PURPOSE:
/// Safely remove all vehicles in this mission.
PROC EXT2_REMOVE_ALL_VEHICLES(BOOL b_delete = FALSE)
IF IS_ENTITY_ALIVE(vehPlaneChase)
SET_ENTITY_LOAD_COLLISION_FLAG(vehPlaneChase, FALSE)
ENDIF
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vehATV[VEHICLE_DOM], FALSE)
ENDIF
IF b_delete = TRUE
SAFE_DELETE_VEHICLE(vehATV[VEHICLE_PLAYER])
SAFE_DELETE_VEHICLE(vehATV[VEHICLE_DOM])
SAFE_DELETE_VEHICLE(vehAirportPlane)
SAFE_DELETE_VEHICLE(vehJetski)
SAFE_DELETE_VEHICLE(vehPlaneChase)
SAFE_DELETE_VEHICLE(vehPlaneSkydive)
SAFE_DELETE_VEHICLE(vehIntroTruck)
SAFE_DELETE_VEHICLE(vehForReplay)
ELSE
SAFE_RELEASE_VEHICLE(vehATV[VEHICLE_PLAYER])
SAFE_RELEASE_VEHICLE(vehATV[VEHICLE_DOM])
SAFE_RELEASE_VEHICLE(vehAirportPlane)
SAFE_RELEASE_VEHICLE(vehJetski)
SAFE_RELEASE_VEHICLE(vehPlaneChase)
SAFE_RELEASE_VEHICLE(vehPlaneSkydive)
SAFE_RELEASE_VEHICLE(vehIntroTruck)
SAFE_RELEASE_VEHICLE(vehForReplay)
ENDIF
ENDPROC
/// PURPOSE:
/// Sets ped to wander after mission.
PROC EXT2_MAKE_PED_WANDER()
IF IS_ENTITY_ALIVE(pedDom)
AND NOT IsPedPerformingTask(pedDom, SCRIPT_TASK_WANDER_STANDARD)
AND NOT IsPedPerformingTask(pedDom, SCRIPT_TASK_SMART_FLEE_PED)
AND NOT IsPedPerformingTask(pedDom, SCRIPT_TASK_PERFORM_SEQUENCE) // Don't make Dom wander at the end of the mission when performing the task sequence
AND NOT IsPedPerformingTask(pedDom, SCRIPT_TASK_SMART_FLEE_PED)
AND NOT IS_PED_IN_ANY_VEHICLE(pedDom)
AND GET_PED_PARACHUTE_STATE(pedDom) = PPS_INVALID
SET_PED_KEEP_TASK(pedDom, TRUE)
TASK_WANDER_STANDARD(pedDom)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Set Dom to wander") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Mission is failing so set alive peds to flee from the player.
PROC EXT2_SET_PED_TO_FLEE()
IF IS_ENTITY_ALIVE(pedDom)
AND NOT IS_PED_IN_ANY_VEHICLE(pedDom)
AND GET_PED_PARACHUTE_STATE(pedDom) = PPS_INVALID
CLEAR_PED_TASKS(pedDom)
SET_PED_KEEP_TASK(pedDom, TRUE)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
TASK_SMART_FLEE_PED(pedDom, PLAYER_PED_ID(), 100, -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Set Dom to flee") ENDIF #ENDIF
ELSE
TASK_WANDER_STANDARD(pedDom)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Set Dom to wander") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Safely remove all peds in this mission.
PROC EXT2_REMOVE_ALL_PEDS(BOOL b_delete = FALSE)
IF IS_ENTITY_ALIVE(pedDom)
SET_ENTITY_LOAD_COLLISION_FLAG(pedDom, FALSE)
ENDIF
IF b_delete = TRUE
SAFE_DELETE_PED(pedAirportBooth)
SAFE_DELETE_PED(pedDom)
SAFE_DELETE_PED(pedPlanePilot[0])
SAFE_DELETE_PED(pedPlanePilot[1])
ELSE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) // Dom should flee if Franklin has died, otherwise only be set to wander
EXT2_MAKE_PED_WANDER()
ELSE
EXT2_SET_PED_TO_FLEE()
ENDIF
SAFE_RELEASE_PED(pedAirportBooth)
SAFE_RELEASE_PED(pedDom)
SAFE_RELEASE_PED(pedPlanePilot[0])
SAFE_RELEASE_PED(pedPlanePilot[1])
ENDIF
ENDPROC
/// PURPOSE:
/// Stop carrec on vehicle if one is active.
PROC EXT2_STOP_CARREC_IF_PLAYING(VEHICLE_INDEX veh)
IF IS_ENTITY_ALIVE(veh)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
STOP_PLAYBACK_RECORDED_VEHICLE(veh)
ENDIF
ENDPROC
/// PURPOSE:
/// Unload all models used in the mission.
PROC EXT2_RELEASE_ALL_MODELS()
INT i = 0
REPEAT NUM_VEHICLE_MODELS i
SET_MODEL_AS_NO_LONGER_NEEDED(modelVehicle[i])
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelVehicle[i], FALSE)
ENDREPEAT
i = 0
REPEAT NUM_PED_MODELS i
SET_MODEL_AS_NO_LONGER_NEEDED(modelPed[i])
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(modelInvisibleProp)
ENDPROC
/// PURPOSE:
/// Sets up Franklin in his skydiving outfit or back to his normal clothes.
PROC EXT2_SET_FRANKLIN_INTO_SKYDIVING_OUTFIT(BOOL b_set_into_outfit)
IF b_set_into_outfit = TRUE
STORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID()) // B*1206376 - Store current clothes before setting into parachuting outfit
PRELOAD_OUTFIT(PLAYER_PED_ID(), OUTFIT_P1_SKYDIVING)
PRELOAD_OUTFIT(PLAYER_PED_ID(), SPECIAL_P1_PARACHUTE)
WHILE NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(PLAYER_PED_ID()) // Screen will always be faded down in this while loop
WAIT(0)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Still preloading outfits") ENDIF #ENDIF
ENDWHILE
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_SKYDIVING, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL, SPECIAL_P1_PARACHUTE, FALSE)
RELEASE_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID())
SET_PED_PARACHUTE_TINT_INDEX(PLAYER_PED_ID(), 1)
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN) // Set that the player has changed clothes on mission
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Set Franklin into his parachuting outfit") ENDIF #ENDIF
ELSE
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
IF IS_SCREEN_FADED_OUT()
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, bHasChanged) // Reset that the player has changed outfit on mission to how it was at the start of the mission
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Restored Franklin's outfit") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Start/stop an audio scene.
PROC EXT2_START_AUDIO_SCENE(STRING s_scene_name, BOOL b_start)
IF b_start = TRUE
IF NOT IS_AUDIO_SCENE_ACTIVE(s_scene_name)
START_AUDIO_SCENE(s_scene_name)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started audio scene ", s_scene_name) ENDIF #ENDIF
ENDIF
ELIF IS_AUDIO_SCENE_ACTIVE(s_scene_name)
STOP_AUDIO_SCENE(s_scene_name)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Stopped audio scene ", s_scene_name) ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Allows/prevents a ped raising the airport barrier when nearby. See B*1284403.
PROC EXT2_REGISTER_BARRIER_FOR_PED(PED_INDEX ped_to_raise_barrier, BOOL b_allow_raise_barrier)
IF IS_ENTITY_ALIVE(ped_to_raise_barrier)
IF b_allow_raise_barrier = TRUE
IF NOT IS_PED_REGISTERED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_AIRPORT_BARRIER_IN, ped_to_raise_barrier)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_AIRPORT_BARRIER_IN, ped_to_raise_barrier)
ENDIF
ELSE
IF IS_PED_REGISTERED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_AIRPORT_BARRIER_IN, ped_to_raise_barrier)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_AIRPORT_BARRIER_IN, ped_to_raise_barrier)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Turns on/off the lighting in the plane. See B*1516771.
PROC SET_LIGHT_RIG_ON_CARGO_PLANE(BOOL bSet)
IF bSet = TRUE
IF IS_ENTITY_ALIVE(vehPlaneSkydive)
DISABLE_VEHCILE_DYNAMIC_AMBIENT_SCALES(vehPlaneSkydive, 255, 255)
IF NOT DOES_ENTITY_EXIST(lightRigObject)
lightRigObject = CREATE_OBJECT(EXILE1_LIGHTRIG, GET_ENTITY_COORDS(vehPlaneSkydive))
SET_ENTITY_ROTATION(lightRigObject, GET_ENTITY_ROTATION(vehPlaneSkydive))
FREEZE_ENTITY_POSITION(lightRigObject, TRUE)
SET_ENTITY_COLLISION(lightRigObject, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Created lighting rig") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF IS_ENTITY_ALIVE(vehPlaneSkydive)
ENABLE_VEHICLE_DYNAMIC_AMBIENT_SCALES(vehPlaneSkydive)
ENDIF
SAFE_DELETE_OBJECT(lightRigObject)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Deleted lighting rig") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Clean up everything conceivably setup in this mission.
/// PARAMS:
/// bTerminateMission - TRUE if cleaning up before terminating, FALSE if cleaning up before a debug skip.
PROC EXT2_MISSION_CLEANUP(BOOL b_delete_entities = FALSE, BOOL b_terminate_mission = FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Cleaning up mission...") ENDIF #ENDIF
CLEAR_PRINTS()
CLEAR_HELP()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
STOP_SOUND(iSparksSound)
STOP_SOUND(iATVFallingSound)
EXT2_START_AUDIO_SCENE("EXTREME_02_DRIVE_TO_PLANE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_FOCUS_ON_PLANE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_DRIVE_UP_RAMP", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_PLANE_TAKEOFF_CUTSCENE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_INSIDE_PLANE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_SKYDIVE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_OPEN_PARACHUTE", FALSE)
STOP_STREAM()
RELEASE_SCRIPT_AUDIO_BANK()
EXT2_STOP_CARREC_IF_PLAYING(vehPlaneChase)
EXT2_STOP_CARREC_IF_PLAYING(vehPlaneSkydive)
EXT2_STOP_CARREC_IF_PLAYING(vehAirportPlane)
EXT2_STOP_CARREC_IF_PLAYING(vehATV[VEHICLE_DOM])
REMOVE_VEHICLE_RECORDING(500, "Ext2_DomIntoAirport")
REMOVE_VEHICLE_RECORDING(502, "Ext2_AirportVeh")
REMOVE_VEHICLE_RECORDING(503, "Ext2_CargoTakeOff")
REMOVE_VEHICLE_RECORDING(600, "Ext2_CargoFlight")
REMOVE_ANIM_DICT("rcmextreme2atv")
REMOVE_ANIM_DICT("rcmjosh1@impatient")
EXT2_REGISTER_BARRIER_FOR_PED(PLAYER_PED_ID(), FALSE)
EXT2_REGISTER_BARRIER_FOR_PED(pedDom, FALSE)
SET_LIGHT_RIG_ON_CARGO_PLANE(FALSE)
EXT2_REMOVE_ALL_BLIPS()
EXT2_REMOVE_ALL_PEDS(b_delete_entities)
EXT2_REMOVE_ALL_VEHICLES(b_delete_entities)
EXT2_RELEASE_ALL_MODELS()
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_moving_clouds)
STOP_PARTICLE_FX_LOOPED(ptfx_moving_clouds)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_gen_sparks)
STOP_PARTICLE_FX_LOOPED(ptfx_gen_sparks)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_wind_and_smoke)
STOP_PARTICLE_FX_LOOPED(ptfx_wind_and_smoke)
ENDIF
REMOVE_PTFX_ASSET()
SAFE_DELETE_OBJECT(objectInvisibleProp)
REMOVE_VEHICLE_ASSET(modelVehicle[EXT2_MODEL_BLAZER])
IF DOES_CAM_EXIST(camCutscene)
DESTROY_CAM(camCutscene)
ENDIF
CLEAR_WEATHER_TYPE_PERSIST()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED_ID(), RBF_NONE)
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
ENDIF
TRIGGER_MUSIC_EVENT("EXTREME2_STOP")
IF STREAMVOL_IS_VALID(streamVolumeExtreme2)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Deleting streamVolumeExtreme2") ENDIF #ENDIF
STREAMVOL_DELETE(streamVolumeExtreme2)
ENDIF
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
FORCE_AUTOMATIC_DOOR_SLIDE_OPEN(AUTODOOR_AIRPORT_BARRIER_IN, FALSE)
IF b_terminate_mission = TRUE
#IF IS_DEBUG_BUILD
IF DOES_WIDGET_GROUP_EXIST(widgetGroup)
DELETE_WIDGET_GROUP(widgetGroup)
ENDIF
#ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_PED_HELMET(PLAYER_PED_ID(), TRUE)
ENDIF
REMOVE_PED_FOR_DIALOGUE(sConversation, 1) // Franklin
REMOVE_PED_FOR_DIALOGUE(sConversation, 3) // Dom
IF DOES_SCENARIO_GROUP_EXIST("LSA_Planes")
AND NOT IS_SCENARIO_GROUP_ENABLED("LSA_Planes")
SET_SCENARIO_GROUP_ENABLED("LSA_Planes", TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Enabled scenario group LSA_Planes") ENDIF #ENDIF
ENDIF
RELEASE_SUPPRESSED_RESTRICTED_AREA_WANTED_LEVEL(AC_AIRPORT_AIRSIDE)
SET_CREATE_RANDOM_COPS(TRUE)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Cleaned up mission") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Standard RC mission cleanup function.
PROC Script_Cleanup()
// Ensure launcher is cleaned up
RC_CLEANUP_LAUNCHER()
IF (Random_Character_Cleanup_If_Triggered())
EXT2_MISSION_CLEANUP(FALSE, TRUE)
ENDIF
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
// Disable sea race blip for Raton Canyon - B*1239034
SET_BIT(g_savedGlobals.sSeaRaceData.iRaceLeaveArea, ENUM_TO_INT(SEA_RACE_CANYON))
// Terminate script
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Standard RC mission passed function.
PROC Script_Passed()
Random_Character_Passed(CP_RAND_C_EXT2)
Script_Cleanup()
ENDPROC
/// PURPOSE:
/// Puts the desired ped into a group friendly to the player.
PROC EXT2_SET_PED_AS_PLAYER_FRIEND(PED_INDEX ped_to_set_as_friend)
IF IS_ENTITY_ALIVE(ped_to_set_as_friend)
relGroupFriendly = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID())
SET_PED_RELATIONSHIP_GROUP_HASH(ped_to_set_as_friend, relGroupFriendly)
SET_PED_CONFIG_FLAG(ped_to_set_as_friend, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Check if all the assets for the required mission stage have been loaded.
PROC EXT2_LOAD_ASSETS_FOR_MISSION_STATE(EXT2_MISSION_STATE current_state, BOOL b_wait_for_assets_to_load = TRUE)
SWITCH current_state
CASE stateIntro
REQUEST_MODEL(modelVehicle[EXT2_MODEL_BLAZER])
REQUEST_MODEL(modelVehicle[EXT2_MODEL_FLATBED])
REQUEST_MODEL(modelVehicle[EXT2_MODEL_CARGOPLANE])
REQUEST_MODEL(modelVehicle[EXT2_MODEL_JET])
REQUEST_MODEL(modelPed[EXT2_MODEL_DOM])
REQUEST_MODEL(modelPed[EXT2_MODEL_SECURITY])
REQUEST_MODEL(modelPed[EXT2_MODEL_PILOT])
REQUEST_MODEL(modelInvisibleProp)
REQUEST_VEHICLE_RECORDING(500, "Ext2_DomIntoAirport")
REQUEST_VEHICLE_RECORDING(502, "Ext2_AirportVeh")
REQUEST_VEHICLE_RECORDING(503, "Ext2_CargoTakeOff")
REQUEST_PTFX_ASSET()
BREAK
CASE stateJumpOutPlane
REQUEST_MODEL(modelVehicle[EXT2_MODEL_BLAZER])
REQUEST_MODEL(modelVehicle[EXT2_MODEL_CARGOPLANE])
REQUEST_MODEL(modelVehicle[EXT2_MODEL_SEASHARK])
REQUEST_MODEL(modelPed[EXT2_MODEL_DOM])
REQUEST_MODEL(modelPed[EXT2_MODEL_PILOT])
REQUEST_VEHICLE_RECORDING(600, "Ext2_CargoFlight")
REQUEST_PTFX_ASSET()
REQUEST_ANIM_DICT("rcmextreme2atv")
REQUEST_ANIM_DICT("rcmjosh1@impatient")
BREAK
CASE stateFinalConversation
REQUEST_MODEL(modelVehicle[EXT2_MODEL_SEASHARK])
REQUEST_ANIM_DICT("rcmextreme2")
BREAK
ENDSWITCH
IF b_wait_for_assets_to_load = TRUE
BOOL b_assets_loaded = FALSE
WHILE b_assets_loaded = FALSE
SWITCH current_state
CASE stateIntro
IF HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_BLAZER])
AND HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_FLATBED])
AND HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_CARGOPLANE])
AND HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_JET])
AND HAS_MODEL_LOADED(modelPed[EXT2_MODEL_DOM])
AND HAS_MODEL_LOADED(modelPed[EXT2_MODEL_SECURITY])
AND HAS_MODEL_LOADED(modelPed[EXT2_MODEL_PILOT])
AND HAS_MODEL_LOADED(modelInvisibleProp)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(500, "Ext2_DomIntoAirport")
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(502, "Ext2_AirportVeh")
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(503, "Ext2_CargoTakeOff")
AND HAS_PTFX_ASSET_LOADED()
AND REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\CARGO_PLANE_PH")
AND REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\CARGO_PLANE_PH_B")
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelVehicle[EXT2_MODEL_BLAZER], TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelVehicle[EXT2_MODEL_CARGOPLANE], TRUE)
b_assets_loaded = TRUE
ENDIF
BREAK
CASE stateJumpOutPlane
IF HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_BLAZER])
AND HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_CARGOPLANE])
AND HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_SEASHARK])
AND HAS_MODEL_LOADED(modelPed[EXT2_MODEL_DOM])
AND HAS_MODEL_LOADED(modelPed[EXT2_MODEL_PILOT])
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(600, "Ext2_CargoFlight")
AND HAS_PTFX_ASSET_LOADED()
AND HAS_ANIM_DICT_LOADED("rcmextreme2atv")
AND HAS_ANIM_DICT_LOADED("rcmjosh1@impatient")
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelVehicle[EXT2_MODEL_BLAZER], TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelVehicle[EXT2_MODEL_CARGOPLANE], TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelVehicle[EXT2_MODEL_SEASHARK], TRUE)
b_assets_loaded = TRUE
ENDIF
BREAK
CASE stateFinalConversation
IF HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_SEASHARK])
AND HAS_ANIM_DICT_LOADED("rcmextreme2")
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelVehicle[EXT2_MODEL_SEASHARK], TRUE)
b_assets_loaded = TRUE
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Loading assets...") ENDIF #ENDIF
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Assets loaded") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Mission failed function.
PROC EXT2_MISSION_FAILED(FAILED_REASON reason = FAILED_DEFAULT)
IF bZSkipping = FALSE
failReason = reason
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
missionStateSkip = stateFailed
ENDIF
ENDPROC
/// PURPOSE:
/// Death checks for any mission critical entities.
PROC EXT2_DEATH_CHECKS()
IF ENUM_TO_INT(missionState) < (ENUM_TO_INT(NUM_MISSION_STATES)-1) // Don't check during stateFailed
IF DOES_ENTITY_EXIST(pedDom)
IF IS_ENTITY_DEAD(pedDom)
EXT2_MISSION_FAILED(FAILED_DOM_DIED)
ELSE
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
EXT2_MISSION_FAILED(FAILED_DOM_SCARED)
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedDom, PLAYER_PED_ID())
IF HAS_PED_BEEN_DAMAGED_BY_WEAPON(pedDom, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
EXT2_MISSION_FAILED(FAILED_DOM_INJURED)
ENDIF
ELIF HAS_PLAYER_THREATENED_PED(pedDom)
EXT2_MISSION_FAILED(FAILED_DOM_SCARED)
ELIF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
IF missionState = stateGoIntoAirport
AND NOT IS_PED_IN_VEHICLE(pedDom, vehATV[VEHICLE_DOM])
EXT2_MISSION_FAILED(FAILED_DOM_SCARED)
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehATV[VEHICLE_DOM], PLAYER_PED_ID())
AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(vehATV[VEHICLE_DOM], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
EXT2_MISSION_FAILED(FAILED_DOM_ATV_DAMAGED)
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(pedAirportBooth)
IF IS_ENTITY_DEAD(pedAirportBooth)
EXT2_MISSION_FAILED(FAILED_GUARD_INJURED)
ELSE
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedAirportBooth, PLAYER_PED_ID())
AND HAS_PED_BEEN_DAMAGED_BY_WEAPON(pedAirportBooth, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
EXT2_MISSION_FAILED(FAILED_GUARD_INJURED)
ENDIF
ENDIF
ENDIF
IF bCheckPlayerATV = TRUE
AND DOES_ENTITY_EXIST(vehATV[VEHICLE_PLAYER])
AND IS_ENTITY_DEAD(vehATV[VEHICLE_PLAYER])
EXT2_MISSION_FAILED(FAILED_ATV_WRECKED)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Set up mission prior to going into any mission states.
PROC EXT2_MISSION_SETUP()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Starting mission setup...") ENDIF #ENDIF
failReason = FAILED_DEFAULT
REQUEST_ADDITIONAL_TEXT("EXT2", MISSION_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
REGISTER_SCRIPT_WITH_AUDIO()
#IF IS_DEBUG_BUILD
mSkipMenu[Z_SKIP_INTRO].sTxtLabel = "Intro - es_2_rcm_concat"
mSkipMenu[Z_SKIP_GO_IN_AIRPORT].sTxtLabel = "Follow Dom"
mSkipMenu[Z_SKIP_DRIVE_OUT_PLANE].sTxtLabel = "ATV skydive"
mSkipMenu[Z_SKIP_LANDED_AFTER_SKYDIVE].sTxtLabel = "Landed on ground"
IF NOT DOES_WIDGET_GROUP_EXIST(widgetGroup)
widgetGroup = START_WIDGET_GROUP("Extreme 2 widgets")
ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintToTTY)
ADD_WIDGET_VECTOR_SLIDER("Marker Pos", vCheckpoint, -7000, 7000, 1)
ADD_WIDGET_VECTOR_SLIDER("Marker Rot", vMarkerRotation, -360, 360, 1)
STOP_WIDGET_GROUP()
ENDIF
#ENDIF
SET_CREATE_RANDOM_COPS(FALSE) // B*1401283
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_PED_HELMET(PLAYER_PED_ID(), FALSE)
REMOVE_PED_HELMET(PLAYER_PED_ID(), FALSE)
ENDIF
modelVehicle[EXT2_MODEL_BLAZER] = BLAZER
modelVehicle[EXT2_MODEL_CARGOPLANE] = CARGOPLANE
modelVehicle[EXT2_MODEL_JET] = JET
modelVehicle[EXT2_MODEL_SEASHARK] = SEASHARK
modelVehicle[EXT2_MODEL_FLATBED] = FLATBED
modelPed[EXT2_MODEL_SECURITY] = S_M_M_SECURITY_01
modelPed[EXT2_MODEL_DOM] = GET_NPC_PED_MODEL(CHAR_DOM)
modelPed[EXT2_MODEL_PILOT] = S_M_M_PILOT_01
modelInvisibleProp = Prop_LD_Test_01
vATV[VEHICLE_PLAYER] = << -950.80, -2751.98, 13.21 >>
fATV[VEHICLE_PLAYER] = 199.05
vATV[VEHICLE_DOM] = << -950.192, -2755.96, 13.3639 >>
fATV[VEHICLE_DOM] = -178.182
vATVOnPlane[VEHICLE_PLAYER] = << 444.8519, 3921.2214, 2398.1 >>
vATVOnPlane[VEHICLE_DOM] = << 443.3347, 3923.1145, 2398.1 >>
SUPPRESS_RESTRICTED_AREA_WANTED_LEVEL(AC_AIRPORT_AIRSIDE, TRUE)
IF DOES_SCENARIO_GROUP_EXIST("LSA_Planes")
AND IS_SCENARIO_GROUP_ENABLED("LSA_Planes")
SET_SCENARIO_GROUP_ENABLED("LSA_Planes", FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Disabled scenario group LSA_Planes") ENDIF #ENDIF
ENDIF
bHasChanged = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN) //ensure bChange is set to the state of "player has changed outfit" at the start of the mission
vJetPlaneEngineRear[0] = <<12.75,6,-7>>
vJetPlaneEngineRear[1] = <<22.75,-4,-7>>
vJetPlaneEngineRear[2] = <<-12.75,6,-7>>
vJetPlaneEngineRear[3] = <<-22.75,-4,-7>>
vJetPlaneEngineFront[0] = <<12.75,15,-7>>
vJetPlaneEngineFront[1] = <<22.75,5,-7>>
vJetPlaneEngineFront[2] = <<-12.75,15,-7>>
vJetPlaneEngineFront[3] = <<-22.75,5,-7>>
vCargoPlaneEngineRear[0] = <<15,-8,-4>>
vCargoPlaneEngineRear[1] = <<29,-17,-4>>
vCargoPlaneEngineRear[2] = <<-15,-8,-4>>
vCargoPlaneEngineRear[3] = <<-29,-17,-4>>
vCargoPlaneEngineFront[0] = <<15,8,-4>>
vCargoPlaneEngineFront[1] = <<29,-1,-4>>
vCargoPlaneEngineFront[2] = <<-15,8,-4>>
vCargoPlaneEngineFront[3] = <<-29,-1,-4>>
REQUEST_VEHICLE_ASSET(modelVehicle[EXT2_MODEL_BLAZER])
EXT2_REGISTER_BARRIER_FOR_PED(PLAYER_PED_ID(), TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Finished mission setup") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Spawn Dom and setup his attributes.
PROC EXT2_SPAWN_DOM(BOOL b_spawn_dom_on_atv, BOOL b_give_parachute = FALSE)
EXT2_ENSURE_MODEL_IS_LOADED(modelPed[EXT2_MODEL_DOM])
IF IS_ENTITY_ALIVE(pedDom)
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
AND NOT IS_PED_IN_VEHICLE(pedDom, vehATV[VEHICLE_DOM])
SET_PED_INTO_VEHICLE(pedDom, vehATV[VEHICLE_DOM])
ENDIF
ELSE
IF b_spawn_dom_on_atv = TRUE
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
EXT2_CREATE_PED_IN_VEHICLE(vehATV[VEHICLE_DOM], pedDom, modelPed[EXT2_MODEL_DOM], VS_DRIVER)
ENDIF
ELSE
EXT2_CREATE_PED(pedDom, modelPed[EXT2_MODEL_DOM], vLandingPos, fPlayerOutro-180)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Dom didn't exist so created him") ENDIF #ENDIF
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelPed[EXT2_MODEL_DOM])
EXT2_SET_PED_AS_PLAYER_FRIEND(pedDom)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(pedDom, KNOCKOFFVEHICLE_NEVER)
SET_ENTITY_LOD_DIST(pedDom, 500)
ADD_PED_FOR_DIALOGUE(sConversation, 3, pedDom, "DOM")
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(pedDom, TRUE)
SET_PED_CAN_BE_TARGETTED(pedDom, FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(pedDom, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDom, TRUE)
SET_PED_PROP_INDEX(pedDom, ANCHOR_EARS, 0, 0)
SET_PED_HELMET(pedDom, FALSE)
SET_PED_DIES_IN_WATER(pedDom, FALSE) // B*1421209
SET_PED_PARACHUTE_TINT_INDEX(pedDom, 6) // Black
IF b_give_parachute = TRUE
SET_PED_COMPONENT_VARIATION(pedDom, INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0)
IF NOT HAS_PED_GOT_WEAPON(pedDom, GADGETTYPE_PARACHUTE)
GIVE_WEAPON_TO_PED(pedDom, GADGETTYPE_PARACHUTE, 1, FALSE, FALSE)
ENDIF
ELSE
SET_PED_COMPONENT_VARIATION(pedDom, INT_TO_ENUM(PED_COMPONENT,8), 2, 0, 0)
ENDIF
IF b_spawn_dom_on_atv = TRUE
AND IS_AUDIO_SCENE_ACTIVE("EXTREME_02_DRIVE_TO_PLANE")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehATV[VEHICLE_DOM], "EXTREME_02_DOMS_ATV")
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Added Dom's ATV to audio mix group EXTREME_02_DRIVE_TO_PLANE") ENDIF #ENDIF
ENDIF
EXT2_REGISTER_BARRIER_FOR_PED(pedDom, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Setup Dom") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Create the jetskis by the shoreline.
PROC EXT2_SPAWN_JETSKIS()
EXT2_LOAD_ASSETS_FOR_MISSION_STATE(stateFinalConversation)
FLOAT z_water_height
GET_WATER_HEIGHT(vJetski, z_water_height)
EXT2_CREATE_VEHICLE(vehJetski, modelVehicle[EXT2_MODEL_SEASHARK], <<vJetski.x, vJetski.y, z_water_height>>, fJetski, -1, 0.0, 0)
SET_VEHICLE_ENGINE_ON(vehJetski, FALSE, TRUE)
SET_BOAT_ANCHOR(vehJetski, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehJetski, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelVehicle[EXT2_MODEL_SEASHARK])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Created jetski") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Sets the standard params on the ATV.
PROC EXT2_SET_PARAMS_ON_ATV(INT i)
IF IS_ENTITY_ALIVE(vehATV[i])
SET_VEHICLE_CAN_LEAK_OIL(vehATV[i], FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(vehATV[i], FALSE)
SET_VEHICLE_DOORS_LOCKED(vehATV[i], VEHICLELOCK_UNLOCKED)
SET_VEHICLE_HAS_STRONG_AXLES(vehATV[i], TRUE)
IF NOT GET_IS_VEHICLE_ENGINE_RUNNING(vehATV[i])
SET_VEHICLE_ENGINE_ON(vehATV[i], TRUE, TRUE)
ENDIF
IF i = VEHICLE_DOM
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vehATV[i], TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Create the cargo plane, ATVs, etc for the skydive.
PROC EXT2_CREATE_CARGO_PLANE_FOR_SKYDIVE()
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE, 1, FALSE, FALSE)
ENDIF
EXT2_LOAD_ASSETS_FOR_MISSION_STATE(stateJumpOutPlane)
EXT2_CREATE_VEHICLE(vehPlaneSkydive, modelVehicle[EXT2_MODEL_CARGOPLANE], GET_POSITION_OF_VEHICLE_RECORDING_ID_AT_TIME(GET_VEHICLE_RECORDING_ID(600, "Ext2_CargoFlight"), 0), fPlaneEnd)
SET_MODEL_AS_NO_LONGER_NEEDED(modelVehicle[EXT2_MODEL_CARGOPLANE])
EXT2_CREATE_PED_IN_VEHICLE(vehPlaneSkydive, pedPlanePilot[0], modelPed[EXT2_MODEL_PILOT], VS_DRIVER)
IF IS_ENTITY_ALIVE(pedPlanePilot[0])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedPlanePilot[0], TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelPed[EXT2_MODEL_PILOT])
START_PLAYBACK_RECORDED_VEHICLE(vehPlaneSkydive, 600, "Ext2_CargoFlight")
PAUSE_PLAYBACK_RECORDED_VEHICLE(vehPlaneSkydive)
SET_VEHICLE_ENGINE_ON(vehPlaneSkydive, TRUE, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehPlaneSkydive, FALSE)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vehPlaneSkydive, FALSE)
SET_VEHICLE_CAN_BREAK(vehPlaneSkydive, FALSE)
SET_ENTITY_PROOFS(vehPlaneSkydive, TRUE, TRUE, TRUE, TRUE, TRUE)
SET_VEHICLE_DOOR_OPEN(vehPlaneSkydive, SC_DOOR_REAR_LEFT)
SET_ENTITY_LOD_DIST(vehPlaneSkydive, 10000)
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vATVOnPlane[VEHICLE_PLAYER], 0) // In case the player was parachuting and he's z skipping back to retry the skydive
ENDIF
SAFE_DELETE_PED(pedDom)
INT i = 0
REPEAT NUM_ATVS i
SAFE_DELETE_VEHICLE(vehATV[i])
EXT2_CREATE_VEHICLE(vehATV[i], modelVehicle[EXT2_MODEL_BLAZER], vATVOnPlane[i], 91,-1,0.0,i)
EXT2_SET_PARAMS_ON_ATV(i)
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(modelVehicle[EXT2_MODEL_BLAZER])
IF NOT IS_REPLAY_BEING_SET_UP()
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER], VS_DRIVER)
ENDIF
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehATV[VEHICLE_DOM], FALSE)
EXT2_SPAWN_DOM(TRUE, TRUE)
EXT2_SET_FRANKLIN_INTO_SKYDIVING_OUTFIT(TRUE)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_WEATHER_TYPE_NOW_PERSIST("CLOUDS")
SET_LIGHT_RIG_ON_CARGO_PLANE(TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Setup cargo plane for skydive") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Creates the flatbed truck if it's not already present.
PROC EXT2_CREATE_INTRO_TRUCK()
IF NOT DOES_ENTITY_EXIST(vehIntroTruck)
EXT2_CREATE_VEHICLE(vehIntroTruck, modelVehicle[EXT2_MODEL_FLATBED], vIntroTruck, fIntroTruck, 2, 0)
SET_VEHICLE_ON_GROUND_PROPERLY(vehIntroTruck)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelVehicle[EXT2_MODEL_FLATBED])
IF IS_ENTITY_ALIVE(vehIntroTruck)
SET_VEHICLE_DOORS_LOCKED(vehIntroTruck, VEHICLELOCK_LOCKED)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehIntroTruck, FALSE)
ENDIF
ENDPROC
/// PURPOSE:
/// Creates the flatbed truck if it's not already present.
PROC EXT2_CREATE_ATV(INT i)
IF NOT DOES_ENTITY_EXIST(vehATV[i])
EXT2_CREATE_VEHICLE(vehATV[i], modelVehicle[EXT2_MODEL_BLAZER], vATV[i], fATV[i],-1,0.0,i)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: vehATV ", i, " didn't exist so created it") ENDIF #ENDIF
ENDIF
EXT2_SET_PARAMS_ON_ATV(i)
ENDPROC
/// PURPOSE:
/// Various setup just before the mocap finishes.
PROC EXT2_SETUP_BEFORE_MOCAP_FINISHES()
EXT2_LOAD_ASSETS_FOR_MISSION_STATE(stateIntro)
INT i = 0
REPEAT NUM_ATVS i
EXT2_CREATE_ATV(i)
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(modelVehicle[EXT2_MODEL_BLAZER])
IF NOT IS_REPLAY_BEING_SET_UP()
AND IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF IS_SCREEN_FADED_OUT()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerAfterIntro, fPlayerAfterIntro)
ENDIF
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
ENDIF
ENDIF
EXT2_START_AUDIO_SCENE("EXTREME_02_DRIVE_TO_PLANE", TRUE)
EXT2_SPAWN_DOM(TRUE, TRUE)
ADD_PED_FOR_DIALOGUE(sConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
ENDPROC
/// PURPOSE:
/// Creates the cloud ptfx.
PROC EXT2_CREATE_CLOUD_PTFX()
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_moving_clouds)
IF IS_ENTITY_ALIVE(vehPlaneSkydive)
fCloudsCurrentAlpha = 0.4
ptfx_moving_clouds = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_extrm2_moving_cloud", vehPlaneSkydive, <<0,-20,-13>>, <<0,0,0>>)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Created ptfx_moving_clouds") ENDIF #ENDIF
ENDIF
ELSE
SET_PARTICLE_FX_LOOPED_ALPHA(ptfx_moving_clouds, fCloudsCurrentAlpha)
ENDIF
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_wind_and_smoke)
ptfx_wind_and_smoke = START_PARTICLE_FX_LOOPED_AT_COORD("scr_rcext2_cargo_smoke", <<417.0, 3920.0, 1449.0>>, <<0,0,0>>)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Created ptfx_wind_and_smoke") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles debug skipping.
/// PARAMS:
/// i_new_state - The state to debug skip to.
PROC EXT2_DEBUG_SKIP_STATE(INT i_new_state)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Starting debug skip to ", i_new_state, "...") ENDIF #ENDIF
RC_START_Z_SKIP()
iCutsceneStage = -1
bZSkipping = TRUE
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()))
ENDIF
EXT2_SET_FRANKLIN_INTO_SKYDIVING_OUTFIT(FALSE)
EXT2_MISSION_CLEANUP(TRUE)
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100, TRUE)
SWITCH i_new_state
CASE Z_SKIP_INTRO
CLEAR_AREA_OF_OBJECTS(vIntroTruck, 100) // B*1086415, 1513300 - Ensure barrier gets remade
missionStateSkip = stateIntro
BREAK
CASE Z_SKIP_GO_IN_AIRPORT
CLEAR_AREA_OF_OBJECTS(vIntroTruck, 100) // B*1086415, 1513300 - Ensure barrier gets remade
EXT2_LOAD_ASSETS_FOR_MISSION_STATE(stateIntro)
EXT2_SETUP_BEFORE_MOCAP_FINISHES()
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
START_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM], 500, "Ext2_DomIntoAirport")
PAUSE_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM])
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM], 1000)
ENDIF
CREATE_VEHICLE_FOR_REPLAY(vehForReplay, vPlayerCarRespot, fPlayerCarRespot, FALSE, FALSE, FALSE, FALSE, FALSE)
EXT2_CREATE_INTRO_TRUCK()
missionStateSkip = stateGoIntoAirport
BREAK
CASE Z_SKIP_DRIVE_OUT_PLANE
EXT2_CREATE_CARGO_PLANE_FOR_SKYDIVE()
EXT2_START_AUDIO_SCENE("EXTREME_02_INSIDE_PLANE", TRUE)
missionStateSkip = stateJumpOutPlane
BREAK
CASE Z_SKIP_LANDED_AFTER_SKYDIVE
EXT2_SPAWN_DOM(FALSE)
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerOutro, fPlayerOutro)
ENDIF
EXT2_SET_FRANKLIN_INTO_SKYDIVING_OUTFIT(TRUE)
EXT2_SPAWN_JETSKIS()
missionStateSkip = stateFinalConversation
BREAK
CASE Z_SKIP_MISSION_PASSED
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerOutro, fPlayerOutro)
ENDIF
missionStateSkip = stateMissionPassed
BREAK
ENDSWITCH
ADD_PED_FOR_DIALOGUE(sConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
IF NOT IS_REPLAY_BEING_SET_UP()
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
ENDIF
IF i_new_state = Z_SKIP_GO_IN_AIRPORT
TRIGGER_MUSIC_EVENT("EXTREME2_RESTART1") // Restart this music here, see B*1131790
ELIF i_new_state = Z_SKIP_DRIVE_OUT_PLANE
TRIGGER_MUSIC_EVENT("EXTREME2_RESTART2")
ENDIF
IF i_new_state = Z_SKIP_GO_IN_AIRPORT
OR i_new_state = Z_SKIP_DRIVE_OUT_PLANE
END_REPLAY_SETUP(vehATV[VEHICLE_PLAYER])
WAIT(500) // Let the ATVs settle
ELSE
END_REPLAY_SETUP()
ENDIF
IF i_new_state = Z_SKIP_MISSION_PASSED
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SAFE_FADE_SCREEN_IN_FROM_BLACK() // Screen needs to be fully faded back in before the mission complete GUI stuff will display
ENDIF
IF i_new_state = Z_SKIP_INTRO
OR i_new_state = Z_SKIP_LANDED_AFTER_SKYDIVE
RC_END_Z_SKIP(TRUE, FALSE)
ELIF i_new_state = Z_SKIP_DRIVE_OUT_PLANE
RC_END_Z_SKIP(TRUE, TRUE, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL, SPECIAL_P1_PARACHUTE, FALSE) // B*1742706 Ensure player has parachute
ELSE
RC_END_Z_SKIP()
ENDIF
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Finished debug skip to ", i_new_state) ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Handles the player getting off his ATV during any mission state prior to the midtro.
PROC EXT2_CHECK_PLAYER_STILL_ON_ATV()
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
IF bPlayerIsOnATV = TRUE
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
CLEAR_PRINTS()
IF missionState = stateGoIntoAirport
SAFE_REMOVE_BLIP(blipDom)
SAFE_REMOVE_BLIP(blipPlane)
ENDIF
IF bDisplayedGetBackOnATV = FALSE
PRINT_NOW("EXT2_09", DEFAULT_GOD_TEXT_TIME, 1) // Get back on your ~b~ATV.
bDisplayedGetBackOnATV = TRUE
ENDIF
IF NOT DOES_BLIP_EXIST(blipPlayerATV)
blipPlayerATV = CREATE_VEHICLE_BLIP(vehATV[VEHICLE_PLAYER])
ENDIF
bPlayerIsOnATV = FALSE
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
CLEAR_PRINTS()
SAFE_REMOVE_BLIP(blipPlayerATV)
SWITCH missionState
CASE stateGoIntoAirport
IF IS_ENTITY_ALIVE(vehPlaneChase)
AND NOT DOES_BLIP_EXIST(blipPlane)
blipPlane = CREATE_VEHICLE_BLIP(vehPlaneChase)
ENDIF
IF iTimesDisplayedRideATVObjective < 2
PRINT_NOW("EXT2_02", DEFAULT_GOD_TEXT_TIME, 1) // Follow Dom on to the ~b~cargo plane.
iTimesDisplayedRideATVObjective++
ENDIF
BREAK
CASE stateJumpOutPlane
IF iTimesDisplayedRideATVObjective < 2
PRINT_NOW("EXT2_08", DEFAULT_GOD_TEXT_TIME, 1) // Ride your ATV out of the plane.
iTimesDisplayedRideATVObjective++
ENDIF
BREAK
ENDSWITCH
bPlayerIsOnATV = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks the player doesn't abandon Dom, and fails the mission if necessary.
PROC EXT2_CHECK_PLAYER_ISNT_ABANDONING_DOM()
IF bZSkipping = FALSE
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedDom) > 500
IF statusDomATV = ATV_CHASE_PLANE
OR statusDomATV = ATV_ATTACHED
EXT2_MISSION_FAILED(FAILED_DIDNT_DRIVE_ATV)
ELSE
EXT2_MISSION_FAILED(FAILED_DIDNT_FOLLOW_DOM)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles displaying the hint camera and text for Dom.
PROC EXT2_MANAGE_DISPLAY_DOM_FOCUS_CAMERA_HELP_TEXT()
IF IS_ENTITY_ALIVE(pedDom)
CONTROL_ENTITY_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, pedDom)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles displaying the hint camera and text for the landing zone.
PROC EXT2_MANAGE_LANDING_ZONE_FOCUS_CAMERA()
CONTROL_COORD_CHASE_HINT_CAM_ON_FOOT(localChaseHintCamStruct, vCheckpoint, "EXT2_15") // Press ~INPUT_VEH_CIN_CAM~ to toggle focus on the landing zone.
ENDPROC
/// PURPOSE:
/// Handles displaying the hint camera and text for the cargo plane.
PROC EXT2_MANAGE_PLANE_FOCUS_CAMERA()
IF IS_ENTITY_ALIVE(vehPlaneChase)
AND IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER]) // See B*904583 - only allow hint camera on plane if the player is on his ATV
IF GET_DISTANCE_BETWEEN_ENTITIES(vehPlaneChase, vehATV[VEHICLE_PLAYER]) < 500
CONTROL_ENTITY_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, vehPlaneChase, "EXT2_12") // Press ~INPUT_VEH_CIN_CAM~ to toggle focus on the cargo plane.
IF IS_GAMEPLAY_HINT_ACTIVE()
EXT2_START_AUDIO_SCENE("EXTREME_02_FOCUS_ON_PLANE", TRUE)
ELSE
EXT2_START_AUDIO_SCENE("EXTREME_02_FOCUS_ON_PLANE", FALSE)
ENDIF
ENDIF
ELIF IS_GAMEPLAY_HINT_ACTIVE()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Returns TRUE if a conversation can be played.
FUNC BOOL EXT2_ALLOW_CONVERSATION_TO_PLAY(BOOL b_check_for_god_text = TRUE)
IF bZSkipping = TRUE
RETURN FALSE
ENDIF
IF b_check_for_god_text = TRUE // If FALSE the conversation is set to not display subtitles ever, so play conversation regardless of whether there is god text onscreen or not
AND IS_MESSAGE_BEING_DISPLAYED()
AND GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) > 0 // B*665755 Support playing conversations over god text when subtitles are turned off
RETURN FALSE
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Handles the ambient airport plane moving around.
PROC EXT2_MANAGE_AMBIENT_AIRPORT_PLANE()
IF IS_ENTITY_ALIVE(vehAirportPlane)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehAirportPlane)
SET_PLAYBACK_SPEED(vehAirportPlane, 0.32)
ENDIF
ENDPROC
/// PURPOSE:
/// Creates the airport planes.
PROC EXT2_SPAWN_AIRPORT_PLANES()
VECTOR v_plane_rot = GET_ROTATION_OF_VEHICLE_RECORDING_ID_AT_TIME(GET_VEHICLE_RECORDING_ID(503, "Ext2_CargoTakeOff"), 0)
EXT2_CREATE_VEHICLE(vehPlaneChase, modelVehicle[EXT2_MODEL_CARGOPLANE], GET_POSITION_OF_VEHICLE_RECORDING_ID_AT_TIME(GET_VEHICLE_RECORDING_ID(503, "Ext2_CargoTakeOff"), 0), v_plane_rot.z)
SET_MODEL_AS_NO_LONGER_NEEDED(modelVehicle[EXT2_MODEL_CARGOPLANE])
IF IS_ENTITY_ALIVE(vehPlaneChase)
EXT2_CREATE_PED_IN_VEHICLE(vehPlaneChase, pedPlanePilot[0], modelPed[EXT2_MODEL_PILOT], VS_DRIVER)
IF IS_ENTITY_ALIVE(pedPlanePilot[0])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedPlanePilot[0], TRUE)
ENDIF
SET_ENTITY_LOAD_COLLISION_FLAG(vehPlaneChase, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehPlaneChase, FALSE)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vehPlaneChase, FALSE)
SET_VEHICLE_CAN_BREAK(vehPlaneChase, FALSE)
SET_ENTITY_PROOFS(vehPlaneChase, TRUE, TRUE, TRUE, TRUE, TRUE)
SET_VEHICLE_DOOR_OPEN(vehPlaneChase, SC_DOOR_REAR_LEFT)
SET_ENTITY_LOD_DIST(vehPlaneChase, 10000)
CONTROL_LANDING_GEAR(vehPlaneChase, LGC_DEPLOY_INSTANT)
START_PLAYBACK_RECORDED_VEHICLE(vehPlaneChase, 503, "Ext2_CargoTakeOff")
PAUSE_PLAYBACK_RECORDED_VEHICLE(vehPlaneChase)
SET_VEHICLE_ENGINE_ON(vehPlaneChase, TRUE, TRUE)
ENDIF
EXT2_CREATE_VEHICLE(vehAirportPlane, modelVehicle[EXT2_MODEL_JET], GET_POSITION_OF_VEHICLE_RECORDING_ID_AT_TIME(GET_VEHICLE_RECORDING_ID(502, "Ext2_AirportVeh"), 0), 161.569275, 0, 0.0, 0)
SET_MODEL_AS_NO_LONGER_NEEDED(modelVehicle[EXT2_MODEL_JET])
IF IS_ENTITY_ALIVE(vehAirportPlane)
EXT2_CREATE_PED_IN_VEHICLE(vehAirportPlane, pedPlanePilot[1], modelPed[EXT2_MODEL_PILOT], VS_DRIVER)
IF IS_ENTITY_ALIVE(pedPlanePilot[1])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedPlanePilot[1], TRUE)
ENDIF
SET_VEHICLE_LIVERY(vehAirportPlane, 0)
SET_ENTITY_LOD_DIST(vehAirportPlane, 5000)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehAirportPlane, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(vehAirportPlane, 502, "Ext2_AirportVeh")
SET_VEHICLE_ENGINE_ON(vehAirportPlane, TRUE, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelPed[EXT2_MODEL_PILOT])
ENDPROC
/// PURPOSE:
/// Returns TRUE if the player's ATV is within an acceptable area to attach to the plane.
FUNC BOOL EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(FLOAT f_x_to_check_positive, FLOAT f_x_to_check_negative, FLOAT f_y_to_check, FLOAT f_z_to_check)
IF IS_ENTITY_ALIVE(vehPlaneChase)
vPlayerRampOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehPlaneChase,<<0,-20,-3>>)
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
vATVOffsetFromPlane = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehPlaneChase, GET_ENTITY_COORDS(vehATV[VEHICLE_PLAYER]))
VECTOR vPlayerOffsetFromPlane = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehPlaneChase, GET_ENTITY_COORDS(PLAYER_PED_ID()))
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player pos within acceptable area to attach to plane") ENDIF #ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: vATVOffsetFromPlane = ", vATVOffsetFromPlane) ENDIF #ENDIF
IF vPlayerOffsetFromPlane.x < f_x_to_check_positive
AND vPlayerOffsetFromPlane.x > f_x_to_check_negative
AND vPlayerOffsetFromPlane.y > f_y_to_check
AND vPlayerOffsetFromPlane.y < 25.0 // B*1546920 Check for player not being ahead of the plane
AND vPlayerOffsetFromPlane.z > f_z_to_check
AND vATVOffsetFromPlane.x < f_x_to_check_positive
AND vATVOffsetFromPlane.x > f_x_to_check_negative
AND vATVOffsetFromPlane.y > f_y_to_check
AND vATVOffsetFromPlane.y < 25.0 // B*1546920 Check for player not being ahead of the plane
AND vATVOffsetFromPlane.z > f_z_to_check
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handles rubber banding for the cargo plane's speed based upon player distance from it.
PROC EXT2_MANAGE_CARGO_PLANE_SPEED()
FLOAT fDist
FLOAT fPlaybackModifier
FLOAT fPlaybackSpeed
IF bShutCargoPlaneDoors = TRUE
fPlaybackSpeed = 0.65 // B*1146534 Ensure plane is going quickly when the cargo plane doors close with the player outside
ELIF statusDomATV = ATV_ATTACHED // When Dom is attached to the plane, use rubber banding for the plane's playback speed depending on player distance
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
fDist = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPlayerRampOffset)
IF fDist > 80
fDist = 80
ENDIF
fPlaybackModifier = (fDist / 100) / 2
IF fDist < 40
fPlaybackSpeed = 0.25 + fPlaybackModifier
ELSE
fPlaybackSpeed = 0.65 - fPlaybackModifier
ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: fDist = ", fDist, " fPlaybackModifier = ", fPlaybackModifier, " fPlaybackSpeed = ", fPlaybackSpeed) ENDIF #ENDIF
ENDIF
ELSE // Until Dom is attached to the plane, keep the plane's playback speed constant
fPlaybackSpeed = 0.35
ENDIF
IF IS_ENTITY_ALIVE(vehPlaneChase)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlaneChase)
SET_PLAYBACK_SPEED(vehPlaneChase, fPlaybackSpeed)
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: GET_POSITION_IN_RECORDING(vehPlaneChase) = ", GET_POSITION_IN_RECORDING(vehPlaneChase)) ENDIF #ENDIF
IF bShutCargoPlaneDoors = FALSE
AND GET_POSITION_IN_RECORDING(vehPlaneChase) > 340
IF EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(2, -2, -40, -7) // B*651102 If the player is on the ramp just allow it
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player is touching ramp so just progress") ENDIF #ENDIF
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Shutting cargo plane doors") ENDIF #ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_gen_sparks)
STOP_PARTICLE_FX_LOOPED(ptfx_gen_sparks)
ENDIF
SET_VEHICLE_DOORS_SHUT(vehPlaneChase, FALSE)
bShutCargoPlaneDoors = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Returns FALSE if we should allow god text or help text to display when following Dom or driving into the plane.
FUNC BOOL EXT2_ALLOW_TEXT_TO_DISPLAY()
IF IS_ENTITY_ALIVE(vehPlaneChase)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlaneChase)
AND GET_POSITION_IN_RECORDING(vehPlaneChase) > 325 // Don't display if plane is about to take out
RETURN FALSE
ENDIF
IF IS_ENTITY_ALIVE(pedDom)
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedDom) > 300 // Don't display if far away from Dom and mission is about to fail
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Handles attaching the player to the moving plane.
PROC EXT2_MANAGE_PLANE_TAKING_OFF()
IF statusDomATV = ATV_ATTACHED
AND IS_ENTITY_ALIVE(vehPlaneChase)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlaneChase)
fCurrentPlanePlaybackPosition = GET_POSITION_IN_RECORDING(vehPlaneChase)
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: fCurrentPlanePlaybackPosition = ", fCurrentPlanePlaybackPosition) ENDIF #ENDIF
IF fCurrentPlanePlaybackPosition > 450
CONTROL_LANDING_GEAR(vehPlaneChase, LGC_RETRACT)
EXT2_MISSION_FAILED(FAILED_DIDNT_DRIVE_ATV)
ELSE // Play some conversations from Dom to encourage the player to ride into the plane
IF IS_ENTITY_ALIVE(pedDom)
AND EXT2_ALLOW_CONVERSATION_TO_PLAY()
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedDom, 50)
IF bStartedDriveInPlaneConversation1 = FALSE
AND fCurrentPlanePlaybackPosition < 200 // Don't play this line if the plane is nearing the end of the runway
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_REMIND1", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_REMIND1 conversation") ENDIF #ENDIF
bStartedDriveInPlaneConversation1 = TRUE
ENDIF
IF bStartedDriveInPlaneConversation2 = FALSE
AND fCurrentPlanePlaybackPosition > 200 // Only play when plane is far down runway prior to taking off...
AND fCurrentPlanePlaybackPosition < 325 // ...but not too far (B*650590)
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_REMIND2", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_REMIND2 conversation") ENDIF #ENDIF
bStartedDriveInPlaneConversation2 = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the plane sfx.
PROC EXT2_MANAGE_PLANE_SFX(VEHICLE_INDEX veh_plane, FLOAT f_initial_value)
IF IS_ENTITY_ALIVE(veh_plane)
IF bPlayingPlaneStream = FALSE
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), veh_plane, 200)
AND LOAD_STREAM("Plane_Interior", "EXTREME_02_SOUNDSET")
PLAY_STREAM_FRONTEND()
SET_VARIABLE_ON_STREAM("INOUT", f_initial_value)
bPlayingPlaneStream = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Playing Plane_Interior audio stream now") ENDIF #ENDIF
ENDIF
ELSE
VECTOR v_temp = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(veh_plane, GET_ENTITY_COORDS(PLAYER_PED_ID()))
IF v_temp.x < 2.5
AND v_temp.x > -2.5
AND v_temp.z > -6
AND v_temp.y < 30
AND v_temp.y > -40
// Player inside plane so need to work out how much
FLOAT f_distance_along_plane = (v_temp.y - 30) / 70 // 30 is at ladder inside plane, -40 is at bottom of ramp, 70 is the difference
fStreamInOut = ABSF(f_distance_along_plane)
ELSE // Player fully outside plane
fStreamInOut = 1.0
ENDIF
IF fStreamInOut < 0
fStreamInOut = 0
ELIF fStreamInOut > 1
fStreamInOut = 1
ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: fStreamInOut = ", fStreamInOut) ENDIF #ENDIF
SET_VARIABLE_ON_STREAM("INOUT", fStreamInOut)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Sets the radar to the interior of the plane.
PROC EXT1_SET_RADAR_TO_PLANE_INTERIOR()
IF NOT IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_IN()
IF IS_ENTITY_ALIVE(vehPlaneSkydive)
VECTOR v_plane_pos = GET_ENTITY_COORDS(vehPlaneSkydive)
SET_RADAR_AS_INTERIOR_THIS_FRAME(GET_HASH_KEY("V_FakeCargoPlaneClimb"), v_plane_pos.x, v_plane_pos.y, FLOOR(GET_ENTITY_HEADING(vehPlaneSkydive)), 1)
ENDIF
IF IS_HUD_HIDDEN()
DISPLAY_HUD(TRUE)
ENDIF
IF IS_RADAR_HIDDEN()
DISPLAY_RADAR(TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles attaching the player to the moving plane.
PROC EXT2_MANAGE_PLAYER_ATTACH_TO_PLANE()
IF IS_ENTITY_ALIVE(vehPlaneChase)
IF EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(2, -2, -24, -4)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player reached cargo plane interior ok") ENDIF #ENDIF
REPLAY_RECORD_BACK_FOR_TIME(3.0)
iPlayerAttachedTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
KILL_ANY_CONVERSATION()
ENDIF
IF bStartedDriveInPlaneConversation3 = FALSE
AND EXT2_ALLOW_CONVERSATION_TO_PLAY()
AND NOT IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
AND EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(1.5, -1.5, -50, -10)
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_BACK", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_BACK conversation") ENDIF #ENDIF
bStartedDriveInPlaneConversation3 = TRUE
EXT2_START_AUDIO_SCENE("EXTREME_02_DRIVE_TO_PLANE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_DRIVE_UP_RAMP", TRUE)
ENDIF
IF bStartedEnterPlaneMusicEvent = FALSE
AND EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(2, -2, -30, -10)
TRIGGER_MUSIC_EVENT("EXTREME2_ENTER")
bStartedEnterPlaneMusicEvent = TRUE
ENDIF
IF (GET_GAME_TIMER() - iPlayerCurseTimer) > 50 // B*861994 Play a curse from Franklin if he drives off the side of the ramp
iPlayerCurseTimer = GET_GAME_TIMER()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_SCRIPTED_SPEECH_PLAYING(PLAYER_PED_ID())
AND NOT IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
IF EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(3.5, 1.6, -40, -5.75)
OR EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(-1.6, -3.5, -40, -5.75)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player within swear area so playing a curse") ENDIF #ENDIF
PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "GENERIC_CURSE_HIGH", SPEECH_PARAMS_INTERRUPT)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Dom yells while driving out of the plane.
PROC EXT2_MANAGE_REMIND_DIALOGUE()
IF iDoneRemindConversation < 3
AND (GET_GAME_TIMER() - iRemindConversationTimer) > 9000
AND EXT2_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_REMIND", CONV_PRIORITY_HIGH, DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_REMIND conversation") ENDIF #ENDIF
iDoneRemindConversation++
iRemindConversationTimer = GET_GAME_TIMER()
ENDIF
ENDPROC
/// PURPOSE:
/// Handles attaching Dom to the moving plane.
PROC EXT2_MANAGE_DOM_ATTACH_TO_PLANE()
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
SWITCH statusDomATV
CASE ATV_INTO_AIRPORT
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehATV[VEHICLE_DOM])
fCurrentDomPlaybackPosition = GET_POSITION_IN_RECORDING(vehATV[VEHICLE_DOM])
SET_PLAYBACK_SPEED(vehATV[VEHICLE_DOM], 1.04)
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: fCurrentDomPlaybackPosition = ", fCurrentDomPlaybackPosition) ENDIF #ENDIF
IF bStartedFirstConversation = FALSE
IF EXT2_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_START", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_START conversation") ENDIF #ENDIF
bStartedFirstConversation = TRUE
ENDIF
ELIF bStartedGuardConversation = FALSE
IF EXT2_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND IS_ENTITY_ALIVE(pedDom)
AND IS_ENTITY_ALIVE(pedAirportBooth)
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_GATE", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_GATE conversation") ENDIF #ENDIF
bStartedGuardConversation = TRUE
TASK_LOOK_AT_ENTITY(pedDom, pedAirportBooth, 2000)
TASK_LOOK_AT_ENTITY(pedAirportBooth, pedDom, 4000)
ENDIF
ENDIF
IF fCurrentDomPlaybackPosition > 265
SAFE_RELEASE_PED(pedAirportBooth)
FORCE_AUTOMATIC_DOOR_SLIDE_OPEN(AUTODOOR_AIRPORT_BARRIER_IN, FALSE)
IF IS_ENTITY_ALIVE(vehPlaneChase)
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(vehPlaneChase)
ptfx_gen_sparks = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_rcext2_ramp_scrape", vehPlaneChase, <<0,-40,-6.45>>, <<0,0,0>>)
objectInvisibleProp = CREATE_OBJECT(modelInvisibleProp, GET_ENTITY_COORDS(vehPlaneChase))
SET_ENTITY_COLLISION(objectInvisibleProp, FALSE)
SET_ENTITY_VISIBLE(objectInvisibleProp, FALSE)
ATTACH_ENTITY_TO_ENTITY(objectInvisibleProp, vehPlaneChase, 0, <<0,-40,-6.45>>, <<0,0,0>>)
PLAY_SOUND_FROM_ENTITY(iSparksSound, "Scraping_Ramp", objectInvisibleProp, "EXTREME_02_SOUNDSET")
ENDIF
iTimesDisplayedRideATVObjective = 0
statusDomATV = ATV_CHASE_PLANE
ENDIF
ENDIF
BREAK
CASE ATV_CHASE_PLANE
EXT2_MANAGE_PLANE_FOCUS_CAMERA()
EXT2_MANAGE_CARGO_PLANE_SPEED()
EXT2_MANAGE_REMIND_DIALOGUE()
IF IS_ENTITY_ALIVE(vehPlaneChase)
vDomRampOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehPlaneChase, GET_ENTITY_COORDS(vehATV[VEHICLE_DOM]))
IF vDomRampOffset.x < 3
AND vDomRampOffset.x > -3
AND vDomRampOffset.y > -8
AND vDomRampOffset.z > -7
SAFE_REMOVE_BLIP(blipDom)
EXT2_STOP_CARREC_IF_PLAYING(vehATV[VEHICLE_DOM])
VECTOR v_attach_offset
v_attach_offset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehPlaneChase, GET_ENTITY_COORDS(vehATV[VEHICLE_DOM]))
ATTACH_ENTITY_TO_ENTITY(vehATV[VEHICLE_DOM], vehPlaneChase, 0, v_attach_offset, <<0,0,0>>, FALSE, FALSE, TRUE)
statusDomATV = ATV_ATTACHED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: statusDomATV = ATV_ATTACHED, v_attach_offset = ", v_attach_offset) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE ATV_ATTACHED
EXT2_MANAGE_PLANE_FOCUS_CAMERA()
EXT2_MANAGE_CARGO_PLANE_SPEED()
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Handles starting the runway music event when the player reaches the runway.
PROC EXT2_MANAGE_RUNWAY_MUSIC_EVENT()
IF bStartedRunwayMusicEvent = FALSE
AND IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
AND IS_ENTITY_IN_ANGLED_AREA(vehATV[VEHICLE_PLAYER], <<-1648.926270,-2752.311279,11.944445>>, <<-1327.844727,-2196.041016,17.944447>>, 50.000000)
TRIGGER_MUSIC_EVENT("EXTREME2_RUNWAY")
bStartedRunwayMusicEvent = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Player has driven near a jet engine so give him a physics blast.
PROC EXT2_CHECK_BLAST_PLAYER_WITH_JET_ENGINE(VECTOR v_engine_pos)
iCheckEngineTimer = GET_GAME_TIMER()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), v_engine_pos, 4)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
KNOCK_PED_OFF_VEHICLE(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player blasted with a jet engine - knocked off ATV") ENDIF #ENDIF
ELSE
IF NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
AND NOT IS_PED_RUNNING_RAGDOLL_TASK(PLAYER_PED_ID())
VECTOR v_entity_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR v_dir = NORMALISE_VECTOR(v_engine_pos - v_entity_pos) // Pull towards engine
v_dir *= 15.0
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 0, 1000, TASK_RELAX, FALSE)
APPLY_FORCE_TO_ENTITY(PLAYER_PED_ID(), APPLY_TYPE_IMPULSE, v_dir, <<0,0,1>>, 0, FALSE, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player blasted with a jet engine - on foot") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Check for the player driving near to an airplane engine.
PROC EXT2_CHECK_PLAYER_NEAR_ENGINES()
IF (GET_GAME_TIMER() - iCheckEngineTimer) > 250
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Checking player proximity to jet engines ", GET_GAME_TIMER()) ENDIF #ENDIF
INT i
VECTOR v_engine_pos
IF IS_ENTITY_ALIVE(vehAirportPlane)
i = 0
REPEAT 4 i
v_engine_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehAirportPlane, vJetPlaneEngineRear[i])
EXT2_CHECK_BLAST_PLAYER_WITH_JET_ENGINE(v_engine_pos)
ENDREPEAT
i = 0
REPEAT 4 i
v_engine_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehAirportPlane, vJetPlaneEngineFront[i])
EXT2_CHECK_BLAST_PLAYER_WITH_JET_ENGINE(v_engine_pos)
ENDREPEAT
ENDIF
IF IS_ENTITY_ALIVE(vehPlaneChase)
i = 0
REPEAT 4 i
v_engine_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehPlaneChase, vCargoPlaneEngineRear[i])
EXT2_CHECK_BLAST_PLAYER_WITH_JET_ENGINE(v_engine_pos)
ENDREPEAT
i = 0
REPEAT 4 i
v_engine_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehPlaneChase, vCargoPlaneEngineFront[i])
EXT2_CHECK_BLAST_PLAYER_WITH_JET_ENGINE(v_engine_pos)
ENDREPEAT
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Creates the airport security guard at the barrier.
PROC EXT2_CREATE_AIRPORT_GUARD()
EXT2_CREATE_PED(pedAirportBooth, modelPed[EXT2_MODEL_SECURITY], vAirportBoothPed, fAirportBoothPed)
SET_MODEL_AS_NO_LONGER_NEEDED(modelPed[EXT2_MODEL_SECURITY])
EXT2_SET_PED_AS_PLAYER_FRIEND(pedAirportBooth)
SET_PED_MAX_HEALTH(pedAirportBooth, 1)
SET_PED_CAN_BE_TARGETTED(pedAirportBooth, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedAirportBooth, TRUE)
TASK_STAND_STILL(pedAirportBooth, -1)
SET_PED_KEEP_TASK(pedAirportBooth, TRUE)
IF NOT HAS_PED_GOT_WEAPON(pedAirportBooth, WEAPONTYPE_SMG)
GIVE_WEAPON_TO_PED(pedAirportBooth, WEAPONTYPE_SMG, 30, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Dom yells while driving out of the plane.
PROC EXT2_MANAGE_DRIVE_OUT_DIALOGUE()
IF bStartedDrivingOutConversation = FALSE
AND EXT2_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_DRIVE", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_DRIVE conversation") ENDIF #ENDIF
bStartedDrivingOutConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Handles Dom facing the player.
PROC EXT2_MANAGE_DOM_AT_LANDING_POS()
IF IS_ENTITY_ALIVE(pedDom)
IF IS_ENTITY_IN_RANGE_COORDS(pedDom, vLandingPos, 2)
IF NOT IS_PED_FACING_PED(pedDom, PLAYER_PED_ID(), 20)
IF NOT IsPedPerformingTask(pedDom, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
AND NOT IsPedPerformingTask(pedDom, SCRIPT_TASK_PERFORM_SEQUENCE)
TASK_LOOK_AT_ENTITY(pedDom, PLAYER_PED_ID(), -1)
TASK_TURN_PED_TO_FACE_ENTITY(pedDom, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Dom told to face player") ENDIF #ENDIF
ENDIF
ELIF NOT IsPedPerformingTask(pedDom, SCRIPT_TASK_PERFORM_SEQUENCE)
OPEN_SEQUENCE_TASK(seqDomAnim)
TASK_PLAY_ANIM(NULL, "rcmjosh1@impatient", "enter")
TASK_PLAY_ANIM(NULL, "rcmjosh1@impatient", "idle_b")
TASK_PLAY_ANIM(NULL, "rcmjosh1@impatient", "exit")
CLOSE_SEQUENCE_TASK(seqDomAnim)
TASK_PERFORM_SEQUENCE(pedDom, seqDomAnim)
CLEAR_SEQUENCE_TASK(seqDomAnim)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Dom performing idles at landing zone") ENDIF #ENDIF
ENDIF
ELSE
IF NOT IsPedPerformingTask(pedDom, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
TASK_FOLLOW_NAV_MESH_TO_COORD(pedDom, vLandingPos, PEDMOVE_RUN)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Dom told to go to vLandingPos") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// B*1561570. Don't continue the EXT2_JUMPOFF conversation if Dom has landed.
PROC EXT2_CHECK_FOR_STOPPING_JUMPOFF_CONVERSATION()
IF bStoppedJumpedOffATVConversation = FALSE
AND IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 t_root = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF ARE_STRINGS_EQUAL(t_root, "EXT2_JUMPOFF")
TEXT_LABEL_23 t_label = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF ARE_STRINGS_EQUAL(t_label, "EXT2_JUMPOFF_1")
OR ARE_STRINGS_EQUAL(t_label, "EXT2_JUMPOFF_2")
OR ARE_STRINGS_EQUAL(t_label, "EXT2_JUMPOFF_3")
// Do nothing
ELSE
bStoppedJumpedOffATVConversation = TRUE
KILL_FACE_TO_FACE_CONVERSATION()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Stopped EXT2_JUMPOFF because Dom is no longer on his ATV") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles Dom skydiving out of the helicopter.
PROC EXT2_MANAGE_DOM_SKYDIVE()
VECTOR v_offset
VECTOR v_dom
VECTOR v_plane
INT i_dom_z
INT i_plane_z
IF IS_ENTITY_ALIVE(pedDom)
IF IS_ENTITY_IN_WATER(pedDom) // Kill Dom to prevent mission not progressing if Dom happens to not deploy his parachute and land in the water - see B*450813
SET_ENTITY_HEALTH(pedDom, 0)
ENDIF
SWITCH domStatus
CASE DOM_IN_PLANE
IF (GET_GAME_TIMER() - iDomRideOutPlaneTimer) > 240000 // See B*1087874 Mission fail for remaining in the plane is triggered from Dom landing on the ground
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
PREPARE_MUSIC_EVENT("EXTREME2_JUMP")
SET_ENTITY_PROOFS(pedDom, TRUE, TRUE, TRUE, TRUE, TRUE)
SET_PED_CAN_TORSO_VEHICLE_IK(pedDom, FALSE)
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
AND IS_ENTITY_ALIVE(vehPlaneSkydive)
v_offset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehPlaneSkydive,<<-1,-50,-4>>)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDom, TRUE)
TASK_VEHICLE_DRIVE_TO_COORD(pedDom, vehATV[VEHICLE_DOM], v_offset, 60, DRIVINGSTYLE_STRAIGHTLINE, modelVehicle[EXT2_MODEL_BLAZER], DF_SwerveAroundAllCars, 3, 100)
bStartedHurryUpConversation = TRUE
domStatus = DOM_DRIVING_OUT_PLANE
ENDIF
ENDIF
BREAK
CASE DOM_DRIVING_OUT_PLANE
IF IS_ENTITY_ALIVE(vehPlaneSkydive)
v_dom = GET_ENTITY_COORDS(pedDom)
v_plane = GET_ENTITY_COORDS(vehPlaneSkydive)
i_dom_z = ROUND(v_dom.z)
i_plane_z = ROUND(v_plane.z)
IF i_dom_z < 250.0
CLEAR_PED_TASKS_IMMEDIATELY(pedDom)
TASK_LEAVE_ANY_VEHICLE(pedDom)
domStatus = DOM_GETTING_OFF_ATV
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Dom getting off ATV") ENDIF #ENDIF
ELIF i_dom_z < (i_plane_z-4) // B*764184
IF bStartedDomTricks = FALSE
bStartedDomTricks = TRUE
IK_CONTROL_FLAGS eIKControlFlags
eIKControlFlags = AIK_DISABLE_LEG_IK | AIK_DISABLE_ARM_IK | AIK_DISABLE_HEAD_IK | AIK_DISABLE_TORSO_IK | AIK_DISABLE_TORSO_REACT_IK | AIK_DISABLE_TORSO_VEHICLE_IK
OPEN_SEQUENCE_TASK(seqDomAnim)
TASK_PLAY_ANIM(NULL, "rcmextreme2atv", "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, DEFAULT, DEFAULT, eIKControlFlags)
TASK_PLAY_ANIM(NULL, "rcmextreme2atv", "idle_b", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, DEFAULT, DEFAULT, eIKControlFlags)
TASK_PLAY_ANIM(NULL, "rcmextreme2atv", "idle_d", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, DEFAULT, DEFAULT, eIKControlFlags)
TASK_PLAY_ANIM(NULL, "rcmextreme2atv", "idle_c", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, DEFAULT, DEFAULT, eIKControlFlags)
TASK_PLAY_ANIM(NULL, "rcmextreme2atv", "idle_e", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, DEFAULT, DEFAULT, eIKControlFlags)
SET_SEQUENCE_TO_REPEAT(seqDomAnim, REPEAT_FOREVER)
CLOSE_SEQUENCE_TASK(seqDomAnim)
TASK_PERFORM_SEQUENCE(pedDom, seqDomAnim)
CLEAR_SEQUENCE_TASK(seqDomAnim)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started Dom's tricks") ENDIF #ENDIF
ENDIF
ELSE
EXT2_MANAGE_DRIVE_OUT_DIALOGUE()
ENDIF
ENDIF
BREAK
CASE DOM_GETTING_OFF_ATV
IF NOT IS_PED_IN_ANY_VEHICLE(pedDom)
TASK_PARACHUTE_TO_TARGET(pedDom, vLandingPos)
domStatus = DOM_SKYDIVING
ENDIF
BREAK
CASE DOM_SKYDIVING
IF GET_PED_PARACHUTE_STATE(pedDom) = PPS_INVALID
SET_PED_COMPONENT_VARIATION(pedDom, INT_TO_ENUM(PED_COMPONENT,8), 2, 0, 0)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Dom has landed") ENDIF #ENDIF
IF missionState = stateJumpOutPlane
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Dom has landed but player is still in the plane, so fail or else all the dialogue will make no sense") ENDIF #ENDIF
EXT2_MISSION_FAILED(FAILED_DIDNT_ATTEMPT_SKYDIVE)
ENDIF
bStoppedJumpedOffATVConversation = FALSE
domStatus = DOM_LANDED
ENDIF
BREAK
CASE DOM_LANDED
EXT2_CHECK_FOR_STOPPING_JUMPOFF_CONVERSATION()
EXT2_MANAGE_DOM_AT_LANDING_POS()
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Dom tells the player to ride out of the plane.
PROC EXT2_MANAGE_LETS_GO_DIALOGUE()
IF bStartedLetsGoConversation = FALSE
AND EXT2_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_LETSGO", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_LETSGO conversation") ENDIF #ENDIF
bStartedLetsGoConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Dom tells the player to hurry up and ride out of the plane.
PROC EXT2_MANAGE_HURRY_UP_DIALOGUE()
IF bStartedHurryUpConversation = FALSE
AND EXT2_ALLOW_CONVERSATION_TO_PLAY()
AND (GET_GAME_TIMER() - iDomRideOutPlaneTimer) > 30000
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_COMEON", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_COMEON conversation") ENDIF #ENDIF
bStartedHurryUpConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Returns TRUE if player is on his ATV.
FUNC BOOL EXT2_IS_PLAYER_ON_ATV()
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Draws the checkpoint ring. Must be called every frame.
PROC EXT2_DRAW_TARGET_MARKER()
DRAW_MARKER(MARKER_RING, vCheckpoint, <<0,0,0>>, vMarkerRotation, <<4, 4, 4>>, 255, 120, 0, 100, FALSE, FALSE)
DRAW_MARKER(MARKER_RING, vCheckpoint, <<0,0,0>>, vMarkerRotation, <<9, 9, 9>>, 255, 120, 0, 100, FALSE, FALSE)
DRAW_MARKER(MARKER_RING, vCheckpoint, <<0,0,0>>, vMarkerRotation, <<14, 14, 14>>, 255, 120, 0, 100, FALSE, FALSE)
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Dom tells the player to perform tricks while skydiving on the ATV.
PROC EXT2_MANAGE_PERFORM_TRICKS_DIALOGUE()
IF bStartedPerformTricksConversation = FALSE
IF EXT2_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_TRICKS", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_TRICKS conversation") ENDIF #ENDIF
bStartedPerformTricksConversation = TRUE
ENDIF
ELIF bStoppedPerformTricksConversation = FALSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
tStoredTricksConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
IF ARE_STRINGS_EQUAL(tStoredTricksConversationLabel, "EXT2_TRICKS_3")
KILL_FACE_TO_FACE_CONVERSATION()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Stopped EXT2_TRICKS conversation") ENDIF #ENDIF
bStoppedPerformTricksConversation = TRUE
ENDIF
ENDIF
ELIF bRestartedPerformTricksConversation = FALSE
IF EXT2_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sConversation, "EXT2AU", "EXT2_TRICKS", tStoredTricksConversationLabel, CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Restarted EXT2_TRICKS conversation with subtitles") ENDIF #ENDIF
bRestartedPerformTricksConversation = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation when the player has jumped off the ATV.
PROC EXT2_MANAGE_JUMPED_OFF_ATV_DIALOGUE()
IF bStartedDidntUseATVConversation = FALSE
IF EXT2_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_NOATV", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_NOATV conversation") ENDIF #ENDIF
bStartedDidntUseATVConversation = TRUE
ENDIF
ELSE
IF bStartedJumpedOffATVConversation = FALSE
AND EXT2_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_JUMPOFF", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_JUMPOFF conversation") ENDIF #ENDIF
bStartedJumpedOffATVConversation = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation when the player has deployed his parachute.
PROC EXT2_MANAGE_DEPLOYED_PARACHUTE_DIALOGUE()
IF bStartedDeployedParachuteConversation = FALSE
AND EXT2_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND IS_ENTITY_ALIVE(pedDom)
IF IS_PED_IN_ANY_VEHICLE(pedDom) // B*1119481 Vary conversation if Dom deploys before player or not (Dom will deploy immediately after getting off his ATV, and this check is simpler than faffing with parachute states)
IF CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_DEPLOY", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_DEPLOY conversation") ENDIF #ENDIF
bStartedDeployedParachuteConversation = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_DEPLOY2", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_DEPLOY2 conversation") ENDIF #ENDIF
bStartedDeployedParachuteConversation = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL EXT2_IS_NOSE_GOING_UP()
FLOAT fPitchDifference
fPitchDifference = fCurrentPitch - fPreviousPitch
IF fPitchDifference > 180
fPitchDifference -= 360
ENDIF
IF fPitchDifference < -180
fPitchDifference += 360
ENDIF
IF fPitchDifference > 0 // nose going up
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL EXT2_HAS_DONE_ROLL()
fCurrentPitch = GET_ENTITY_PITCH(vehATV[VEHICLE_PLAYER])
IF bResetStuntValues = TRUE
fTotalPitch = 0
fPreviousPitch = fCurrentPitch
bResetStuntValues = FALSE
ENDIF
FLOAT fPitchDifferenceABSF = ABSF(ABSF(fCurrentPitch) - ABSF(fPreviousPitch))
IF EXT2_IS_NOSE_GOING_UP()
fTotalPitch += fPitchDifferenceABSF
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Nose going up fPitchDifferenceABSF = ", fPitchDifferenceABSF, " fTotalPitch = ", fTotalPitch) ENDIF #ENDIF
ELSE
fTotalPitch -= fPitchDifferenceABSF
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Nose going down fPitchDifferenceABSF = ", fPitchDifferenceABSF, " fTotalPitch = ", fTotalPitch) ENDIF #ENDIF
ENDIF
fPreviousPitch = fCurrentPitch
IF fTotalPitch < -360
OR fTotalPitch > 360
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Keeps track of the ATV roll done by the player.
PROC EXT2_MANAGE_ATV_ROLL_STATS()
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
AND EXT2_HAS_DONE_ROLL()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player did a forward or backward roll") ENDIF #ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(EXT2_NUMBER_OF_SPINS)
bResetStuntValues = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Shows the checkpoint blip and objective, then draws the marker.
PROC EXT2_SHOW_CHECKPOINT_AND_OBJECTIVE()
IF NOT DOES_BLIP_EXIST(blipCheckpoint)
blipCheckpoint = CREATE_COORD_BLIP(vCheckpoint, BLIPPRIORITY_MED, FALSE) // B*764195 - Create checkpoint blip straight away
PRINT_NOW("EXT2_10", DEFAULT_GOD_TEXT_TIME, 1) // Skydive to the ~y~landing zone.
iSkydiveHelpTextTimer = GET_GAME_TIMER()
ELSE
EXT2_DRAW_TARGET_MARKER()
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the player skydiving out of the helicopter.
PROC EXT2_MANAGE_PLAYER_SKYDIVE()
SWITCH statusSkydive
CASE SKYDIVE_ON_ATV
EXT2_SHOW_CHECKPOINT_AND_OBJECTIVE()
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
CLEAR_HELP()
KILL_FACE_TO_FACE_CONVERSATION() // Stop the EXT2_TRICKS conversation after the current line has finished
STOP_SOUND(iATVFallingSound)
statusSkydive = SKYDIVE_PARACHUTING
ELSE
EXT2_MANAGE_PERFORM_TRICKS_DIALOGUE()
EXT2_MANAGE_ATV_ROLL_STATS()
IF bDisplayedSkydiveHelpText = FALSE
IF (GET_GAME_TIMER() - iSkydiveHelpTextTimer) > 1000
PRINT_HELP("EXT2_05", 7500) // Perform tricks by using ~PAD_LSTICK_ALL~ to roll your ATV.
bDisplayedSkydiveHelpText = TRUE
ENDIF
ELIF bDisplayedJumpOffHelpText = FALSE
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
PRINT_HELP("EXT2_16") // Press ~INPUT_VEH_EXIT~ to jump off your ATV.
bDisplayedJumpOffHelpText = TRUE
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
AND IS_ENTITY_IN_WATER(vehATV[VEHICLE_PLAYER])
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID(), 0, ECF_DONT_CLOSE_DOOR|ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP) // See B*904660
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
CLEAR_HELP()
statusSkydive = SKYDIVE_LANDED_OK
ENDIF
ENDIF
BREAK
CASE SKYDIVE_PARACHUTING
IF IS_ENTITY_IN_WATER(PLAYER_PED_ID())
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
CLEAR_HELP()
statusSkydive = SKYDIVE_LANDED_OK
ELSE
SWITCH GET_PED_PARACHUTE_STATE(PLAYER_PED_ID())
CASE PPS_SKYDIVING
IF bPreparedParachuteMusicEvent = FALSE
PREPARE_MUSIC_EVENT("EXTREME2_PARA")
bPreparedParachuteMusicEvent = TRUE
ENDIF
EXT2_SHOW_CHECKPOINT_AND_OBJECTIVE()
EXT2_MANAGE_JUMPED_OFF_ATV_DIALOGUE()
//IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
//PRINT_HELP_FOREVER("EXT2_06") // Press ~INPUT_SPRINT~ to deploy your parachute. // B*1514261 Apparently this isn't required anymore
//ENDIF
BREAK
CASE PPS_DEPLOYING
EXT2_DRAW_TARGET_MARKER()
IF bPlayerDeployedParachute = FALSE
EXT2_START_AUDIO_SCENE("EXTREME_02_SKYDIVE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_OPEN_PARACHUTE", TRUE)
bPlayerDeployedParachute = TRUE
ENDIF
BREAK
CASE PPS_PARACHUTING
IF bStartedParachuteMusicEvent = FALSE
TRIGGER_MUSIC_EVENT("EXTREME2_PARA")
bStartedParachuteMusicEvent = TRUE
KILL_FACE_TO_FACE_CONVERSATION() // Stop the EXT2_JUMPOFF conversation after the current line has finished
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
CLEAR_PRINTS()
ENDIF
ENDIF
EXT2_MANAGE_LANDING_ZONE_FOCUS_CAMERA()
EXT2_DRAW_TARGET_MARKER()
EXT2_MANAGE_DEPLOYED_PARACHUTE_DIALOGUE()
BREAK
CASE PPS_LANDING
CASE PPS_INVALID
IF GET_ENTITY_HEIGHT_ABOVE_GROUND(PLAYER_PED_ID()) > 50.0 // Player has manually removed his parachute more than x metres above the ground, so fails the skydive
IF bPreparedParachuteMusicEvent = TRUE // When player jumps off ATV for a few frames he'll be in PPS_INVALID, so wait until he's been in PPS_SKYDIVING before allowing the mission to fail for this
AND NOT GET_PLAYER_HAS_RESERVE_PARACHUTE(PLAYER_ID()) // B*1973306 Don't fail if the player has a reserve parachute
EXT2_MISSION_FAILED(FAILED_FAILED_SKY_DIVE)
ENDIF
ELSE
statusSkydive = SKYDIVE_LANDING
ENDIF
BREAK
ENDSWITCH
ENDIF
BREAK
CASE SKYDIVE_LANDING
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
ENDIF
TRIGGER_MUSIC_EVENT("EXTREME2_STOP")
EXT2_START_AUDIO_SCENE("EXTREME_02_SKYDIVE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_OPEN_PARACHUTE", FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player has landed") ENDIF #ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCheckpoint) < 500.0
statusSkydive = SKYDIVE_LANDED_OK
ELSE
SAFE_REMOVE_BLIP(blipDom)
iFailedLandingTimer = GET_GAME_TIMER()
statusSkydive = SKYDIVE_LANDED_FAR_AWAY
ENDIF
BREAK
CASE SKYDIVE_LANDED_OK
IF domStatus = DOM_LANDED
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
EXT2_MANAGE_DISPLAY_DOM_FOCUS_CAMERA_HELP_TEXT()
IF bDisplayedGoToLandingZoneText = FALSE
bDisplayedGoToLandingZoneText = TRUE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCheckpoint) > 15.0
PRINT_NOW("EXT2_03", DEFAULT_GOD_TEXT_TIME, 1) // Go to the ~y~landing zone.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
ENDIF
ELIF bDisplayedWaitDomLandText = FALSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCheckpoint) < 15.0
SAFE_REMOVE_BLIP(blipCheckpoint)
PRINT_NOW("EXT2_07", DEFAULT_GOD_TEXT_TIME, 1) // Wait for ~b~Dom.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
bDisplayedWaitDomLandText = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE SKYDIVE_LANDED_FAR_AWAY
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles deleting the cloud ptfx.
PROC EXT2_MANAGE_DELETING_CLOUD_PTFX()
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_moving_clouds)
AND IS_ENTITY_ALIVE(vehPlaneSkydive)
vATVOffsetFromPlane = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehPlaneSkydive, GET_ENTITY_COORDS(PLAYER_PED_ID()))
IF vATVOffsetFromPlane.z < -35
IF fCloudsCurrentAlpha <= 0
REMOVE_PARTICLE_FX(ptfx_moving_clouds)
REMOVE_PARTICLE_FX(ptfx_wind_and_smoke)
REMOVE_PTFX_ASSET()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Cloud ptfx removed") ENDIF #ENDIF
ELSE
fCloudsCurrentAlpha -= 0.01
SET_PARTICLE_FX_LOOPED_ALPHA(ptfx_moving_clouds, fCloudsCurrentAlpha)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles getting Dom onto the jetski and driving off, then passing mission.
PROC EXT2_MANAGE_DOM_GETTING_ON_JETSKI(BOOL b_do_interp)
IF b_do_interp = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player didn't skip cutscene - doing interp") ENDIF #ENDIF
CAMERA_INDEX camCatchup = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_PARAMS(camCatchup, GET_CAM_COORD(camCutscene) , GET_CAM_ROT(camCutscene), GET_CAM_FOV(camCutscene), 0)
SET_CAM_PARAMS(camCatchup, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<-0.25,-1.5,0.5>>), <<0,0,GET_ENTITY_HEADING(PLAYER_PED_ID())>>, GET_CAM_FOV(camCutscene), 2000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Player skipped cutscene - not doing interp") ENDIF #ENDIF
DESTROY_ALL_CAMS()
WAIT(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(10.0)
ENDIF
IF IS_ENTITY_ALIVE(pedDom)
IF b_do_interp = TRUE
CLEAR_PED_TASKS(pedDom)
ELSE
CLEAR_PED_TASKS_IMMEDIATELY(pedDom)
SAFE_TELEPORT_ENTITY(pedDom, <<149.8338, 3664.6121, 30.5093>>, 282.0820)
ENDIF
IF IS_VEHICLE_OK(vehJetski)
AND IS_ENTITY_IN_RANGE_COORDS(vehJetski, vJetski, 20)
AND IS_VEHICLE_SEAT_FREE(vehJetski)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Sending Dom to get on jetski") ENDIF #ENDIF
SET_DISABLE_PRETEND_OCCUPANTS(vehJetski, TRUE)
SET_BOAT_ANCHOR(vehJetski, FALSE)
OPEN_SEQUENCE_TASK(endSequence)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<171.4, 3662.0, 31.5>>, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, vehJetski, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVEBLENDRATIO_RUN)
TASK_VEHICLE_DRIVE_TO_COORD(NULL, vehJetski, << 2368.1108, 4503.1675, 29.5964 >>, 30, DRIVINGSTYLE_NORMAL, modelVehicle[EXT2_MODEL_SEASHARK], DF_DontSteerAroundPlayerPed, 50, 100)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(endSequence)
TASK_PERFORM_SEQUENCE(pedDom, endSequence)
CLEAR_SEQUENCE_TASK(endSequence)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Jetski not available so making Dom wander") ENDIF #ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDom, FALSE)
TASK_WANDER_STANDARD(pedDom)
ENDIF
SET_PED_KEEP_TASK(pedDom, TRUE)
ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF b_do_interp = TRUE
CLEAR_PED_TASKS(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Wait for interp") ENDIF #ENDIF
WAIT(2000) // Wait until camera has interpolated back to the player
ELSE
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), <<145.6766, 3661.6016, 30.4832>>, 260.1765)
ENDIF
ENDIF
IF DOES_CAM_EXIST(camCutscene)
DESTROY_CAM(camCutscene)
ENDIF
IF b_do_interp = TRUE
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
ELSE
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
RC_END_CUTSCENE_MODE()
ENDPROC
/// PURPOSE:
/// Handles playing the dialogue if the player threatens Dom and fails the mission.
PROC EXT2_MANAGE_THREATEN_DOM_DIALOGUE()
IF failReason = FAILED_DOM_SCARED
AND bStartedThreatenDomConversation = FALSE
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_THREAT", CONV_PRIORITY_HIGH, DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_THREAT conversation") ENDIF #ENDIF
bStartedThreatenDomConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Ensures the HD model is used for the cargo plane and Dom's ATV.
PROC EXT2_USE_HD_VEHICLE_MODEL(VEHICLE_INDEX veh_index)
IF IS_ENTITY_ALIVE(veh_index)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(veh_index) // B*1460873 Ensure plane doesn't change to its low LOD model
IF IS_VEHICLE_HIGH_DETAIL(veh_index)
SET_FORCE_HD_VEHICLE(veh_index, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Setup Dom for cutscene.
PROC EXT2_SETUP_DOM_CUTSCENE_VARIATIONS()
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "EXTREME2: CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY is TRUE") #ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Dom", sRCLauncherDataLocal.pedID[0])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Set cutscene variations for sRCLauncherDataLocal.pedID[0] in cutscene") ENDIF #ENDIF
ELIF IS_ENTITY_ALIVE(pedDom)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Dom", pedDom)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Set cutscene variations for pedDom in cutscene") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Main state for handling the intro cutscene.
PROC MS_INTRO()
EXT2_SETUP_DOM_CUTSCENE_VARIATIONS()
VECTOR v_vec, v_rot
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
SET_FORCE_HD_VEHICLE(vehATV[VEHICLE_DOM], TRUE) // For B*1512897
ENDIF
SWITCH missionStateMachine
CASE EXT2_STATE_MACHINE_SETUP
EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_INTRO" #ENDIF)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF IS_SCREEN_FADED_IN() // Don't do gameplay hint if skipping to intro
AND NOT IS_REPLAY_IN_PROGRESS() // Or if replaying mission
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-954.535706,-2760.553223,11.916363>>, <<-947.684692,-2749.718994,15.631608>>, 26.000000) // See B*1543280
REMOVE_CUTSCENE()
RC_PRE_REQUEST_CUTSCENE(FALSE)
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("es_2_rcm_concat", CS_SECTION_2|CS_SECTION_3)
iCutsceneStage = 0
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Loading partial es_2_rcm_concat cutscene") ENDIF #ENDIF
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], (<<0, 0, 0.5>>), TRUE, -1, 3000)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.45)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.9)
SET_GAMEPLAY_HINT_FOV(30.00)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
OPEN_SEQUENCE_TASK(seqFranklinLeadIn)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_LEAVE_ANY_VEHICLE(NULL)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: task sequence for Franklin: leaving vehicle") ENDIF #ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0]) > 6
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-953.09198, -2758.35083, 12.94>>, PEDMOVEBLENDRATIO_WALK) // Where Dom lands
TASK_GO_TO_ENTITY(NULL, sRCLauncherDataLocal.pedID[0], DEFAULT_TIME_BEFORE_WARP, 6, PEDMOVEBLENDRATIO_WALK)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: task sequence for Franklin: walking to Dom") ENDIF #ENDIF
ENDIF
TASK_TURN_PED_TO_FACE_ENTITY(NULL, sRCLauncherDataLocal.pedID[0])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: task sequence for Franklin: turning to Dom") ENDIF #ENDIF
CLOSE_SEQUENCE_TASK(seqFranklinLeadIn)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqFranklinLeadIn)
CLEAR_SEQUENCE_TASK(seqFranklinLeadIn)
iLeadInTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Doing leadin focus camera") ENDIF #ENDIF
ELSE
RC_REQUEST_CUTSCENE("es_2_rcm_concat")
iCutsceneStage = 2
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Loading full es_2_rcm_concat cutscene") ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Not doing leadin focus camera") ENDIF #ENDIF
ENDIF
ENDIF
// B*1958190 In case player bails out before triggering the RC
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[2])
vehIntroTruck = sRCLauncherDataLocal.vehID[2]
IF IS_ENTITY_ALIVE(vehIntroTruck)
SET_ENTITY_AS_MISSION_ENTITY(vehIntroTruck, TRUE, TRUE)
SAFE_TELEPORT_ENTITY(vehIntroTruck, vIntroTruck, fIntroTruck)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vehIntroTruck)
FREEZE_ENTITY_POSITION(vehIntroTruck, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Grabbed truck, teleported and frozen before intro") ENDIF #ENDIF
ENDIF
ENDIF
bCutsceneSkipped = FALSE
BREAK
CASE EXT2_STATE_MACHINE_LOOP
IF iCutsceneStage = 0
OR iCutsceneStage = 1
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE)
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0]) < 5
CLEAR_PED_TASKS(PLAYER_PED_ID())
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Franklin closer than 5m to Dom so halting him") ENDIF #ENDIF
ENDIF
ENDIF
SWITCH iCutsceneStage
CASE 0
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
REQUEST_ANIM_DICT("rcmextreme2")
IF HAS_ANIM_DICT_LOADED("rcmextreme2")
ADD_PED_FOR_DIALOGUE(sConversation, 0, sRCLauncherDataLocal.pedID[0], "DOM")
ADD_PED_FOR_DIALOGUE(sConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_INT_LI", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_INT_LI conversation") ENDIF #ENDIF
FREEZE_ENTITY_POSITION(sRCLauncherDataLocal.pedID[0], FALSE)
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[0], "rcmextreme2", "leadin", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_IGNORE_GRAVITY|AF_HOLD_LAST_FRAME)
TASK_LOOK_AT_ENTITY(sRCLauncherDataLocal.pedID[0], PLAYER_PED_ID(), -1, SLF_WIDEST_YAW_LIMIT|SLF_WIDEST_PITCH_LIMIT)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0], -1)
PLAY_FACIAL_ANIM(sRCLauncherDataLocal.pedID[0], "leadin_facial", "rcmextreme2") // B*1502033
REQUEST_MODEL(modelVehicle[EXT2_MODEL_BLAZER])
REQUEST_VEHICLE_RECORDING(500, "Ext2_DomIntoAirport")
iCutsceneStage++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF (GET_GAME_TIMER() - iLeadInTimer) > 3000
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
REMOVE_PED_FOR_DIALOGUE(sConversation, 0)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Done leadin") ENDIF #ENDIF
iCutsceneStage++
ENDIF
ENDIF
BREAK
CASE 2
REQUEST_MODEL(modelVehicle[EXT2_MODEL_BLAZER])
REQUEST_VEHICLE_RECORDING(500, "Ext2_DomIntoAirport")
IF RC_IS_CUTSCENE_OK_TO_START()
AND HAS_MODEL_LOADED(modelVehicle[EXT2_MODEL_BLAZER])
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(500, "Ext2_DomIntoAirport")
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
pedDom = sRCLauncherDataLocal.pedID[0]
SET_ENTITY_AS_MISSION_ENTITY(pedDom, TRUE, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(pedDom, "Dom", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, modelPed[EXT2_MODEL_DOM])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: CU_ANIMATE_EXISTING_SCRIPT_ENTITY Dom") ENDIF #ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(pedDom, "Dom", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, modelPed[EXT2_MODEL_DOM])
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[0])
vehATV[VEHICLE_PLAYER] = sRCLauncherDataLocal.vehID[0]
SET_ENTITY_AS_MISSION_ENTITY(vehATV[VEHICLE_PLAYER], TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: SET_ENTITY_AS_MISSION_ENTITY vehATV[VEHICLE_PLAYER]") ENDIF #ENDIF
ELSE
EXT2_CREATE_ATV(VEHICLE_PLAYER)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: sRCLauncherDataLocal.vehID[0] didn't exist so created vehATV[VEHICLE_PLAYER]") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
REGISTER_ENTITY_FOR_CUTSCENE(vehATV[VEHICLE_PLAYER], "Franklin_Quad", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, modelPed[EXT2_MODEL_BLAZER])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Registered vehATV[VEHICLE_PLAYER]") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[1])
vehATV[VEHICLE_DOM] = sRCLauncherDataLocal.vehID[1]
SET_ENTITY_AS_MISSION_ENTITY(vehATV[VEHICLE_DOM], TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: SET_ENTITY_AS_MISSION_ENTITY vehATV[VEHICLE_DOM]") ENDIF #ENDIF
ELSE
EXT2_CREATE_ATV(VEHICLE_DOM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: sRCLauncherDataLocal.vehID[1] didn't exist so created vehATV[VEHICLE_DOM]") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
REGISTER_ENTITY_FOR_CUTSCENE(vehATV[VEHICLE_DOM], "DOM_Quad", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, modelPed[EXT2_MODEL_BLAZER])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Registered vehATV[VEHICLE_DOM]") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(vehIntroTruck)
REGISTER_ENTITY_FOR_CUTSCENE(vehIntroTruck, "DOM_Flatbed_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, modelVehicle[EXT2_MODEL_FLATBED])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: CU_ANIMATE_EXISTING_SCRIPT_ENTITY DOM_Flatbed_truck") ENDIF #ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(vehIntroTruck, "DOM_Flatbed_truck", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, modelVehicle[EXT2_MODEL_FLATBED])
ENDIF
RC_CLEANUP_LAUNCHER() // Cleanup launcher to remove lead-in blip
START_CUTSCENE()
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(GET_ENTITY_MODEL(vehATV[VEHICLE_PLAYER])) // B*2027007
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: set_vehicle_model_player_will_exit_scene") ENDIF #ENDIF
ENDIF
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
iCutsceneStage++
ENDIF
BREAK
CASE 3
IF IS_CUTSCENE_PLAYING()
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-954.774231,-2761.566650,11.944938>>, <<-947.811523,-2750.971191,15.674092>>, 9.000000, vPlayerCarRespot, fPlayerCarRespot)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-945.467407,-2754.302246,11.870284>>, <<-989.596558,-2835.254883,15.964786>>, 7.000000, vPlayerCarRespot, fPlayerCarRespot)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespot, fPlayerCarRespot)
RC_START_CUTSCENE_MODE(<<-954.19, -2760.05, 14.64>>)
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // Just in case screen is faded out
SAFE_TELEPORT_ENTITY(vehATV[VEHICLE_PLAYER], vATV[VEHICLE_PLAYER], fATV[VEHICLE_PLAYER])
SAFE_TELEPORT_ENTITY(vehATV[VEHICLE_DOM], vATV[VEHICLE_DOM], fATV[VEHICLE_DOM])
EXT2_LOAD_ASSETS_FOR_MISSION_STATE(stateIntro, FALSE) // Preload all these as we want to start immediately after the intro and not wait for the cargo plane etc to load
iCutsceneStage++
ENDIF
BREAK
CASE 4
IF IS_CUTSCENE_PLAYING()
IF NOT DOES_ENTITY_EXIST(pedDom)
AND DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Dom"))
pedDom = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Dom"))
SET_ENTITY_AS_MISSION_ENTITY(pedDom, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Grabbed pedDom from Dom") ENDIF #ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vehIntroTruck)
AND DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("DOM_Flatbed_truck"))
vehIntroTruck = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("DOM_Flatbed_truck"))
SET_ENTITY_AS_MISSION_ENTITY(vehIntroTruck, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Grabbed vehIntroTruck from DOM_Flatbed_truck") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(pedDom)
AND IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Dom")
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: SET_FORCE_HD_VEHICLE on vehATV[VEHICLE_DOM] set to TRUE") ENDIF #ENDIF
SET_PED_INTO_VEHICLE(pedDom, vehATV[VEHICLE_DOM])
IF NOT WAS_CUTSCENE_SKIPPED() // Can't start a playable on a fixed vehicle so only start playable if not skipped
START_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM], 500, "Ext2_DomIntoAirport")
PAUSE_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM])
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM], 1000)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Teleported pedDom onto vehATV[VEHICLE_DOM] and started & paused playback") ENDIF #ENDIF
ELSE
v_vec = GET_POSITION_OF_VEHICLE_RECORDING_ID_AT_TIME(GET_VEHICLE_RECORDING_ID(500, "Ext2_DomIntoAirport"), 1000)
v_rot = GET_ROTATION_OF_VEHICLE_RECORDING_ID_AT_TIME(GET_VEHICLE_RECORDING_ID(500, "Ext2_DomIntoAirport"), 1000)
SAFE_TELEPORT_ENTITY(vehATV[VEHICLE_DOM], v_vec, v_rot.z)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Teleported pedDom onto vehATV[VEHICLE_DOM] and moved it to playback position") ENDIF #ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: v_vec = ", v_vec) ENDIF #ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: v_rot = ", v_rot) ENDIF #ENDIF
ENDIF
SET_VEHICLE_ENGINE_ON(vehATV[VEHICLE_DOM], TRUE, TRUE)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vehATV[VEHICLE_DOM])
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedDom)
ENDIF
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Franklin given task to get onto vehATV[VEHICLE_PLAYER]") ENDIF #ENDIF
ENDIF
IF NOT CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin_Quad")
AND IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
AND IS_ENTITY_VISIBLE(vehATV[VEHICLE_PLAYER])
SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(vehATV[VEHICLE_PLAYER], TRUE, FALSE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Doing SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION") ENDIF #ENDIF
ENDIF
ENDIF
IF WAS_CUTSCENE_SKIPPED()
bCutsceneSkipped = TRUE
ENDIF
ELSE
IF bCutsceneSkipped = TRUE
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
RC_END_CUTSCENE_MODE()
IF IS_ENTITY_ALIVE(vehIntroTruck)
FREEZE_ENTITY_POSITION(vehIntroTruck, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Unfroze truck after intro") ENDIF #ENDIF
ENDIF
EXT2_SETUP_BEFORE_MOCAP_FINISHES()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: IS_CUTSCENE_PLAYING returned false") ENDIF #ENDIF
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
ENDIF
BREAK
ENDSWITCH
BREAK
CASE EXT2_STATE_MACHINE_CLEANUP
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0)
EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_INTRO" #ENDIF)
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling going into the airport.
PROC MS_GO_INTO_AIRPORT()
IF iPlayerAttachedTimer > -1
SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, INPUT_SCRIPT_RUP) // B*1308933 B*1483507 Prevent the player bailing after he's driven into the plane
ENDIF
EXT2_USE_HD_VEHICLE_MODEL(vehATV[VEHICLE_DOM]) // For B*1512897
EXT2_USE_HD_VEHICLE_MODEL(vehPlaneChase)
SWITCH missionStateMachine
CASE EXT2_STATE_MACHINE_SETUP
EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_GO_INTO_AIRPORT" #ENDIF)
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehATV[VEHICLE_DOM], FALSE)
SET_ENTITY_LOD_DIST(vehATV[VEHICLE_DOM], 500)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehATV[VEHICLE_DOM])
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Playback already started on vehATV[VEHICLE_DOM] so unpausing") ENDIF #ENDIF
ELSE
START_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM], 500, "Ext2_DomIntoAirport")
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehATV[VEHICLE_DOM], 1000)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Starting playback on vehATV[VEHICLE_DOM]") ENDIF #ENDIF
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(pedDom)
IF NOT DOES_BLIP_EXIST(blipDom)
blipDom = CREATE_PED_BLIP(pedDom, TRUE, TRUE)
ENDIF
IF DOES_BLIP_EXIST(blipDom)
SET_BLIP_SCALE(blipDom, BLIP_SIZE_PED)
ENDIF
ENDIF
EXT2_LOAD_ASSETS_FOR_MISSION_STATE(stateIntro)
EXT2_CREATE_INTRO_TRUCK()
EXT2_SPAWN_AIRPORT_PLANES()
IF IS_ENTITY_ALIVE(vehPlaneChase)
AND NOT DOES_BLIP_EXIST(blipPlane)
blipPlane = CREATE_VEHICLE_BLIP(vehPlaneChase)
ENDIF
PRINT_NOW("EXT2_02", DEFAULT_GOD_TEXT_TIME, 1) // Follow Dom on to the ~b~cargo plane.
EXT2_CREATE_AIRPORT_GUARD()
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
bPlayerIsOnATV = TRUE
bCheckPlayerATV = TRUE
bDisplayedGetBackOnATV = FALSE
iTimesDisplayedRideATVObjective = 1
bShutCargoPlaneDoors = FALSE
bStartedDriveInPlaneConversation1 = FALSE
bStartedDriveInPlaneConversation2 = FALSE
bStartedDriveInPlaneConversation3 = FALSE
bStartedFirstConversation = FALSE
bStartedGuardConversation = FALSE
bStartedRunwayMusicEvent = FALSE
bStartedEnterPlaneMusicEvent = FALSE
bPlayingPlaneStream = FALSE
iPlayerAttachedTimer = -1
iDoneRemindConversation = 0
iRemindConversationTimer = GET_GAME_TIMER()
iPlayerCurseTimer = GET_GAME_TIMER()
statusDomATV = ATV_INTO_AIRPORT
iCheckEngineTimer = GET_GAME_TIMER()
IF NOT Is_Replay_In_Progress()
TRIGGER_MUSIC_EVENT("EXTREME2_START")
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
FORCE_AUTOMATIC_DOOR_SLIDE_OPEN(AUTODOOR_AIRPORT_BARRIER_IN, TRUE)
CLEAR_AREA_OF_VEHICLES(<<-1028,-2879,14>>, 50, FALSE) // B*1748672 - remove new cargens during mission
BREAK
CASE EXT2_STATE_MACHINE_LOOP
EXT2_MANAGE_PLANE_SFX(vehPlaneChase, 1.0)
IF iPlayerAttachedTimer = -1
EXT2_MANAGE_PLAYER_ATTACH_TO_PLANE()
EXT2_MANAGE_PLANE_TAKING_OFF()
EXT2_MANAGE_DOM_ATTACH_TO_PLANE()
EXT2_MANAGE_RUNWAY_MUSIC_EVENT()
EXT2_CHECK_PLAYER_STILL_ON_ATV()
EXT2_CHECK_PLAYER_ISNT_ABANDONING_DOM()
EXT2_CHECK_PLAYER_NEAR_ENGINES()
EXT2_MANAGE_AMBIENT_AIRPORT_PLANE()
ELSE
IF ((GET_GAME_TIMER() - iPlayerAttachedTimer) > 1500 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED())
OR EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(2, -2, -12, -4) // B*1146772 Don't let player smash into Dom
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
ELSE
EXT2_MANAGE_CARGO_PLANE_SPEED()
ENDIF
ENDIF
BREAK
CASE EXT2_STATE_MACHINE_CLEANUP
EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_GO_INTO_AIRPORT" #ENDIF)
SAFE_REMOVE_BLIP(blipDom)
SAFE_REMOVE_BLIP(blipPlane)
SAFE_RELEASE_VEHICLE(vehIntroTruck)
SAFE_RELEASE_PED(pedAirportBooth)
SAFE_RELEASE_PED(pedPlanePilot[1])
SAFE_RELEASE_VEHICLE(vehAirportPlane)
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_gen_sparks)
STOP_PARTICLE_FX_LOOPED(ptfx_gen_sparks)
ENDIF
REMOVE_PTFX_ASSET()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling the midtro cutscene.
PROC MS_MIDTRO_PLANE()
EXT2_USE_HD_VEHICLE_MODEL(vehPlaneChase)
EXT2_USE_HD_VEHICLE_MODEL(vehPlaneSkydive)
SWITCH missionStateMachine
CASE EXT2_STATE_MACHINE_SETUP
EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_MIDTRO_PLANE" #ENDIF)
KILL_FACE_TO_FACE_CONVERSATION() // B*1462010 Don't cut off the playing line
EXT2_START_AUDIO_SCENE("EXTREME_02_DRIVE_UP_RAMP", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_PLANE_TAKEOFF_CUTSCENE", TRUE)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
IF IS_ENTITY_ALIVE(vehPlaneChase)
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
IF EXT2_IS_PLAYER_WITHIN_ACCEPTABLE_AREA_FROM_PLANE(2, -2, -24, -4)
ATTACH_ENTITY_TO_ENTITY(vehATV[VEHICLE_PLAYER], vehPlaneChase, 0, GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehPlaneChase, GET_ENTITY_COORDS(vehATV[VEHICLE_PLAYER])), <<0,0,0>>, FALSE, FALSE, TRUE)
ELSE
ATTACH_ENTITY_TO_ENTITY(vehATV[VEHICLE_PLAYER], vehPlaneChase, 0, <<0,-24,-3>>, <<0,0,0>>)
ENDIF
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
ENDIF
ENDIF
SET_VEHICLE_DOORS_SHUT(vehPlaneChase, TRUE)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlaneChase)
SKIP_TIME_IN_PLAYBACK_RECORDED_vehicle(vehPlaneChase, 12000 - GET_TIME_POSITION_IN_RECORDING(vehPlaneChase))
ENDIF
CONTROL_LANDING_GEAR(vehPlaneChase, LGC_RETRACT)
WAIT(0)
ENDIF
camCutscene = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_PARAMS(camCutscene, << -1359.8, -2217.8, 14.2 >>, << 5.6, -0.0, 160.7 >>, 50.0000, 0)
SET_CAM_PARAMS(camCutscene, << -1348.5, -2198.4, 14.2 >>, << 11.5, 0.0, 168.1 >>, 50.0000, 5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
AND NOT IS_ENTITY_ATTACHED(vehATV[VEHICLE_DOM])
AND IS_ENTITY_ALIVE(vehPlaneChase)
ATTACH_ENTITY_TO_ENTITY(vehATV[VEHICLE_DOM], vehPlaneChase, 0, << 0.902488, -6, -3.55149 >>, <<0,0,0>>, FALSE, FALSE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Dom's ATV wasn't attached when the cutscene started so attached it inside vehPlaneChase") ENDIF #ENDIF
ENDIF
STOP_STREAM()
EXT2_STOP_CARREC_IF_PLAYING(vehAirportPlane)
EXT2_STOP_CARREC_IF_PLAYING(vehATV[VEHICLE_DOM])
REMOVE_VEHICLE_RECORDING(500, "Ext2_DomIntoAirport")
REMOVE_VEHICLE_RECORDING(502, "Ext2_AirportVeh")
SAFE_DELETE_PED(pedPlanePilot[1])
SAFE_DELETE_VEHICLE(vehAirportPlane)
streamVolumeExtreme2 = STREAMVOL_CREATE_SPHERE(<< -1389.5, -2218.5, 33.7 >>, 400.0, FLAG_MAPDATA)
PRELOAD_OUTFIT(PLAYER_PED_ID(), OUTFIT_P1_SKYDIVING)
PRELOAD_OUTFIT(PLAYER_PED_ID(), SPECIAL_P1_PARACHUTE)
iCutsceneStage = 0
iCutsceneWaitTime = GET_GAME_TIMER()
BREAK
CASE EXT2_STATE_MACHINE_LOOP
IF IS_ENTITY_ALIVE(vehPlaneChase)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlaneChase)
SET_PLAYBACK_SPEED(vehPlaneChase, 0.9)
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
iCutsceneStage = 5
ENDIF
SWITCH iCutsceneStage
CASE 0
IF LOAD_STREAM("Plane_Flyby", "EXTREME_02_SOUNDSET")
PLAY_STREAM_FRONTEND()
iCutsceneStage++
ENDIF
BREAK
CASE 1
IF (GET_GAME_TIMER() - iCutsceneWaitTime) > 500
iCutsceneStage++
ENDIF
BREAK
CASE 2
IF EXT2_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_MIDTRO", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_MIDTRO conversation") ENDIF #ENDIF
iCutsceneStage++
ENDIF
BREAK
CASE 3
IF IS_ENTITY_ALIVE(vehPlaneChase)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlaneChase)
AND GET_TIME_POSITION_IN_RECORDING(vehPlaneChase) > 16000
SET_CAM_PARAMS(camCutscene, << -1389.5, -2218.5, 33.8 >>, << 4.4, 0.0, -44.2 >>, 40.0000, 0)
SET_CAM_PARAMS(camCutscene, << -1322.0, -2143.9, 69.7 >>, << 2.1, 0.0, -43.0 >>, 40.0000, 25000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
iCutsceneStage++
ENDIF
BREAK
CASE 4
IF EXT2_ALLOW_CONVERSATION_TO_PLAY()
iCutsceneStage++
ENDIF
BREAK
CASE 5
SAFE_FADE_SCREEN_OUT_TO_BLACK()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
EXT2_CREATE_CARGO_PLANE_FOR_SKYDIVE()
RENDER_SCRIPT_CAMS(FALSE, FALSE, 0)
DESTROY_ALL_CAMS()
STOP_SOUND(iSparksSound)
EXT2_START_AUDIO_SCENE("EXTREME_02_PLANE_TAKEOFF_CUTSCENE", FALSE)
SAFE_DELETE_OBJECT(objectInvisibleProp)
EXT2_STOP_CARREC_IF_PLAYING(vehPlaneChase)
REMOVE_VEHICLE_RECORDING(503, "Ext2_CargoTakeOff")
SAFE_DELETE_PED(pedPlanePilot[0])
SAFE_DELETE_VEHICLE(vehPlaneChase)
IF STREAMVOL_IS_VALID(streamVolumeExtreme2)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Deleting streamVolumeExtreme2") ENDIF #ENDIF
STREAMVOL_DELETE(streamVolumeExtreme2)
ENDIF
WAIT(1000)
RC_END_CUTSCENE_MODE(TRUE, TRUE, FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_INSIDE_PLANE", TRUE)
SAFE_FADE_SCREEN_IN_FROM_BLACK()
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
BREAK
ENDSWITCH
BREAK
CASE EXT2_STATE_MACHINE_CLEANUP
REPLAY_STOP_EVENT()
EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_MIDTRO_PLANE" #ENDIF)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling jumping out of the cargo plane.
PROC MS_JUMP_OUT_PLANE()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableTakeOffParachutePack, TRUE) // B*1276475 - Prevent player taking off backpack if getting off the ATV
ENDIF
IF IS_ENTITY_ALIVE(vehPlaneSkydive)
EXT2_USE_HD_VEHICLE_MODEL(vehPlaneSkydive)
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehPlaneSkydive, TRUE)
ENDIF
EXT1_SET_RADAR_TO_PLANE_INTERIOR()
SWITCH missionStateMachine
CASE EXT2_STATE_MACHINE_SETUP
EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_JUMP_OUT_PLANE" #ENDIF)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_SKYDIVE, "ATV skydive")
IF IS_ENTITY_ALIVE(vehATV[VEHICLE_DOM])
AND NOT GET_IS_VEHICLE_ENGINE_RUNNING(vehATV[VEHICLE_DOM])
SET_VEHICLE_ENGINE_ON(vehATV[VEHICLE_DOM], TRUE, TRUE)
ENDIF
iDomRideOutPlaneTimer = GET_GAME_TIMER()
domStatus = DOM_IN_PLANE
bPlayerIsOnATV = FALSE
bCheckPlayerATV = TRUE
bDisplayedGetBackOnATV = FALSE
bStartedLetsGoConversation = FALSE
bStartedHurryUpConversation = FALSE
bStartedDrivingOutConversation = FALSE
bPlayingPlaneStream = FALSE
iTimesDisplayedRideATVObjective = 0
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED_ID(), RBF_VEHICLE_IMPACT | RBF_IMPACT_OBJECT)
IF Is_Replay_In_Progress()
TRIGGER_MUSIC_EVENT("EXTREME2_RESTART2")
ELSE
TRIGGER_MUSIC_EVENT("EXTREME2_READY")
ENDIF
BREAK
CASE EXT2_STATE_MACHINE_LOOP
EXT2_CREATE_CLOUD_PTFX()
EXT2_MANAGE_PLANE_SFX(vehPlaneSkydive, 0.0) // 0 is fully inside, 1 is outside
EXT2_MANAGE_DOM_SKYDIVE()
EXT2_MANAGE_LETS_GO_DIALOGUE()
EXT2_MANAGE_HURRY_UP_DIALOGUE()
EXT2_CHECK_PLAYER_STILL_ON_ATV()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_ALIVE(vehPlaneSkydive)
vATVOffsetFromPlane = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehPlaneSkydive, GET_ENTITY_COORDS(PLAYER_PED_ID()))
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: vATVOffsetFromPlane = ", vATVOffsetFromPlane) ENDIF #ENDIF
IF vATVOffsetFromPlane.z < -6.5
OR vATVOffsetFromPlane.y < -40
REPLAY_RECORD_BACK_FOR_TIME(5.0)
IF bPlayerIsOnATV = TRUE
bStartedDidntUseATVConversation = TRUE // Set to true because we won't need to play it
statusSkydive = SKYDIVE_ON_ATV
ELSE
bStartedDidntUseATVConversation = FALSE
statusSkydive = SKYDIVE_PARACHUTING
ENDIF
IF IS_ENTITY_ALIVE(vehPlaneSkydive)
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehPlaneSkydive, FALSE)
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(vehPlaneSkydive)
ENDIF
STOP_STREAM() // Cargo plane wind stream
TRIGGER_MUSIC_EVENT("EXTREME2_JUMP")
SET_LIGHT_RIG_ON_CARGO_PLANE(FALSE)
SAFE_REMOVE_BLIP(blipPlayerATV)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED_ID(), RBF_NONE)
ENDIF
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
ENDIF
ENDIF
BREAK
CASE EXT2_STATE_MACHINE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(5.0, 15.0, REPLAY_IMPORTANCE_LOW)
EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_JUMP_OUT_PLANE" #ENDIF)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling skydiving out of the cargo plane.
PROC MS_SKYDIVE()
SWITCH missionStateMachine
CASE EXT2_STATE_MACHINE_SETUP
EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_SKYDIVE" #ENDIF)
IF IS_ENTITY_ALIVE(pedDom)
AND NOT DOES_BLIP_EXIST(blipDom)
blipDom = CREATE_PED_BLIP(pedDom, TRUE, TRUE)
ENDIF
bCheckPlayerATV = FALSE
bDisplayedSkydiveHelpText = FALSE
bDisplayedJumpOffHelpText = FALSE
bStartedPerformTricksConversation = FALSE
bStoppedPerformTricksConversation = FALSE
bRestartedPerformTricksConversation = FALSE
bStartedJumpedOffATVConversation = FALSE
bStartedDeployedParachuteConversation = FALSE
bStartedDomTricks = FALSE
bPlayerDeployedParachute = FALSE
bResetStuntValues = TRUE
bPreparedParachuteMusicEvent = FALSE
bStartedParachuteMusicEvent = FALSE
bDisplayedGoToLandingZoneText = FALSE
bDisplayedWaitDomLandText = FALSE
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE, 1, FALSE, FALSE)
ENDIF
EXT2_SPAWN_JETSKIS()
EXT2_START_AUDIO_SCENE("EXTREME_02_INSIDE_PLANE", FALSE)
EXT2_START_AUDIO_SCENE("EXTREME_02_SKYDIVE", TRUE)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_ALIVE(vehATV[VEHICLE_PLAYER])
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehATV[VEHICLE_PLAYER])
PLAY_SOUND_FROM_ENTITY(iATVFallingSound, "PLAYER_AT_SPEED_FREEFALL_MASTER", vehATV[VEHICLE_PLAYER])
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started PLAYER_AT_SPEED_FREEFALL_MASTER sfx") ENDIF #ENDIF
ENDIF
BREAK
CASE EXT2_STATE_MACHINE_LOOP
IF statusSkydive != SKYDIVE_LANDED_FAR_AWAY
EXT2_MANAGE_DOM_SKYDIVE()
EXT2_MANAGE_DELETING_CLOUD_PTFX()
EXT2_MANAGE_PLAYER_SKYDIVE()
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, sConversation, "EXT2AU", tSavedConversationRoot, tSavedConversationLabel)
ELIF (GET_GAME_TIMER() - iFailedLandingTimer) > 3000
EXT2_MISSION_FAILED(FAILED_OUTSIDE_ZONE)
ENDIF
BREAK
CASE EXT2_STATE_MACHINE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(15.0, 0.0)
EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_SKYDIVE" #ENDIF)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
IF bPlayerDeployedParachute = FALSE
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(EXT2_LEAP_FROM_ATV_TO_WATER)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Achieved stat: EX2_LEAP_FROM_ATV_TO_WATER") ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling going to meet Dom after the skydive.
PROC MS_GO_TO_DOM()
SWITCH missionStateMachine
CASE EXT2_STATE_MACHINE_SETUP
EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_GO_TO_DOM" #ENDIF)
SAFE_REMOVE_BLIP(blipCheckpoint)
IF IS_ENTITY_ALIVE(pedDom)
SET_ENTITY_PROOFS(pedDom, FALSE, FALSE, FALSE, FALSE, FALSE)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(pedDom, FALSE)
SET_PED_CONFIG_FLAG(pedDom, PCF_UseKinematicModeWhenStationary, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDom, TRUE)
IF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedDom, 15)
IF NOT DOES_BLIP_EXIST(blipDom)
blipDom = CREATE_PED_BLIP(pedDom, TRUE, TRUE)
ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vLandingPos, 10) // See B*1254800 - Don't give "get to Dom" objective if player is already at the landing spot.
PRINT_NOW("EXT2_01", DEFAULT_GOD_TEXT_TIME, 1) // Wait for ~b~Dom.
ELSE
PRINT_NOW("EXT2_04", DEFAULT_GOD_TEXT_TIME, 1) // Get to ~b~Dom.
ENDIF
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
ENDIF
ENDIF
SAFE_DELETE_VEHICLE(vehPlaneSkydive)
bReachedDom = FALSE
bNearToDomStoppedConversation = FALSE
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
BREAK
CASE EXT2_STATE_MACHINE_LOOP
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
EXT2_MANAGE_DOM_AT_LANDING_POS()
IF bReachedDom = FALSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCheckpoint, FALSE) > 500.0
EXT2_MISSION_FAILED(FAILED_ABANDONED_DOM)
ELIF IS_ENTITY_ALIVE(pedDom)
IF bNearToDomStoppedConversation = FALSE
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedDom, 20) // B*1543309
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Near to Dom so stopping conversation in readiness for outro") ENDIF #ENDIF
STOP_CHECKING_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation)
KILL_FACE_TO_FACE_CONVERSATION() // Stop the EXT2_DEPLOY conversation after the current line has finished
bNearToDomStoppedConversation = TRUE
ENDIF
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedDom, 10)
AND IS_ENTITY_IN_RANGE_COORDS(pedDom, vLandingPos, 10) // B*1323668 Trigger if Dom is near enough
bReachedDom = TRUE
ELIF bNearToDomStoppedConversation = FALSE
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, sConversation, "EXT2AU", tSavedConversationRoot, tSavedConversationLabel)
ENDIF
ENDIF
ELIF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
ENDIF
ENDIF
BREAK
CASE EXT2_STATE_MACHINE_CLEANUP
EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_GO_TO_DOM" #ENDIF)
SAFE_REMOVE_BLIP(blipDom)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling the final conversation between Franklin and Dom.
PROC MS_FINAL_CONVERSATION()
SWITCH missionStateMachine
CASE EXT2_STATE_MACHINE_SETUP
EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_FINAL_CONVERSATION" #ENDIF)
EXT2_LOAD_ASSETS_FOR_MISSION_STATE(stateFinalConversation)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_ALIVE(pedDom)
iSynchedScene = CREATE_SYNCHRONIZED_SCENE(<<vPlayerOutro.x, vPlayerOutro.y+2.3, vPlayerOutro.z+1.05>>, <<0,0,110>>)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSynchedScene, "rcmextreme2", "banter_franklin", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT|SYNCED_SCENE_TAG_SYNC_OUT)
TASK_SYNCHRONIZED_SCENE(pedDom, iSynchedScene, "rcmextreme2", "banter_dom", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT|SYNCED_SCENE_TAG_SYNC_OUT)
camCutscene = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iSynchedScene, "banter_cam", "rcmextreme2")
RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
CLEAR_AREA(vLandingPos, 10, TRUE) // B*1322579 - Clear immediate area of stuff
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET) // Remove headset while Franklin is offscreen at start of outro rather than at end
ENDIF
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
iCutsceneStage = 0
iCutsceneWaitTime = GET_GAME_TIMER()
BREAK
CASE EXT2_STATE_MACHINE_LOOP
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
SAFE_FADE_SCREEN_OUT_TO_BLACK()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
EXT2_MANAGE_DOM_GETTING_ON_JETSKI(FALSE)
WAIT(250)
SAFE_FADE_SCREEN_IN_FROM_BLACK()
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
ELSE
SWITCH iCutsceneStage
CASE 0
SAFE_FADE_SCREEN_IN_FROM_BLACK()
IF EXT2_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "EXT2AU", "EXT2_OUTRO", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Started EXT2_OUTRO conversation") ENDIF #ENDIF
iCutsceneStage++
ENDIF
BREAK
CASE 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSynchedScene)
AND GET_SYNCHRONIZED_SCENE_PHASE(iSynchedScene) > 0.99
EXT2_MANAGE_DOM_GETTING_ON_JETSKI(TRUE)
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
ENDIF
BREAK
ENDSWITCH
ENDIF
BREAK
CASE EXT2_STATE_MACHINE_CLEANUP
REPLAY_STOP_EVENT()
EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_FINAL_CONVERSATION" #ENDIF)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Starts the mission failed sequence.
PROC MS_FAILED()
SWITCH missionStateMachine
CASE EXT2_STATE_MACHINE_SETUP
EXT2_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_FAILED" #ENDIF)
CLEAR_PRINTS()
CLEAR_HELP()
EXT2_REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
TRIGGER_MUSIC_EVENT("EXTREME2_FAIL")
EXT2_SET_PED_TO_FLEE()
bStartedThreatenDomConversation = FALSE
SWITCH failReason
CASE FAILED_DEFAULT
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_DEFAULT") ENDIF #ENDIF
BREAK
CASE FAILED_DOM_DIED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_DOM_DIED") ENDIF #ENDIF
failString = "EXT2_F1" // ~s~Dom died.
BREAK
CASE FAILED_ATV_WRECKED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_ATV_WRECKED") ENDIF #ENDIF
failString = "EXT2_F3" // ~s~Franklin's ATV was destroyed.
BREAK
CASE FAILED_ABANDONED_DOM
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_ABANDONED_DOM") ENDIF #ENDIF
failString = "EXT2_F2" // ~s~Franklin abandoned Dom.
BREAK
CASE FAILED_DIDNT_FOLLOW_DOM
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_DIDNT_FOLLOW_DOM") ENDIF #ENDIF
failString = "EXT2_F5" // ~s~Franklin didn't follow Dom.
BREAK
CASE FAILED_DOM_INJURED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_DOM_INJURED") ENDIF #ENDIF
failString = "EXT2_F7" // ~s~Dom was injured.
BREAK
CASE FAILED_DOM_ATV_DAMAGED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_DOM_ATV_DAMAGED") ENDIF #ENDIF
failString = "EXT2_F8" // ~s~Dom's ATV was damaged.
BREAK
CASE FAILED_GUARD_INJURED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_GUARD_INJURED") ENDIF #ENDIF
failString = "EXT2_F9" // ~s~The security guard was injured.
BREAK
CASE FAILED_DIDNT_DRIVE_ATV
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_DIDNT_DRIVE_ATV") ENDIF #ENDIF
failString = "EXT2_F10" // ~s~Franklin didn't ride the ATV onto the plane.
BREAK
CASE FAILED_DOM_SCARED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_DOM_SCARED") ENDIF #ENDIF
failString = "EXT2_F11" // ~s~Dom was spooked.
BREAK
CASE FAILED_OUTSIDE_ZONE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_OUTSIDE_ZONE") ENDIF #ENDIF
failString = "EXT2_F12" // ~s~Franklin landed too far outside the target zone.
BREAK
CASE FAILED_FAILED_SKY_DIVE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_FAILED_SKY_DIVE") ENDIF #ENDIF
failString = "EXT2_F13" // ~s~Skydive failed.
BREAK
CASE FAILED_DIDNT_ATTEMPT_SKYDIVE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: MISSION_FAILED reason=FAILED_DIDNT_ATTEMPT_SKYDIVE") ENDIF #ENDIF
failString = "EXT2_F4" // ~s~Franklin didn't attempt the skydive.
BREAK
ENDSWITCH
IF failReason = FAILED_DEFAULT
Random_Character_Failed()
ELSE
Random_Character_Failed_With_Reason(failString)
ENDIF
BREAK
CASE EXT2_STATE_MACHINE_LOOP
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
EXT2_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_FAILED" #ENDIF)
EXT2_SET_FRANKLIN_INTO_SKYDIVING_OUTFIT(FALSE)
IF IS_ENTITY_ALIVE(vehPlaneSkydive) // If this plane is alive the player will either be inside it or in the process of skydiving out
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-1036.1206, -2731.8335, 12.7565>>, 332.5734)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-1023.8408, -2728.1885, 12.7005>>, 238.4360)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_gen_sparks)
STOP_PARTICLE_FX_LOOPED(ptfx_gen_sparks)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_moving_clouds)
STOP_PARTICLE_FX_LOOPED(ptfx_moving_clouds)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_wind_and_smoke)
STOP_PARTICLE_FX_LOOPED(ptfx_wind_and_smoke)
ENDIF
STOP_SOUND(iSparksSound)
EXT2_STOP_CARREC_IF_PLAYING(vehPlaneChase)
EXT2_STOP_CARREC_IF_PLAYING(vehPlaneSkydive)
EXT2_STOP_CARREC_IF_PLAYING(vehATV[VEHICLE_DOM])
SAFE_DELETE_OBJECT(objectInvisibleProp)
SAFE_DELETE_PED(pedDom)
SAFE_DELETE_PED(pedAirportBooth)
SAFE_DELETE_VEHICLE(vehATV[VEHICLE_PLAYER])
SAFE_DELETE_VEHICLE(vehATV[VEHICLE_DOM])
SAFE_DELETE_VEHICLE(vehPlaneChase)
SAFE_DELETE_VEHICLE(vehPlaneSkydive)
INFORM_MISSION_STATS_OF_INCREMENT(EXT2_NUMBER_OF_SPINS, 0, TRUE) // B*1550843 Reset to 0 when failing
Script_Cleanup()
ELSE
EXT2_MANAGE_THREATEN_DOM_DIALOGUE()
ENDIF
BREAK
ENDSWITCH
ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Checks for debug keys being pressed.
PROC DEBUG_Check_Debug_Keys()
IF bZSkipping = FALSE
AND (GET_GAME_TIMER() - iDebugSkipTime) > 1000
AND ENUM_TO_INT(missionState) < (ENUM_TO_INT(NUM_MISSION_STATES)-1) // Don't check during stateFailed
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: S key pressed so passing mission") ENDIF #ENDIF
IF missionState = stateIntro
WAIT_FOR_CUTSCENE_TO_STOP()
ENDIF
Script_Passed()
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: F key pressed so failing mission") ENDIF #ENDIF
IF missionState = stateIntro
WAIT_FOR_CUTSCENE_TO_STOP()
ENDIF
EXT2_MISSION_FAILED()
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: J key pressed so doing z skip forwards") ENDIF #ENDIF
SWITCH missionState
CASE stateIntro
IF IS_CUTSCENE_ACTIVE()
STOP_CUTSCENE()
ENDIF
BREAK
CASE stateGoIntoAirport
EXT2_DEBUG_SKIP_STATE(Z_SKIP_DRIVE_OUT_PLANE)
BREAK
CASE stateMidtroPlane
missionStateMachine = EXT2_STATE_MACHINE_CLEANUP
BREAK
CASE stateJumpOutPlane
CASE stateSkydive
CASE stateGoToDom
EXT2_DEBUG_SKIP_STATE(Z_SKIP_LANDED_AFTER_SKYDIVE)
BREAK
CASE stateFinalConversation
EXT2_DEBUG_SKIP_STATE(Z_SKIP_MISSION_PASSED)
BREAK
ENDSWITCH
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: P key pressed so doing z skip backwards") ENDIF #ENDIF
SWITCH missionState
CASE stateGoIntoAirport
EXT2_DEBUG_SKIP_STATE(Z_SKIP_INTRO)
BREAK
CASE stateJumpOutPlane
EXT2_DEBUG_SKIP_STATE(Z_SKIP_GO_IN_AIRPORT)
BREAK
CASE stateSkydive
CASE stateGoToDom
CASE stateFinalConversation
EXT2_DEBUG_SKIP_STATE(Z_SKIP_DRIVE_OUT_PLANE)
BREAK
ENDSWITCH
ENDIF
INT i_new_state
IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, i_new_state)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "EXTREME2: Z skip menu used so doing z skip") ENDIF #ENDIF
EXT2_DEBUG_SKIP_STATE(i_new_state)
ENDIF
ENDIF
ENDPROC
#ENDIF
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU))
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
IF IS_ENTITY_ALIVE(vehPlaneSkydive) // This is all for B*457088
EXT2_STOP_CARREC_IF_PLAYING(vehPlaneSkydive)
FREEZE_ENTITY_POSITION(vehPlaneSkydive, TRUE)
SET_VEHICLE_STAYS_FROZEN_WHEN_CLEANED_UP(vehPlaneSkydive, TRUE)
ENDIF
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
Random_Character_Failed()
Script_Cleanup()
ENDIF
ADD_CONTACT_TO_PHONEBOOK(CHAR_DOM, FRANKLIN_BOOK, FALSE)
EXT2_MISSION_SETUP()
IF IS_REPLAY_IN_PROGRESS()
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE, TRUE)
INT istage = GET_REPLAY_MID_MISSION_STAGE()
IF g_bShitskipAccepted = TRUE
istage++
ENDIF
SWITCH istage
CASE CP_FOLLOW_DOM
START_REPLAY_SETUP(vPlayerAfterIntro, fPlayerAfterIntro)
EXT2_DEBUG_SKIP_STATE(Z_SKIP_GO_IN_AIRPORT)
BREAK
CASE CP_SKYDIVE
START_REPLAY_SETUP(vATVOnPlane[VEHICLE_PLAYER], 0)
EXT2_DEBUG_SKIP_STATE(Z_SKIP_DRIVE_OUT_PLANE)
BREAK
CASE CP_LANDED
START_REPLAY_SETUP(vPlayerOutro, fPlayerOutro)
EXT2_DEBUG_SKIP_STATE(Z_SKIP_LANDED_AFTER_SKYDIVE)
BREAK
CASE CP_MISSION_PASSED
START_REPLAY_SETUP(vPlayerOutro, fPlayerOutro)
EXT2_DEBUG_SKIP_STATE(Z_SKIP_MISSION_PASSED)
BREAK
ENDSWITCH
ENDIF
WHILE(TRUE)
WAIT(0)
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
EXT2_DEATH_CHECKS()
SWITCH missionState
CASE stateIntro
MS_INTRO()
BREAK
CASE stateGoIntoAirport
MS_GO_INTO_AIRPORT()
BREAK
CASE stateMidtroPlane
MS_MIDTRO_PLANE()
BREAK
CASE stateJumpOutPlane
MS_JUMP_OUT_PLANE()
BREAK
CASE stateSkydive
MS_SKYDIVE()
BREAK
CASE stateGoToDom
MS_GO_TO_DOM()
BREAK
CASE stateFinalConversation
MS_FINAL_CONVERSATION()
BREAK
CASE stateMissionPassed
Script_Passed()
BREAK
CASE stateFailed
MS_FAILED()
BREAK
ENDSWITCH
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_Extreme2")
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
ENDWHILE
ENDSCRIPT