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

1973 lines
66 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
CONST_INT USE_TU_CHANGES 1
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 "replay_public.sch"
USING "RC_Helper_Functions.sch"
USING "RC_Threat_Public.sch"
USING "initial_scenes_Hao.sch"
//USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
USING "Race_Control.sch"
USING "commands_recording.sch"
USING "taxi_functions.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
#ENDIF
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Hao1.sc
// AUTHOR :
// DESCRIPTION : Franklin meets Hao which unlocks Street Race oddjob
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
g_structRCScriptArgs sRCLauncherDataLocal
ENUM MISSION_STAGE
MS_INIT,
MS_PRE_INTRO,
MS_INTRO,
MS_GET_CAR,
//MS_RETURN_TO_CAR,
MS_DRIVE_TO_RACE,
MS_LOSE_COPS,
MS_LINEUP,
MS_COUNTDOWN,
MS_RACE,
MS_PASS,
MS_FAIL
ENDENUM
ENUM SUB_STATE
SS_SETUP,
SS_UPDATE,
SS_UPDATE_2,
SS_CLEANUP
ENDENUM
ENUM MISSION_FAILED_REASON
MFR_NONE,
MFR_THREATENED_HAO,
MFR_KILLED_HAO,
MFR_DIDNT_WIN
ENDENUM
CONST_INT HAO 0
//----------------------
// CHECKPOINTS
//----------------------
CONST_INT CP_MISSION_START 0
CONST_INT CP_RACE_START 1
CONST_INT CP_MISSION_PASSED 2
MISSION_STAGE missionStage = MS_INIT
SUB_STATE missionSubState = SS_SETUP
MISSION_FAILED_REASON missionFailReason = MFR_NONE
STRING sHaoDestRecording = "hao1_Hao"
#IF IS_DEBUG_BUILD
MissionStageMenuTextStruct sSkipMenu[2]
#ENDIF
BLIP_INDEX biDestination
VECTOR vRaceStart = <<-144.969666,-1550.709106,33.487854>>//<<-53.350788,-1813.927979,25.723551>>//<<-56.54, -1804.86, 26.28>>
//VECTOR vHaoDestStart = <<-98.958611,-1318.066406,28.357740>>//<<-92.201019,-1318.854858,28.180756>>
VECTOR vHaoDest = <<-59.64, -1808.68, 26.76>>
VECTOR vClearAreaMin = <<-66.364021,-1812.869507,23.765099>>
VECTOR vClearAreaMax = <<-46.690018,-1790.171021,29.893478>>
VECTOR vVehicleIntroPos = <<-79.29, -1264.51, 28.74>>//<<-73.3166, -1265.9296, 28.1742>>//<<-82.50, -1320.32, 28.82>>
FLOAT fVehicleIntroHeading = 270.3906//90.3906//88.46
VECTOR vPlayerIntroPos = <<-72.4774, -1262.7596, 27.9890>>//<<-72.9071, -1317.2295, 28.0414>>
FLOAT fPlayerIntroHeading = 349.5845//281.2032
/*VECTOR vHaoIntroPos = <<-72.2937, -1260.6362, 28.1462>>
FLOAT fHaoIntroHeading = 169.58*/
VECTOR vIntroAreaPos1 = <<-80.264381,-1262.474854,27.014877>>//<<-85.718742,-1258.504028,27.290422>>//<<-65.888504,-1259.101196,27.195118>>//<<-75.258995,-1317.123535,27.055149>>
VECTOR vIntroAreaPos2 = <<-64.890450,-1262.256104,30.031475>>//<<-74.818626,-1258.565308,30.190575>>//<<-100.941582,-1258.543823,30.358128>>//<<-66.016724,-1316.947876,30.052485>>
FLOAT fIntroAreaWidth = 11.0//5.0
VECTOR vIntroAreaBPos1 = <<-115.662796,-1261.453247,27.156199>>
VECTOR vIntroAreaBPos2 = <<-85.775139,-1260.507568,30.297710>>
FLOAT fIntroAreaBWidth = 8.0
VECTOR vIntroAreaCPos1 = <<-91.509140,-1267.899902,27.148733>>
VECTOR vIntroAreaCPos2 = <<-91.271820,-1278.836304,29.151850>>
FLOAT fIntroAreaCWidth = 9.0
// Keeping the road in front of the intro clear of vehicles
VECTOR vClearAmbientVehiclesAreaPos1 = <<-99.922195,-1101.087891,23.907503>>
VECTOR vClearAmbientVehiclesAreaPos2 = <<-109.291039,-1385.994629,30.313572>>
FLOAT fClearAmbientVehiclesAreaWidth = 40.0
// variables for dealing with the number of times the player has rammed Hao
INT iHaoRammedCount = 0
BOOL bHaoRammedLastFrame = FALSE
FLOAT fPlayerVsHaoClosingSpeedLastFrame = 0
INT iRamTimer = 0
// Variables for checking if the player has blocked Hao's start point
VECTOR vBlockingHaoOne = <<-137.7, -1551.0, 35.3>>
VECTOR vBlockingHaoTwo = <<-144.1, -1558.7, 33.6>>
FLOAT fBlockingHao = 6.0
INT iLeadIn
STRING sLeadInDict = "special_ped@hao@base"
//VEHICLE_INDEX viPlayerLast
VEHICLE_INDEX viPlayerLastUnsuitable
/*VEHICLE_INDEX viNearbyCar
MODEL_NAMES mnNearbyCar = RUINER //BANSHEE
VECTOR vPosNearbyCar = <<-91.07, -1273.45, 28.86>>
FLOAT fHeadingNearbyCar = 0.57*/
CAMERA_INDEX camCutscene
BOOL bGetVehicle = TRUE
BOOL bGoToRace = TRUE
BOOL bReturnToVehicle = TRUE
//BOOL bGetNewVehicle = TRUE
//BOOL bWrongVehicle = TRUE
BOOL bHeadingIsOK
BOOL bHaoArrivesLate = TRUE
BOOL bClearVehicles = TRUE
BOOL bSlipStreamHelpReady = TRUE
BOOL bLookBackHelpReady = TRUE
BOOL bIntroSkipped = FALSE
BOOL bPlaceHao = TRUE
INT iCallDelayTimer = 0
INT iAtStartTimer = 0
INT iRamInRaceTimer = 0
INT iCloseInRaceTimer = 0
VECTOR vRoadOffOne = <<-189.571381,-1613.517090,31.753590>>//<<-41.457458,-1821.230591,24.364006>>
VECTOR vRoadOffTwo = <<-131.694153,-1538.062134,34.259357>>//<<-117.984245,-1757.774414,29.840506>>
FLOAT fRoadOffWidth = 20.0//15.0
VECTOR vDisableRoadsBigPos1 = <<-254.968719,-1422.748657,20.337524>>
VECTOR vDisableRoadsBigPos2 = <<75.873474,-1692.709229,38.141510>>
FLOAT fDisableRoadsBigWidth = 500.0
//Area to disable one of the lanes approaching the race start
VECTOR vApproachRoadPos1 = <<-134.442383,-1532.813843,34.241035>>
VECTOR vApproachRoadPos2 = <<-225.420334,-1456.148560,29.321934>>
FLOAT fApproachRoadWidth = 5.0
/*VECTOR vDisableRoadPos1 = <<-115.442245,-1756.196167,29.832426>>
VECTOR vDisableRoadPos2 = <<113.464401,-1947.301636,18.621464>>
FLOAT fDisableRoadWidth = 15.0*/
// Variables for tracking stats
INT iCollisionTimer = 0
/*CONST_INT TARGET_RACE_TIME 999999999
CONST_INT TARGET_LAP_TIME 999999999
CONST_INT TARGET_COLLISIONS 10*/
//INT iPreviousCollisions = 0
structPedsForConversation convStruct
// ===========================================================================================================
// CLEANUP FUNCTIONS
// ===========================================================================================================
/// PURPOSE:
/// Cleans up mission things
PROC CleanupMission(BOOL bDeleteAll = FALSE)
SAFE_REMOVE_BLIP(biDestination)
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sRCLauncherDataLocal.vehID[HAO], TRUE)
ENDIF
IF bDeleteAll
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[HAO])
SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[HAO])
//SAFE_DELETE_VEHICLE(viNearbyCar)
SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[1])
ELSE
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[HAO])
SAFE_RELEASE_VEHICLE(sRCLauncherDataLocal.vehID[HAO])
SAFE_RELEASE_VEHICLE(sRCLauncherDataLocal.vehID[1])
//SAFE_RELEASE_VEHICLE(viNearbyCar)
ENDIF
RACE_CLEANUP(bDeleteAll)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, FALSE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_SHOP_CARMOD_01_AP, TRUE)
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SAVEHOUSE, TRUE)
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SHOP, TRUE)
SUPPRESS_LARGE_VEHICLES(FALSE)
IF DOES_CAM_EXIST(camCutscene)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_CAM_ACTIVE(camCutscene, FALSE)
DESTROY_CAM(camCutscene)
ENDIF
REMOVE_WAYPOINT_RECORDING(sHaoDestRecording)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vClearAreaMin, vClearAreaMax, TRUE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vRaceStart-<<300,300,300>>, vRaceStart+<<300,300,300>>, TRUE)
SET_ROADS_IN_ANGLED_AREA(vRoadOffOne, vRoadOffTwo, fRoadOffWidth, FALSE, TRUE)
SET_ROADS_IN_ANGLED_AREA(vApproachRoadPos1, vApproachRoadPos2, fApproachRoadWidth, FALSE, TRUE)
SET_ROADS_IN_ANGLED_AREA(vDisableRoadsBigPos1, vDisableRoadsBigPos2, fDisableRoadsBigWidth, FALSE, TRUE)
//SET_ROADS_IN_ANGLED_AREA(vDisableRoadPos1, vDisableRoadPos2, fDisableRoadWidth, FALSE, TRUE)
CLEAR_PRINTS()
ENDPROC
/// PURPOSE:
/// Safely cleans up the script
PROC Script_Cleanup()
// Clear the mission title
MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
CPRINTLN(DEBUG_MISSION, "Hao 1: Script Cleanup")
// Ensure launcher is cleaned up
RC_CLEANUP_LAUNCHER()
// If the mission was triggered then additional mission cleanup will be required.
IF (Random_Character_Cleanup_If_Triggered())
CPRINTLN(DEBUG_MISSION, "Hao 1: Script triggered, additional cleanup required...")
CleanupMission()
ENDIF
DISABLE_TAXI_HAILING(FALSE)
//Cleanup the scene created by the launcher
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Adds needed contacts, completion %, cleans up and passes script.
PROC Script_Passed()
CPRINTLN(DEBUG_MISSION, "Hao 1: Passed")
// Update mission stats
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_MG_SRLS) // Technically have completed the first street race
INFORM_MISSION_STATS_OF_TIME_TOTAL_CHANGE(HAO1_FASTEST_LAP, sRaceHUD.iBestTime)
// B*1577763
// Flag flow bitset for the minigame and ensure first two races are unlocked
SET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_STREET_RACES), TRUE)
SET_BIT(g_savedGlobals.sStreetRaceData.iRaceUnlocked, ENUM_TO_INT(STREET_RACE_LOS_SANTOS))
SET_BIT(g_savedGlobals.sStreetRaceData.iRaceUnlocked, ENUM_TO_INT(STREET_RACE_CITY_CIRCUIT))
// Pass mission and autosave
Random_Character_Passed(CP_RAND_C_HAO1)
Script_Cleanup()
ENDPROC
// ===========================================================================================================
// HELPER FUNCTIONS
// ===========================================================================================================
/*PROC CreateNearbyCar()
IF NOT DOES_ENTITY_EXIST(viNearbyCar)
REQUEST_MODEL(mnNearbyCar)
IF HAS_MODEL_LOADED(mnNearbyCar)
CLEAR_AREA_OF_VEHICLES(vPosNearbyCar, 5.0)
viNearbyCar = CREATE_VEHICLE(mnNearbyCar, vPosNearbyCar, fHeadingNearbyCar)
SET_VEHICLE_COLOUR_COMBINATION(viNearbyCar, 10)
SET_MODEL_AS_NO_LONGER_NEEDED(mnNearbyCar)
ENDIF
ENDIF
ENDPROC*/
/// PURPOSE:
/// Checks if the player has killed or threatened Hao, fails if so
PROC CheckHao()
IF missionStage <> MS_FAIL
AND missionStage <> MS_INIT
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[HAO])
IF IS_PED_INJURED(sRCLauncherDataLocal.pedID[HAO])
missionStage = MS_FAIL
missionSubState = SS_SETUP
MissionFailReason = MFR_KILLED_HAO
ELSE
IF HAS_PLAYER_THREATENED_PED(sRCLauncherDataLocal.pedID[HAO]) OR (IS_PED_BEING_JACKED(sRCLauncherDataLocal.pedID[HAO]) AND IS_PED_JACKING(PLAYER_PED_ID()))
missionStage = MS_FAIL
missionSubState = SS_SETUP
MissionFailReason = MFR_THREATENED_HAO
ENDIF
ENDIF
ENDIF
IF (missionStage = MS_GET_CAR OR missionStage = MS_DRIVE_TO_RACE OR missionStage = MS_LOSE_COPS ) AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
IF HAS_PLAYER_RAMMED_ENEMY_ENOUGH(sRCLauncherDataLocal.vehID[HAO], bHaoRammedLastFrame, iRamTimer, iHaoRammedCount, fPlayerVsHaoClosingSpeedLastFrame, 5)
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sRCLauncherDataLocal.vehID[HAO], TRUE)
missionStage = MS_FAIL
missionSubState = SS_SETUP
MissionFailReason = MFR_THREATENED_HAO
ENDIF
ELIF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRCLauncherDataLocal.vehID[HAO], PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sRCLauncherDataLocal.vehID[HAO])
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CheckRacers()
IF missionStage = MS_GET_CAR OR missionStage = MS_DRIVE_TO_RACE OR missionStage = MS_LOSE_COPS
INT i_index = 0
REPEAT sTrackData.iNumAIRacers i_index
IF DOES_ENTITY_EXIST(sRacer[i_index].piDriver) AND DOES_ENTITY_EXIST(sRacer[i_index].viCar)
IF IS_PED_INJURED(sRacer[i_index].piDriver) OR NOT IS_VEHICLE_OK(sRacer[i_index].viCar)
missionStage = MS_FAIL
missionSubState = SS_SETUP
eRaceState = RACE_STATE_FAIL
failReason = FAIL_RIVAL_ATTACKED
ELSE
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRacer[i_index].piDriver, PLAYER_PED_ID()) OR IS_PLAYER_SHOOTING_NEAR_PED(sRacer[i_index].piDriver)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRacer[i_index].viCar, PLAYER_PED_ID())
OR (IS_PED_BEING_JACKED(sRacer[i_index].piDriver) AND IS_PED_JACKING(PLAYER_PED_ID()))
OR IS_PLAYER_TOWING_VEHICLE(sRacer[i_index].viCar)
OR (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND (GET_ENTITY_SPEED(PLAYER_PED_ID())>5) AND IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sRacer[i_index].viCar))
missionStage = MS_FAIL
missionSubState = SS_SETUP
eRaceState = RACE_STATE_FAIL
failReason = FAIL_RIVAL_ATTACKED
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE:
/// Controls failing for a race specific reason
PROC CONTROL_RACE_FAIL()
IF eRaceState = RACE_STATE_FAIL
missionStage = MS_FAIL
missionSubState = SS_SETUP
ENDIF
ENDPROC
FUNC BOOL AI_RACERS_DONT_EXIST()
INT i_index
FOR i_index = 0 TO sTrackData.iNumAIRacers - 1
IF NOT IS_PED_UNINJURED(sRacer[i_index].piDriver)
RETURN TRUE
ENDIF
IF NOT IS_VEHICLE_OK(sRacer[i_index].viCar)
RETURN TRUE
ENDIF
ENDFOR
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Plays dialogue if the player hangs around the race start without triggering the race
PROC PLAY_WAITING_CONV()
IF GET_GAME_TIMER() > iAtStartTimer
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
AND IS_ENTITY_IN_RANGE_COORDS(sRCLauncherDataLocal.pedID[HAO], sTrackData.vStartGrid[sTrackData.iNumAIRacers-1], 10.0)
AND IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vRaceStart, 25.0)
IF CREATE_CONVERSATION(convStruct, "HAO1AU", "HAO1_HWAR", CONV_PRIORITY_HIGH)
iAtStartTimer = GET_GAME_TIMER() + 10000
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays dialogue if the player rams Hao
PROC PLAY_RAM_CONV()
IF GET_GAME_TIMER() > iRamInRaceTimer
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
AND IS_ENTITY_TOUCHING_ENTITY(sRCLauncherDataLocal.pedID[HAO], PLAYER_PED_ID())
IF CREATE_CONVERSATION(convStruct, "HAO1AU", "HAO1_HRAM", CONV_PRIORITY_HIGH)
iRamInRaceTimer = GET_GAME_TIMER() + 10000
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays dialogue if the player is close to Hao
PROC PLAY_CLOSE_CONV()
IF GET_GAME_TIMER() > iCloseInRaceTimer
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
AND IS_ENTITY_IN_RANGE_ENTITY(sRCLauncherDataLocal.pedID[HAO], PLAYER_PED_ID(), 15.0)
IF CREATE_CONVERSATION(convStruct, "HAO1AU", "HAO1_HSPC", CONV_PRIORITY_HIGH)
iCloseInRaceTimer = GET_GAME_TIMER() + 10000
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SPAWN_RACE_LINEUP()
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vRaceStart, 200)
SETUP_ALT_RIVAL_MODELS()
SETUP_AI_RACERS(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO])
ENDIF
ENDPROC
/// PURPOSE:
/// Put Hao into the lineup - 7th place as it's easier for him to get there...
PROC PLACE_HAO()
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO]) AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
CLEAR_PED_TASKS_IMMEDIATELY(sRCLauncherDataLocal.pedID[HAO])
BRING_VEHICLE_TO_HALT(sRCLauncherDataLocal.vehID[HAO], 0.1, 1)
IF NOT IS_PED_IN_VEHICLE(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO]) AND IS_VEHICLE_SEAT_FREE(sRCLauncherDataLocal.vehID[HAO])
SET_PED_INTO_VEHICLE(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO])
ENDIF
SET_ENTITY_COORDS(sRCLauncherDataLocal.vehID[HAO], sTrackData.vStartGrid[sTrackData.iNumAIRacers-1])
SET_ENTITY_HEADING(sRCLauncherDataLocal.vehID[HAO], sTrackData.fStartGrid[sTrackData.iNumAIRacers-1])
CPRINTLN(DEBUG_MISSION, "Placed Hao")
ENDIF
ENDPROC
PROC SkipToRaceStart()
RC_START_Z_SKIP()
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
CLEAR_PED_TASKS_IMMEDIATELY(sRCLauncherDataLocal.pedID[HAO])
ENDIF
INT i_index
FOR i_index = 0 TO 1
IF DOES_CAM_EXIST(gridCamera[i_index])
IF IS_CAM_ACTIVE(gridCamera[i_index])
SET_CAM_ACTIVE(gridCamera[i_index], FALSE)
ENDIF
ENDIF
ENDFOR
IF NOT IS_REPLAY_BEING_SET_UP()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_PLAYER_IN_SUITABLE_RACE_CAR()
BRING_VEHICLE_TO_HALT(GET_PLAYERS_LAST_VEHICLE(), 0.1, 1)
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vHaoDest)
ELSE
VEHICLE_INDEX viTemp
CREATE_VEHICLE_FOR_REPLAY(viTemp, vHaoDest, 1.31, TRUE, TRUE, FALSE, FALSE, TRUE, BUFFALO)
IF IS_VEHICLE_OK(viTemp)
SET_VEHICLE_ENGINE_ON(viTemp, TRUE, TRUE)
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDIF
sRaceData.eRaceTrack = STREET_RACE_01
sRaceData.eRaceType = RACETYPE_CAR
RACE_INIT(TRUE)
SETUP_PLAYER_PRECUTSCENE()
WHILE AI_RACERS_DONT_EXIST()
SPAWN_RACE_LINEUP()
ENDWHILE
PLACE_HAO()
IF NOT IS_REPLAY_BEING_SET_UP()
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
ENDIF
CLEAR_AREA_OF_VEHICLES(GET_PLAYER_COORDS(PLAYER_ID()), 500.0) // use a big area since ambient vehicles get turned off anyway
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillTakeDamageWhenVehicleCrashes, FALSE)
ENDIF
missionSubState = SS_CLEANUP
missionStage = MS_LINEUP
ENDPROC
PROC RestartMission()
RC_START_Z_SKIP()
CleanupMission(TRUE)
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_HAO_1(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
ADD_PED_FOR_DIALOGUE(convStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
ADD_PED_FOR_DIALOGUE(convStruct, 3, sRCLauncherDataLocal.pedID[HAO], "HAO")
ENDIF
SET_ENTITY_COORDS_NO_OFFSET(PLAYER_PED_ID(), vPlayerIntroPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fPlayerIntroHeading)
VEHICLE_INDEX viTemp
CREATE_VEHICLE_FOR_REPLAY(viTemp, <<-90.91, -1311.97, 28.73>>, 1.31, FALSE, TRUE, FALSE, FALSE, TRUE, BUFFALO)
// Cleanup cameras
INT i_index
FOR i_index = 0 TO 1
IF DOES_CAM_EXIST(gridCamera[i_index])
IF IS_CAM_ACTIVE(gridCamera[i_index])
SET_CAM_ACTIVE(gridCamera[i_index], FALSE)
ENDIF
ENDIF
ENDFOR
// Set camera behind player
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
// Release countdown timer
RELEASE_MINIGAME_COUNTDOWN_UI(sRaceHUD.uiCountdown)
// Enable controls and go to race!
END_RACE_CUTSCENE()
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
bGetVehicle = TRUE
bGoToRace = TRUE
bReturnToVehicle = TRUE
//bGetNewVehicle = TRUE
//bWrongVehicle = TRUE
missionSubState = SS_SETUP
missionStage = MS_INTRO
RC_END_Z_SKIP()
ENDPROC
// ===========================================================================================================
// DEBUG FUNCTIONS
// ===========================================================================================================
#IF IS_DEBUG_BUILD
PROC DEBUG_Check_Debug_Keys()
IF missionStage <> MS_PASS AND missionStage <> MS_FAIL
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
WAIT_FOR_CUTSCENE_TO_STOP()
Script_Passed()
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
WAIT_FOR_CUTSCENE_TO_STOP()
missionSubState = SS_SETUP
missionStage = MS_FAIL
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
SWITCH missionStage
CASE MS_INTRO
// Ending the conversation ends the intro stage
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
BREAK
CASE MS_GET_CAR
CASE MS_DRIVE_TO_RACE
//CASE MS_RETURN_TO_CAR
SkipToRaceStart()
BREAK
CASE MS_LINEUP
missionSubState = SS_CLEANUP
BREAK
ENDSWITCH
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
IF missionStage = MS_RACE
RC_START_Z_SKIP()
RACE_CLEANUP(TRUE)
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_HAO_1(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
ADD_PED_FOR_DIALOGUE(convStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
ADD_PED_FOR_DIALOGUE(convStruct, 3, sRCLauncherDataLocal.pedID[HAO], "HAO")
ENDIF
SkipToRaceStart()
ELSE
RestartMission()
ENDIF
ENDIF
INT debugJumpStage = -1
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, debugJumpStage)
IF debugJumpStage = 0
// restart mission
RestartMission()
ELIF debugJumpStage = 1
// Skip to the race stage
RC_START_Z_SKIP()
RACE_CLEANUP(TRUE)
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_HAO_1(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
ADD_PED_FOR_DIALOGUE(convStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
ADD_PED_FOR_DIALOGUE(convStruct, 3, sRCLauncherDataLocal.pedID[HAO], "HAO")
ENDIF
SkipToRaceStart()
ENDIF
ENDIF
ENDIF
ENDPROC
#ENDIF
// ===========================================================================================================
// MISSION FUNCTIONS
// ===========================================================================================================
PROC INIT()
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup INIT")
REQUEST_ADDITIONAL_TEXT("HAO1", MISSION_TEXT_SLOT)
sRaceWaypointRecording = "CityRace0_route1"
ADD_PED_FOR_DIALOGUE(convStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
ADD_PED_FOR_DIALOGUE(convStruct, 3, sRCLauncherDataLocal.pedID[HAO], "HAO")
TASK_CLEAR_LOOK_AT(sRCLauncherDataLocal.pedID[HAO])
ENDIF
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sRCLauncherDataLocal.vehID[HAO], FALSE)
SET_DISABLE_PRETEND_OCCUPANTS(sRCLauncherDataLocal.vehID[HAO], TRUE)
SET_VEHICLE_DOORS_LOCKED(sRCLauncherDataLocal.vehID[0], VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
ENDIF
SET_PED_POPULATION_BUDGET(1)
SET_REDUCE_PED_MODEL_BUDGET(TRUE)
SET_VEHICLE_POPULATION_BUDGET(1)
SET_REDUCE_VEHICLE_MODEL_BUDGET(TRUE)
SUPPRESS_LARGE_VEHICLES(TRUE)
REQUEST_WAYPOINT_RECORDING(sHaoDestRecording)
sRaceData.eRaceTrack = STREET_RACE_01
sRaceData.eRaceType = RACETYPE_CAR
INIT_TRACK_DATA(sRaceData, sTrackData)
SETUP_ALT_RIVAL_MODELS()
//vRaceStart = sTrackData.vStartGrid[sTrackData.iNumAIRacers]
DISABLE_TAXI_HAILING()
missionSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
IF Is_Replay_In_Progress()
VEHICLE_INDEX viTemp
INT iReplayStage
iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
IF g_bShitskipAccepted = TRUE
iReplayStage++ // player is skipping this stage
ENDIF
SWITCH iReplayStage
CASE CP_MISSION_START
//SET_ENTITY_COORDS_NO_OFFSET(PLAYER_PED_ID(), <<-72.4774, -1262.7596, 27.9891>>)
/*SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), <<-72.4774, -1262.7596, 27.9891>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 349.5845)*/
START_REPLAY_SETUP(<<-72.4774, -1262.7596, 27.9891>>, 119.6309)
/*REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<-121.1904, -1302.6024, 26.3543>>, <<-41.3738, -1222.2810, 30.3348>>)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-121.1904, -1302.6024, 26.3543>>, <<-41.3738, -1222.2810, 30.3348>>, FALSE)
CLEAR_AREA_OF_VEHICLES(vPosNearbyCar, 25.0)
DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(vPosNearbyCar, 25.0)*/
VEHICLE_INDEX viStartVehicle
VECTOR vSafehouse
FLOAT fSafehouse
viStartVehicle = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH)
IF IS_VEHICLE_OK(viStartVehicle)
IF GET_CAR_RESPOT_POS_FOR_NEAREST_SAVEHOUSE(GET_ENTITY_COORDS(viStartVehicle), CHAR_FRANKLIN, vSafehouse, fSafehouse)
SET_ENTITY_COORDS(viStartVehicle, vSafehouse)
SET_ENTITY_HEADING(viStartVehicle, fSafehouse)
ENDIF
ENDIF
//SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-121.1904, -1302.6024, 26.3543>>, <<-41.3738, -1222.2810, 30.3348>>, TRUE)
CREATE_VEHICLE_FOR_REPLAY(viTemp, vVehicleIntroPos, fVehicleIntroHeading, FALSE, TRUE, FALSE, FALSE, TRUE, BUFFALO)
//WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO]) AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
STOP_SYNCHRONIZED_ENTITY_ANIM(sRCLauncherDataLocal.vehID[HAO], INSTANT_BLEND_OUT, TRUE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sRCLauncherDataLocal.pedID[HAO], INSTANT_BLEND_OUT, TRUE)
WAIT(0)
ENDIF
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO]) AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
AND IS_VEHICLE_SEAT_FREE(sRCLauncherDataLocal.vehID[HAO])
SET_PED_INTO_VEHICLE(sRCLauncherDataLocal.pedID[HAO],sRCLauncherDataLocal.vehID[HAO])
SET_ENTITY_COORDS_GROUNDED(sRCLauncherDataLocal.vehID[HAO], <<-89.0261, -1260.9956, 28.2992>>)
SET_ENTITY_HEADING(sRCLauncherDataLocal.vehID[HAO], 112.5636)
SET_VEHICLE_ENGINE_ON(sRCLauncherDataLocal.vehID[HAO], TRUE, TRUE)
SET_VEHICLE_FORWARD_SPEED(sRCLauncherDataLocal.vehID[HAO], 5.0)
ENDIF
/*CreateNearbyCar()
WHILE NOT DOES_ENTITY_EXIST(viNearbyCar)
CreateNearbyCar()
WAIT(0)
ENDWHILE*/
END_REPLAY_SETUP()
RC_END_Z_SKIP()
missionSubState = SS_CLEANUP
missionStage = MS_INTRO
BREAK
CASE CP_RACE_START
START_REPLAY_SETUP(vHaoDest, 1.31)
//SkipToRaceStart()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_PLAYER_IN_SUITABLE_RACE_CAR()
viTemp = GET_PLAYERS_LAST_VEHICLE()
BRING_VEHICLE_TO_HALT(viTemp, 0.1, 1)
ELSE
CREATE_VEHICLE_FOR_REPLAY(viTemp, vHaoDest, 1.31, FALSE, TRUE, FALSE, FALSE, TRUE, BUFFALO)
IF IS_VEHICLE_OK(viTemp)
SET_VEHICLE_ENGINE_ON(viTemp, TRUE, TRUE)
ENDIF
ENDIF
END_REPLAY_SETUP(viTemp)
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO]) AND IS_ENTITY_PLAYING_ANIM(sRCLauncherDataLocal.pedID[HAO], "special_ped@hao@base", "hao_base", ANIM_SYNCED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sRCLauncherDataLocal.pedID[HAO], INSTANT_BLEND_OUT, TRUE)
ENDIF
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO]) AND IS_ENTITY_PLAYING_ANIM(sRCLauncherDataLocal.vehID[HAO], "special_ped@hao@base", "hao_base_penumbra", ANIM_SYNCED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sRCLauncherDataLocal.vehID[HAO], INSTANT_BLEND_OUT, TRUE)
ENDIF
CLEAR_AREA_OF_VEHICLES(GET_PLAYER_COORDS(PLAYER_ID()), 500.0) // use a big area since ambient vehicles get turned off anyway
sRaceData.eRaceTrack = STREET_RACE_01
sRaceData.eRaceType = RACETYPE_CAR
RACE_INIT(TRUE)
SETUP_PLAYER_PRECUTSCENE()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
START_RACE_CUTSCENE()
WHILE AI_RACERS_DONT_EXIST()
SPAWN_RACE_LINEUP()
ENDWHILE
PLACE_HAO()
PLACE_RACERS_FOR_RESTART()
IF NOT IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
CPRINTLN(DEBUG_MISSION, "Hao is not available")
ENDIF
IF NOT IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
CPRINTLN(DEBUG_MISSION, "Hao's car is not available")
ENDIF
missionSubState = SS_CLEANUP
missionStage = MS_LINEUP
BREAK
CASE CP_MISSION_PASSED
START_REPLAY_SETUP(<<-29.86, -1833.06, 25.37>>, 234.16)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
//SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vHaoDest)
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viTemp)
/*SET_ENTITY_COORDS(viTemp, <<-29.86, -1833.06, 25.37>>)
SET_ENTITY_HEADING(viTemp, 234.16)*/
ELSE
CREATE_VEHICLE_FOR_REPLAY(viTemp, <<-29.86, -1833.06, 25.37>>, 234.16, FALSE, FALSE, FALSE, FALSE, TRUE, BUFFALO)
ENDIF
ELSE
CREATE_VEHICLE_FOR_REPLAY(viTemp, <<-29.86, -1833.06, 25.37>>, 234.16, FALSE, FALSE, FALSE, FALSE, TRUE, BUFFALO)
ENDIF
END_REPLAY_SETUP(viTemp)
//WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
RC_END_Z_SKIP()
missionSubState = SS_SETUP
missionStage = MS_PASS
BREAK
DEFAULT
SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected")
BREAK
ENDSWITCH
ELSE
missionSubState = SS_CLEANUP
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup INIT")
missionStage = MS_PRE_INTRO
missionSubState = SS_SETUP
BREAK
ENDSWITCH
ENDPROC
PROC PRE_INTRO()
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
RC_REQUEST_CUTSCENE("hao_mcs_1")
SWITCH missionSubState
CASE SS_SETUP
REQUEST_ANIM_DICT(sLeadInDict)
IF HAS_ANIM_DICT_LOADED(sLeadInDict) AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[0]) AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[0])
INT iBone
iBone = GET_ENTITY_BONE_INDEX_BY_NAME(sRCLauncherDataLocal.vehID[0], "chassis_dummy")
VECTOR vChassisPos
vChassisPos = GET_WORLD_POSITION_OF_ENTITY_BONE(sRCLauncherDataLocal.vehID[0], iBone)
iLeadIn = CREATE_SYNCHRONIZED_SCENE(vChassisPos, GET_ENTITY_ROTATION(sRCLauncherDataLocal.vehID[0]))
SET_SYNCHRONIZED_SCENE_PHASE(iLeadIn, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iLeadIn,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iLeadIn,TRUE)
TASK_SYNCHRONIZED_SCENE(sRCLauncherDataLocal.pedID[0], iLeadIn, sLeadInDict, "hao_leadin", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_ON_ABORT_STOP_SCENE, RBF_PLAYER_IMPACT)
//PLAY_SYNCHRONIZED_ENTITY_ANIM(sRCLauncherDataLocal.vehID[0], iLeadIn, "hao_leadin_penumbra", sLeadInDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
TASK_LOOK_AT_ENTITY(sRCLauncherDataLocal.pedID[0], PLAYER_PED_ID(), -1, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], <<0,0,0>>)
missionSubState = SS_UPDATE
ENDIF
BREAK
CASE SS_UPDATE
IF IS_SYNCHRONIZED_SCENE_RUNNING(iLeadIn)
IF GET_SYNCHRONIZED_SCENE_PHASE(iLeadIn) >= 0.9
missionSubState = SS_CLEANUP
ENDIF
ELSE
missionSubState = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup Pre intro")
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
missionStage = MS_INTRO
missionSubState = SS_SETUP
BREAK
ENDSWITCH
ENDPROC
PROC INTRO()
//CreateNearbyCar()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup INTRO")
RC_REQUEST_CUTSCENE("hao_mcs_1")
IF RC_IS_CUTSCENE_OK_TO_START()
IF IS_PED_UNINJURED(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[HAO], "Hao", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.vehID[HAO], "hao_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE)
RC_CLEANUP_LAUNCHER()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
WAIT(0)
SAFE_DELETE_OBJECT(sRCLauncherDataLocal.objID[HAO])
FLOAT fCurrentHeading
VEHICLE_INDEX viPlayer
viPlayer = GET_PLAYERS_LAST_VEHICLE()
fCurrentHeading = 0
IF IS_VEHICLE_OK(viPlayer)
fCurrentHeading = GET_ENTITY_HEADING(viPlayer)
ENDIF
IF fCurrentHeading > 0 AND fCurrentHeading < 180
fVehicleIntroHeading = 90.3906
ELSE
fVehicleIntroHeading = 270.3906
ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vIntroAreaPos1, vIntroAreaPos2, fIntroAreaWidth, vVehicleIntroPos, fVehicleIntroHeading, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vIntroAreaBPos1, vIntroAreaBPos2, fIntroAreaBWidth, vVehicleIntroPos, fVehicleIntroHeading, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vIntroAreaCPos1, vIntroAreaCPos2, fIntroAreaCWidth, vVehicleIntroPos, fVehicleIntroHeading, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
IF viPlayer <> sRCLauncherDataLocal.vehID[1]
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[1])
SET_ENTITY_COORDS_GROUNDED(sRCLauncherDataLocal.vehID[1], <<-91.07, -1273.45, 28.86>>)
SET_ENTITY_HEADING(sRCLauncherDataLocal.vehID[1], 0.57)
ENDIF
ENDIF
//CLEAR_AREA_OF_VEHICLES(<<-91.07, -1273.45, 28.86>>, 300)
//CLEAR_ANGLED_AREA_OF_VEHICLES(vClearAmbientVehiclesAreaPos1, vClearAmbientVehiclesAreaPos2, fClearAmbientVehiclesAreaWidth)
SET_ROADS_IN_ANGLED_AREA(vClearAmbientVehiclesAreaPos1, vClearAmbientVehiclesAreaPos2, fClearAmbientVehiclesAreaWidth, FALSE, FALSE)
RC_START_CUTSCENE_MODE(vPlayerIntroPos)
missionSubState = SS_UPDATE
ENDIF
BREAK
CASE SS_UPDATE
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO]) AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Hao") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("hao_car")
SET_PED_INTO_VEHICLE(sRCLauncherDataLocal.pedID[HAO],sRCLauncherDataLocal.vehID[HAO])
SET_VEHICLE_DOOR_SHUT(sRCLauncherDataLocal.vehID[HAO], SC_DOOR_FRONT_LEFT)
ENDIF
ENDIF
IF IS_PED_UNINJURED(PLAYER_PED_ID())
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-72.4639, -1261.2433, 28.0930>>)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
ENDIF
IF NOT IS_CUTSCENE_PLAYING()
RC_END_CUTSCENE_MODE()
missionSubState = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
/*IF GET_CURRENT_SCRIPTED_CONVERSATION_LINE() = 7 AND NOT IsPedPerformingTask(sRCLauncherDataLocal.pedID[HAO], SCRIPT_TASK_ENTER_VEHICLE)
AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO]) AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
AND IS_VEHICLE_SEAT_FREE(sRCLauncherDataLocal.vehID[HAO])
TASK_ENTER_VEHICLE(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_WALK)
ENDIF
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()
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO]) AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
AND IS_VEHICLE_SEAT_FREE(sRCLauncherDataLocal.vehID[HAO])
SET_PED_INTO_VEHICLE(sRCLauncherDataLocal.pedID[HAO],sRCLauncherDataLocal.vehID[HAO])
ENDIF
WAIT(1000)
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CPRINTLN(DEBUG_MISSION, "Cleanup INTRO")
IF DOES_CAM_EXIST(camCutscene)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_CAM_ACTIVE(camCutscene, FALSE)
DESTROY_CAM(camCutscene)
ENDIF
CLEAR_PED_TASKS(PLAYER_PED_ID())
RC_END_CUTSCENE_MODE()
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
bGetVehicle = TRUE
bGoToRace = TRUE
SAFE_FADE_SCREEN_IN_FROM_BLACK()
missionStage = MS_GET_CAR
missionSubState = SS_SETUP
ENDIF*/
REPLAY_STOP_EVENT()
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(vClearAmbientVehiclesAreaPos1, vClearAmbientVehiclesAreaPos2, fClearAmbientVehiclesAreaWidth)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillTakeDamageWhenVehicleCrashes, FALSE)
ENDIF
bGetVehicle = TRUE
bGoToRace = TRUE
SAFE_FADE_SCREEN_IN_FROM_BLACK()
missionStage = MS_GET_CAR
missionSubState = SS_SETUP
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_SHOP_CARMOD_01_AP, FALSE)
BREAK
ENDSWITCH
ENDPROC
PROC PRINT_UNSUITABLE_VEHICLE()
IF NOT IS_PLAYER_IN_SUITABLE_RACE_CAR()
//IF viPlayerLast <> viPlayerMain
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) <> viPlayerLastUnsuitable //bWrongVehicle
PRINT_HELP("HAO1_4")
//viPlayerLast = viPlayerMain
//bWrongVehicle = FALSE
viPlayerLastUnsuitable = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HAO1_4")
CLEAR_HELP()
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks the player's wanted level, sends them to the LOSE_COPS state if it's greater than zero
PROC CHECK_FOR_COPS()
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
missionStage = MS_LOSE_COPS
missionSubState = SS_SETUP
ENDIF
ENDPROC
/// PURPOSE:
/// Emergency stop for Hao in case AI fails to stop him at the end of his waypoint recording
PROC HAO_EMERGENCY_STOP()
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sRCLauncherDataLocal.vehID[HAO])
AND GET_IS_WAYPOINT_RECORDING_LOADED(sHaoDestRecording)
INT wayP
IF WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(sHaoDestRecording, GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[HAO]), wayP)
IF wayP >= 54
STOP_PLAYBACK_RECORDED_VEHICLE(sRCLauncherDataLocal.vehID[HAO])
TASK_VEHICLE_TEMP_ACTION(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO], TEMPACT_BRAKE, 500)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC GET_CAR()
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vRaceStart, 350.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
ENDIF
SPAWN_RACE_LINEUP()
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup GET_CAR")
REQUEST_WAYPOINT_RECORDING(sHaoDestRecording)
IF GET_IS_WAYPOINT_RECORDING_LOADED(sHaoDestRecording)
IF bGetVehicle
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO]) AND IS_PED_UNINJURED(PLAYER_PED_ID())
AND CREATE_CONVERSATION(convStruct, "HAO1AU", "HAO1_MCS1LO", CONV_PRIORITY_HIGH)
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
/*SET_ENTITY_LOAD_COLLISION_FLAG(sRCLauncherDataLocal.pedID[HAO], TRUE)
SEQUENCE_INDEX siHao
OPEN_SEQUENCE_TASK(siHao)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(NULL, sRCLauncherDataLocal.vehID[HAO], sHaoDestRecording, DRIVINGMODE_AVOIDCARS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
TASK_PAUSE(NULL, -1)
CLOSE_SEQUENCE_TASK(siHao)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[HAO], siHao)
CLEAR_SEQUENCE_TASK(siHao)*/
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO], sHaoDestRecording, DRIVINGMODE_AVOIDCARS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
ENDIF
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(vClearAreaMin, vClearAreaMax)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(vRaceStart-<<300,300,300>>, vRaceStart+<<300,300,300>>)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vClearAreaMin, vClearAreaMax, FALSE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vRaceStart-<<300,300,300>>, vRaceStart+<<300,300,300>>, FALSE)
SET_ROADS_IN_ANGLED_AREA(vRoadOffOne, vRoadOffTwo, fRoadOffWidth, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(vDisableRoadsBigPos1, vDisableRoadsBigPos2, fDisableRoadsBigWidth, FALSE, FALSE)
//SET_ROADS_IN_ANGLED_AREA(vDisableRoadPos1, vDisableRoadPos2, fDisableRoadWidth, FALSE, FALSE)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<0,0,0>>, 0.0, TRUE, CHAR_FRANKLIN)
SET_ROADS_IN_ANGLED_AREA(vApproachRoadPos1, vApproachRoadPos2, fApproachRoadWidth, FALSE, FALSE)
SAFE_REMOVE_BLIP(biDestination)
CLEAR_PRINTS()
missionSubState = SS_UPDATE
ENDIF
ELSE
missionSubState = SS_UPDATE_2
ENDIF
ENDIF
BREAK
CASE SS_UPDATE
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF bGetVehicle
PRINT_NOW("HAO1_1", DEFAULT_GOD_TEXT_TIME, 1) // Get a car.
bGetVehicle = FALSE
/*ELIF bGetNewVehicle
PRINT_NOW("HAO1_5", DEFAULT_GOD_TEXT_TIME, 1) // Get a new car.
bGetNewVehicle = FALSE*/
ENDIF
missionSubState = SS_UPDATE_2
ENDIF
BREAK
CASE SS_UPDATE_2
IF NOT (IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO]) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sRCLauncherDataLocal.vehID[HAO], TRUE))
IF IS_PLAYER_IN_SUITABLE_RACE_CAR()
CLEAR_HELP()
//viPlayerLast = viPlayerMain
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0)
missionSubState = SS_CLEANUP
ELSE
PRINT_UNSUITABLE_VEHICLE()
ENDIF
ENDIF
PLAY_WAITING_CONV()
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup GET_CAR")
missionStage = MS_DRIVE_TO_RACE
missionSubState = SS_SETUP
BREAK
ENDSWITCH
CHECK_FOR_COPS()
HAO_EMERGENCY_STOP()
ENDPROC
/// PURPOSE:
/// Checks if the player has arrived at a weird angle or if they've blocked the race start. If they've done either of these things we need to play the cutscene to tidy things up
/// RETURNS:
/// TRUE if it's safe to continue without using the cutscene
FUNC BOOL DONT_NEED_CUTSCENE()
IF IS_ANY_VEHICLE_NEAR_POINT(<<-168.426910,-1582.630981,33.966496>>, 20.0)
CPRINTLN(DEBUG_MISSION, "Vehicle is blocking the start grid")
RETURN FALSE
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vBlockingHaoOne, vBlockingHaoTwo, fBlockingHao)
CPRINTLN(DEBUG_MISSION, "Player is in Hao's spot")
RETURN FALSE
ENDIF
FLOAT fTargetHeading = sTrackData.fStartGrid[sTrackData.iNumAIRacers]
FLOAT fCurrentHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
FLOAT fHeadingDiff
WHILE fTargetHeading < 0
fTargetHeading += 360
ENDWHILE
WHILE fCurrentHeading < 0
fCurrentHeading += 360
ENDWHILE
fHeadingDiff = fTargetHeading - fCurrentHeading
IF fHeadingDiff < 20 AND fHeadingDiff > -20
CPRINTLN(DEBUG_MISSION, "Player approached at a reasonable angle")
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_MISSION, "Player approached at a crazy angle")
RETURN FALSE
ENDFUNC
PROC DRIVE_TO_RACE()
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vRaceStart, 350.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
ENDIF
IF bClearVehicles AND IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vRaceStart, 300)
CLEAR_AREA_OF_VEHICLES(vRaceStart, 150.0) // use a big area since ambient vehicles get turned off anyway
bClearVehicles = FALSE
ENDIF
SPAWN_RACE_LINEUP()
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup DRIVE_TO_RACE")
SAFE_REMOVE_BLIP(biDestination)
biDestination = CREATE_COORD_BLIP(vRaceStart)
//viPlayerLast = viPlayerMain
bReturnToVehicle = TRUE
bClearVehicles = TRUE
bPlaceHao = TRUE
iAtStartTimer = 0
//viPlayerMain = GET_PLAYERS_LAST_VEHICLE()
CLEAR_PRINTS()
IF bGoToRace
PRINT_NOW("HAO1_2", DEFAULT_GOD_TEXT_TIME, 1) // Go to the ~y~race.
bGoToRace = FALSE
ENDIF
missionSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vRaceStart, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
//OR IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vRaceStart, 20.0)
OR IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vRaceStart, 4.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vBlockingHaoOne, vBlockingHaoTwo, fBlockingHao)
IF IS_PLAYER_IN_SUITABLE_RACE_CAR()
//IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viPlayerMain)
missionSubState = SS_CLEANUP
//ENDIF
ELSE
IF bReturnToVehicle
PRINT_NOW("HAO1_3", DEFAULT_GOD_TEXT_TIME, 1)
bReturnToVehicle = FALSE
ENDIF
PLAY_WAITING_CONV()
ENDIF
ELSE
PLAY_WAITING_CONV()
ENDIF
PRINT_UNSUITABLE_VEHICLE()
IF bPlaceHao AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO])
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sRCLauncherDataLocal.vehID[HAO])
IF IS_ENTITY_OCCLUDED(sRCLauncherDataLocal.vehID[HAO])
SET_ENTITY_COORDS(sRCLauncherDataLocal.vehID[HAO], sTrackData.vStartGrid[sTrackData.iNumAIRacers-1])
SET_ENTITY_HEADING(sRCLauncherDataLocal.vehID[HAO], sTrackData.fStartGrid[sTrackData.iNumAIRacers-1])
bPlaceHao = FALSE
ENDIF
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup DRIVE_TO_RACE")
IF IS_VEHICLE_OK(viPlayerMain)
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viPlayerMain, 3.5) // There's a vehicle in front of where the player stops so using a shorter distance than the default
REPLAY_RECORD_BACK_FOR_TIME(5.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
sRaceData.eRaceTrack = STREET_RACE_01
sRaceData.eRaceType = RACETYPE_CAR
RACE_INIT(TRUE, FALSE)
missionSubState = SS_SETUP
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF DONT_NEED_CUTSCENE()
bHeadingIsOK = TRUE
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
//SET_GAMEPLAY_COORD_HINT(sTrackData.vCheckPoint[0])
SET_VEHICLE_IS_RACING(viPlayerMain, TRUE)
missionStage = MS_COUNTDOWN
ELSE
bHeadingIsOK = FALSE
missionStage = MS_LINEUP
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
CHECK_FOR_COPS()
HAO_EMERGENCY_STOP()
ENDPROC
PROC LOSE_COPS()
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vRaceStart, 350.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
ENDIF
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup LOSE_COPS")
SAFE_REMOVE_BLIP(biDestination)
CLEAR_PRINTS()
PRINT_NOW("HAO1_6", DEFAULT_GOD_TEXT_TIME, 1) // Lose the cops.
missionSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
missionSubState = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup LOSE_COPS")
IF bGoToRace
// If bGoToRace is true, the player hadn't got a suitable vehicle before getting a wanted level, check their car
IF IS_PLAYER_IN_SUITABLE_RACE_CAR()
missionStage = MS_DRIVE_TO_RACE
missionSubState = SS_SETUP
ELSE
missionStage = MS_GET_CAR
missionSubState = SS_SETUP
ENDIF
ELSE
// If bGoToRace is false, the player had already got a suitable vehicle so send them to the race
missionStage = MS_DRIVE_TO_RACE
missionSubState = SS_SETUP
ENDIF
BREAK
ENDSWITCH
ENDPROC
/*PROC RETURN_TO_CAR()
SPAWN_RACE_LINEUP()
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup RETURN_TO_CAR")
SAFE_REMOVE_BLIP(biDestination)
CLEAR_PRINTS()
IF IS_VEHICLE_OK(viPlayerMain)
biDestination = CREATE_VEHICLE_BLIP(viPlayerLast)
IF bReturnToVehicle
PRINT_NOW("HAO1_3", DEFAULT_GOD_TEXT_TIME, 1) // Get back in your ~b~car.
bReturnToVehicle = FALSE
ENDIF
missionSubState = SS_UPDATE
ELSE
missionStage = MS_GET_CAR
ENDIF
BREAK
CASE SS_UPDATE
IF NOT IS_VEHICLE_OK(viPlayerLast)
missionSubState = SS_SETUP
missionStage = MS_GET_CAR
ENDIF
IF NOT (IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO]) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sRCLauncherDataLocal.vehID[HAO], TRUE))
IF IS_PLAYER_IN_SUITABLE_RACE_CAR()
missionSubState = SS_CLEANUP
ELSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) <> viPlayerLastUnsuitable //bWrongVehicle
PRINT_HELP("HAO1_4")
//bWrongVehicle = FALSE
viPlayerLastUnsuitable = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup RETURN_TO_CAR")
sRaceData.eRaceTrack = STREET_RACE_01
sRaceData.eRaceType = RACETYPE_CAR
RACE_INIT(TRUE)
missionStage = MS_DRIVE_TO_RACE
missionSubState = SS_SETUP
BREAK
ENDSWITCH
ENDPROC*/
PROC RACE_LINEUP()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup RACE_LINEUP")
SAFE_REMOVE_BLIP(biDestination)
// Start cutscene
START_RACE_CUTSCENE()
// Remove the initial scene car if the player isn't using it
IF GET_PLAYERS_LAST_VEHICLE() <> sRCLauncherDataLocal.vehID[1]
SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[1])
ENDIF
// Setup vehicles
SETUP_PLAYER_PRECUTSCENE()
PLACE_HAO()
// Setup initial camera
CREATE_RACE_CAMERAS()
//SET_FOLLOW_VEHICLE_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON)
SETUP_GRID_GIRLS()
bPlayedIntroSound = FALSE
bIntroSkipped = FALSE
//RC_END_Z_SKIP()
SAFE_FADE_SCREEN_IN_FROM_BLACK()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_RACE_START, "Race start", TRUE)
missionSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF CONTROL_RACE_CAMERAS()
SET_GRID_GIRLS_FOR_COUNTDOWN(0.32)
missionStage = MS_COUNTDOWN
missionSubState = SS_SETUP
ENDIF
// Camera running?
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
SAFE_FADE_SCREEN_OUT_TO_BLACK()
bIntroSkipped = TRUE
SETUP_PLAYER_COUNTDOWN()
INT i_index
FOR i_index = 0 TO sTrackData.iNumAIRacers-1
IF IS_PED_UNINJURED(sRacer[i_index].piDriver)
CLEAR_PED_TASKS(sRacer[i_index].piDriver)
ENDIF
IF IS_VEHICLE_OK(sRacer[i_index].viCar)
BRING_VEHICLE_TO_HALT(sRacer[i_index].viCar, 0.1, 1)
SET_ENTITY_COORDS_GROUNDED(sRacer[i_index].viCar, sTrackData.vStartGrid[i_index])
SET_ENTITY_HEADING(sRacer[i_index].viCar, sTrackData.fStartGrid[i_index])
ENDIF
ENDFOR
SAFE_DELETE_PED(piGridGirlTwo)
SAFE_DELETE_PED(piGridGirlThree)
//WAIT(1000)
missionSubState = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup RACE_LINEUP")
SETUP_PLAYER_COUNTDOWN()
SET_GRID_GIRLS_FOR_COUNTDOWN(0.27)
// Set camera behind player
IF bIntroSkipped
SETUP_PLAYER_COUNTDOWN()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
WAIT(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
/*ELSE
//RENDER_SCRIPT_CAMS(FALSE, TRUE)
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()*/
ENDIF
// Cleanup cameras
INT i_index
i_index = 0
REPEAT COUNT_OF(gridCamera) i_index
IF DOES_CAM_EXIST(gridCamera[i_index])
DESTROY_CAM(gridCamera[i_index])
ENDIF
ENDREPEAT
// Got to race countdown
missionStage = MS_COUNTDOWN
missionSubState = SS_SETUP
SAFE_FADE_SCREEN_IN_FROM_BLACK()
BREAK
ENDSWITCH
ENDPROC
PROC HAO_ARRIVES_LATE()
IF bHaoArrivesLate AND IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HAO]) AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HAO])
IF NOT IS_ENTITY_IN_RANGE_COORDS(sRCLauncherDataLocal.vehID[HAO], sTrackData.vStartGrid[sTrackData.iNumAIRacers-1], 10.0)
CLEAR_PED_TASKS_IMMEDIATELY(sRCLauncherDataLocal.pedID[HAO])
BRING_VEHICLE_TO_HALT(sRCLauncherDataLocal.vehID[HAO], 0.1, 1)
IF NOT IS_PED_IN_VEHICLE(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO]) AND IS_VEHICLE_SEAT_FREE(sRCLauncherDataLocal.vehID[HAO])
SET_PED_INTO_VEHICLE(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO])
ENDIF
VECTOR behind_pos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(sTrackData.vStartGrid[sTrackData.iNumAIRacers-1], sTrackData.fStartGrid[sTrackData.iNumAIRacers-1], <<0.0, -5.0, 0.0>>)
VECTOR targetPos
targetPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(sTrackData.vStartGrid[sTrackData.iNumAIRacers-1], sTrackData.fStartGrid[sTrackData.iNumAIRacers-1], <<0.0, 2.3, 0.0>>)
SET_ENTITY_COORDS(sRCLauncherDataLocal.vehID[HAO], behind_pos)
SET_ENTITY_HEADING(sRCLauncherDataLocal.vehID[HAO], sTrackData.fStartGrid[sTrackData.iNumAIRacers-1])
SET_VEHICLE_ON_GROUND_PROPERLY(sRCLauncherDataLocal.vehID[HAO])
SET_VEHICLE_FORWARD_SPEED(sRCLauncherDataLocal.vehID[HAO], 5.0)
TASK_VEHICLE_DRIVE_TO_COORD(sRCLauncherDataLocal.pedID[HAO], sRCLauncherDataLocal.vehID[HAO], targetPos, 5.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(sRCLauncherDataLocal.vehID[HAO]), DF_ForceStraightLine|DRIVINGMODE_PLOUGHTHROUGH, 0.5, 15.0)
bHaoArrivesLate = FALSE
ENDIF
ENDIF
ENDPROC
PROC RACE_COUNTDOWN()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
CONTROL_RACE_CAMERAS()
DISABLE_SELECTOR_THIS_FRAME()
SWITCH missionSubState
CASE SS_SETUP
SAFE_REMOVE_BLIP(biDestination)
CPRINTLN(DEBUG_MISSION, "Setup RACE_COUNTDOWN")
REQUEST_MINIGAME_COUNTDOWN_UI(sRaceHUD.uiCountdown)
REQUEST_SCRIPT_AUDIO_BANK("HUD_321_GO", TRUE)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_RACE_START, "Race start", TRUE)
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SAVEHOUSE, FALSE)
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SHOP, FALSE)
bRacersReleased = FALSE
bHaoArrivesLate = TRUE
iBoostTimer = -1
eBoostState = BS_READY
CLEAR_BITMASK_AS_ENUM(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_Go)
CLEAR_BITMASK_AS_ENUM(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_1)
CLEAR_BITMASK_AS_ENUM(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_2)
CLEAR_BITMASK_AS_ENUM(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_3)
CANCEL_TIMER(sRaceHUD.uiCountdown.CountdownTimer)
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_VEHICLE_HANDBRAKE(sPlayerVehicle.vehPlayerVehicle, TRUE)
ENDIF
IF IS_PED_UNINJURED(PLAYER_PED_ID())
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "RACE_REACH_START", "FRANKLIN_NORMAL", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
missionSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
REQUEST_SCRIPT_AUDIO_BANK("HUD_321_GO", TRUE)
IF HAS_MINIGAME_COUNTDOWN_UI_LOADED(sRaceHUD.uiCountdown)
UPDATE_RACE_CHECKPOINTS(FALSE)
IF UPDATE_MINIGAME_COUNTDOWN_UI(sRaceHUD.uiCountdown, TRUE, FALSE, FALSE, 3, TRUE)
missionSubState = SS_CLEANUP
ENDIF
IF bHeadingIsOK
IF IS_BITMASK_AS_ENUM_SET(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_2)
HAO_ARRIVES_LATE()
ENDIF
ENDIF
// See B*929855 - allow racers to move as soon as "GO" appears
IF IS_BITMASK_AS_ENUM_SET(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_Go)
IF iBoostTimer < 0
iBoostTimer = GET_GAME_TIMER() + BOOST_START_WINDOW
ENDIF
IF bRacersReleased = FALSE
bRacersReleased = TRUE
INIT_RACE_HUD()
PLAYER_INDEX pId
pId = GET_PLAYER_INDEX()
SET_PLAYER_CONTROL(pId, TRUE)
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
SET_VEHICLE_HANDBRAKE(sPlayerVehicle.vehPlayerVehicle, FALSE)
ENDIF
SET_FRONTEND_RADIO_ACTIVE(true)
IF sRaceData.eRaceType = RACETYPE_SEA
TRIGGER_MUSIC_EVENT("MGSR_START")
ENDIF
START_RACE_MIXER()
CPRINTLN(DEBUG_MISSION, "Street Race: Starting race at game time ", GET_GAME_TIMER())
ENDIF
UPDATE_RACE_AI(FALSE)
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup RACE_COUNTDOWN")
// Release countdown timer
RELEASE_MINIGAME_COUNTDOWN_UI(sRaceHUD.uiCountdown)
UPDATE_RACE_CHECKPOINTS(FALSE)
/*IF bHeadingIsOK
STOP_GAMEPLAY_HINT()
SET_FOLLOW_VEHICLE_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON)
ENDIF*/
// Enable controls and go to race!
END_RACE_CUTSCENE()
missionStage = MS_RACE
missionSubState = SS_SETUP
BREAK
ENDSWITCH
HANDLE_START_BOOST()
ENDPROC
FUNC BOOL RIVAL_FINISHED()
INT i_index
FOR i_index = 0 TO sTrackData.iNumAIRacers-1
IF sRacer[i_index].iCurrentLap > sTrackData.iNumLaps
RETURN TRUE
ENDIF
ENDFOR
RETURN FALSE
ENDFUNC
PROC CHECK_COLLISION_STAT()
IF GET_GAME_TIMER() > iCollisionTimer
IF HAS_PLAYER_COLLIDED_WITH_RACER()
INFORM_MISSION_STATS_OF_INCREMENT(HAO1_COLLISIONS)
iCollisionTimer = GET_GAME_TIMER() + 1000
ENDIF
ENDIF
ENDPROC
PROC SHOW_LOOK_BACK_HELP()
IF bLookBackHelpReady AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
// Show the How to Look Back help text the first time the player is third or higher
IF sRaceHUD.iPlayerPosition <= 3
PRINT_HELP("HAO1_LOOK_HELP")
bLookBackHelpReady = FALSE
ENDIF
ENDIF
ENDPROC
PROC SHOW_SLIPSTREAM_HELP()
IF bSlipStreamHelpReady AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED() AND g_savedGlobals.sStreetRaceData.iSlipstreamHelpCount < 3
PRINT_HELP("FM_IHELP_SLP") // You can slipstream by driving close behind another racer. This will give you a speed boost.
bSlipStreamHelpReady = FALSE
g_savedGlobals.sStreetRaceData.iSlipstreamHelpCount++
ENDIF
ENDPROC
PROC SHOW_ABILITY_HELP()
IF g_savedGlobals.sStreetRaceData.bSpecialAbilityHelp = FALSE
IF sRaceHUD.iCurrentCheckPoint >= 4 AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED() AND IS_REPLAY_IN_PROGRESS()
IF GET_PLAYER_SPECIAL_ABILITY_VALUE() > 0
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("HAO1_ABILITY_HELP_KM")
ELSE
PRINT_HELP("HAO1_ABILITY_HELP")
ENDIF
ENDIF
g_savedGlobals.sStreetRaceData.bSpecialAbilityHelp = TRUE
ENDIF
ENDIF
ENDPROC
PROC RACE_ACTIVE()
IF sRaceHUD.iCurrentLap = 1 AND sRaceHUD.iCurrentCheckPoint < 3
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
ELSE
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.1)
ENDIF
HIDE_STREET_AND_CAR_NAMES_THIS_FRAME()
DISABLE_SELECTOR_THIS_FRAME()
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup RACE_ACTIVE")
STOP_SOUND(iIntroSound)
// Used for respawning the player's car if it become stuck
racesRespawnState = RACES_RESPAWN_SET
iPlayerWantsToRecoverVehicleTimer = -1
PRINT_HELP("HAO1_LAP_HELP")
iPreviousPosition = sRaceHUD.iPlayerPosition
iPositionConvTimer = GET_GAME_TIMER() + POSITION_CONV_TIME
UPDATE_RACE_CHECKPOINTS()
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SAVEHOUSE, FALSE)
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SHOP, FALSE)
bLookBackHelpReady = TRUE
bSlipStreamHelpReady = TRUE
INIT_STOPPED_SOUND()
iRamInRaceTimer = 0
iCloseInRaceTimer = GET_GAME_TIMER() + 10000
// Start Stats tracking
iCollisionTimer = 0
/*iNumCollisions = 0
iPreviousCollisions = iNumCollisions*/
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(HAO1_RACE_TIME)
missionSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
UPDATE_RACE_AI(TRUE, TRUE)
UPDATE_PLAYER_POS()
//CAM_HINT_FOR_NEXT_CAR()
UPDATE_RACE_HUD()
CHECK_RACE_CONVS()
SHOW_LOOK_BACK_HELP()
SHOW_SLIPSTREAM_HELP()
SHOW_ABILITY_HELP()
IF iReplayRecordWarpTimer > GET_GAME_TIMER()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2226208
ENDIF
IF RIVAL_FINISHED() AND sRaceHUD.iPlayerPosition > 1
missionFailReason = MFR_DIDNT_WIN
missionStage = MS_FAIL
missionSubState = SS_SETUP
EXIT
ENDIF
/*IF iNumCollisions < iPreviousCollisions
INFORM_MISSION_STATS_OF_INCREMENT(HAO1_COLLISIONS)
ENDIF*/
CHECK_COLLISION_STAT()
PLAY_RAM_CONV()
PLAY_CLOSE_CONV()
IF IS_PLAYER_IN_VEHICLE()
AND UPDATE_RACE_CHECKPOINTS()
missionSubState = SS_CLEANUP
STOP_AUDIO_SCENE("STREET_RACE_DURING_RACE")
START_AUDIO_SCENE("STREET_RACE_OUTRO")
ENDIF
BREAK
CASE SS_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(10.0, 2, REPLAY_IMPORTANCE_HIGHEST)
CPRINTLN(DEBUG_MISSION, "Cleanup RACE_ACTIVE")
IF sRaceHUD.iPlayerPosition = 1
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(TRUE, HAO1_RACE_TIME)
missionStage = MS_PASS
ELSE
missionFailReason = MFR_DIDNT_WIN
missionStage = MS_FAIL
ENDIF
missionSubState = SS_SETUP
BREAK
ENDSWITCH
HANDLE_START_BOOST()
CONTROL_RACE_FAIL()
ENDPROC
PROC WAIT_FOR_PASS()
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup WAIT_FOR_PASS")
CLEANUP_RACERS(FALSE)
CLEANUP_RACER_BLIPS()
CLEANUP_CHECKPOINTS()
IF IS_REPEAT_PLAY_ACTIVE()
Script_Passed()
ELSE
missionSubState = SS_UPDATE
ENDIF
BREAK
CASE SS_UPDATE
iCallDelayTimer = GET_GAME_TIMER() + 2000
missionSubState = SS_CLEANUP
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleanup WAIT_FOR_PASS")
IF GET_GAME_TIMER() > iCallDelayTimer
IF REGISTER_TEXT_MESSAGE_FROM_CHARACTER_TO_PLAYER(TEXT_HAO1, CT_FRIEND, BIT_FRANKLIN, CHAR_HAO, 1000, 5000, VID_BLANK, CID_DISPLAY_STREET_RACE_HELP)
CREDIT_BANK_ACCOUNT(CHAR_FRANKLIN, BAAC_UNLOGGED_SMALL_ACTION, 200,TRUE,TRUE)//1412118
Script_Passed()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC WAIT_FOR_FAIL()
SWITCH missionSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Setup WAIT_FOR_FAIL")
CLEANUP_CHECKPOINTS()
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(TRUE, HAO1_RACE_TIME)
STRING sFailReason
STOP_AUDIO_SCENE("STREET_RACE_DURING_RACE")
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[HAO])
IF IS_PED_INJURED(sRCLauncherDataLocal.pedID[HAO])
MissionFailReason = MFR_KILLED_HAO
ENDIF
ENDIF
// set the fail reason
IF eRaceState = RACE_STATE_FAIL
// Race specific fail reason
SWITCH failReason
CASE FAIL_RIVAL_ATTACKED
sFailReason = "RACES_R_INJ"
BREAK
CASE FAIL_RIVAL_DEAD
sFailReason = "RACES_R_DEAD"
BREAK
CASE FAIL_WRECKED
sFailReason = "RACES_WRECK"
BREAK
CASE FAIL_ABANDONED_RACE
sFailReason = "RACES_ABAND"
BREAK
CASE FAIL_MISSED_CHECKPOINT
sFailReason = "RACES_MISS"
BREAK
CASE FAIL_ALERTED_COPS
sFailReason = "RACES_COPS"
BREAK
ENDSWITCH
ELSE
SWITCH missionFailReason
CASE MFR_NONE
// no fail reason
BREAK
CASE MFR_KILLED_HAO
sFailReason = "HAO1_FAIL1"
BREAK
CASE MFR_THREATENED_HAO
sFailReason = "HAO1_FAIL2"
BREAK
CASE MFR_DIDNT_WIN
sFailReason = "HAO1_FAIL3"
BREAK
ENDSWITCH
ENDIF
IF MissionFailReason = MFR_NONE AND failReason = FAIL_DEFAULT
Random_Character_Failed()
ELSE
Random_Character_Failed_With_Reason(sFailReason)
ENDIF
missionSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
CPRINTLN(DEBUG_MISSION, "Cleanup WAIT_FOR_FAIL")
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
Script_Cleanup()
ELSE
// not finished fading out
// you may want to handle dialogue etc here.
ENDIF
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
// Setup callback when player is killed, arrested or goes to multiplayer
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU))
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
Random_Character_Failed()
Script_Cleanup()
ENDIF
RANDOM_CHAR_DISPLAY_MISSION_TITLE(RC_HAO_1)
IF Is_Replay_In_Progress() // Set up the initial scene for replays
g_bSceneAutoTrigger = TRUE
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_HAO_1(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
g_bSceneAutoTrigger = FALSE
ENDIF
#IF IS_DEBUG_BUILD
sSkipMenu[0].sTxtLabel = "Restart"
sSkipMenu[1].sTxtLabel = "Race"
#ENDIF
IF (g_savedGlobals.sRandomChars.g_bTriggeredHao1 = FALSE)
g_savedGlobals.sRandomChars.g_bTriggeredHao1 = TRUE
ENDIF
// Loop within here until the mission passes or fails
WHILE(TRUE)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_SW")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
WAIT(0)
IF IS_PED_UNINJURED(PLAYER_PED_ID())
SWITCH missionStage
CASE MS_INIT
INIT()
BREAK
CASE MS_PRE_INTRO
PRE_INTRO()
BREAK
CASE MS_INTRO
INTRO()
BREAK
CASE MS_GET_CAR
GET_CAR()
BREAK
CASE MS_DRIVE_TO_RACE
DRIVE_TO_RACE()
BREAK
/*CASE MS_RETURN_TO_CAR
RETURN_TO_CAR()
BREAK*/
CASE MS_LOSE_COPS
LOSE_COPS()
BREAK
CASE MS_LINEUP
RACE_LINEUP()
BREAK
CASE MS_COUNTDOWN
RACE_COUNTDOWN()
BREAK
CASE MS_RACE
RACE_ACTIVE()
BREAK
CASE MS_PASS
WAIT_FOR_PASS()
BREAK
CASE MS_FAIL
WAIT_FOR_FAIL()
BREAK
ENDSWITCH
ENDIF
CheckHao()
CheckRacers()
// Check debug completion/failure
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT