//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], <>, 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(<>, <<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