//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