2205 lines
72 KiB
Python
Executable File
2205 lines
72 KiB
Python
Executable File
|
|
USING "country_race_header.sch"
|
|
USING "minigame_big_message.sch"
|
|
|
|
//═══════════════════════════════════════╡ Constants ╞══════════════════════════════════════\\
|
|
|
|
//---------------------------------STAGE-RELATED-CONSTANTS----------------------------------\\
|
|
|
|
// Stage warps
|
|
VECTOR VECTOR_STAGE_SETUP_WARP = <<1967.0420, 3116.0051, 45.8901>>
|
|
VECTOR VECTOR_STAGE_RACE_WARP = <<1967.0420, 3116.0051, 45.8901>>
|
|
VECTOR VECTOR_STAGE_COMPLETE_WARP = <<1967.0420, 3116.0051, 45.8901>>
|
|
|
|
// Stage warp headings
|
|
CONST_FLOAT FLOAT_STAGE_SETUP_HEADING 103.4
|
|
CONST_FLOAT FLOAT_STAGE_RACE_HEADING 103.4
|
|
CONST_FLOAT FLOAT_STAGE_COMPLETE_HEADING 103.4
|
|
|
|
// Replay stages
|
|
CONST_INT INT_REPLAY_STAGE_SETUP 0
|
|
CONST_INT INT_REPLAY_STAGE_RACE 1
|
|
CONST_INT INT_REPLAY_STAGE_COMPLETE 2
|
|
|
|
// Total number of stages
|
|
CONST_INT INT_NUMBER_OF_STAGES 3
|
|
|
|
// Stage names
|
|
STRING STAGE_SETUP_NAME = "Stage Setup"
|
|
STRING STAGE_RACE_NAME = "Race"
|
|
STRING STAGE_COMPLETE_NAME = "Complete"
|
|
|
|
// Mission text
|
|
STRING MISSION_TEXT = ""
|
|
|
|
//-------------------------------------OTHER-CONSTANTS--------------------------------------\\
|
|
|
|
//VECTOR VECTOR_ZERO = <<0,0,0>>
|
|
CONST_FLOAT PER_FRAME_FORCE_MULTIPLIER 30.0
|
|
CONST_INT MAX_LOS_CHECK_ENTITIES 10
|
|
|
|
//═══════════════════════════════════════╡ Variables ╞══════════════════════════════════════\\
|
|
|
|
//-------------------------------------------Bools------------------------------------------\\
|
|
#IF IS_DEBUG_BUILD
|
|
BOOL bShowDebugCheckpointProgress
|
|
#ENDIF
|
|
BOOL b_PlayerBoosting = FALSE
|
|
BOOL b_ShouldRetry
|
|
//------------------------------------------Floats------------------------------------------\\
|
|
//-----------------------------------------Integers-----------------------------------------\\
|
|
|
|
INT i_TriggeredTextHashes[30]
|
|
INT i_MissionBitFlags = 0
|
|
INT i_StageProgress = 0
|
|
INT i_LOSCheckIndex
|
|
INT i_BoostTimer = 0
|
|
INT i_QuitTimer
|
|
INT i_TimeLapseProgress = 0
|
|
INT i_DNFTImer = 0
|
|
//------------------------------------------Strings-----------------------------------------\\
|
|
STRING st_FailString
|
|
//------------------------------------------Vectors-----------------------------------------\\
|
|
VECTOR v_DriveToStartlineOffset = <<8.669, -5.9084, 0.0428>>
|
|
VECTOR v_PosInitial, v_RotInitial
|
|
VECTOR v_PosDestination, v_RotDestination
|
|
//-------------------------------------------Misc-------------------------------------------\\
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
MissionStageMenuTextStruct stageMenu[INT_NUMBER_OF_STAGES]
|
|
WIDGET_GROUP_ID widgetDebug
|
|
#ENDIF
|
|
|
|
PED_STRUCT s_MissionPed [COUNT_OF(MISSION_PED_FLAGS)]
|
|
PED_STRUCT s_AmbientPed [COUNT_OF(AMBIENT_PED_FLAGS)]
|
|
VEHICLE_STRUCT s_MissionVehicle [COUNT_OF(MISSION_VEHICLE_FLAGS)]
|
|
OBJECT_STRUCT s_MissionObject [COUNT_OF(MISSION_OBJECT_FLAGS)]
|
|
LOCATES_HEADER_DATA s_LocatesData
|
|
SCRIPT_ENTITY_LOS_STRUCT s_LOSChecks[MAX_LOS_CHECK_ENTITIES]
|
|
COUNTRY_RACER_DATA s_PlayerRacerData
|
|
STRUCTTIMELAPSE s_Timelapse
|
|
MISSION_STAGE e_CurrentMissionStage
|
|
REL_GROUP_HASH e_RelEnemy
|
|
REL_GROUP_HASH e_RelBuddy
|
|
|
|
BIG_TEXT s_LapText
|
|
//BIG_TEXT s_FailText
|
|
MG_FAIL_SPLASH s_FailSplash
|
|
SCRIPT_SCALEFORM_BIG_MESSAGE s_BigMessage
|
|
//════════════════════════════════════════╡ Indeces ╞═══════════════════════════════════════\\
|
|
|
|
//-------------------------------------------Blips------------------------------------------\\
|
|
//------------------------------------------Cameras-----------------------------------------\\
|
|
CAMERA_INDEX cam_Initial
|
|
CAMERA_INDEX cam_Destination
|
|
//----------------------------------------Coverpoints---------------------------------------\\
|
|
//-----------------------------------------Entities-----------------------------------------\\
|
|
//------------------------------------------Objects-----------------------------------------\\
|
|
//--------------------------------------Particle-Effects------------------------------------\\
|
|
//-------------------------------------------Peds-------------------------------------------\\
|
|
PED_INDEX PLAYER = PLAYER_PED_ID()
|
|
//------------------------------------------Pickups-----------------------------------------\\
|
|
//-------------------------------------------Rope-------------------------------------------\\
|
|
//--------------------------------------Scaleform-Index-------------------------------------\\
|
|
//-----------------------------------------Sequences----------------------------------------\\
|
|
//----------------------------------------Shape-Tests---------------------------------------\\
|
|
//-------------------------------------Streaming-Volumes------------------------------------\\
|
|
//-----------------------------------------Vehicles-----------------------------------------\\
|
|
VEHICLE_INDEX ve_CheckpointVehicle
|
|
VEHICLE_INDEX ve_PlayersCar
|
|
VEHICLE_INDEX ve_RewardCar
|
|
|
|
/// PURPOSE:
|
|
/// Progresses the stage and resets any variables needed.
|
|
/// PARAMS:
|
|
/// eNextStage - The stage we need to advance to.
|
|
PROC PROGRESS_STAGE(MISSION_STAGE eNextStage)
|
|
|
|
i_StageProgress = 0
|
|
e_CurrentMissionStage = eNextStage
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all peds.
|
|
/// PARAMS:
|
|
/// bForceClean - Do we want to force clean?
|
|
PROC REMOVE_ALL_PEDS(BOOL bForceClean = FALSE)
|
|
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(s_MissionPed) i
|
|
REMOVE_PED( s_MissionPed[i].PedIndex, bForceClean )
|
|
ENDREPEAT
|
|
REPEAT COUNT_OF(s_AmbientPed) i
|
|
REMOVE_PED( s_AmbientPed[i].PedIndex, TRUE )
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all vehicles.
|
|
/// PARAMS:
|
|
/// bForceClean - Do we want to force clean?
|
|
PROC REMOVE_ALL_VEHICLES(BOOL bForceClean = FALSE, BOOL bRemovePlayersCar = TRUE)
|
|
|
|
IF bRemovePlayersCar AND bForceClean
|
|
IF IS_ENTITY_ALIVE(PLAYER) AND IS_PED_IN_ANY_VEHICLE(PLAYER)
|
|
SET_PLAYER_OUT_OF_ANY_VEHICLE()
|
|
ENDIF
|
|
REMOVE_VEHICLE( ve_PlayersCar, bForceClean )
|
|
ENDIF
|
|
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(s_MissionPed) i
|
|
REMOVE_VEHICLE( s_MissionPed[i].sVehicle.VehicleIndex, bForceClean )
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(s_MissionVehicle) i
|
|
REMOVE_VEHICLE( s_MissionVehicle[i].VehicleIndex, bForceClean )
|
|
ENDREPEAT
|
|
|
|
REMOVE_VEHICLE( ve_CheckpointVehicle, bForceClean )
|
|
REMOVE_VEHICLE( ve_RewardCar, bForceClean )
|
|
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all objects.
|
|
/// PARAMS:
|
|
/// bForceClean - Do we want to force clean?
|
|
PROC REMOVE_ALL_OBJECTS(BOOL bForceClean = FALSE)
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(s_MissionObject) i
|
|
REMOVE_OBJECT( s_MissionObject[i].ObjectIndex, bForceClean )
|
|
ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all blips.
|
|
PROC REMOVE_ALL_BLIPS()
|
|
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(s_MissionPed) i
|
|
SAFE_REMOVE_BLIP( s_MissionPed[i].BlipIndex )
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(s_MissionVehicle) i
|
|
SAFE_REMOVE_BLIP( s_MissionVehicle[i].BlipIndex )
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(s_MissionObject) i
|
|
SAFE_REMOVE_BLIP( s_MissionObject[i].BlipIndex )
|
|
ENDREPEAT
|
|
|
|
SAFE_REMOVE_BLIP(s_PlayerRacerData.blCurrentCheckpoint )
|
|
SAFE_REMOVE_BLIP(s_PlayerRacerData.blNextCheckpoint )
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all relationship groups.
|
|
PROC REMOVE_ALL_RELATIONSHIP_GROUPS()
|
|
|
|
REMOVE_RELATIONSHIP_GROUP(e_RelEnemy)
|
|
REMOVE_RELATIONSHIP_GROUP(e_RelBuddy)
|
|
REMOVE_RELATIONSHIP_GROUP(e_RelRacer)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all cover points.
|
|
PROC REMOVE_ALL_COVER_POINTS()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all door hashes.
|
|
PROC REMOVE_ALL_DOORS()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Cleans up the mission and all mission assets.
|
|
/// PARAMS:
|
|
/// bTerminate - Whether we want to terminate the script.
|
|
/// bForceCleanup - Whether to force the cleanup (delete assets).
|
|
PROC MISSION_CLEANUP( BOOL bTerminate = TRUE, BOOL bForceCleanup = FALSE, BOOL bRemovePlayersCar = TRUE, BOOL bDontRemoveIPL = FALSE)
|
|
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
|
|
REMOVE_ALL_PEDS(bForceCleanup)
|
|
REMOVE_ALL_VEHICLES(bForceCleanup, bRemovePlayersCar)
|
|
REMOVE_ALL_OBJECTS(bForceCleanup)
|
|
REMOVE_ALL_BLIPS()
|
|
REMOVE_ALL_COVER_POINTS()
|
|
REMOVE_ALL_DOORS()
|
|
|
|
IF s_PlayerRacerData.cpCurrentCheckpoint != NULL
|
|
DELETE_CHECKPOINT(s_PlayerRacerData.cpCurrentCheckpoint)
|
|
ENDIF
|
|
IF s_PlayerRacerData.cpPreviousCheckpoint != NULL
|
|
DELETE_CHECKPOINT(s_PlayerRacerData.cpPreviousCheckpoint)
|
|
ENDIF
|
|
|
|
CLEAR_TRIGGERED_LABELS(i_TriggeredTextHashes)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_LocatesData)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
KILL_ANY_CONVERSATION()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_TIME_SCALE(1)
|
|
SET_CUTSCENE_RUNNING(FALSE)
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
SET_ENTITY_VISIBLE(PLAYER, TRUE)
|
|
|
|
RELEASE_MINIGAME_COUNTDOWN_UI(s_RaceData.sCountDown)
|
|
|
|
CLEANUP_RACE_CHECKPOINTS(s_PlayerRacerData)
|
|
|
|
IF bForceCleanup
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER), 1000, TRUE)
|
|
ENDIF
|
|
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_VEHICLE_HANDBRAKE(ve_PlayersCar, FALSE)
|
|
ENDIF
|
|
|
|
ANIMPOSTFX_STOP_ALL()
|
|
|
|
STOP_AUDIO_SCENES()
|
|
STOP_STREAM()
|
|
|
|
IF bTerminate
|
|
|
|
// Turn off the slipstream effect
|
|
SET_ENABLE_VEHICLE_SLIPSTREAMING(FALSE)
|
|
|
|
REMOVE_ALL_RELATIONSHIP_GROUPS()
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE()
|
|
|
|
// Disable all peds...
|
|
SET_PED_POPULATION_BUDGET(2)
|
|
SET_REDUCE_PED_MODEL_BUDGET(FALSE)
|
|
SET_SCENARIO_TYPE_ENABLED( "WORLD_VEHICLE_BIKER", TRUE )
|
|
SET_SCENARIO_TYPE_ENABLED( "DRIVE", TRUE )
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", TRUE)
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_PASSENGERS", TRUE)
|
|
// Traffic and cops
|
|
SET_VEHICLE_POPULATION_BUDGET(2)
|
|
SET_REDUCE_VEHICLE_MODEL_BUDGET(FALSE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1)
|
|
SET_ROADS_IN_ANGLED_AREA( <<2565.207275,2896.661621,29.940796>>, <<1654.530151,3420.822021,63.940063>>, 470.000000, FALSE, TRUE)
|
|
|
|
// Turn on the slipstream effect
|
|
SET_ENABLE_VEHICLE_SLIPSTREAMING(FALSE)
|
|
|
|
IF IS_ENTITY_ALIVE( GET_PLAYERS_LAST_VEHICLE() )
|
|
SET_VEHICLE_DOORS_LOCKED( GET_PLAYERS_LAST_VEHICLE(), VEHICLELOCK_UNLOCKED )
|
|
SET_VEHICLE_HANDBRAKE( GET_PLAYERS_LAST_VEHICLE(), FALSE )
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF DOES_WIDGET_GROUP_EXIST(widgetDebug)
|
|
DELETE_WIDGET_GROUP(widgetDebug)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
PAUSE_CLOCK(FALSE)
|
|
|
|
// Reseting this here, in case MG_UPDATE_FAIL_SPLASH_SCREEN failed to cleanup. (Very important this gets reset)
|
|
SET_NO_LOADING_SCREEN(FALSE)
|
|
|
|
IF NOT bDontRemoveIPL
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_COUNTRY_RACETRACK, BUILDINGSTATE_NORMAL, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND IS_ENTITY_ALIVE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
FREEZE_ENTITY_POSITION(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), FALSE)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK_SUPPRESS_TRAFFIC()
|
|
|
|
MISSION_OVER(g_iRaceMissionCandidateID)
|
|
|
|
CPRINTLN(DEBUG_MISSION, "Cleaning up races.")
|
|
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, TRUE)
|
|
|
|
SET_CINEMATIC_BUTTON_ACTIVE( TRUE )
|
|
|
|
|
|
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialises the big text structs.
|
|
PROC INITIALISE_BIG_TEXT
|
|
|
|
s_LapText.eBigTextState = BTS_READY
|
|
s_LapText.iBigTextTimer = 0
|
|
//
|
|
// s_FailText.eBigTextState = BTS_READY
|
|
// s_FailText.iBigTextTimer = 0
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets up the missions relationship groups.
|
|
/// Sets a like - hate relationship between enemies and buddies/player.
|
|
PROC SETUP_RELATIONSHIP_GROUPS()
|
|
|
|
ADD_RELATIONSHIP_GROUP("ENEMIES", e_RelEnemy)
|
|
ADD_RELATIONSHIP_GROUP("BUDDIES", e_RelBuddy)
|
|
ADD_RELATIONSHIP_GROUP("RACERS", e_RelRacer)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, e_RelEnemy)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, e_RelBuddy)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, RELGROUPHASH_PLAYER, e_RelRacer)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, e_RelBuddy, e_RelEnemy)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, e_RelBuddy, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, e_RelBuddy, e_RelRacer)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, e_RelEnemy, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, e_RelEnemy, e_RelBuddy)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, e_RelEnemy, e_RelRacer)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, e_RelRacer, e_RelEnemy)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, e_RelRacer, e_RelBuddy)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, e_RelRacer, RELGROUPHASH_PLAYER)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialises mission variables.
|
|
PROC INITIALISE_MISSION_VARIABLES()
|
|
|
|
i_MissionBitFlags = 0
|
|
i_StageProgress = 0
|
|
i_DNFTImer = 0
|
|
i_BoostTimer = 0
|
|
b_PlayerBoosting = FALSE
|
|
i_TimeLapseProgress = 0
|
|
|
|
INITIALISE_COUNTRY_TRACK_DATA( s_TrackData )
|
|
INITIALISE_MISSION_VEHICLES( s_MissionVehicle )
|
|
INITIALISE_MISSION_PEDS( s_MissionPed, s_MissionVehicle )
|
|
INITIALISE_AMBIENT_PEDS( s_AmbientPed )
|
|
INITIALISE_MISSION_OBJECTS( s_MissionObject )
|
|
INITIALISE_RACER_DATA( s_PlayerRacerData )
|
|
INITIALISE_RACE_DATA( s_RaceData )
|
|
INITIALISE_BIG_TEXT()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets up the mission.
|
|
PROC MISSION_SETUP()
|
|
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
SAFE_FADE_SCREEN_OUT_TO_BLACK_SUPPRESS_TRAFFIC()
|
|
ENDIF
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_TIME_SCALE(1)
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
SETUP_RELATIONSHIP_GROUPS()
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_LocatesData)
|
|
|
|
e_CurrentMissionStage = STAGE_SETUP
|
|
|
|
PLAYER = PLAYER_PED_ID()
|
|
|
|
REQUEST_TEXT(MISSION_TEXT, DLC_TEXT_SLOT0, FALSE)
|
|
|
|
ADD_SCENARIO_BLOCKING_AREA_FROM_POSITION_AND_RADIUS( s_TrackData.vCheckpoint[0], 1000 )
|
|
ADD_SCENARIO_BLOCKING_AREA( <<2270.0408, 3006.9998, 44.1942>>, <<2276.2146, 3010.5435, 48.0713>> )
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE( TRUE )
|
|
|
|
// Remove vehicle gens
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-7000.0, -7000.0, -100.0>>, <<7000.0, 7000.0, 100.0>>, FALSE)
|
|
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<-7000.0, -7000.0, -100.0>>, <<7000.0, 7000.0, 100.0>>)
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE)
|
|
SET_ROADS_IN_ANGLED_AREA( <<2565.207275,2896.661621,29.940796>>, <<1654.530151,3420.822021,63.940063>>, 470.000000, FALSE, FALSE)
|
|
SET_SCENARIO_TYPE_ENABLED( "WORLD_VEHICLE_BIKER", FALSE )
|
|
SET_SCENARIO_TYPE_ENABLED( "DRIVE", FALSE )
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE)
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_PASSENGERS", FALSE)
|
|
// Disable all peds...
|
|
SET_PED_POPULATION_BUDGET(0)
|
|
SET_REDUCE_PED_MODEL_BUDGET(TRUE)
|
|
|
|
|
|
// Traffic and cops
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
SET_REDUCE_VEHICLE_MODEL_BUDGET(TRUE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0)
|
|
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
// Turn on the slipstream effect
|
|
SET_ENABLE_VEHICLE_SLIPSTREAMING(TRUE)
|
|
|
|
IF IS_GAMEPLAY_HINT_ACTIVE()
|
|
STOP_GAMEPLAY_HINT()
|
|
ENDIF
|
|
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
|
|
|
|
CPRINTLN(DEBUG_MISSION, "Mission Setup Complete.")
|
|
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Loads the setup stage assets.
|
|
PROC LOAD_STAGE_SETUP()
|
|
|
|
IF NOT IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
|
|
ve_PlayersCar = GET_PLAYERS_LAST_VEHICLE()
|
|
SET_ENTITY_AS_MISSION_ENTITY(ve_PlayersCar)
|
|
ELSE
|
|
REQUEST_MODEL(GAUNTLET)
|
|
WHILE NOT HAS_MODEL_LOADED(GAUNTLET)
|
|
wait(0)
|
|
ENDWHILE
|
|
ve_PlayersCar = CREATE_VEHICLE(GAUNTLET, s_TrackData.vStartingGrid[MAX_RACERS - 1] + v_DriveToStartlineOffset, s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GAUNTLET)
|
|
SET_PED_INTO_VEHICLE( PLAYER_PED_ID(), ve_PlayersCar )
|
|
ENDIF
|
|
ELSE
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, s_TrackData.vStartingGrid[MAX_RACERS - 1] + v_DriveToStartlineOffset, s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), ve_PlayersCar)
|
|
ENDIF
|
|
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, s_TrackData.vStartingGrid[MAX_RACERS - 1] + v_DriveToStartlineOffset, s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
|
|
e_CurrentMissionStage = STAGE_SETUP
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Loads the race stage.
|
|
PROC LOAD_STAGE_RACE()
|
|
|
|
REQUEST_MINIGAME_COUNTDOWN_UI( s_RaceData.sCountDown )
|
|
WHILE NOT HAS_MINIGAME_COUNTDOWN_UI_LOADED( s_RaceData.sCountDown )
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_COUNTRY_RACETRACK, BUILDINGSTATE_DESTROYED, FALSE)
|
|
|
|
INT i
|
|
FOR i = ENUM_TO_INT(MPF_RACER1 ) TO ENUM_TO_INT( MPF_RACER8 )
|
|
CREATE_MISSION_PED( s_MissionPed[i], TRUE )
|
|
ENDFOR
|
|
|
|
IF NOT IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
|
|
ve_PlayersCar = GET_PLAYERS_LAST_VEHICLE()
|
|
SET_ENTITY_AS_MISSION_ENTITY(ve_PlayersCar)
|
|
ELSE
|
|
REQUEST_MODEL(GAUNTLET)
|
|
WHILE NOT HAS_MODEL_LOADED(GAUNTLET)
|
|
wait(0)
|
|
ENDWHILE
|
|
ve_PlayersCar = CREATE_VEHICLE(GAUNTLET, s_TrackData.vStartingGrid[MAX_RACERS - 1], s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
SET_PED_INTO_VEHICLE( PLAYER_PED_ID(), ve_PlayersCar )
|
|
ENDIF
|
|
ELSE
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, s_TrackData.vStartingGrid[MAX_RACERS - 1], s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), ve_PlayersCar)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_FIXED(ve_PlayersCar)
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(ve_PlayersCar, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
SET_VEHICLE_HANDBRAKE(ve_PlayersCar, TRUE)
|
|
|
|
REQUEST_WAYPOINT_RECORDING( s_TrackData.stTrackWaypoint )
|
|
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED( s_TrackData.stTrackWaypoint )
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, s_TrackData.vStartingGrid[MAX_RACERS - 1], s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
|
|
e_CurrentMissionStage = STAGE_RACE
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Loads the complete stage.
|
|
PROC LOAD_STAGE_COMPLETE()
|
|
|
|
s_RaceData.bRaceOver = TRUE
|
|
|
|
REQUEST_WAYPOINT_RECORDING( s_TrackData.stTrackWaypoint )
|
|
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED( s_TrackData.stTrackWaypoint )
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
|
|
ve_PlayersCar = GET_PLAYERS_LAST_VEHICLE()
|
|
SET_ENTITY_AS_MISSION_ENTITY(ve_PlayersCar)
|
|
ELSE
|
|
REQUEST_MODEL(GAUNTLET)
|
|
WHILE NOT HAS_MODEL_LOADED(GAUNTLET)
|
|
wait(0)
|
|
ENDWHILE
|
|
ve_PlayersCar = CREATE_VEHICLE(GAUNTLET, s_TrackData.vCheckpoint[FINISH_LINE], s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GAUNTLET)
|
|
SET_PED_INTO_VEHICLE( PLAYER_PED_ID(), ve_PlayersCar )
|
|
ENDIF
|
|
|
|
SAFE_TELEPORT_ENTITY(GET_PLAYERS_LAST_VEHICLE(), s_TrackData.vCheckpoint[FINISH_LINE], s_TrackData.fStartingGrid[1] )
|
|
|
|
SET_VEHICLE_FORWARD_SPEED(GET_PLAYERS_LAST_VEHICLE(), 30)
|
|
|
|
|
|
CPRINTLN(DEBUG_MISSION, "Debug skipping to race complete.")
|
|
e_CurrentMissionStage = STAGE_COMPLETE
|
|
|
|
ENDPROC
|
|
|
|
//╒════════════════════════════════════════════════════════════════════════════════════════╕\\
|
|
//│ │\\
|
|
//│ Debug Procedures │\\
|
|
//│ │\\
|
|
//╘════════════════════════════════════════════════════════════════════════════════════════╛\\
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
/// PURPOSE:
|
|
/// Creates widgets.
|
|
PROC CREATE_MISSION_WIDGETS()
|
|
widgetDebug = START_WIDGET_GROUP("Country Race")
|
|
ADD_WIDGET_BOOL("Show Checkpoint Progress: ", bShowDebugCheckpointProgress)
|
|
INT i
|
|
FOR i = ENUM_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
TEXT_LABEL LapString, CheckpointString, ProgressString
|
|
LapString = s_MissionPed[i].Name
|
|
LapString += " Laps "
|
|
ADD_WIDGET_INT_READ_ONLY (LapString, s_MissionPed[i].sRacerData.iLap)
|
|
CheckpointString = s_MissionPed[i].Name
|
|
CheckpointString += " CP "
|
|
ADD_WIDGET_INT_READ_ONLY (CheckpointString, s_MissionPed[i].sRacerData.iCurrentCheckpoint)
|
|
ProgressString = s_MissionPed[i].Name
|
|
ProgressString += " RP "
|
|
ADD_WIDGET_INT_READ_ONLY (ProgressString, s_MissionPed[i].sRacerData.iRaceProgress)
|
|
ENDFOR
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets up the the debug menu.
|
|
PROC SETUP_MISSION_DEBUG_MENU()
|
|
|
|
stageMenu[INT_REPLAY_STAGE_SETUP].sTxtLabel = STAGE_SETUP_NAME
|
|
stageMenu[INT_REPLAY_STAGE_RACE].sTxtLabel = STAGE_RACE_NAME
|
|
stageMenu[INT_REPLAY_STAGE_COMPLETE].sTxtLabel = STAGE_COMPLETE_NAME
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
/// PURPOSE:
|
|
/// Skips the mission for menu skip.
|
|
/// PARAMS:
|
|
/// iReturnValue - The stage selected in the debug menu.
|
|
PROC MENU_SKIP(INT iReturnValue, BOOL bRemovePlayersCar = TRUE)
|
|
|
|
DO_SCREEN_FADE_OUT(500)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0)
|
|
SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0, 0)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
|
|
SET_PLAYER_OUT_OF_ANY_VEHICLE()
|
|
|
|
MISSION_CLEANUP(FALSE, TRUE, bRemovePlayersCar)
|
|
|
|
INITIALISE_MISSION_VARIABLES()
|
|
|
|
SWITCH iReturnValue
|
|
|
|
CASE INT_REPLAY_STAGE_SETUP
|
|
|
|
SAFE_TELEPORT_ENTITY( PLAYER, VECTOR_STAGE_SETUP_WARP, FLOAT_STAGE_SETUP_HEADING, TRUE )
|
|
LOAD_STAGE_SETUP()
|
|
|
|
BREAK
|
|
|
|
CASE INT_REPLAY_STAGE_RACE
|
|
|
|
SAFE_TELEPORT_ENTITY( PLAYER, VECTOR_STAGE_RACE_WARP, FLOAT_STAGE_RACE_HEADING, TRUE )
|
|
LOAD_STAGE_RACE()
|
|
|
|
BREAK
|
|
|
|
CASE INT_REPLAY_STAGE_COMPLETE
|
|
|
|
SAFE_TELEPORT_ENTITY( PLAYER, VECTOR_STAGE_COMPLETE_WARP, FLOAT_STAGE_COMPLETE_HEADING, TRUE )
|
|
LOAD_STAGE_COMPLETE()
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER))
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK_SUPPRESS_TRAFFIC()
|
|
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
/// PURPOSE:
|
|
/// Skips forwards to the next stage.
|
|
/// PARAMS:
|
|
/// iSkip - The int we are using for the stage.
|
|
PROC J_SKIP(INT &iSkip)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
KILL_ANY_CONVERSATION()
|
|
IF ENUM_TO_INT(e_CurrentMissionStage) = (INT_NUMBER_OF_STAGES - 1)
|
|
MISSION_FLOW_MISSION_PASSED()
|
|
MISSION_CLEANUP()
|
|
ELSE
|
|
iSkip = ENUM_TO_INT(e_CurrentMissionStage) + 1
|
|
MENU_SKIP(iSkip)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Skips backwards to the previous stage.
|
|
/// PARAMS:
|
|
/// iSkip - The int we are using for the stage.
|
|
PROC P_SKIP(INT &iSkip)
|
|
IF ENUM_TO_INT(e_CurrentMissionStage) = 0
|
|
iSkip = 0
|
|
ELSE
|
|
iSkip = ENUM_TO_INT(e_CurrentMissionStage) - 1
|
|
ENDIF
|
|
MENU_SKIP(iSkip)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Debug fails the mission
|
|
PROC DEBUG_FAIL()
|
|
SET_COUNTRY_RACE_FAILED()
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
Mission_Cleanup(TRUE, TRUE)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Debug passes the mission.
|
|
PROC DEBUG_PASS()
|
|
SET_COUNTRY_RACE_PASSED()
|
|
Mission_Cleanup()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Handle all debug procedures.
|
|
PROC DEBUG_UPDATE()
|
|
|
|
INT iSkip
|
|
|
|
// Z-Skip
|
|
IF LAUNCH_MISSION_STAGE_MENU(stageMenu, iSkip)
|
|
MENU_SKIP(iSkip, FALSE)
|
|
ENDIF
|
|
|
|
// J-Skip
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
IF s_RaceData.bRaceStarted AND NOT s_RaceData.bRaceOver
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_ENTITY_COORDS(ve_PlayersCar, s_TrackData.vCheckpoint[s_PlayerRacerData.iRaceProgress])
|
|
ENDIF
|
|
ELSE
|
|
J_SKIP(iSkip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// P-Skip
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
|
P_SKIP(iSkip)
|
|
ENDIF
|
|
|
|
INT iDebugPassRace = 0
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1) iDebugPassRace = 1 ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2) iDebugPassRace = 2 ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD3) iDebugPassRace = 3 ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4) iDebugPassRace = 4 ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD5) iDebugPassRace = 5 ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD6) iDebugPassRace = 6 ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD7) iDebugPassRace = 7 ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD8) iDebugPassRace = 8 ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD9) iDebugPassRace = 9 ENDIF
|
|
|
|
IF iDebugPassRace <> 0
|
|
e_CurrentMissionStage = STAGE_COMPLETE
|
|
i_StageProgress = 0
|
|
s_PlayerRacerData.iPosition = iDebugPassRace
|
|
s_PlayerRacerData.iFinalPosition = iDebugPassRace
|
|
s_RaceData.bRaceOver = TRUE
|
|
s_PlayerRacerData.iTotalTime = GET_GAME_TIMER() - s_RaceData.iRaceStartTime
|
|
IF s_PlayerRacerData.iTotalTime < g_savedGlobals.sCountryRaceData.iBestTime OR g_savedGlobals.sCountryRaceData.iBestTime = 0
|
|
g_savedGlobals.sCountryRaceData.iBestTime = s_PlayerRacerData.iTotalTime
|
|
ENDIF
|
|
CLEANUP_RACE_CHECKPOINTS(s_PlayerRacerData)
|
|
CPRINTLN(DEBUG_MISSION, "iDebugPassRace = ", iDebugPassRace, " passing race with position: ", iDebugPassRace)
|
|
ENDIF
|
|
|
|
// S-Pass
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
|
|
e_CurrentMissionStage = STAGE_COMPLETE
|
|
i_StageProgress = 0
|
|
s_PlayerRacerData.iPosition = 1
|
|
s_PlayerRacerData.iFinalPosition = 1
|
|
s_RaceData.bRaceOver = TRUE
|
|
s_PlayerRacerData.iTotalTime = GET_GAME_TIMER() - s_RaceData.iRaceStartTime
|
|
IF s_PlayerRacerData.iTotalTime < g_savedGlobals.sCountryRaceData.iBestTime OR g_savedGlobals.sCountryRaceData.iBestTime = 0
|
|
g_savedGlobals.sCountryRaceData.iBestTime = s_PlayerRacerData.iTotalTime
|
|
ENDIF
|
|
CLEANUP_RACE_CHECKPOINTS(s_PlayerRacerData)
|
|
CPRINTLN(DEBUG_MISSION, "S PASS Passing race in 1st position.")
|
|
ENDIF
|
|
|
|
// F-Fail
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
|
|
OR g_iDebugRaceWarp <> -1
|
|
DEBUG_FAIL()
|
|
ENDIF
|
|
|
|
IF bShowDebugCheckpointProgress
|
|
INT i
|
|
FOR i = ENUM_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
IF IS_ENTITY_ALIVE( s_MissionPed[i].sVehicle.VehicleIndex )
|
|
DRAW_DEBUG_TEXT( GET_STRING_FROM_INT(s_MissionPed[i].sRacerData.iLap), GET_ENTITY_COORDS( s_MissionPed[i].sVehicle.VehicleIndex ) + <<0,0,1.44>> )
|
|
DRAW_DEBUG_TEXT( GET_STRING_FROM_INT(s_MissionPed[i].sRacerData.iCurrentCheckpoint), GET_ENTITY_COORDS( s_MissionPed[i].sVehicle.VehicleIndex ) + <<0,0,1.38>> )
|
|
DRAW_DEBUG_TEXT( GET_STRING_FROM_FLOAT(s_MissionPed[i].sRacerData.fDistanceToNextCheckpoint), GET_ENTITY_COORDS( s_MissionPed[i].sVehicle.VehicleIndex ) + <<0,0,1.32>> )
|
|
STRING RSL
|
|
IF s_MissionPed[i].sRacerData.eRacerSkillLevel = RSL_POOR RSL = "Poor"
|
|
ELIF s_MissionPed[i].sRacerData.eRacerSkillLevel = RSL_AVERAGE RSL = "Average"
|
|
ELSE RSL = "Professional"
|
|
ENDIF
|
|
DRAW_DEBUG_TEXT( RSL, GET_ENTITY_COORDS( s_MissionPed[i].sVehicle.VehicleIndex ) + <<0,0,1.26>> )
|
|
DRAW_DEBUG_TEXT( GET_STRING_FROM_FLOAT(s_MissionPed[i].sRacerData.fSpeed), GET_ENTITY_COORDS( s_MissionPed[i].sVehicle.VehicleIndex ) + <<0,0,1.2>> )
|
|
DRAW_DEBUG_TEXT( GET_STRING_FROM_FLOAT(GET_ENTITY_SPEED(s_MissionPed[i].sVehicle.VehicleIndex)), GET_ENTITY_COORDS( s_MissionPed[i].sVehicle.VehicleIndex ) + <<0,0,1.14>> )
|
|
ENDIF
|
|
ENDFOR
|
|
DRAW_DEBUG_TEXT( GET_STRING_FROM_INT(s_PlayerRacerData.iLap), GET_ENTITY_COORDS( PLAYER ) + <<0,0,1.6>> )
|
|
DRAW_DEBUG_TEXT( GET_STRING_FROM_INT(s_PlayerRacerData.iCurrentCheckpoint), GET_ENTITY_COORDS( PLAYER ) + <<0,0,1.5>> )
|
|
DRAW_DEBUG_TEXT( GET_STRING_FROM_FLOAT(s_PlayerRacerData.fDistanceToNextCheckpoint), GET_ENTITY_COORDS( PLAYER ) + <<0,0,1.4>> )
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialises the debug widgets and menu.
|
|
PROC DEBUG_SETUP()
|
|
CREATE_MISSION_WIDGETS()
|
|
SETUP_MISSION_DEBUG_MENU()
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
INT iPrevClosestRacer
|
|
INT iRaceMixTimer
|
|
/// PURPOSE:
|
|
/// Adds the closest racer to the audio mixer and removes the previous closest
|
|
PROC ADD_CLOSEST_RACER_TO_MIX()
|
|
IF GET_GAME_TIMER() > iRaceMixTimer
|
|
FLOAT fDist
|
|
FLOAT fClosestDist = 9999999.9
|
|
INT iClosestRacer
|
|
INT i
|
|
|
|
FOR i = Enum_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
IF IS_VEHICLE_OK(s_MissionPed[i].sVehicle.VehicleIndex)
|
|
fDist = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), s_MissionPed[i].sVehicle.VehicleIndex)
|
|
IF fDist < fClosestDist
|
|
fDist = fClosestDist
|
|
iClosestRacer = i
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF iPrevClosestRacer > -1 AND IS_VEHICLE_OK(s_MissionPed[iPrevClosestRacer].sVehicle.VehicleIndex)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(s_MissionPed[iPrevClosestRacer].sVehicle.VehicleIndex)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_MissionPed[iPrevClosestRacer].sVehicle.VehicleIndex,"STREET_RACE_NPC_GENERAL")
|
|
ENDIF
|
|
IF IS_VEHICLE_OK(s_MissionPed[iClosestRacer].sVehicle.VehicleIndex)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_MissionPed[iClosestRacer].sVehicle.VehicleIndex,"STREET_RACE_NPC_CLOSEST")
|
|
ENDIF
|
|
|
|
iPrevClosestRacer = iClosestRacer
|
|
iRaceMixTimer = GET_GAME_TIMER() + 2000
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Updates the racers.
|
|
PROC UPDATE_RACERS()
|
|
|
|
INT i
|
|
|
|
FOR i = ENUM_TO_INT( MPF_RACER1 ) TO ENUM_TO_INT( MPF_RACER8 )
|
|
|
|
IF NOT s_MissionPed[i].bKilled
|
|
|
|
IF s_MissionPed[i].bCreated
|
|
|
|
IF IS_ENTITY_ALIVE( s_MissionPed[i].PedIndex )
|
|
|
|
BOOL bCanRevEngine = TRUE
|
|
|
|
IF i_TimeLapseProgress < 3 bCanRevEngine = FALSE ENDIF // Stop AI cars revving during timelapse.
|
|
|
|
HANDLE_RACER( s_MissionPed[i], s_PlayerRacerData, bCanRevEngine)
|
|
|
|
ADD_CLOSEST_RACER_TO_MIX()
|
|
|
|
IF IS_ENTITY_ALIVE( s_MissionPed[i].sVehicle.VehicleIndex )
|
|
|
|
IF NOT DOES_BLIP_EXIST(s_MissionPed[i].BlipIndex)
|
|
MANAGE_SLIDY_BLIP_FOR_ENTITY( s_MissionPed[i].BlipIndex, s_MissionPed[i].sVehicle.VehicleIndex, TRUE, 10, TRUE )
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(s_MissionPed[i].BlipIndex, "CRACEBLIP")
|
|
ELSE
|
|
MANAGE_SLIDY_BLIP_FOR_ENTITY( s_MissionPed[i].BlipIndex, s_MissionPed[i].sVehicle.VehicleIndex, TRUE, 10, FALSE )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
REMOVE_PED( s_MissionPed[i].PedIndex )
|
|
SAFE_REMOVE_BLIP( s_MissionPed[i].BlipIndex )
|
|
s_MissionPed[i].bKilled = TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT s_RaceData.bRaceOver AND IS_MISSION_BIT_FLAG_SET( MBF_TIMELAPSE_INITIATED, i_MissionBitFlags )
|
|
|
|
CREATE_MISSION_PED( s_MissionPed[i], FALSE, TRUE )
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
CONST_INT AMBIENT_PED_STREAM_IN_DIST 150 * 150
|
|
CONST_INT AMBIENT_PED_STREAM_OUT_DIST 200 * 200
|
|
|
|
FUNC STRING GET_AMBIENT_PED_SCENARIO(INT iPedIndex)
|
|
|
|
SWITCH INT_TO_ENUM( AMBIENT_PED_FLAGS, iPedIndex)
|
|
|
|
CASE APF_STARTLINE_1
|
|
CASE APF_STARTLINE_2
|
|
CASE APF_STARTLINE_4
|
|
CASE APF_CHECKPOINT0_1
|
|
CASE APF_CHECKPOINT2_1
|
|
CASE APF_CHECKPOINT2_2
|
|
CASE APF_CHECKPOINT3_1
|
|
CASE APF_STAND1_1
|
|
CASE APF_STAND1_3
|
|
CASE APF_STAND1_4
|
|
CASE APF_STAND2_1
|
|
CASE APF_STAND2_2
|
|
CASE APF_STAND2_3
|
|
CASE APF_FINISHLINE_1
|
|
CASE APF_FINISHLINE_2
|
|
CASE APF_FINISHLINE_3
|
|
CASE APF_FINISHLINE_4
|
|
RETURN "WORLD_HUMAN_CHEERING"
|
|
BREAK
|
|
|
|
CASE APF_STARTLINE_3
|
|
CASE APF_CHECKPOINT0_2
|
|
CASE APF_CHECKPOINT3_2
|
|
CASE APF_STAND1_2
|
|
CASE APF_STAND2_4
|
|
RETURN "WORLD_HUMAN_MOBILE_FILM_SHOCKING"
|
|
BREAK
|
|
|
|
CASE APF_HOTDOGSTAND
|
|
RETURN "WORLD_HUMAN_STAND_IMPATIENT"
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN ""
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Handles the AI logic of the ambient peds.
|
|
/// PARAMS:
|
|
/// PedData - The ped array we want to handle.
|
|
PROC HANDLE_AMBIENT_PEDS(PED_STRUCT &PedData[])
|
|
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(PedData) i
|
|
|
|
IF IS_ENTITY_ALIVE(PedData[i].PedIndex)
|
|
|
|
IF NOT IS_PED_IN_COMBAT(PedData[i].PedIndex)
|
|
AND NOT IS_PED_FLEEING(PedData[i].PedIndex)
|
|
AND NOT IS_PED_RAGDOLL(PedData[i].PedIndex)
|
|
|
|
SET_IK_TARGET(PedData[i].PedIndex, IK_PART_HEAD, PLAYER_PED_ID(), 0, <<0,0,0>>, ITF_DEFAULT)
|
|
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(PedData[i].PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE )
|
|
OPEN_SEQUENCE_TASK(PedData[i].SequenceIndex)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID(), 2000)
|
|
TASK_START_SCENARIO_IN_PLACE(null, GET_AMBIENT_PED_SCENARIO(i), -1, TRUE)
|
|
CLOSE_SEQUENCE_TASK(PedData[i].SequenceIndex)
|
|
TASK_PERFORM_SEQUENCE(PedData[i].PedIndex, PedData[i].SequenceIndex)
|
|
CLEAR_SEQUENCE_TASK(PedData[i].SequenceIndex)
|
|
PedData[i].iTaskTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
|
|
IF INT_TO_ENUM(AMBIENT_PED_FLAGS, i) != APF_HOTDOGSTAND // If the ped isn't the hotdog guy turn to face players car.
|
|
|
|
//If they aren't facing the player clear tasks so that they start the sequence again
|
|
IF GET_ENTITY_HEADING(PedData[i].PedIndex) - GET_HEADING_BETWEEN_VECTORS_2D(GET_ENTITY_COORDS(PedData[i].PedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 60
|
|
OR GET_ENTITY_HEADING(PedData[i].PedIndex) - GET_HEADING_BETWEEN_VECTORS_2D(GET_ENTITY_COORDS(PedData[i].PedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < -60
|
|
IF GET_GAME_TIMER() > PedData[i].iTaskTimer + 5000
|
|
CLEAR_PED_TASKS(PedData[i].PedIndex)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SEQUENCE_PROGRESS(PedData[i].PedIndex) > 0
|
|
IF GET_GAME_TIMER() > PedData[i].iTaskTimer + 4000
|
|
IF INT_TO_ENUM(AMBIENT_PED_FLAGS, i) = APF_STARTLINE_3
|
|
OR INT_TO_ENUM(AMBIENT_PED_FLAGS, i) = APF_CHECKPOINT0_2
|
|
OR INT_TO_ENUM(AMBIENT_PED_FLAGS, i) = APF_CHECKPOINT3_2
|
|
OR INT_TO_ENUM(AMBIENT_PED_FLAGS, i) = APF_STAND1_2
|
|
OR INT_TO_ENUM(AMBIENT_PED_FLAGS, i) = APF_STAND2_4
|
|
SET_IK_TARGET(PedData[i].PedIndex, IK_PART_ARM_RIGHT, PLAYER_PED_ID(), 0, <<0,0,0>>, ITF_DEFAULT, 500, 300)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF IS_PED_RAGDOLL(PedData[i].PedIndex)
|
|
SET_ENTITY_HEALTH(PedData[i].PedIndex, 0)
|
|
ELSE
|
|
REMOVE_PED(PedData[i].PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Streams ambient peds in and out as the player travels around the track.
|
|
PROC UPDATE_AMBIENT_PEDS()
|
|
|
|
INT i
|
|
|
|
REPEAT COUNT_OF( s_AmbientPed ) i
|
|
|
|
IF NOT s_AmbientPed[i].bKilled
|
|
|
|
IF s_AmbientPed[i].bCreated
|
|
|
|
IF IS_ENTITY_ALIVE(s_AmbientPed[i].PedIndex)
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_AmbientPed[i].PedIndex)) > AMBIENT_PED_STREAM_OUT_DIST
|
|
|
|
REMOVE_PED(s_AmbientPed[i].PedIndex, TRUE)
|
|
s_AmbientPed[i].bCreated = FALSE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
REMOVE_PED(s_AmbientPed[i].PedIndex)
|
|
s_AmbientPed[i].bKilled = TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_MISSION_BIT_FLAG_SET(MBF_TIMELAPSE_INITIATED, i_MissionBitFlags)
|
|
AND NOT s_RaceData.bRaceOver
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), s_AmbientPed[i].vPosition) < AMBIENT_PED_STREAM_IN_DIST
|
|
|
|
CREATE_AMBIENT_PED( s_AmbientPed[i], FALSE )
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDREPEAT
|
|
|
|
|
|
HANDLE_AMBIENT_PEDS(s_AmbientPed)
|
|
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates which checkpoint the player is currently on.
|
|
PROC HANDLE_PLAYER_RACE_PROGRESS()
|
|
|
|
IF s_RaceData.bRaceStarted AND NOT s_RaceData.bRaceOver
|
|
|
|
IF s_PlayerRacerData.iRaceProgress < MAX_CHECKPOINTS
|
|
s_PlayerRacerData.fDistanceToNextCheckpoint = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER, s_TrackData.vCheckpoint[s_PlayerRacerData.iRaceProgress])
|
|
ENDIF
|
|
|
|
SWITCH s_PlayerRacerData.iRaceProgress
|
|
|
|
//Race to finish line.
|
|
CASE 5 //This case needs to be the index of the finish line.
|
|
IF IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), s_TrackData.vFinishLineMin, s_TrackData.vFinishLineMax, s_TrackData.fFinishLineWidth)
|
|
|
|
s_PlayerRacerData.iLap++
|
|
s_PlayerRacerData.iCurrentCheckpoint++
|
|
IF s_PlayerRacerData.iLap < s_TrackData.iNumLaps
|
|
s_PlayerRacerData.iCurrentLapTime = GET_GAME_TIMER() - s_PlayerRacerData.iLapTimer
|
|
IF s_PlayerRacerData.iCurrentLapTime < s_PlayerRacerData.iBestLapTime s_PlayerRacerData.iBestLapTime = s_PlayerRacerData.iCurrentLapTime ENDIF
|
|
s_PlayerRacerData.iLapTimer = GET_GAME_TIMER()
|
|
s_PlayerRacerData.iRaceProgress = 0
|
|
s_LapText.eBigTextState = BTS_LOAD
|
|
ELSE
|
|
s_PlayerRacerData.iTotalTime = GET_GAME_TIMER() - s_RaceData.iRaceStartTime
|
|
IF s_PlayerRacerData.iTotalTime < g_savedGlobals.sCountryRaceData.iBestTime OR g_savedGlobals.sCountryRaceData.iBestTime = 0
|
|
g_savedGlobals.sCountryRaceData.iBestTime = s_PlayerRacerData.iTotalTime
|
|
ENDIF
|
|
s_PlayerRacerData.bFinished = TRUE
|
|
CPRINTLN(DEBUG_MISSION, "Player Finished.")
|
|
s_RaceData.bRaceOver = TRUE
|
|
ENDIF
|
|
PLAY_SOUND_FRONTEND(-1, "CHECKPOINT_NORMAL", "HUD_MINI_GAME_SOUNDSET", FALSE)
|
|
CLEANUP_RACE_CHECKPOINTS(s_PlayerRacerData)
|
|
ENDIF
|
|
BREAK
|
|
|
|
DEFAULT
|
|
IF s_PlayerRacerData.fDistanceToNextCheckpoint < 20
|
|
s_PlayerRacerData.iCurrentCheckpoint++
|
|
s_PlayerRacerData.iRaceProgress++
|
|
PLAY_SOUND_FRONTEND(-1, "CHECKPOINT_NORMAL", "HUD_MINI_GAME_SOUNDSET", FALSE)
|
|
CLEANUP_RACE_CHECKPOINTS(s_PlayerRacerData)
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF NOT s_RaceData.bRaceOver
|
|
|
|
IF NOT b_PlayerBoosting
|
|
IF GET_GAME_TIMER() < s_RaceData.iRaceStartTime + 500
|
|
IF CAN_VEHICLE_BOOST(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
|
|
SET_VEHICLE_BOOST_ACTIVE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), TRUE)
|
|
ENDIF
|
|
i_BoostTimer = GET_GAME_TIMER() + 2000
|
|
ANIMPOSTFX_PLAY("RaceTurbo", 0, FALSE)
|
|
b_PlayerBoosting = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() > i_BoostTimer OR NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
|
|
SET_VEHICLE_BOOST_ACTIVE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), FALSE)
|
|
ENDIF
|
|
b_PlayerBoosting = FALSE
|
|
ELSE
|
|
APPLY_FORCE_TO_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), APPLY_TYPE_FORCE, <<0.0, 20.0, 0.0>>, <<0.0, 0.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_FAR_RIGHT_TITLE_POSITION_HUD_THIS_FRAME()
|
|
|
|
DISPLAY_LAPS_BIG_TEXT(s_LapText, s_PlayerRacerData)
|
|
|
|
// DRAW_LOOP_RACE_HUD(GET_GAME_TIMER() - s_RaceData.iRaceStartTime, 0, "", s_PlayerRacerData.iLap+1,s_TrackData.iNumLaps,"",s_PlayerRacerData.iPosition,MAX_RACERS,"",0,HUD_COLOUR_WHITE,-1,-1,"",DEFAULT,DEFAULT,DEFAULT,DEFAULT,
|
|
// DEFAULT,DEFAULT,DEFAULT,GET_GAME_TIMER() - s_PlayerRacerData.iLapTimer,"")
|
|
|
|
|
|
DRAW_LOOP_RACE_HUD(GET_GAME_TIMER() - s_RaceData.iRaceStartTime, //Race Time
|
|
0, //iComparison
|
|
"", //Timer Title "Time"
|
|
s_PlayerRacerData.iLap+1, //Current Lap
|
|
s_TrackData.iNumLaps, //Total Laps
|
|
"", //Lap Title "Lap"
|
|
s_PlayerRacerData.iPosition, //Current Position
|
|
MAX_RACERS, //Total Racers
|
|
"", //Position title "Position"
|
|
0, //Extra Time
|
|
HUD_COLOUR_WHITE, //Placement Colour
|
|
s_PlayerRacerData.iCurrentCheckpoint + 1, //Current Checkpoint
|
|
30, //Total Checkpoints
|
|
"", //Checkpoint Title
|
|
HUD_COLOUR_WHITE, //Checkpoint Colour
|
|
-1, //Meters
|
|
-1, //Max Meters
|
|
"", //Meters Title
|
|
HUD_COLOUR_RED, //Meter Colour
|
|
g_SavedGlobals.sCountryRaceData.iBestTime, //Best Time
|
|
"CRACEBTIME", //Best Time Title
|
|
GET_GAME_TIMER() - s_PlayerRacerData.iLapTimer, //Lap Time
|
|
"", //Lap Time Title
|
|
PODIUMPOS_NONE, //Podium Position
|
|
TRUE, //Display Milliseconds
|
|
-1, //Flashing
|
|
"", //Float Title
|
|
-1.0, //Float Value
|
|
HUD_COLOUR_WHITE, //Float Colour
|
|
HUD_COLOUR_WHITE, //Best Time Colour
|
|
-1.0, //Distance Check
|
|
-1, //Worlds Best Time
|
|
FALSE, //Time Trial
|
|
-1, //Checkpoint Time
|
|
-1, //Challenge Time
|
|
"", //World Name
|
|
TRUE) //Use Personal Best instead of World Best
|
|
|
|
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_MULTIPLAYER_INFO)
|
|
IF NOT g_Show_Lap_Dpad
|
|
g_Show_Lap_Dpad = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF g_Show_Lap_Dpad
|
|
g_Show_Lap_Dpad = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DRAW_RACE_CHECKPOINTS(s_PlayerRacerData)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC FAIL_RACE(STRING sFailText)
|
|
|
|
PROGRESS_STAGE(STAGE_FAIL)
|
|
st_FailString = sFailText
|
|
|
|
ENDPROC
|
|
|
|
PROC CHECK_FAIL()
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<1688.298950,3336.850586,24.684418>>, <<2475.162842,2991.082275,120.054871>>, 480.000000)
|
|
// FAIL_RACE("CRACEFAIL1")
|
|
PROGRESS_STAGE(STAGE_FAIL)
|
|
st_FailString = "CRACEFAIL1"
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC QUIT_RACE()
|
|
|
|
SAFE_FADE_SCREEN_OUT_TO_BLACK_SUPPRESS_TRAFFIC()
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, <<1948.2572, 3142.9358, 45.8642>>, 51.7219, TRUE)
|
|
SET_COUNTRY_RACE_FAILED()
|
|
MISSION_CLEANUP(TRUE, TRUE, FALSE)
|
|
|
|
ENDPROC
|
|
|
|
PROC HANDLE_RACE_QUITTING()
|
|
IF s_RaceData.bRaceStarted AND NOT s_RaceData.bRaceOver
|
|
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
|
|
IF GET_GAME_TIMER() > i_QuitTimer + 500
|
|
DRAW_GENERIC_METER(GET_GAME_TIMER() - i_QuitTimer - 500, 3000, "CRACEQUIT", HUD_COLOUR_RED, 0, HUDORDER_EIGHTHBOTTOM, -1, -1, FALSE, TRUE)
|
|
IF GET_GAME_TIMER() > i_QuitTimer + 3500
|
|
CPRINTLN(DEBUG_MISSION, "Race quit by player.")
|
|
FAIL_RACE("CRACEFAIL1")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
i_QuitTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
INT i_StoppedTimer, i_StoppedSound
|
|
|
|
PROC INIT_STOPPED_SOUND()
|
|
i_StoppedSound = GET_SOUND_ID()
|
|
i_StoppedTimer = -1
|
|
ENDPROC
|
|
|
|
FUNC INT GET_CLOSEST_RACER()
|
|
INT i_index
|
|
FLOAT fDistance = 0
|
|
FLOAT fClosestDistance = 9999999999.9
|
|
INT iClosest
|
|
|
|
FOR i_index = ENUM_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
IF IS_VEHICLE_OK(s_MissionPed[i_index].sVehicle.VehicleIndex)
|
|
fDistance = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), s_MissionPed[i_index].sVehicle.VehicleIndex)
|
|
|
|
IF fDistance < fClosestDistance
|
|
fClosestDistance = fDistance
|
|
iClosest = i_index
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
RETURN iClosest
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Main update for the mission, anything that needs to happen independant of stage goes in here.
|
|
PROC MAIN_UPDATE()
|
|
|
|
CHECK_FAIL()
|
|
|
|
HANDLE_PLAYER_RACE_PROGRESS()
|
|
UPDATE_RACERS()
|
|
UPDATE_AMBIENT_PEDS()
|
|
UPDATE_PLAYER_POSITION(s_MissionPed, s_PlayerRacerData)
|
|
UPDATE_SCRIPT_ENTITY_LOS_DISTRIBUTED_CHECKS( s_LOSChecks, i_LOSCheckIndex )
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
|
|
|
|
DISABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_VEH_ATTACK )
|
|
DISABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_VEH_AIM )
|
|
DISABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_AIM ) //url:bugstar:2059984
|
|
DISABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_VEH_ATTACK2 )
|
|
DISABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON )
|
|
DISABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON )
|
|
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0)
|
|
SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(0, 0)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the player is driving a large vehicle
|
|
/// RETURNS:
|
|
/// true if the player is driving a large vehicle
|
|
FUNC BOOL PLAYERS_CAR_IS_BIG()
|
|
IF IS_VEHICLE_OK(ve_PlayersCar)
|
|
MODEL_NAMES mnCar = GET_ENTITY_MODEL(ve_PlayersCar)
|
|
|
|
IF mnCar = BALLER
|
|
OR mnCar = BALLER2
|
|
OR mnCar = BISON
|
|
OR mnCar = BISON2
|
|
OR mnCar = BISON3
|
|
OR mnCar = BOBCATXL
|
|
OR mnCar = CAVALCADE
|
|
OR mnCar = CAVALCADE2
|
|
OR mnCar = CRUSADER
|
|
OR mnCar = DUBSTA
|
|
OR mnCar = DUBSTA2
|
|
OR mnCar = FQ2
|
|
OR mnCar = GRANGER
|
|
OR mnCar = GRESLEY
|
|
OR mnCar = LANDSTALKER
|
|
OR mnCar = MESA
|
|
OR mnCar = MESA2
|
|
OR mnCar = MESA3
|
|
OR mnCar = PATRIOT
|
|
OR mnCar = RADI
|
|
OR mnCar = RANCHERXL
|
|
OR mnCar = RANCHERXL2
|
|
OR mnCar = REBEL
|
|
OR mnCar = ROCOTO
|
|
OR mnCar = SADLER
|
|
OR mnCar = SADLER2
|
|
OR mnCar = SANDKING
|
|
OR mnCar = SANDKING2
|
|
OR mnCar = SEMINOLE
|
|
OR mnCar = SUPERD
|
|
OR mnCar = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY("huntley"))
|
|
OR mnCar = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY("DUBSTA3"))
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the player is driving a very large vehicle
|
|
/// RETURNS:
|
|
/// TRUE if the player is driving a very large vehicle
|
|
FUNC BOOL PLAYERS_CAR_IS_VERY_BIG()
|
|
IF IS_VEHICLE_OK(ve_PlayersCar)
|
|
MODEL_NAMES mnCar = GET_ENTITY_MODEL(ve_PlayersCar)
|
|
|
|
IF mnCar = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY("MONSTER"))
|
|
OR mnCar = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY("MARSHALL"))
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a timelapse to a desired time.
|
|
/// RETURNS:
|
|
/// Whethe the timelapse is completed.
|
|
FUNC BOOL DO_RACE_INTRO_CUTSCENE()
|
|
|
|
BOOL bAssetsCreated
|
|
INT i
|
|
|
|
SWITCH i_TimeLapseProgress
|
|
|
|
CASE 0
|
|
IF REQUEST_AMBIENT_AUDIO_BANK("TIME_LAPSE")
|
|
|
|
s_Timelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
|
|
|
|
ADD_CAM_SPLINE_NODE(s_Timelapse.splineCamera, <<2002.6934, 3097.8193, 50.8232>>, <<5.4256, 0.0276, -170.9332>>, 10000, CAM_SPLINE_NODE_NO_FLAGS)
|
|
ADD_CAM_SPLINE_NODE(s_Timelapse.splineCamera, <<2002.8185, 3097.4880, 48.0966>>, <<7.3944, 0.0276, -159.5117>>, 10000, CAM_SPLINE_NODE_NO_FLAGS)
|
|
|
|
SET_CAM_FOV(s_Timelapse.splineCamera, 40)
|
|
SET_CAM_ACTIVE(s_Timelapse.splineCamera, TRUE)
|
|
PLAY_SOUND_FRONTEND(-1, "TIME_LAPSE_MASTER")
|
|
SET_TODS_CUTSCENE_RUNNING(s_Timelapse, TRUE, FALSE, DEFAULT, DEFAULT, FALSE)
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000, TRUE)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SETTIMERA(0)
|
|
SET_MISSION_BIT_FLAG( MBF_TIMELAPSE_INITIATED, i_MissionBitFlags )
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
ANIMPOSTFX_PLAY( "MinigameEndMichael", 5000, FALSE )
|
|
BREAK
|
|
CASE CHAR_FRANKLIN
|
|
ANIMPOSTFX_PLAY( "MinigameEndFranklin", 5000, FALSE )
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
ANIMPOSTFX_PLAY( "MinigameEndTrevor", 5000, FALSE )
|
|
BREAK
|
|
ENDSWITCH
|
|
i_TimeLapseProgress++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(GET_RACE_TIMEOFDAY(), 0, "", "", s_Timelapse)
|
|
RELEASE_AMBIENT_AUDIO_BANK()
|
|
SETTIMERA(0)
|
|
i_TimeLapseProgress++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF TIMERA() > 1500
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
TASK_VEHICLE_DRIVE_TO_COORD(PLAYER_PED_ID(), ve_PlayersCar, s_TrackData.vStartingGrid[MAX_CHECKPOINTS -1], 0.95, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(ve_PlayersCar), DRIVINGMODE_AVOIDCARS, 3.5, -1)
|
|
SET_RADIO_TO_STATION_NAME("RADIO_01_CLASS_ROCK")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("TOD_SHIFT_SCENE")
|
|
STOP_SOUND(s_Timelapse.iSplineStageSound)
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE")
|
|
STOP_AUDIO_SCENE("TOD_SHIFT_SCENE")
|
|
ENDIF
|
|
CPRINTLN(DEBUG_MISSION, "Intro Cutscene - Panning cam to players bonnet.")
|
|
SET_RADIO_STATION_MUSIC_ONLY("RADIO_01_CLASS_ROCK", TRUE)
|
|
|
|
FOR i = ENUM_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
IF IS_ENTITY_ALIVE(s_MissionPed[i].sVehicle.VehicleIndex)
|
|
SET_VEHICLE_HEADLIGHT_SHADOWS(s_MissionPed[i].sVehicle.VehicleIndex, HEADLIGHTS_CAST_FULL_SHADOWS)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF PLAYERS_CAR_IS_BIG()
|
|
v_PosInitial = <<-0.7054, 6.3148, 2.0821>>
|
|
v_RotInitial = <<0.9495, 3.9011, 2.7419>>
|
|
v_PosDestination = <<-0.5670, 2.6724, 1.2077>>
|
|
v_RotDestination = <<0.0940, -0.2423, 0.7483>>
|
|
ELIF PLAYERS_CAR_IS_VERY_BIG()
|
|
v_PosInitial = <<-1.6831, 6.0271, 4.2228>>
|
|
v_RotInitial = <<-0.0245, 3.5705, 4.6855>>
|
|
v_PosDestination = <<-1.0281, 4.6872, 1.1868>>
|
|
v_RotDestination = <<-0.1850, 1.8112, 1.1221>>
|
|
ELSE
|
|
v_PosInitial = <<-1.5802, 5.8398, 2.2274>>
|
|
v_RotInitial = <<0.1970, 3.5006, 2.8356>>
|
|
v_PosDestination = <<-0.6678, 1.9740, 0.8876>>
|
|
v_RotDestination = <<0.1440, -0.9013, 0.4170>>
|
|
ENDIF
|
|
|
|
cam_Initial = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA")
|
|
SET_CAM_FOV(cam_Initial, 40.0)
|
|
ATTACH_CAM_TO_ENTITY(cam_Initial, ve_PlayersCar, v_PosInitial)
|
|
POINT_CAM_AT_ENTITY(cam_Initial, ve_PlayersCar, v_RotInitial)
|
|
|
|
cam_Destination = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA")
|
|
SET_CAM_FOV(cam_Destination, 40.0)
|
|
ATTACH_CAM_TO_ENTITY(cam_Destination, ve_PlayersCar, v_PosDestination)
|
|
POINT_CAM_AT_ENTITY(cam_Destination, ve_PlayersCar, v_RotDestination)
|
|
|
|
SET_CAM_ACTIVE(cam_Initial, TRUE)
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_Destination,cam_Initial,4000,GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE, 0)
|
|
SHAKE_CAM(cam_Initial,"ROAD_VIBRATION_SHAKE",0.5)
|
|
SHAKE_CAM(cam_Destination,"ROAD_VIBRATION_SHAKE",0.5)
|
|
|
|
SETTIMERA(0)
|
|
|
|
START_AUDIO_SCENE("RACE_INTRO_GENERIC")
|
|
IF LOAD_STREAM("STOCK_RACE_INTRO","ROAD_RACE_SOUNDSET")
|
|
PLAY_STREAM_FRONTEND()
|
|
ENDIF
|
|
i_TimeLapseProgress++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF TIMERA() > 6000
|
|
DESTROY_ALL_CAMS()
|
|
CPRINTLN(DEBUG_MISSION, "Intro Cutscene - Panning across race front.")
|
|
cam_Initial = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1960.1542, 3125.9194, 47.8242>>, <<-2.4987, 0.0002, -95.2875>>, 25.0)
|
|
cam_Destination = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1963.0167, 3129.4304, 47.4810>>, <<-3.0689, 0.0002, -114.3019>>, 25.0)
|
|
SET_CAM_ACTIVE(cam_Initial, TRUE)
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_Destination,cam_Initial,7000,GRAPH_TYPE_LINEAR)
|
|
SHAKE_CAM(cam_Initial,"HAND_SHAKE", 0.1)
|
|
SHAKE_CAM(cam_Destination,"HAND_SHAKE", 0.1)
|
|
SETTIMERA(0)
|
|
i_TimeLapseProgress++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF TIMERA() > 4900
|
|
IF IS_SCRIPT_TASK_RUNNING_OR_STARTING( PLAYER_PED_ID(), SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_VEHICLE_HANDBRAKE(ve_PlayersCar, TRUE)
|
|
ENDIF
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERA() > 7000
|
|
DESTROY_ALL_CAMS()
|
|
CPRINTLN(DEBUG_MISSION, "Intro Cutscene - Easing back to gameplay cam.")
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
cam_Initial = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1990.6644, 3113.4822, 47.1558>>, <<0.8047, 0.0484, 56.7722>>, 50.0, TRUE)
|
|
cam_Destination = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, GET_GAMEPLAY_CAM_COORD(), GET_GAMEPLAY_CAM_ROT(), GET_GAMEPLAY_CAM_FOV())
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_Destination, cam_Initial, 4000, GRAPH_TYPE_DECEL)
|
|
SETTIMERA(0)
|
|
i_TimeLapseProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
CASE 6
|
|
IF TIMERA() > 3000
|
|
bAssetsCreated = TRUE
|
|
|
|
FOR i = ENUM_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
IF NOT DOES_ENTITY_EXIST(s_MissionPed[i].PedIndex)
|
|
bAssetsCreated = FALSE
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF NOT DOES_ENTITY_EXIST(ve_PlayersCar)
|
|
bAssetsCreated = FALSE
|
|
ENDIF
|
|
|
|
IF bAssetsCreated
|
|
SET_TODS_CUTSCENE_RUNNING( s_Timelapse, FALSE, DEFAULT, DEFAULT, DEFAULT, FALSE)
|
|
IF IS_AUDIO_SCENE_ACTIVE("TOD_SHIFT_SCENE")
|
|
STOP_SOUND(s_Timelapse.iSplineStageSound)
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE")
|
|
STOP_AUDIO_SCENE("TOD_SHIFT_SCENE")
|
|
ENDIF
|
|
SET_RADIO_TO_STATION_NAME("RADIO_01_CLASS_ROCK")
|
|
SET_RADIO_STATION_MUSIC_ONLY("RADIO_01_CLASS_ROCK", TRUE)
|
|
START_AUDIO_SCENE("RACE_INTRO_GENERIC")
|
|
DESTROY_ALL_CAMS()
|
|
STOP_STREAM()
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
SAFE_FADE_SCREEN_OUT_TO_BLACK_SUPPRESS_TRAFFIC()
|
|
SET_CLOCK_TIME(GET_RACE_TIMEOFDAY(),0,0)
|
|
SETTIMERA(0)
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_VEHICLE_HANDBRAKE(ve_PlayersCar, TRUE)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, s_TrackData.vStartingGrid[MAX_RACERS - 1], s_TrackData.fStartingGrid[MAX_RACERS - 1], TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(ve_PlayersCar)
|
|
ENDIF
|
|
i_TimeLapseProgress = 6
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Does the logic for the setup stage.
|
|
PROC DO_STAGE_SETUP()
|
|
|
|
SWITCH i_StageProgress
|
|
|
|
CASE 0
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(INT_REPLAY_STAGE_SETUP, STAGE_SETUP_NAME, FALSE, TRUE)
|
|
i_TimeLapseProgress = 0
|
|
i_StageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
MISSION_PED_FLAGS ePed
|
|
|
|
IF DO_RACE_INTRO_CUTSCENE()
|
|
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_INVINCIBLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), FALSE)
|
|
|
|
FOR ePed = MPF_RACER1 TO MPF_RACER8
|
|
IF IS_ENTITY_ALIVE(s_MissionPed[ePed].PedIndex)
|
|
SET_ENTITY_INVINCIBLE(s_MissionPed[ePed].PedIndex, FALSE)
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(s_MissionPed[ePed].sVehicle.VehicleIndex)
|
|
SET_ENTITY_INVINCIBLE(s_MissionPed[ePed].sVehicle.VehicleIndex, FALSE)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK_SUPPRESS_TRAFFIC()
|
|
|
|
i_StageProgress++
|
|
|
|
ELSE
|
|
|
|
IF IS_MISSION_BIT_FLAG_SET( MBF_TIMELAPSE_INITIATED, i_MissionBitFlags )
|
|
|
|
REQUEST_MINIGAME_COUNTDOWN_UI( s_RaceData.sCountDown )
|
|
REQUEST_WAYPOINT_RECORDING( s_TrackData.stTrackWaypoint )
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_COUNTRY_RACETRACK, BUILDINGSTATE_DESTROYED, FALSE)
|
|
LOAD_STREAM("STOCK_RACE_INTRO","ROAD_RACE_SOUNDSET")
|
|
|
|
FOR ePed = MPF_RACER1 TO MPF_RACER8
|
|
IF IS_ENTITY_ALIVE(s_MissionPed[ePed].PedIndex)
|
|
SET_ENTITY_INVINCIBLE(s_MissionPed[ePed].PedIndex, TRUE)
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(s_MissionPed[ePed].sVehicle.VehicleIndex)
|
|
SET_ENTITY_INVINCIBLE(s_MissionPed[ePed].sVehicle.VehicleIndex, TRUE)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF NOT DOES_ENTITY_EXIST(ve_PlayersCar)
|
|
|
|
IF NOT IS_SPHERE_VISIBLE( GET_ENTITY_COORDS(PLAYER_PED_ID()), 2 )
|
|
AND NOT IS_SPHERE_VISIBLE( s_TrackData.vStartingGrid[MAX_RACERS - 1], 2 )
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
ve_PlayersCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
SET_ENTITY_AS_MISSION_ENTITY(ve_PlayersCar)
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, s_TrackData.vStartingGrid[MAX_RACERS - 1] + v_DriveToStartlineOffset, s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
ELSE
|
|
REQUEST_MODEL(GAUNTLET)
|
|
IF HAS_MODEL_LOADED(GAUNTLET)
|
|
ve_PlayersCar = CREATE_VEHICLE(GAUNTLET, s_TrackData.vStartingGrid[MAX_RACERS - 1] + v_DriveToStartlineOffset, s_TrackData.fStartingGrid[MAX_RACERS - 1])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_VEHICLE_FIXED(ve_PlayersCar)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), ve_PlayersCar)
|
|
SET_PED_INTO_VEHICLE( PLAYER_PED_ID(), ve_PlayersCar )
|
|
ENDIF
|
|
IF GET_VEHICLE_DOOR_LOCK_STATUS(ve_PlayersCar) != VEHICLELOCK_LOCKED_PLAYER_INSIDE
|
|
SET_VEHICLE_DOORS_LOCKED(ve_PlayersCar, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
PROGRESS_STAGE( STAGE_RACE )
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Does the logic of the race stage.
|
|
PROC DO_STAGE_RACE()
|
|
|
|
INT i
|
|
|
|
SWITCH i_StageProgress
|
|
|
|
CASE 0
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(INT_REPLAY_STAGE_RACE, STAGE_RACE_NAME, FALSE, TRUE)
|
|
CPRINTLN(DEBUG_MISSION, "Stage Do Race.")
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK_SUPPRESS_TRAFFIC()
|
|
REQUEST_SCRIPT_AUDIO_BANK("HUD_321_GO")
|
|
CLEAR_BITMASK_AS_ENUM(s_RaceData.sCountDown.iBitFlags, CNTDWN_UI_Played_Go)
|
|
CLEAR_BITMASK_AS_ENUM(s_RaceData.sCountDown.iBitFlags, CNTDWN_UI_Played_1)
|
|
CLEAR_BITMASK_AS_ENUM(s_RaceData.sCountDown.iBitFlags, CNTDWN_UI_Played_2)
|
|
CLEAR_BITMASK_AS_ENUM(s_RaceData.sCountDown.iBitFlags, CNTDWN_UI_Played_3)
|
|
INIT_STOPPED_SOUND()
|
|
s_BigMessage.siMovie = REQUEST_MG_BIG_MESSAGE()
|
|
MG_INIT_FAIL_SPLASH_SCREEN(s_FailSplash)
|
|
IF g_savedGlobals.sCountryRaceData.iSlipStreamHelpCount < 2
|
|
PRINT_HELP("FM_IHELP_SLP") // You can slipstream by driving close behind another racer. This will give you a speed boost.
|
|
g_savedGlobals.sCountryRaceData.iSlipStreamHelpCount++
|
|
ENDIF
|
|
|
|
i_StageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
DRAW_SCALEFORM_MOVIE( s_RaceData.sCountDown.uiCountdown, 0.5, 0.5, 1.0, 1.0, 255, 255, 255, 100 )
|
|
|
|
IF UPDATE_MINIGAME_COUNTDOWN_UI( s_RaceData.sCountDown, TRUE, FALSE, TRUE, 3, TRUE)
|
|
|
|
STOP_STREAM()
|
|
RELEASE_MINIGAME_COUNTDOWN_UI(s_RaceData.sCountDown)
|
|
i_QuitTimer = GET_GAME_TIMER()
|
|
i_StageProgress++
|
|
|
|
ENDIF
|
|
|
|
IF NOT s_RaceData.bRaceStarted
|
|
IF IS_BITMASK_AS_ENUM_SET( s_RaceData.sCountDown.iBitFlags, CNTDWN_UI_Played_Go)
|
|
s_RaceData.bRaceStarted = TRUE
|
|
CPRINTLN(DEBUG_MISSION, "Camera cut on timer: ", TIMERA())
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_FIRST_PERSON_FLASH_EFFECT_VEHICLE_MODEL_HASH(ENUM_TO_INT(GET_ENTITY_MODEL(ve_PlayersCar)))
|
|
ENDIF
|
|
SET_TODS_CUTSCENE_RUNNING( s_Timelapse, FALSE, TRUE, DEFAULT, TRUE, FALSE)
|
|
DESTROY_ALL_CAMS()
|
|
IF IS_ENTITY_ALIVE( GET_PLAYERS_LAST_VEHICLE() )
|
|
SET_VEHICLE_HANDBRAKE( GET_PLAYERS_LAST_VEHICLE(), FALSE )
|
|
ENDIF
|
|
DISPLAY_HUD( TRUE )
|
|
DISPLAY_RADAR( TRUE )
|
|
CPRINTLN( DEBUG_MISSION, "Race Started!" )
|
|
STOP_AUDIO_SCENE("RACE_INTRO_GENERIC")
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
s_RaceData.iRaceStartTime = GET_GAME_TIMER()
|
|
s_PlayerRacerData.iLapTimer = s_RaceData.iRaceStartTime
|
|
START_AUDIO_SCENE("STREET_RACE_DURING_RACE")
|
|
FOR i = ENUM_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
s_MissionPed[i].bCanBeBlipped = TRUE
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(s_MissionPed[i].sVehicle.VehicleIndex,"STREET_RACE_NPC_GENERAL")
|
|
ENDFOR
|
|
ELSE
|
|
IF TIMERA() > 2800 AND i_TimeLapseProgress = 5
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
|
|
IF NOT IS_MISSION_BIT_FLAG_SET(MBF_FLASH1_TRIGGERED, i_MissionBitFlags)
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_FIRST_PERSON_FLASH_EFFECT_VEHICLE_MODEL_HASH(ENUM_TO_INT(GET_ENTITY_MODEL(ve_PlayersCar)))
|
|
ENDIF
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
CPRINTLN(DEBUG_MISSION, "Doing push in flash.")
|
|
SET_MISSION_BIT_FLAG(MBF_FLASH1_TRIGGERED, i_MissionBitFlags)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
INT iNumAIFinished
|
|
iNumAIFinished = 0
|
|
FOR i = ENUM_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
IF s_MissionPed[i].sRacerData.bFinished
|
|
iNumAIFinished++
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF iNumAIFinished = MAX_RACERS - 1
|
|
IF i_DNFTImer = 0
|
|
CPRINTLN(DEBUG_MISSION, "All other racers finished, starting DNF timer. Player will fail in 30 seconds.")
|
|
i_DNFTImer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF s_PlayerRacerData.bFinished
|
|
s_RaceData.bRaceOver = TRUE
|
|
s_PlayerRacerData.iFinalPosition = s_PlayerRacerData.iPosition
|
|
CLEANUP_RACE_CHECKPOINTS(s_PlayerRacerData)
|
|
i_StageProgress++
|
|
ENDIF
|
|
|
|
IF (i_DNFTImer <> 0 AND GET_GAME_TIMER() > i_DNFTImer + 30000) //Player has 30 seconds to finish after the last racer finishes.
|
|
PROGRESS_STAGE(STAGE_FAIL)
|
|
CPRINTLN(DEBUG_MISSION, "Player DNF, Progressing to STAGE_FAIL")
|
|
st_FailString = "CRACEFAIL1"
|
|
ENDIF
|
|
|
|
IF IS_CHAR_ALMOST_STOPPED(PLAYER_PED_ID())
|
|
IF i_StoppedTimer < 0
|
|
i_StoppedTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2500, 5000)
|
|
ELIF GET_GAME_TIMER() > i_StoppedTimer
|
|
PLAY_SOUND_FROM_ENTITY(i_StoppedSound, "DISTANT_RACERS", s_MissionPed[GET_CLOSEST_RACER()].sVehicle.VehicleIndex, "ROAD_RACE_SOUNDSET")
|
|
CPRINTLN(DEBUG_MISSION, "Playing sound - DISTANT_RACERS")
|
|
i_StoppedTimer = -1
|
|
ENDIF
|
|
ELSE
|
|
IF i_StoppedTimer > 0
|
|
i_StoppedTimer = -1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_PLAYER_VEHICLE_RESPAWNING(s_PlayerRacerData)
|
|
HANDLE_RACE_QUITTING()
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
STOP_AUDIO_SCENE("STREET_RACE_DURING_RACE")
|
|
CPRINTLN(DEBUG_MISSION, "s_PlayerRacerData.bFinished = ", s_PlayerRacerData.bFinished,", Race Passed.")
|
|
PROGRESS_STAGE( STAGE_COMPLETE )
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
|
|
END_SCREEN_DATASET s_EndScreen
|
|
SIMPLE_USE_CONTEXT s_UseContext
|
|
BOOL bRetry
|
|
|
|
|
|
PROC DO_STAGE_COMPLETE()
|
|
|
|
INT i
|
|
|
|
SWITCH i_StageProgress
|
|
|
|
CASE 0
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(INT_REPLAY_STAGE_COMPLETE, STAGE_COMPLETE_NAME, TRUE, TRUE)
|
|
START_AUDIO_SCENE("STREET_RACE_OUTRO")
|
|
i_StageProgress++
|
|
BREAK
|
|
|
|
// INITIAL FINISH LINE CAMERA - Slow ease back.
|
|
CASE 1
|
|
cam_Initial = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1954.7765, 3149.1460, 47.0701>>, <<4.9054, -0.0416, -158.4057>>, 52.4461)
|
|
cam_Destination = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1954.7765, 3150.1460, 47.0701>>, <<4.9054, -0.0416, -158.4057>>, 52.4461)
|
|
SET_CAM_ACTIVE(cam_Initial, TRUE)
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_Destination, cam_Initial, 2000, GRAPH_TYPE_LINEAR)
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
ANIMPOSTFX_PLAY( "MinigameEndMichael", 0, FALSE )
|
|
BREAK
|
|
CASE CHAR_FRANKLIN
|
|
ANIMPOSTFX_PLAY( "MinigameEndFranklin", 0, FALSE )
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
ANIMPOSTFX_PLAY( "MinigameEndTrevor", 0, FALSE )
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
PLAY_SOUND_FRONTEND(-1,"Hit_In","PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_CUTSCENE_RUNNING(TRUE)
|
|
SET_CINEMATIC_MODE_ACTIVE( FALSE )
|
|
SHAKE_CAM(cam_Destination,"HAND_SHAKE",0.3)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING( PLAYER, GET_VEHICLE_PED_IS_IN( PLAYER ), s_TrackData.stTrackWaypoint, DRIVINGMODE_AVOIDCARS_RECKLESS, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN | EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE, -1, 30, TRUE )
|
|
IF s_PlayerRacerData.iFinalPosition = 1
|
|
REQUEST_MODEL(GET_TRIGGER_CAR_MODEL())
|
|
ENDIF
|
|
|
|
i_StageProgress++
|
|
BREAK
|
|
|
|
//WHIP CAMERA UP TO SKY
|
|
CASE 2
|
|
IF DOES_CAM_EXIST(cam_Destination)
|
|
IF NOT IS_CAM_INTERPOLATING(cam_Destination)
|
|
DESTROY_CAM(cam_Initial)
|
|
cam_Initial = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1954.7765, 3149.1460, 47.0701>>, <<89.5011, -0.0416, -158.4057>>, 30)
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_Initial,cam_Destination,600,GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
SET_CAM_MOTION_BLUR_STRENGTH(cam_Initial,1.0)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
BRING_VEHICLE_TO_HALT(GET_VEHICLE_PED_IS_IN( PLAYER ), 10, 1)
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
ANIMPOSTFX_STOP( "MinigameEndMichael" )
|
|
BREAK
|
|
CASE CHAR_FRANKLIN
|
|
ANIMPOSTFX_STOP( "MinigameEndFranklin" )
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
ANIMPOSTFX_STOP( "MinigameEndTrevor" )
|
|
BREAK
|
|
ENDSWITCH
|
|
ANIMPOSTFX_PLAY("MinigameTransitionIn", 0, TRUE)
|
|
PLAY_SOUND_FRONTEND(-1,"Short_Transition_In","PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
DESTROY_CAM(cam_Destination)
|
|
e_EndScreenState = END_SCREEN_INITIATE
|
|
i_StageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF DOES_CAM_EXIST(cam_Initial)
|
|
IF NOT IS_CAM_INTERPOLATING(cam_Initial)
|
|
FOR i = Enum_TO_INT(MPF_RACER1) TO ENUM_TO_INT(MPF_RACER8)
|
|
SAFE_REMOVE_BLIP(s_MissionPed[i].BlipIndex)
|
|
REMOVE_PED(s_MissionPed[i].PedIndex, TRUE)
|
|
REMOVE_VEHICLE(s_MissionPed[i].sVehicle.VehicleIndex, TRUE)
|
|
ENDFOR
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_COUNTRY_RACETRACK, BUILDINGSTATE_NORMAL, FALSE)
|
|
REPEAT COUNT_OF(s_AmbientPed) i
|
|
REMOVE_PED( s_AmbientPed[i].PedIndex, TRUE )
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
IF DISPLAY_RACE_RESULTS(s_PlayerRacerData, s_EndScreen, s_UseContext, bRetry)
|
|
IF !bRetry
|
|
IF s_PlayerRacerData.iFinalPosition > 1
|
|
i_StageProgress = 10
|
|
ELSE
|
|
ve_RewardCar = CREATE_VEHICLE(GET_TRIGGER_CAR_MODEL(), GET_TRIGGER_CAR_COORDS(), GET_TRIGGER_CAR_HEADING())
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_TRIGGER_CAR_MODEL())
|
|
IF g_savedGlobals.sCountryRaceData.iCurrentRace = COUNTRY_RACE_5
|
|
SET_VEHICLE_LIVERY(ve_RewardCar, 0)
|
|
SET_VEHICLE_COLOURS(ve_RewardCar, 44, 83)
|
|
SET_VEHICLE_EXTRA_COLOURS(ve_RewardCar, 111, 111)
|
|
ENDIF
|
|
i_StageProgress ++
|
|
ENDIF
|
|
ELSE
|
|
MENU_SKIP(INT_REPLAY_STAGE_RACE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
// WHIP CAMERA DOWN TO SHOT ON PRIZE CAR
|
|
CASE 4
|
|
DESTROY_ALL_CAMS()
|
|
cam_Initial = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1971.3821, 3108.1348, 47.2013>>, <<89.4758, 0.0478, 53.1639>>, 53.374201)
|
|
SET_CAM_ACTIVE(cam_Initial, TRUE)
|
|
cam_Destination = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1971.3821, 3108.1348, 47.2013>>, <<0.4758, 0.0478, 53.1639>>, 53.374201)
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_Destination,cam_Initial,600,GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
ANIMPOSTFX_STOP("MinigameTransitionIn")
|
|
PLAY_SOUND_FRONTEND(-1,"Short_Transition_Out","PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
SET_CAM_MOTION_BLUR_STRENGTH(cam_Initial,1.0)
|
|
SHAKE_CAM(cam_Initial,"HAND_SHAKE",0.3)
|
|
SET_CAM_MOTION_BLUR_STRENGTH(cam_Destination,1.0)
|
|
SHAKE_CAM(cam_Destination,"HAND_SHAKE",0.3)
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, <<1967.4711, 3124.5825, 46.0038>>, 186.2056, TRUE)
|
|
TASK_VEHICLE_MISSION_COORS_TARGET(PLAYER_PED_ID(), ve_PlayersCar, <<1968.5, 3113.2, 45.9001>>, MISSION_GOTO, 2, DRIVINGMODE_AVOIDCARS, 1, -1)
|
|
ANIMPOSTFX_STOP_ALL()
|
|
ANIMPOSTFX_PLAY("MinigameTransitionOut", 0, FALSE)
|
|
CLEAR_AREA(GET_RACE_TRIGGER_LOCATION(), 100, TRUE)
|
|
i_StageProgress ++
|
|
BREAK
|
|
|
|
// PAN CAMERA ACROSS AS PLAYER DRIVES IN
|
|
CASE 5
|
|
IF DOES_CAM_EXIST(cam_Destination)
|
|
IF NOT IS_CAM_INTERPOLATING(cam_Destination)
|
|
DESTROY_CAM(cam_Initial)
|
|
cam_Initial = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1971.6366, 3108.4292, 47.2010>>, <<0.1839, 0.0478, 40.5043>>, 40)
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_Initial,cam_Destination, 5000, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
SHAKE_CAM(cam_Initial,"HAND_SHAKE")
|
|
SETTIMERA(0)
|
|
i_StageProgress ++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6
|
|
IF TIMERA() > 4700
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
OR GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
ENDIF
|
|
i_StageProgress ++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 7
|
|
IF DOES_CAM_EXIST(cam_Initial)
|
|
IF NOT IS_CAM_INTERPOLATING(cam_Initial)
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) <> CAM_VIEW_MODE_FIRST_PERSON
|
|
AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) <> CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-69.3229)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10.5361)
|
|
ENDIF
|
|
SET_CUTSCENE_RUNNING(FALSE)
|
|
SETTIMERA(0)
|
|
i_StageProgress ++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 8
|
|
ANIMPOSTFX_STOP_ALL()
|
|
TRACK_VEHICLE_FOR_IMPOUND(ve_RewardCar)
|
|
SET_COUNTRY_RACE_PASSED()
|
|
CPRINTLN(DEBUG_MISSION, "Race Passed")
|
|
STOP_AUDIO_SCENE("STREET_RACE_OUTRO")
|
|
MISSION_CLEANUP()
|
|
BREAK
|
|
|
|
// PLAYER FAILED SO WHIP CAMERA DOWN TO THEIR CAR.
|
|
CASE 10
|
|
DESTROY_ALL_CAMS()
|
|
cam_Initial = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1953.3099, 3139.0049, 48.1762>>, <<89.5003, -0.0032, 52.2429>>, 25.374201)
|
|
SET_CAM_ACTIVE(cam_Initial, TRUE)
|
|
cam_Destination = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1953.3099, 3139.0049, 48.1762>>, <<-7.3963, -0.0058, 52.1179>>, 45)
|
|
SET_CAM_ACTIVE_WITH_INTERP(cam_Destination,cam_Initial,800,GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
ANIMPOSTFX_STOP("MinigameTransitionIn")
|
|
PLAY_SOUND_FRONTEND(-1,"Short_Transition_Out","PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
SET_CAM_MOTION_BLUR_STRENGTH(cam_Initial,1.0)
|
|
SHAKE_CAM(cam_Initial,"HAND_SHAKE",0.3)
|
|
SET_CAM_MOTION_BLUR_STRENGTH(cam_Destination,1.0)
|
|
SHAKE_CAM(cam_Destination,"HAND_SHAKE",0.3)
|
|
SAFE_TELEPORT_ENTITY(ve_PlayersCar, <<1948.2572, 3142.9358, 45.8642>>, 51.7219, TRUE)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ANIMPOSTFX_PLAY("MinigameTransitionOut", 0, FALSE)
|
|
CLEAR_AREA(GET_RACE_TRIGGER_LOCATION(), 100, TRUE)
|
|
SETTIMERA(0)
|
|
i_StageProgress ++
|
|
BREAK
|
|
|
|
CASE 11
|
|
IF TIMERA() > 500
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_FIRST_PERSON_FLASH_EFFECT_VEHICLE_MODEL_HASH(ENUM_TO_INT(GET_ENTITY_MODEL(ve_PlayersCar)))
|
|
ENDIF
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
CPRINTLN(DEBUG_MISSION, "Doing push in flash.")
|
|
ENDIF
|
|
i_StageProgress ++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 12
|
|
IF TIMERA() > 790
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
IF IS_ENTITY_ALIVE(ve_PlayersCar)
|
|
SET_FIRST_PERSON_FLASH_EFFECT_VEHICLE_MODEL_HASH(ENUM_TO_INT(GET_ENTITY_MODEL(ve_PlayersCar)))
|
|
ENDIF
|
|
SET_CUTSCENE_RUNNING(FALSE, FALSE, TRUE, DEFAULT)
|
|
SETTIMERA(0)
|
|
i_StageProgress++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 13
|
|
IF TIMERA() > 2000
|
|
ANIMPOSTFX_STOP_ALL()
|
|
SET_COUNTRY_RACE_FAILED()
|
|
CPRINTLN(DEBUG_MISSION, "Race Failed")
|
|
STOP_AUDIO_SCENE("STREET_RACE_OUTRO")
|
|
MISSION_CLEANUP()
|
|
ENDIF
|
|
BREAK
|
|
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC DO_FAIL()
|
|
|
|
// IF NOT IS_MISSION_BIT_FLAG_SET(MBF_FAIL_CLEANUP, i_MissionBitFlags)
|
|
// MISSION_CLEANUP(FALSE, FALSE, FALSE, TRUE)
|
|
// SET_MISSION_BIT_FLAG(MBF_FAIL_CLEANUP, i_MissionBitFlags)
|
|
// ENDIF
|
|
|
|
DISABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_VEH_CIN_CAM )
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
|
|
SWITCH i_StageProgress
|
|
|
|
CASE 0
|
|
SET_CINEMATIC_BUTTON_ACTIVE( FALSE )
|
|
i_StageProgress ++
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF MG_UPDATE_FAIL_SPLASH_SCREEN(s_BigMessage, s_FailSplash, "CRACEFAIL", st_FailString, b_ShouldRetry)
|
|
IF b_ShouldRetry
|
|
PLAY_SOUND_FRONTEND(-1,"YES","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
MENU_SKIP(INT_REPLAY_STAGE_RACE, FALSE)
|
|
ELSE
|
|
// Terminate script
|
|
PLAY_SOUND_FRONTEND(-1,"NO","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
DO_SCREEN_FADE_OUT(500)
|
|
SETTIMERA(0)
|
|
i_StageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF TIMERA() > 1500
|
|
MISSION_CLEANUP(TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
|
|
|
|
ENDPROC
|
|
|
|
SCRIPT
|
|
|
|
SET_MISSION_FLAG(TRUE)
|
|
|
|
IF HAS_FORCE_CLEANUP_OCCURRED()
|
|
CPRINTLN(DEBUG_MISSION, "FORCE CLEANUP - Cleaning up races.")
|
|
MISSION_CLEANUP()
|
|
ENDIF
|
|
|
|
MISSION_SETUP()
|
|
|
|
INITIALISE_MISSION_VARIABLES()
|
|
|
|
#IF IS_DEBUG_BUILD DEBUG_SETUP() #ENDIF
|
|
|
|
WHILE TRUE
|
|
|
|
IF e_CurrentMissionStage <> STAGE_FAIL MAIN_UPDATE() ENDIF
|
|
|
|
SWITCH e_CurrentMissionStage
|
|
|
|
CASE STAGE_SETUP
|
|
DO_STAGE_SETUP() // Intro cutscene and setup.
|
|
BREAK
|
|
|
|
CASE STAGE_RACE
|
|
DO_STAGE_RACE() // Handle the race.
|
|
BREAK
|
|
|
|
CASE STAGE_COMPLETE
|
|
DO_STAGE_COMPLETE() // Outro cutscene and cleanup.
|
|
BREAK
|
|
|
|
CASE STAGE_FAIL
|
|
DO_FAIL()
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD DEBUG_UPDATE() #ENDIF
|
|
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
ENDSCRIPT |