// MISSION NAME : Josh3.sc // AUTHOR : Kev Edwards // DESCRIPTION : Collect fuel can and burn down Josh's house //Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. USING "rage_builtins.sch" USING "globals.sch" USING "commands_entity.sch" USING "commands_script.sch" USING "script_player.sch" USING "randomChar_public.sch" USING "cutscene_public.sch" USING "commands_cutscene.sch" USING "dialogue_public.sch" USING "RC_Helper_Functions.sch" USING "rc_launcher_public.sch" USING "initial_scenes_Josh.sch" USING "building_control_public.sch" USING "script_ped.sch" USING "CompletionPercentage_public.sch" USING "RC_Threat_public.sch" USING "RC_Area_public.sch" USING "rgeneral_include.sch" CONST_INT MAX_TRAIL_POINTS 48 USING "gas_trails.sch" USING "commands_recording.sch" USING "taxi_functions.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" #ENDIF g_structRCScriptArgs sRCLauncherDataLocal CONST_INT CP_LEAD_IN 0 // Checkpoints CONST_INT CP_GET_IN_CAR 1 CONST_INT CP_ARRIVE_AT_HOUSE 2 CONST_INT CP_MISSION_PASSED 3 // Only used for shitskips CONST_INT Z_SKIP_LEAD_IN 0 // Z Skips CONST_INT Z_SKIP_INTRO 1 CONST_INT Z_SKIP_GET_IN_CAR 2 CONST_INT Z_SKIP_GO_TO_BBQ 3 CONST_INT Z_SKIP_DROP_FUEL 4 CONST_INT Z_SKIP_LEAVE_AREA 5 CONST_INT Z_SKIP_MISSION_PASSED 6 ENUM JOSH3_MISSION_STATE stateNULL, stateLeadIn, stateWalkInMotelCutscene, stateIntro, stateGetInCar, stateGoToHouse, stateGoToBBQ, stateDropFuel, stateShootFuel, stateOutro, stateLeaveArea, stateLoseCops, statePhoneCall, stateMissionPassed, stateFailed, NUM_MISSION_STATES ENDENUM JOSH3_MISSION_STATE missionState = stateLeadIn // Stores the current JOSH3_MISSION_STATE JOSH3_MISSION_STATE missionStateSkip = stateNULL // Used if needing to change to a JOSH3_MISSION_STATE out of sequence ENUM JOSH3_STATE_MACHINE JOSH3_STATE_MACHINE_SETUP, JOSH3_STATE_MACHINE_LOOP, JOSH3_STATE_MACHINE_CLEANUP ENDENUM JOSH3_STATE_MACHINE missionStateMachine = JOSH3_STATE_MACHINE_SETUP ENUM FAILED_REASON FAILED_DEFAULT = 0, FAILED_CAR_WRECKED, FAILED_USED_UP_FUEL, FAILED_DIDNT_COLLECT_FUEL, FAILED_USED_TOO_MUCH_GASOLINE, FAILED_SHOT_TRAIL_TOO_EARLY, FAILED_JOSH_DIED, FAILED_JOSH_INJURED, FAILED_JOSH_SCARED, FAILED_DIDNT_GO_TO_MOTEL_ROOM, FAILED_DIDNT_BURN_HOUSE ENDENUM FAILED_REASON failReason STRING failString ENUM STATUS_SHOOT_FUEL STATUS_SHOOT_FUEL_HAS_WEAPON, STATUS_SHOOT_FUEL_NO_WEAPON, STATUS_SHOOT_FUEL_FAR_AWAY ENDENUM STATUS_SHOOT_FUEL statusShootFuel ENUM STATUS_MISSION_OBJECTIVE MISSION_OBJECTIVE_NORMAL, // Player is on his normal mission objective for that particular missionState MISSION_OBJECTIVE_LOSE_COPS // Player has alerted the cops and need to lose them before returning to the current missionState ENDENUM BOOL bZSkipping = FALSE // Changes to TRUE if z skipping to prevent subsequent mission state changes etc #IF IS_DEBUG_BUILD CONST_INT MAX_SKIP_MENU_LENGTH 6 MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH] WIDGET_GROUP_ID widgetGroup BOOL bDebug_PrintToTTY = TRUE INT iDebugSkipTime // Prevents skipping instantaneously #ENDIF structTimelapse sTimelapse TIMEOFDAY todReference INT iSkipToHour CONST_INT CONST_NUM_HOURS_SKIP_FOR_MOTEL_TIMELAPSE 2 VECTOR vPlayerCarRespotAtStart = <<572.4306, -1765.0028, 28.1693>> CONST_FLOAT fPlayerCarRespotAtStart 354.2095 VECTOR vPlayerCarRespotAtHouse = <<-1116.9021, 281.7206, 64.2895>> CONST_FLOAT fPlayerCarRespotAtHouse 101.2209 VEHICLE_INDEX vehForReplay VECTOR vMotelRoom = <<550.3759, -1772.4634, 32.4478>> VECTOR vInsideMainGate = << -1105.96240, 292.88455, 63.58510 >> CONST_FLOAT fInsideMainGate 203.9533 VECTOR vHouse = << -1116, 309, 67 >> VECTOR vBBQLocate = << -1116.11719, 318.26044, 65.97770 >> VECTOR vPlayerLeadInCP = << 567.3073, -1762.9607, 28.1695 >> CONST_FLOAT fPlayerLeadInCP 161.1730 VECTOR vPlayerGetInCarCP = << 565.4832, -1767.7043, 28.1470 >> CONST_FLOAT fPlayerGetInCarCP 66.0379 VECTOR vPlayerGoToBBQCP = << -1102.4427, 284.4827, 63.0251 >> CONST_FLOAT fPlayerGoToBBQCP 40.6354 VECTOR vPlayerMissionPassedCP = << -1069.3167, 236.0038, 62.3195 >> CONST_FLOAT fPlayerMissionPassedCP 24.0453 OBJECT_INDEX oBBQ MODEL_NAMES modelBBQ VECTOR vBBQObject = << -1116.31, 317.28, 65.97 >> CONST_FLOAT fBBQObject 170.40 BOOL bDisplayedShootFuelObjective BOOL bDisplayedFuelHelpText STATUS_MISSION_OBJECTIVE missionCurrentObjective BOOL bToldToLoseWantedLevel BOOL bGivenCarDistanceWarning BOOL bGivenWastingFuelWarning INT iPlayerFuelBeforeMission INT iMaxJerryCanAmmo BOOL bStartedPouringFuel BOOL bDidntPourFuelInOneGo BLIP_INDEX blipMotelRoom BLIP_INDEX blipJoshCar BLIP_INDEX blipGate BLIP_INDEX blipBBQ BLIP_INDEX blipHouse VEHICLE_INDEX vehJoshCar MODEL_NAMES modelJoshCar VECTOR vJoshCar = << 558.09, -1765.39, 28.86 >> CONST_FLOAT fJoshCar 335.3252 INT colourJoshCar = 4 structPedsForConversation sTrevorConversation BOOL bDoneLeadInConversation BOOL bDoneCarefulWithCarConversation BOOL bDoneJoshFuelConversation BOOL bDoneJoshReminderConversation BOOL bStoppedJoshReminderConversation BOOL bDoneCollectedFuelConversation BOOL bDoneTrevorCarConversation BOOL bDoneJoshPhoneConversation BOOL bDoneAfterPhoneConversation BOOL bSentTextMessage BOOL bDoneTrevorClimbWallConversation BOOL bDoneTrevorOverWallConversation BOOL bDoneTrevorCopsConversation BOOL bDisplayedLeaveAreaObjective BOOL bStartedMusic BOOL bHasPlayerGotInAnyVehicle INT iPourFuelConversationsDone BOOL bDoneFinalPhoneCallConversation INT iCounterDialogueDamageCar INT iDoneLeadInConversationTimer INT iEnterMotelRoomTimer INT iJoshReminderTimer INT iJoshPhoneTimer INT iLeaveAreaTimer INT iRestoreControlTimer INT iDisplayFuelHelpTimer INT iCameraChangeTimer INT iEndCutsceneTimer INT iPlayerHungUpPhoneTimer INT iAfterPhoneTimer INT iPourFuelConversationTimer INT iDialogueDamageCarTimer PTFX_ID fxBigFire VECTOR vBigFire VECTOR rBigFire INT iBBQExplosionSound = GET_SOUND_ID() INT iHouseFireSound = GET_SOUND_ID() VECTOR vLightFromFire = <<-1107.8625, 296.1609, 65.3295>> // These are each slightly further back <<-1105.8230, 292.4114, 63.5407>> <<-1105.8230, 292.4114, 63.5407>> <<-1105.8230, 292.4114, 63.5407>> CONST_INT JOSH3_CAMERA_FRONT_PATHWAY 0 CONST_INT JOSH3_CAMERA_REAR_PATHWAY 1 CONST_INT JOSH3_CAMERA_EXPLODE_BBQ 2 CONST_INT NUM_OUTRO_CAMERAS 3 STRUCT JOSH3_OUTRO_CAMERA VECTOR vCamPosStart VECTOR vCamRotStart VECTOR vCamPosEnd VECTOR vCamRotEnd FLOAT fFOV BOOL bDisplayedCamera = FALSE VECTOR vNearestTrailPoint FLOAT fTriggerRange CAMERA_GRAPH_TYPE camGraphType ENDSTRUCT JOSH3_OUTRO_CAMERA cameraOutro[NUM_OUTRO_CAMERAS] CAMERA_INDEX camCutscene INT iCutsceneStage = 0 BOOL bCutsceneSkipped BOOL bDoneCutsceneStartCommands INT iLastCameraDisplayed STRUCT JOSH3_EXPLOSION_LOCATION BOOL bDoneExplosion INT iExplosionTimer ENDSTRUCT JOSH3_EXPLOSION_LOCATION explosionOutro TEST_POLY g_polyPlayArea PED_INDEX pedJosh REL_GROUP_HASH relGroupFriendly INT iJoshSynchedScene VECTOR vJoshSynchedScenePos = <<563.76, -1773.86, 28.36>> VECTOR vJoshSynchedSceneRot = <<-0.00, 0.05, -110.70>> INT iTrevorSynchedScene CAMERA_INDEX cameraAnim SCENARIO_BLOCKING_INDEX blockScenarios STREAMVOL_ID streamVolumeJosh3 BOOL bStartedReplayEvent = FALSE BOOL bDone1stPersonCameraFlash = FALSE /// PURPOSE: /// Used in every JOSH3_STATE_MACHINE_SETUP. Advances state machine to JOSH3_STATE_MACHINE_LOOP. PROC JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD STRING s_text #ENDIF) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Initialising ", s_text) ENDIF #ENDIF bZSkipping = FALSE bToldToLoseWantedLevel = FALSE missionCurrentObjective = MISSION_OBJECTIVE_NORMAL #IF IS_DEBUG_BUILD iDebugSkipTime = GET_GAME_TIMER() #ENDIF missionStateMachine = JOSH3_STATE_MACHINE_LOOP ENDPROC /// PURPOSE: /// Used in every JOSH3_STATE_MACHINE_CLEANUP. Advances state machine to JOSH3_STATE_MACHINE_SETUP. PROC JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD STRING s_text #ENDIF) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Cleaning up ", s_text) ENDIF #ENDIF CLEAR_PRINTS() CLEAR_HELP(TRUE) IF missionStateSkip = stateNULL missionState = INT_TO_ENUM(JOSH3_MISSION_STATE, ENUM_TO_INT(missionState) + 1) ELSE missionState = missionStateSkip ENDIF missionStateSkip = stateNULL missionStateMachine = JOSH3_STATE_MACHINE_SETUP ENDPROC /// PURPOSE: /// Safely remove all blips in this mission. PROC JOSH3_REMOVE_ALL_BLIPS() SAFE_REMOVE_BLIP(blipMotelRoom) SAFE_REMOVE_BLIP(blipJoshCar) SAFE_REMOVE_BLIP(blipGate) SAFE_REMOVE_BLIP(blipBBQ) SAFE_REMOVE_BLIP(blipHouse) ENDPROC /// PURPOSE: /// Models required for a mission state are all loaded when the mission state inits, but this is a safety check to ensure a model is loaded before subsequently creating an entity using it. PROC JOSH3_ENSURE_MODEL_IS_LOADED(MODEL_NAMES e_model) REQUEST_MODEL(e_model) IF NOT HAS_MODEL_LOADED(e_model) WHILE NOT HAS_MODEL_LOADED(e_model) WAIT(0) ENDWHILE ENDIF ENDPROC /// PURPOSE: /// Safely creates a vehicle. PROC JOSH3_CREATE_VEHICLE(VEHICLE_INDEX &veh_to_create, MODEL_NAMES e_model, VECTOR v_pos, FLOAT f_heading = 0.0, INT i_colour = -1) IF NOT DOES_ENTITY_EXIST(veh_to_create) JOSH3_ENSURE_MODEL_IS_LOADED(e_model) veh_to_create = CREATE_VEHICLE(e_model, v_pos, f_heading) IF i_colour >= 0 SET_VEHICLE_COLOURS(veh_to_create, i_colour, i_colour) ENDIF ENDIF ENDPROC /// PURPOSE: /// Safely remove all vehicles in this mission. PROC JOSH3_REMOVE_ALL_VEHICLES(BOOL b_delete = FALSE) IF b_delete = TRUE SAFE_DELETE_VEHICLE(vehJoshCar) SAFE_DELETE_VEHICLE(vehForReplay) ELSE SAFE_RELEASE_VEHICLE(vehJoshCar) SAFE_RELEASE_VEHICLE(vehForReplay) ENDIF ENDPROC /// PURPOSE: /// Sets ped to wander after mission. PROC JOSH3_MAKE_PED_WANDER() IF IS_ENTITY_ALIVE(pedJosh) AND NOT IsPedPerformingTask(pedJosh, SCRIPT_TASK_WANDER_STANDARD) AND NOT IsPedPerformingTask(pedJosh, SCRIPT_TASK_SMART_FLEE_PED) SET_PED_KEEP_TASK(pedJosh, TRUE) TASK_WANDER_STANDARD(pedJosh) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Set Josh to wander") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// Mission is failing so set alive peds to flee from the player. PROC JOSH3_SET_PED_TO_FLEE() IF IS_ENTITY_ALIVE(pedJosh) CLEAR_PED_TASKS(pedJosh) SET_PED_KEEP_TASK(pedJosh, TRUE) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) TASK_SMART_FLEE_PED(pedJosh, PLAYER_PED_ID(), 100, -1) MAKE_PED_SCREAM(pedJosh) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Set Josh to flee") ENDIF #ENDIF ELSE TASK_WANDER_STANDARD(pedJosh) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Set Josh to wander") ENDIF #ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Safely remove all peds in this mission. PROC JOSH3_REMOVE_ALL_PEDS(BOOL b_delete = FALSE) IF b_delete = TRUE SAFE_DELETE_PED(pedJosh) ELSE IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) // Josh should flee if Franklin has died, otherwise only be set to wander JOSH3_MAKE_PED_WANDER() ELSE JOSH3_SET_PED_TO_FLEE() ENDIF SAFE_RELEASE_PED(pedJosh) ENDIF ENDPROC /// PURPOSE: /// Safely remove all script fire vfx. PROC JOSH3_CLEANUP_BIG_FIRE() IF DOES_PARTICLE_FX_LOOPED_EXIST(fxBigFire) STOP_PARTICLE_FX_LOOPED(fxBigFire) fxBigFire = NULL ENDIF ENDPROC /// PURPOSE: /// Clean up everything conceivably setup in this mission. /// PARAMS: /// bTerminateMission - TRUE if cleaning up before terminating, FALSE if cleaning up before a debug skip. PROC JOSH3_MISSION_CLEANUP(BOOL b_delete_entities = FALSE, BOOL bTerminateMission = FALSE) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Cleaning up mission...") ENDIF #ENDIF CLEAR_PRINTS() CLEAR_HELP() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() SAFE_RELEASE_OBJECT(oBBQ) JOSH3_REMOVE_ALL_BLIPS() JOSH3_REMOVE_ALL_PEDS(b_delete_entities) JOSH3_REMOVE_ALL_VEHICLES(b_delete_entities) JOSH3_CLEANUP_BIG_FIRE() SET_MODEL_AS_NO_LONGER_NEEDED(modelJoshCar) SET_VEHICLE_MODEL_IS_SUPPRESSED(modelJoshCar, FALSE) SET_MODEL_AS_NO_LONGER_NEEDED(modelBBQ) IF ASSISTED_MOVEMENT_IS_ROUTE_LOADED("Jo_3") ASSISTED_MOVEMENT_REMOVE_ROUTE("Jo_3") ENDIF REMOVE_ANIM_DICT("rcmjosh3") REMOVE_ANIM_DICT("rcmjosh") REMOVE_ANIM_DICT("reaction@shellshock@unarmed") REMOVE_PTFX_ASSET() DESTROY_ALL_CAMS() RESET_GAS_TRAIL(FALSE) SET_WANTED_LEVEL_MULTIPLIER(1) SET_CREATE_RANDOM_COPS(TRUE) CLEAR_WEATHER_TYPE_PERSIST() STOP_SOUND(iBBQExplosionSound) STOP_SOUND(iHouseFireSound) STOP_STREAM() SET_AMBIENT_ZONE_LIST_STATE("AZL_JOSH_HOUSE_BURNING", FALSE, FALSE) RELEASE_SCRIPT_AUDIO_BANK() RELEASE_AMBIENT_AUDIO_BANK() TRIGGER_MUSIC_EVENT("JOSH3_MISSION_FAIL") RESET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID()) IF STREAMVOL_IS_VALID(streamVolumeJosh3) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Deleting streamVolumeJosh3") ENDIF #ENDIF STREAMVOL_DELETE(streamVolumeJosh3) ENDIF DISABLE_TAXI_HAILING(FALSE) // B*2153231 Allow being able to hail a taxi IF bTerminateMission = TRUE REMOVE_PED_FOR_DIALOGUE(sTrevorConversation, 2) REMOVE_PED_FOR_DIALOGUE(sTrevorConversation, 3) CLEANUP_GAS_TRAILS() CLEAR_PED_NON_CREATION_AREA() REMOVE_SCENARIO_BLOCKING_AREA(blockScenarios) SET_PED_PATHS_BACK_TO_ORIGINAL(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>, TRUE) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_NORMAL) #IF IS_DEBUG_BUILD IF DOES_WIDGET_GROUP_EXIST(widgetGroup) DELETE_WIDGET_GROUP(widgetGroup) ENDIF #ENDIF ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Cleaned up mission") ENDIF #ENDIF ENDPROC /// PURPOSE: /// Standard RC mission cleanup function. PROC Script_Cleanup() // Ensure launcher is cleaned up RC_CLEANUP_LAUNCHER() IF (Random_Character_Cleanup_If_Triggered()) JOSH3_MISSION_CLEANUP(FALSE, TRUE) ENDIF RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE) TERMINATE_THIS_THREAD() ENDPROC /// PURPOSE: /// Standard RC mission passed function. PROC Script_Passed() Random_Character_Passed(CP_RAND_C_JOS3) Script_Cleanup() ENDPROC /// PURPOSE: /// Mission failed function. PROC JOSH3_MISSION_FAILED(FAILED_REASON reason = FAILED_DEFAULT) IF bZSkipping = FALSE failReason = reason missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP missionStateSkip = stateFailed ENDIF ENDPROC /// PURPOSE: /// Death checks for any mission critical entities. PROC JOSH3_DEATH_CHECKS() IF ENUM_TO_INT(missionState) < (ENUM_TO_INT(NUM_MISSION_STATES)-1) // Don't check during stateFailed IF DOES_ENTITY_EXIST(pedJosh) IF IS_ENTITY_DEAD(pedJosh) JOSH3_MISSION_FAILED(FAILED_JOSH_DIED) ELSE IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(pedJosh) JOSH3_MISSION_FAILED(FAILED_JOSH_INJURED) ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedJosh, PLAYER_PED_ID()) JOSH3_MISSION_FAILED(FAILED_JOSH_INJURED) ELIF HAS_PLAYER_THREATENED_PED(pedJosh) JOSH3_MISSION_FAILED(FAILED_JOSH_SCARED) ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Set up mission prior to going into any mission states. PROC JOSH3_MISSION_SETUP() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Starting mission setup...") ENDIF #ENDIF failReason = FAILED_DEFAULT REQUEST_ADDITIONAL_TEXT("JOSH3", MISSION_TEXT_SLOT) WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) WAIT(0) ENDWHILE #IF IS_DEBUG_BUILD mSkipMenu[Z_SKIP_LEAD_IN].sTxtLabel = "Go to motel room" mSkipMenu[Z_SKIP_INTRO].sTxtLabel = "Intro - josh_3_intp1" mSkipMenu[Z_SKIP_GET_IN_CAR].sTxtLabel = "Get in car" mSkipMenu[Z_SKIP_GO_TO_BBQ].sTxtLabel = "Arrived at house" mSkipMenu[Z_SKIP_DROP_FUEL].sTxtLabel = "Pour fuel" mSkipMenu[Z_SKIP_LEAVE_AREA].sTxtLabel = "Leave the area" IF NOT DOES_WIDGET_GROUP_EXIST(widgetGroup) widgetGroup = START_WIDGET_GROUP("Josh3 widgets") ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintToTTY) STOP_WIDGET_GROUP() ENDIF #ENDIF modelJoshCar = FELON2 modelBBQ = prop_bbq_1 vBigFire = << -1116.1232, 318.0682, 65.9778 >> // BBQ rBigFire = << 0,0,350 >> SET_PED_NON_CREATION_AREA(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>) blockScenarios = ADD_SCENARIO_BLOCKING_AREA(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>) SET_PED_PATHS_IN_AREA(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>, FALSE) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>, FALSE) REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>) CLEAR_AREA(vHouse, 100, TRUE, FALSE) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE, BUILDINGSTATE_NORMAL) // Ensure building state is undamaged. See B*401987. SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_NORMAL) GET_MAX_AMMO(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN, iMaxJerryCanAmmo) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: iMaxJerryCanAmmo = ", iMaxJerryCanAmmo) ENDIF #ENDIF bHidden = FALSE // gas_trails.sch SET_WEATHER_TYPE_OVERTIME_PERSIST("EXTRASUNNY", 30) SET_DOOR_STATE(DOORNAME_JOSH_HOTEL, DOORSTATE_LOCKED) ADD_PED_FOR_DIALOGUE(sTrevorConversation, 2, PLAYER_PED_ID(), "TREVOR") OPEN_TEST_POLY(g_polyPlayArea) ADD_TEST_POLY_VERT(g_polyPlayArea, << -1094.6340, 292.4790, 63.0398 >>) ADD_TEST_POLY_VERT(g_polyPlayArea, << -1133.5137, 285.0669, 65.2301 >>) ADD_TEST_POLY_VERT(g_polyPlayArea, << -1139.6509, 304.8385, 66.4302 >>) ADD_TEST_POLY_VERT(g_polyPlayArea, << -1149.9860, 331.3831, 68.1542 >>) ADD_TEST_POLY_VERT(g_polyPlayArea, << -1092.2432, 334.3243, 65.9754 >>) CLOSE_TEST_POLY(g_polyPlayArea) iCounterDialogueDamageCar = 0 iDialogueDamageCarTimer = GET_GAME_TIMER() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Finished mission setup") ENDIF #ENDIF ENDPROC /// PURPOSE: /// Loads the assets for the required mission stage. PROC JOSH3_LOAD_ASSETS_FOR_MISSION_STATE(JOSH3_MISSION_STATE current_state) SWITCH current_state CASE stateLeadIn REQUEST_ANIM_DICT("rcmjosh3") REQUEST_ANIM_DICT("rcmjosh") BREAK CASE stateGetInCar REQUEST_MODEL(modelJoshCar) SET_VEHICLE_MODEL_IS_SUPPRESSED(modelJoshCar, TRUE) BREAK CASE stateGoToBBQ REQUEST_MODEL(modelBBQ) BREAK CASE stateDropFuel ASSISTED_MOVEMENT_REQUEST_ROUTE("Jo_3") REQUEST_PTFX_ASSET() REQUEST_MODEL(modelBBQ) REQUEST_ANIM_DICT("reaction@shellshock@unarmed") BREAK ENDSWITCH BOOL b_assets_loaded = FALSE WHILE b_assets_loaded = FALSE SWITCH current_state CASE stateLeadIn IF HAS_ANIM_DICT_LOADED("rcmjosh3") AND HAS_ANIM_DICT_LOADED("rcmjosh") b_assets_loaded = TRUE ENDIF BREAK CASE stateGetInCar IF HAS_MODEL_LOADED(modelJoshCar) b_assets_loaded = TRUE ENDIF BREAK CASE stateGoToBBQ IF HAS_MODEL_LOADED(modelBBQ) b_assets_loaded = TRUE ENDIF BREAK CASE stateDropFuel IF ASSISTED_MOVEMENT_IS_ROUTE_LOADED("Jo_3") AND HAS_PTFX_ASSET_LOADED() AND HAS_MODEL_LOADED(modelBBQ) AND HAS_ANIM_DICT_LOADED("reaction@shellshock@unarmed") ASSISTED_MOVEMENT_SET_ROUTE_PROPERTIES("Jo_3", EASSISTED_ROUTE_ACTIVE_WHEN_STRAFING) b_assets_loaded = TRUE ENDIF BREAK ENDSWITCH #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Loading assets...") ENDIF #ENDIF WAIT(0) ENDWHILE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Assets loaded") ENDIF #ENDIF ENDPROC /// PURPOSE: /// Give the fuel can weapon to the player. PROC JOSH3_GIVE_FUEL_CAN_TO_PLAYER() GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN, iMaxJerryCanAmmo, FALSE, FALSE) //SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN, TRUE) B*511832 ENDPROC /// PURPOSE: /// Ensures player has at least 30 pistol bullets. PROC JOSH3_GIVE_PISTOL_TO_PLAYER() IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) < 30 SET_PED_AMMO(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 30) ENDIF ELSE GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 30) ENDIF ENDPROC /// PURPOSE: /// Locks both sets of gates into the grounds of Josh's house. PROC JOSH3_LOCK_GATES(BOOL b_lock_gates = TRUE) IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1107.01, 289.38, 64.76>>, 5.0, prop_lrggate_01c_l) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(prop_lrggate_01c_l, <<-1107.01, 289.38, 64.76>>, b_lock_gates, 0.0) ELSE SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(prop_lrggate_01c_l, <<-1107.01, 289.38, 64.76>>, b_lock_gates, 0.0) ENDIF IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1101.62, 290.36, 64.76>>, 5.0, prop_lrggate_01c_r) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(prop_lrggate_01c_r, <<-1101.62, 290.36, 64.76>>, b_lock_gates, 0.0) ELSE SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(prop_lrggate_01c_r, <<-1101.62, 290.36, 64.76>>, b_lock_gates, 0.0) ENDIF IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1137.05, 295.59, 67.18>>, 5.0, prop_lrggate_01c_r) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(prop_lrggate_01c_r, <<-1137.05, 295.59, 67.18>>, b_lock_gates, 0.0) ELSE SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(prop_lrggate_01c_r, <<-1137.05, 295.59, 67.18>>, b_lock_gates, 0.0) ENDIF IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1138.64, 300.82, 67.18>>, 5.0, prop_lrggate_01c_l) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(prop_lrggate_01c_l, <<-1138.64, 300.82, 67.18>>, b_lock_gates, 0.0) ELSE SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(prop_lrggate_01c_l, <<-1138.64, 300.82, 67.18>>, b_lock_gates, 0.0) ENDIF IF b_lock_gates = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Locked gates") ENDIF #ENDIF ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Unlocked gates") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// Creates a car parked outside Josh's mansion during replays only. PROC JOSH3_CREATE_REPLAY_VEHICLE() IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL() WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED() WAIT(0) ENDWHILE IF ENUM_TO_INT(missionStateSkip) < ENUM_TO_INT(stateGoToBBQ) vehForReplay = CREATE_REPLAY_CHECKPOINT_VEHICLE(vPlayerCarRespotAtStart, fPlayerCarRespotAtStart) ELSE vehForReplay = CREATE_REPLAY_CHECKPOINT_VEHICLE(vPlayerCarRespotAtHouse, fPlayerCarRespotAtHouse) ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Created replay vehicle") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// Cleanup pre-mission Josh and spawn Josh for misson. PROC JOSH3_SPAWN_JOSH_FOR_MISSION() JOSH3_LOAD_ASSETS_FOR_MISSION_STATE(stateLeadIn) IF NOT IS_ENTITY_ALIVE(pedJosh) WHILE NOT RC_CREATE_NPC_PED(pedJosh,CHAR_JOSH, << 566.1639, -1773.8171, 29.8 >>, 14.4, "JOSH") #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Creating Josh...") ENDIF #ENDIF WAIT(0) ENDWHILE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Created Josh") ENDIF #ENDIF iJoshSynchedScene = CREATE_SYNCHRONIZED_SCENE(vJoshSynchedScenePos, vJoshSynchedSceneRot) TASK_SYNCHRONIZED_SCENE(pedJosh, iJoshSynchedScene, "rcmjosh3", "sit_stairs_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE|SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT) ENDIF IF IS_ENTITY_ALIVE(pedJosh) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedJosh, TRUE) relGroupFriendly = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID()) SET_PED_RELATIONSHIP_GROUP_HASH(pedJosh, relGroupFriendly) SET_PED_CONFIG_FLAG(pedJosh, PCF_KeepRelationshipGroupAfterCleanUp, TRUE) SET_PED_CAN_BE_TARGETTED(pedJosh, FALSE) SET_ENTITY_CAN_BE_DAMAGED(pedJosh, TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(pedJosh, FALSE) // B*1532473 Prevent interrupting Josh's anims if player runs into him TASK_LOOK_AT_ENTITY(pedJosh, PLAYER_PED_ID(), -1) ADD_PED_FOR_DIALOGUE(sTrevorConversation, 3, pedJosh, "JOSH") #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Set up Josh") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// Creates Josh's car if it's not already created. PROC JOSH3_CREATE_JOSHS_CAR_AT_MOTEL() IF NOT IS_ENTITY_ALIVE(vehJoshCar) IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[0]) vehJoshCar = sRCLauncherDataLocal.vehID[0] SET_ENTITY_AS_MISSION_ENTITY(vehJoshCar, TRUE, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Josh's car already existed so grabbed it from RCLauncherDataLocal.vehID[0]") ENDIF #ENDIF ELSE JOSH3_LOAD_ASSETS_FOR_MISSION_STATE(stateGetInCar) JOSH3_CREATE_VEHICLE(vehJoshCar, modelJoshCar, vJoshCar, fJoshCar, colourJoshCar) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Josh's car didn't already exist so created a new car") ENDIF #ENDIF ENDIF ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(modelJoshCar) IF IS_ENTITY_ALIVE(vehJoshCar) SET_VEHICLE_COLOUR_COMBINATION(vehJoshCar, colourJoshCar) SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehJoshCar, FALSE) SET_VEHICLE_DISABLE_TOWING(vehJoshCar, TRUE) SET_VEHICLE_DOORS_LOCKED(vehJoshCar, VEHICLELOCK_LOCKED) ENDIF ENDPROC /// PURPOSE: /// Creates the BBQ object model. PROC JOSH3_CREATE_BBQ_OBJECT() CLEAR_AREA_OF_OBJECTS(vBBQObject, 2, CLEAROBJ_FLAG_FORCE) IF NOT DOES_ENTITY_EXIST(oBBQ) oBBQ = GET_CLOSEST_OBJECT_OF_TYPE(vBBQObject, 1.0, modelBBQ) ENDIF IF DOES_ENTITY_EXIST(oBBQ) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Grabbed BBQ object from world") #ENDIF ELSE oBBQ = CREATE_OBJECT(modelBBQ, vBBQObject) SET_ENTITY_HEADING(oBBQ, fBBQObject) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Couldn't grab BBQ object from world so created a new one") #ENDIF ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(modelBBQ) ENDPROC /// PURPOSE: /// Checks for the player shooting the BBQ to make it explode. PROC JOSH3_CHECK_BBQ_OBJECT_STILL_ALIVE() IF NOT IS_ENTITY_ALIVE(oBBQ) OR (IS_ENTITY_ALIVE(oBBQ) AND GET_ENTITY_HEALTH(oBBQ) <= 500) JOSH3_MISSION_FAILED(FAILED_DIDNT_BURN_HOUSE) ENDIF ENDPROC /// PURPOSE: /// Handles debug skipping. /// PARAMS: /// i_new_state - The state to debug skip to. PROC JOSH3_DEBUG_SKIP_STATE(INT i_new_state) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Starting debug skip to ", i_new_state, "...") ENDIF #ENDIF RC_START_Z_SKIP() bZSkipping = TRUE STOP_FIRE_IN_RANGE(vHouse, 100) JOSH3_MISSION_CLEANUP(TRUE) CLEAR_AREA(vHouse, 100, TRUE) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100, TRUE) ENDIF SWITCH i_new_state CASE Z_SKIP_LEAD_IN IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerLeadInCP, fPlayerLeadInCP) ENDIF SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespotAtStart, fPlayerCarRespotAtStart) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE, BUILDINGSTATE_NORMAL) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_NORMAL) JOSH3_SPAWN_JOSH_FOR_MISSION() JOSH3_CREATE_JOSHS_CAR_AT_MOTEL() missionStateSkip = stateLeadIn BREAK CASE Z_SKIP_INTRO SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespotAtStart, fPlayerCarRespotAtStart) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE, BUILDINGSTATE_NORMAL) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_NORMAL) JOSH3_SPAWN_JOSH_FOR_MISSION() JOSH3_CREATE_JOSHS_CAR_AT_MOTEL() missionStateSkip = stateIntro BREAK CASE Z_SKIP_GET_IN_CAR SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespotAtStart, fPlayerCarRespotAtStart) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerGetInCarCP, fPlayerGetInCarCP) ENDIF SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK, 2500) ENDIF JOSH3_SPAWN_JOSH_FOR_MISSION() JOSH3_CREATE_JOSHS_CAR_AT_MOTEL() missionStateSkip = stateGetInCar BREAK CASE Z_SKIP_GO_TO_BBQ SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespotAtHouse, fPlayerCarRespotAtHouse) IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerGoToBBQCP, fPlayerGoToBBQCP) ENDIF SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE, BUILDINGSTATE_NORMAL) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_NORMAL) JOSH3_LOCK_GATES() JOSH3_GIVE_FUEL_CAN_TO_PLAYER() JOSH3_GIVE_PISTOL_TO_PLAYER() JOSH3_LOAD_ASSETS_FOR_MISSION_STATE(stateGoToBBQ) WAIT(1000) JOSH3_CREATE_BBQ_OBJECT() missionStateSkip = stateGoToBBQ BREAK CASE Z_SKIP_DROP_FUEL SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespotAtHouse, fPlayerCarRespotAtHouse) IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), << -1112.7906, 317.5085, 65.9778 >>, 86.0521) ENDIF SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE, BUILDINGSTATE_NORMAL) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_NORMAL) JOSH3_LOCK_GATES() JOSH3_GIVE_FUEL_CAN_TO_PLAYER() JOSH3_GIVE_PISTOL_TO_PLAYER() JOSH3_LOAD_ASSETS_FOR_MISSION_STATE(stateGoToBBQ) WAIT(1000) JOSH3_CREATE_BBQ_OBJECT() missionStateSkip = stateDropFuel BREAK CASE Z_SKIP_LEAVE_AREA SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespotAtHouse, fPlayerCarRespotAtHouse) IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vInsideMainGate, fInsideMainGate) ENDIF SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE, BUILDINGSTATE_DESTROYED) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_DESTROYED) SET_AMBIENT_ZONE_LIST_STATE("AZL_JOSH_HOUSE_BURNING", TRUE, TRUE) JOSH3_LOCK_GATES(FALSE) REQUEST_PTFX_ASSET() WHILE NOT HAS_PTFX_ASSET_LOADED() WAIT(0) ENDWHILE missionStateSkip = stateLeaveArea BREAK CASE Z_SKIP_MISSION_PASSED SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespotAtHouse, fPlayerCarRespotAtHouse) IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerMissionPassedCP, fPlayerMissionPassedCP) ENDIF missionStateSkip = stateMissionPassed BREAK ENDSWITCH JOSH3_CREATE_REPLAY_VEHICLE() SET_WEATHER_TYPE_PERSIST("EXTRASUNNY") IF NOT IS_REPLAY_BEING_SET_UP() WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID())) ENDIF IF i_new_state = Z_SKIP_DROP_FUEL TRIGGER_MUSIC_EVENT("JOSH3_START") ELIF i_new_state = Z_SKIP_LEAVE_AREA TRIGGER_MUSIC_EVENT("JOSH3_RESTART1") ENDIF END_REPLAY_SETUP() IF i_new_state = Z_SKIP_MISSION_PASSED SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SAFE_FADE_SCREEN_IN_FROM_BLACK() // Screen needs to be fully faded back in before the mission complete GUI stuff will display ENDIF IF i_new_state = Z_SKIP_INTRO RC_END_Z_SKIP(TRUE, FALSE) ELSE RC_END_Z_SKIP() ENDIF missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Finished debug skip to ", i_new_state) ENDIF #ENDIF ENDPROC /// PURPOSE: /// Updates the current objective for the mission state. PROC JOSH3_CHANGE_CURRENT_MISSION_OBJECTIVE(STATUS_MISSION_OBJECTIVE new_objective) missionCurrentObjective = new_objective CLEAR_PRINTS() CLEAR_HELP() JOSH3_REMOVE_ALL_BLIPS() //INT i = 0 IF missionState = stateDropFuel AND missionCurrentObjective = MISSION_OBJECTIVE_LOSE_COPS HIDE_GAS_TRAIL(TRUE) ENDIF SWITCH new_objective CASE MISSION_OBJECTIVE_NORMAL #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Changed missionCurrentObjective to MISSION_OBJECTIVE_NORMAL") ENDIF #ENDIF SWITCH missionState CASE stateGetInCar IF IS_ENTITY_ALIVE(vehJoshCar) AND NOT DOES_BLIP_EXIST(blipJoshCar) blipJoshCar = CREATE_VEHICLE_BLIP(vehJoshCar) ENDIF BREAK CASE stateGoToHouse IF NOT DOES_BLIP_EXIST(blipBBQ) blipBBQ = CREATE_COORD_BLIP(vBBQLocate) ENDIF BREAK CASE stateGoToBBQ IF NOT DOES_BLIP_EXIST(blipBBQ) blipBBQ = CREATE_COORD_BLIP(vBBQLocate) ENDIF BREAK CASE stateDropFuel HIDE_GAS_TRAIL(FALSE) BREAK CASE stateShootFuel bDisplayedShootFuelObjective = FALSE BREAK CASE stateLeaveArea PRINT_NOW("JOSH3_07", DEFAULT_GOD_TEXT_TIME, 1) // Leave the area. BREAK ENDSWITCH BREAK CASE MISSION_OBJECTIVE_LOSE_COPS #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Changed missionCurrentObjective to MISSION_OBJECTIVE_LOSE_COPS") ENDIF #ENDIF IF bToldToLoseWantedLevel = FALSE PRINT_NOW("JOSH3_11", DEFAULT_GOD_TEXT_TIME, 1) // Lose the cops. bToldToLoseWantedLevel = TRUE ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Handles the player getting a wanted level at any point in the mission, or dropping the fuel can. PROC JOSH3_MANAGE_CURRENT_MISSION_OBJECTIVE() SWITCH missionCurrentObjective CASE MISSION_OBJECTIVE_NORMAL IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 JOSH3_CHANGE_CURRENT_MISSION_OBJECTIVE(MISSION_OBJECTIVE_LOSE_COPS) ENDIF BREAK CASE MISSION_OBJECTIVE_LOSE_COPS IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 JOSH3_CHANGE_CURRENT_MISSION_OBJECTIVE(MISSION_OBJECTIVE_NORMAL) ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Displays appropriate god text for getting in Josh's car, depending on whether the player has any fuel can ammo. PROC JOSH3_DISPLAY_APPROPRIATE_GASOLINE_IN_CAR_TEXT() IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN) PRINT_NOW("JOSH3_13", DEFAULT_GOD_TEXT_TIME, 1) // Collect more gasoline in Josh's ~b~car. ELSE PRINT_NOW("JOSH3_01", DEFAULT_GOD_TEXT_TIME, 1) // Collect the jerry can in Josh's ~b~car. ENDIF ENDPROC /// PURPOSE: /// Handles checking the player abandoning Josh's car before having collected the fuel can weapon. PROC JOSH3_CHECK_PLAYER_ISNT_ABANDONING_CAR() IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vehJoshCar) > 100 IF IS_SCREEN_FADED_IN() JOSH3_MISSION_FAILED(FAILED_DIDNT_COLLECT_FUEL) ENDIF ELIF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vehJoshCar) > 50 IF bGivenCarDistanceWarning = FALSE JOSH3_DISPLAY_APPROPRIATE_GASOLINE_IN_CAR_TEXT() bGivenCarDistanceWarning = TRUE ENDIF ENDIF ENDPROC /// PURPOSE: /// Manages Josh's anim after the mocap has finished. PROC JOSH3_MANAGE_JOSH_AFTER_MOCAP() IF IS_ENTITY_ALIVE(pedJosh) AND IS_SYNCHRONIZED_SCENE_RUNNING(iJoshSynchedScene) AND NOT IS_SYNCHRONIZED_SCENE_LOOPED(iJoshSynchedScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iJoshSynchedScene) > 0.99 iJoshSynchedScene = CREATE_SYNCHRONIZED_SCENE(vJoshSynchedScenePos, vJoshSynchedSceneRot) SET_SYNCHRONIZED_SCENE_LOOPED(iJoshSynchedScene, TRUE) TASK_SYNCHRONIZED_SCENE(pedJosh, iJoshSynchedScene, "rcmjosh3", "josh3_leadout_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE|SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT) TASK_LOOK_AT_ENTITY(pedJosh, PLAYER_PED_ID(), -1) ENDIF ENDPROC /// PURPOSE: /// Returns TRUE if a conversation can be played. FUNC BOOL JOSH3_ALLOW_CONVERSATION_TO_PLAY(BOOL b_check_for_god_text = TRUE) IF bZSkipping = TRUE RETURN FALSE ENDIF IF b_check_for_god_text = TRUE // If FALSE the conversation is set to not display subtitles ever, so play conversation regardless of whether there is god text onscreen or not AND IS_MESSAGE_BEING_DISPLAYED() AND GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) > 0 // B*665755 Support playing conversations over god text when subtitles are turned off RETURN FALSE ENDIF IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() RETURN FALSE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Plays the conversation for the lead into the mocap. PROC JOSH3_MANAGE_LEAD_IN_CONVERSATION_AND_OBJECTIVE() IF bDoneLeadInConversation = FALSE IF JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND IS_ENTITY_ALIVE(pedJosh) AND CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_INT_LI", CONV_PRIORITY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(2.0, 5.0, REPLAY_IMPORTANCE_LOW) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_INT_LI conversation") ENDIF #ENDIF bDoneLeadInConversation = TRUE ENDIF ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vMotelRoom, g_vOnFootLocate, DOES_BLIP_EXIST(blipMotelRoom)) KILL_ANY_CONVERSATION() missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ELIF iDoneLeadInConversationTimer > -1 IF (GET_GAME_TIMER() - iDoneLeadInConversationTimer) > 2000 // Wait until the conversation has actually started AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT_NOW("JOSH3_09", DEFAULT_GOD_TEXT_TIME, 1) // Go to the motel ~y~room. IF NOT DOES_BLIP_EXIST(blipMotelRoom) blipMotelRoom = CREATE_COORD_BLIP(vMotelRoom, BLIPPRIORITY_MED, FALSE) ENDIF iDoneLeadInConversationTimer = -1 iEnterMotelRoomTimer = GET_GAME_TIMER() ENDIF ENDIF ENDPROC /// PURPOSE: /// Plays the conversation if the player doesn't enter the motel room. PROC JOSH3_MANAGE_MOTEL_ROOM_REMINDER_CONVERSATION() IF iEnterMotelRoomTimer > -1 AND (GET_GAME_TIMER() - iEnterMotelRoomTimer) > 15000 AND JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) AND IS_ENTITY_ALIVE(pedJosh) AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedJosh) < 20.0 AND CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_HANG", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_HANG conversation") ENDIF #ENDIF iEnterMotelRoomTimer = GET_GAME_TIMER() ENDIF ENDPROC /// PURPOSE: /// Plays the conversation after the intro has finished. PROC JOSH3_MANAGE_JOSH_FUEL_CONVERSATION() IF bDoneJoshFuelConversation = FALSE AND JOSH3_ALLOW_CONVERSATION_TO_PLAY(FALSE) AND IS_ENTITY_ALIVE(pedJosh) AND CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_GAS", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_GAS conversation") ENDIF #ENDIF bDoneJoshFuelConversation = TRUE ENDIF ENDPROC /// PURPOSE: /// Plays the conversation when Trevor enters Josh's car. PROC JOSH3_MANAGE_CAFEFUL_WITH_CAR_CONVERSATION() IF bDoneCarefulWithCarConversation = FALSE AND JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND IS_ENTITY_ALIVE(vehJoshCar) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehJoshCar, TRUE) AND IS_ENTITY_ALIVE(pedJosh) AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedJosh) < 20 AND CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_CAR", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_CAR conversation") ENDIF #ENDIF bDoneCarefulWithCarConversation = TRUE ENDIF ENDPROC /// PURPOSE: /// Plays dialogue if Trevor damages Josh's car. See B*1413871. PROC JOSH3_MANAGE_DAMAGED_JOSH_CAR_CONVERSATION() IF iCounterDialogueDamageCar < 3 AND (GET_GAME_TIMER() - iDialogueDamageCarTimer) > 5000 AND JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) AND IS_ENTITY_ALIVE(pedJosh) AND IS_ENTITY_ALIVE(vehJoshCar) AND NOT IS_ANY_SPEECH_PLAYING(pedJosh) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehJoshCar) AND GET_DISTANCE_BETWEEN_ENTITIES(pedJosh, vehJoshCar) < 40 AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehJoshCar, PLAYER_PED_ID()) PLAY_PED_AMBIENT_SPEECH(pedJosh, "WHATS_YOUR_PROBLEM", SPEECH_PARAMS_FORCE) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started WHATS_YOUR_PROBLEM ambient speech") ENDIF #ENDIF CLEAR_ENTITY_LAST_DAMAGE_ENTITY(vehJoshCar) iDialogueDamageCarTimer = GET_GAME_TIMER() iCounterDialogueDamageCar++ #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: iCounterDialogueDamageCar = ", iCounterDialogueDamageCar) ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// Plays the conversation if the player remains at the motel near Josh. PROC JOSH3_MANAGE_JOSH_REMINDER_CONVERSATION() IF bDoneJoshReminderConversation = FALSE IF (GET_GAME_TIMER() - iJoshReminderTimer) > 25000 AND JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND IS_ENTITY_ALIVE(pedJosh) AND IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), <<566.53, -1770.40, 28.35>>, 10) // Fixes B*529059. This coord is a few metres in front of Josh. AND CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_REMIND", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_REMIND conversation") ENDIF #ENDIF bDoneJoshReminderConversation = TRUE bStoppedJoshReminderConversation = FALSE ENDIF ELIF bStoppedJoshReminderConversation = FALSE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() TEXT_LABEL_23 t_conversation_root = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT() IF ARE_STRINGS_EQUAL(t_conversation_root, "JOSH3_REMIND") AND IS_ENTITY_ALIVE(PLAYER_PED_ID()) AND IS_ENTITY_ALIVE(pedJosh) AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedJosh) > 30.0 KILL_FACE_TO_FACE_CONVERSATION() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Stopping JOSH3_REMIND conversation because player moved away from Josh") ENDIF #ENDIF bStoppedJoshReminderConversation = TRUE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Play the collected fuel conversation. PROC JOSH3_PLAY_COLLECTED_FUEL_CONVERSATION() IF bDoneCollectedFuelConversation = FALSE AND JOSH3_ALLOW_CONVERSATION_TO_PLAY(FALSE) IF iPlayerFuelBeforeMission = iMaxJerryCanAmmo IF CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_FUEL3", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_FUEL3 conversation") ENDIF #ENDIF bDoneCollectedFuelConversation = TRUE ENDIF ELIF iPlayerFuelBeforeMission = 0 IF CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_FUEL", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_FUEL conversation") ENDIF #ENDIF bDoneCollectedFuelConversation = TRUE ENDIF ELIF CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_FUEL2", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_FUEL2 conversation") ENDIF #ENDIF bDoneCollectedFuelConversation = TRUE ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles the fuel remaining in the player's fuel can weapon, and fails mission if necessary. PROC JOSH3_MANAGE_REMAINING_FUEL() IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN) INT iFuelRemaining = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN) IF missionState = stateDropFuel IF iFuelRemaining = 0 JOSH3_MISSION_FAILED(FAILED_USED_UP_FUEL) ENDIF ELIF iFuelRemaining < 3000 #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: iFuelRemaining = ", iFuelRemaining) ENDIF #ENDIF JOSH3_MISSION_FAILED(FAILED_USED_TOO_MUCH_GASOLINE) ENDIF ELSE JOSH3_MISSION_FAILED(FAILED_USED_UP_FUEL) ENDIF IF bGivenWastingFuelWarning = FALSE IF missionState = stateGoToHouse OR missionState = stateGoToBBQ IF IS_PED_SHOOTING(PLAYER_PED_ID()) AND GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_PETROLCAN PRINT_HELP("JOSH3_08") // Do not waste gasoline. You will need it to burn down Josh's house. bGivenWastingFuelWarning = TRUE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Plays the conversation of Trevor talking to himself in the car. PROC JOSH3_MANAGE_TREVOR_CAR_CONVERSATION() IF JOSH3_ALLOW_CONVERSATION_TO_PLAY() IF bDoneTrevorCarConversation = FALSE IF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vMotelRoom, 100) AND CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_DRIVE", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_DRIVE conversation") ENDIF #ENDIF bDoneTrevorCarConversation = TRUE SAFE_RELEASE_PED(pedJosh) REMOVE_ANIM_DICT("rcmjosh3") REMOVE_ANIM_DICT("rcmjosh") ENDIF ELIF iJoshPhoneTimer = -1 iJoshPhoneTimer = GET_GAME_TIMER() ENDIF ENDIF ENDPROC /// PURPOSE: /// Josh calls Trevor on the phone, while the player is driving to Josh's mansion. PROC JOSH3_MANAGE_JOSH_PHONE_CONVERSATION() IF bDoneJoshPhoneConversation = FALSE IF JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND bDoneTrevorCarConversation = TRUE // Only play when Trevor has talked to himself about Josh AND iJoshPhoneTimer > -1 // Only play when JOSH3_DRIVE conversation has registered as finished AND (GET_GAME_TIMER() - iJoshPhoneTimer) > 15000 AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) ADD_PED_FOR_DIALOGUE(sTrevorConversation, 3, NULL, "JOSH") // B*1373893 Add this again because pedJosh has been cleaned up by this point IF CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(sTrevorConversation, CHAR_JOSH, "JOSH3AU", "JOSH_PHONE1", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH_PHONE1 cellphone conversation") ENDIF #ENDIF bDoneJoshPhoneConversation = TRUE bSentTextMessage = FALSE iPlayerHungUpPhoneTimer = -1 iAfterPhoneTimer = -1 ENDIF ENDIF ELSE IF bDoneAfterPhoneConversation = FALSE AND JOSH3_ALLOW_CONVERSATION_TO_PLAY() // Wait until the JOSH_PHONE1 has finished IF iAfterPhoneTimer = -1 iAfterPhoneTimer = GET_GAME_TIMER() ELIF (GET_GAME_TIMER() - iAfterPhoneTimer) > 2000 IF CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_COMM", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_COMM conversation") ENDIF #ENDIF bDoneAfterPhoneConversation = TRUE ENDIF ENDIF ENDIF IF bSentTextMessage = FALSE IF iPlayerHungUpPhoneTimer = -1 IF WAS_LAST_CELLPHONE_CALL_INTERRUPTED() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Player interrupted JOSH_PHONE1 cellphone conversation") ENDIF #ENDIF iPlayerHungUpPhoneTimer = GET_GAME_TIMER() ENDIF ELIF (GET_GAME_TIMER() - iPlayerHungUpPhoneTimer) > 5000 IF SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_JOSH, "JOSH3_TXT", TXTMSG_UNLOCKED) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Sent JOSH3_TXT text message") ENDIF #ENDIF bSentTextMessage = TRUE ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Plays the conversation giving a hint to climb over a wall. PROC JOSH3_MANAGE_TREVOR_WALL_CONVERSATION() IF JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 // B*1513592 Prevent dialogue if the player is wanted IF bDoneTrevorClimbWallConversation = FALSE IF IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID())) bDoneTrevorClimbWallConversation = TRUE // Don't play conversation JOSH3_WALL if already over the wall (likely restarted from checkpoint) ELIF CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_WALL", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_WALL conversation") ENDIF #ENDIF bDoneTrevorClimbWallConversation = TRUE ENDIF ELIF bDoneTrevorOverWallConversation = FALSE IF bStartedMusic = TRUE AND CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_OVER", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_OVER conversation") ENDIF #ENDIF bDoneTrevorOverWallConversation = TRUE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles starting the music when the player is inside the boundaries of Josh's property. PROC JOSH3_MANAGE_STARTING_MUSIC() IF bStartedMusic = FALSE AND IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID())) TRIGGER_MUSIC_EVENT("JOSH3_START") bStartedMusic = TRUE ENDIF ENDPROC /// PURPOSE: /// Handles changing the music if the player enters a vehicle when fleeing the area. PROC JOSH3_MANAGE_CHANGING_MUSIC_WHEN_IN_CAR() IF bHasPlayerGotInAnyVehicle = FALSE AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) TRIGGER_MUSIC_EVENT("JOSH3_COPS") bHasPlayerGotInAnyVehicle = TRUE ENDIF ENDPROC /// PURPOSE: /// Checks if the player is pouring fuel inside the grounds of Josh's house. FUNC BOOL JOSH3_IS_PLAYER_POURING_FUEL_IN_AREA() IF IS_PED_SHOOTING(PLAYER_PED_ID()) AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN) AND GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_PETROLCAN AND IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID())) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Plays the conversations when Trevor is pouring fuel. PROC JOSH3_MANAGE_POURING_FUEL_CONVERSATIONS() IF iPourFuelConversationsDone < 3 AND (GET_GAME_TIMER() - iPourFuelConversationTimer) > 10000 AND JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND JOSH3_IS_PLAYER_POURING_FUEL_IN_AREA() AND CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_POUR", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_POUR conversation ", iPourFuelConversationsDone) ENDIF #ENDIF iPourFuelConversationsDone++ iPourFuelConversationTimer = GET_GAME_TIMER() ENDIF ENDPROC /// PURPOSE: /// Handles displaying the fuel can help text. PROC JOSH3_MANAGE_DISPLAY_FUEL_HELP_TEXT() IF bDisplayedFuelHelpText = FALSE IF IS_PED_SHOOTING(PLAYER_PED_ID()) // B*1513587 Prevent this appearing if already pouring AND GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_PETROLCAN bDisplayedFuelHelpText = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Player already pouring petrol so not displaying help text") ENDIF #ENDIF ELIF (GET_GAME_TIMER() - iDisplayFuelHelpTimer) > DEFAULT_GOD_TEXT_TIME #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Player hasn't poured petrol yet so displaying help text") ENDIF #ENDIF PRINT_HELP_FOREVER("JOSH3_03") // Equip the Jerry Can and hold ~INPUT_ATTACK~ to pour gas. bDisplayedFuelHelpText = TRUE ENDIF ELSE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("JOSH3_03") AND IS_PED_SHOOTING(PLAYER_PED_ID()) AND GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_PETROLCAN CLEAR_HELP() ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles failing the mission if the player ignites the fuel trail before pouring out the entire expected length. PROC JOSH3_MANAGE_PLAYER_SHOOTING_FUEL_TOO_EARLY() IF bFireBurning AND NOT IS_GAS_TRAIL_COMPLETE() JOSH3_MISSION_FAILED(FAILED_SHOT_TRAIL_TOO_EARLY) ENDIF ENDPROC /// PURPOSE: /// Handles checking for the player pouring the fuel in one go to achieve the JO3_POUR_FUEL_IN_ONE_GO stat. PROC JOSH3_MANAGE_POURING_FUEL_STAT() IF bStartedPouringFuel = FALSE AND IS_PED_SHOOTING(PLAYER_PED_ID()) AND GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_PETROLCAN bStartedPouringFuel = TRUE TRIGGER_MUSIC_EVENT("JOSH3_PETROL") ENDIF IF bStartedPouringFuel = TRUE AND NOT IS_PED_SHOOTING(PLAYER_PED_ID()) AND NOT IS_GAS_TRAIL_COMPLETE() bDidntPourFuelInOneGo = TRUE ENDIF ENDPROC /// PURPOSE: /// Handles switching between cameras during the outro. PROC JOSH3_SHOW_CAMERA(INT i) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Showing outro camera ", i) ENDIF #ENDIF IF NOT DOES_CAM_EXIST(camCutscene) camCutscene = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE) ENDIF IF i = JOSH3_CAMERA_EXPLODE_BBQ AND cameraOutro[JOSH3_CAMERA_FRONT_PATHWAY].bDisplayedCamera = FALSE AND cameraOutro[JOSH3_CAMERA_REAR_PATHWAY].bDisplayedCamera = FALSE cameraOutro[i].vCamRotStart = << 1.0, 0.2, 150.0 >> #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Only showing camera JOSH3_CAMERA_EXPLODE_BBQ so add some interp") ENDIF #ENDIF ENDIF SET_CAM_PARAMS(camCutscene, cameraOutro[i].vCamPosStart, cameraOutro[i].vCamRotStart, cameraOutro[i].fFOV, 0, cameraOutro[i].camGraphType, cameraOutro[i].camGraphType) SET_CAM_PARAMS(camCutscene, cameraOutro[i].vCamPosEnd, cameraOutro[i].vCamRotEnd, cameraOutro[i].fFOV, 5000, cameraOutro[i].camGraphType, cameraOutro[i].camGraphType) cameraOutro[i].bDisplayedCamera = TRUE iLastCameraDisplayed = i IF bDoneCutsceneStartCommands = FALSE RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID())) SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vInsideMainGate, fInsideMainGate) // If player is inside the grounds of Josh's house, reposition near gate to avoid showing the building swap ELSE // B*1741570 If player is outside the grounds of Josh's house, face away from house to avoid showing the building swap and explosion VECTOR vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID()) FLOAT fAngle = GET_ANGLE_BETWEEN_2D_VECTORS(vPlayerCoords.x, vPlayerCoords.y, vHouse.x, vHouse.y) fAngle += 180.0 #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: fAngle for Trevor's heading = ", fAngle) ENDIF #ENDIF SET_ENTITY_HEADING(PLAYER_PED_ID(), fAngle) ENDIF ENDIF bDoneCutsceneStartCommands = TRUE ENDIF ENDPROC /// PURPOSE: /// Creates the specified outro explosion and camera shake. /// PARAMS: /// b_create_instantly_for_skipped_cutscene - if TRUE only create the explosion, if FALSE create the explosion and camera shake. PROC JOSH3_DO_OUTRO_EXPLOSION(BOOL b_create_instantly_for_skipped_cutscene) IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(fxBigFire) fxBigFire = START_PARTICLE_FX_LOOPED_AT_COORD("scr_josh3_fires", vBigFire, rBigFire) START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_josh3_explosion", vBigFire, rBigFire) IF b_create_instantly_for_skipped_cutscene = FALSE // Don't create the explosion if the cutscene is being skipped, only create the fire IF DOES_CAM_EXIST(camCutscene) SHAKE_CAM(camCutscene, "SMALL_EXPLOSION_SHAKE", 0.25) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Shaking outro camera 2") ENDIF #ENDIF ENDIF PLAY_SOUND_FROM_COORD(iBBQExplosionSound, "BBQ_EXPLODE", vBigFire, "JOSH_03_SOUNDSET") // Only create the sfx if the explosion is seen during the outro, not if the cutscene has been skipped TRIGGER_MUSIC_EVENT("JOSH3_HOUSE_EXPLODE") ENDIF ENDIF explosionOutro.bDoneExplosion = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Done outro explosion") ENDIF #ENDIF ENDPROC /// PURPOSE: /// Returns TRUE if there is a fire within x distance of the explosion's nearest gas trail point. FUNC BOOL JOSH3_IS_FIRE_NEAR_POS(VECTOR v_pos_to_check, FLOAT f_distance) VECTOR v_closest_fire_pos IF GET_CLOSEST_FIRE_POS(v_closest_fire_pos, v_pos_to_check) AND GET_DISTANCE_BETWEEN_COORDS(v_closest_fire_pos, v_pos_to_check) < f_distance RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Handles checking for ignited fuel being within the trigger bounds for creating outro explosions. /// PARAMS: /// b_create_instantly_for_skipped_cutscene - if TRUE only create the explosion, if FALSE create the explosion and camera shake. PROC JOSH3_MANAGE_OUTRO_EXPLOSION(BOOL b_create_instantly_for_skipped_cutscene) IF explosionOutro.bDoneExplosion = FALSE IF b_create_instantly_for_skipped_cutscene = TRUE JOSH3_DO_OUTRO_EXPLOSION(b_create_instantly_for_skipped_cutscene) ELSE IF explosionOutro.iExplosionTimer = -1 IF JOSH3_IS_FIRE_NEAR_POS(vBigFire, 1) explosionOutro.iExplosionTimer = GET_GAME_TIMER() ENDIF ELIF (GET_GAME_TIMER() - explosionOutro.iExplosionTimer) > 500 // B*437565 - short delay before the explosion occurs JOSH3_DO_OUTRO_EXPLOSION(b_create_instantly_for_skipped_cutscene) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if the player has any weapon that fires a projectile. FUNC BOOL JOSH3_HAS_PLAYER_GOT_SUITABLE_WEAPON() WEAPON_TYPE weaponBest = GET_BEST_PED_WEAPON(PLAYER_PED_ID()) WEAPON_GROUP weaponGroup = GET_WEAPONTYPE_GROUP(weaponBest) IF weaponGroup = WEAPONGROUP_PISTOL OR weaponGroup = WEAPONGROUP_SMG OR weaponGroup = WEAPONGROUP_RIFLE OR weaponGroup = WEAPONGROUP_MG OR weaponGroup = WEAPONGROUP_SHOTGUN OR weaponGroup = WEAPONGROUP_SNIPER IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), weaponBest) > 0 RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Handles checking if the player has a projectile weapon or needs to go find one. PROC JOSH3_MANAGE_PLAYER_WEAPON_CHECKING() IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 // Losing the cops is more important SWITCH statusShootFuel CASE STATUS_SHOOT_FUEL_HAS_WEAPON IF bDisplayedShootFuelObjective = FALSE PRINT_NOW("JOSH3_05", DEFAULT_GOD_TEXT_TIME, 1) // Shoot the gasoline trail to ignite it. bDisplayedShootFuelObjective = TRUE ENDIF IF NOT JOSH3_HAS_PLAYER_GOT_SUITABLE_WEAPON() statusShootFuel = STATUS_SHOOT_FUEL_NO_WEAPON bDisplayedShootFuelObjective = FALSE ELIF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vHouse, 40) statusShootFuel = STATUS_SHOOT_FUEL_FAR_AWAY bDisplayedShootFuelObjective = FALSE ENDIF BREAK CASE STATUS_SHOOT_FUEL_NO_WEAPON IF bDisplayedShootFuelObjective = FALSE PRINT_NOW("JOSH3_10", DEFAULT_GOD_TEXT_TIME, 1) // Find a gun so you can ignite the gasoline trail. bDisplayedShootFuelObjective = TRUE ENDIF IF JOSH3_HAS_PLAYER_GOT_SUITABLE_WEAPON() statusShootFuel = STATUS_SHOOT_FUEL_HAS_WEAPON bDisplayedShootFuelObjective = FALSE ENDIF BREAK CASE STATUS_SHOOT_FUEL_FAR_AWAY IF bDisplayedShootFuelObjective = FALSE PRINT_NOW("JOSH3_02", DEFAULT_GOD_TEXT_TIME, 1) // Go to ~y~Josh's house. IF NOT DOES_BLIP_EXIST(blipHouse) blipHouse = CREATE_COORD_BLIP(vHouse) ENDIF bDisplayedShootFuelObjective = TRUE ENDIF IF NOT JOSH3_HAS_PLAYER_GOT_SUITABLE_WEAPON() SAFE_REMOVE_BLIP(blipHouse) statusShootFuel = STATUS_SHOOT_FUEL_NO_WEAPON bDisplayedShootFuelObjective = FALSE ELIF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vHouse, 40) SAFE_REMOVE_BLIP(blipHouse) statusShootFuel = STATUS_SHOOT_FUEL_HAS_WEAPON bDisplayedShootFuelObjective = FALSE ENDIF BREAK ENDSWITCH ENDIF ENDPROC /// PURPOSE: /// Sets the closest point of the gas trails to the house car and BBQ, for checking when a fire is nearby. PROC JOSH3_GET_NEAREST_TRAIL_POINT(INT i_camera) VECTOR v_camera_trigger_pos IF i_camera = JOSH3_CAMERA_FRONT_PATHWAY v_camera_trigger_pos = <<-1116.75818, 298.43961, 64.96789>> cameraOutro[i_camera].fTriggerRange = 8 ELIF i_camera = JOSH3_CAMERA_REAR_PATHWAY v_camera_trigger_pos = <<-1128.22070, 317.22104, 65.17768>> cameraOutro[i_camera].fTriggerRange = 2 ELSE // JOSH3_CAMERA_EXPLODE_BBQ v_camera_trigger_pos = vBigFire cameraOutro[i_camera].fTriggerRange = 4 ENDIF FLOAT f_closest_distance = 9999 FLOAT f_current_distance INT i_gas REPEAT COUNT_OF(gasTrail) i_gas f_current_distance = GET_DISTANCE_BETWEEN_COORDS(v_camera_trigger_pos, gasTrail[i_gas].coord) IF f_current_distance < f_closest_distance cameraOutro[i_camera].vNearestTrailPoint = gasTrail[i_gas].coord f_closest_distance = f_current_distance ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// Plays the conversation about leaving the area. PROC JOSH3_MANAGE_TREVOR_COPS_CONVERSATION() IF JOSH3_ALLOW_CONVERSATION_TO_PLAY() IF bDoneTrevorCopsConversation = FALSE IF CREATE_CONVERSATION(sTrevorConversation, "JOSH3AU", "JOSH3_FIRE", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_FIRE conversation") ENDIF #ENDIF bDoneTrevorCopsConversation = TRUE ENDIF ELIF bDisplayedLeaveAreaObjective = FALSE PRINT_NOW("JOSH3_07", DEFAULT_GOD_TEXT_TIME, 1) // Leave the area. bDisplayedLeaveAreaObjective = TRUE ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles setting the player on fire if he gets near to one of the script fires. PROC JOSH3_MANAGE_SETTING_PLAYER_ON_FIRE() IF NOT IS_ENTITY_ON_FIRE(PLAYER_PED_ID()) AND IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vBigFire, 2) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Player is close to a ptfx fire, so set him on fire") ENDIF #ENDIF START_ENTITY_FIRE(PLAYER_PED_ID()) ENDIF ENDPROC /// PURPOSE: /// Main state for handling Trevor going to the hotel room. PROC MS_LEAD_IN SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_LEAD_IN" #ENDIF) RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) pedJosh = sRCLauncherDataLocal.pedID[0] SET_ENTITY_AS_MISSION_ENTITY(pedJosh, TRUE, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Grabbed pedJosh from sRCLauncherDataLocal.pedID[0]") ENDIF #ENDIF ENDIF JOSH3_SPAWN_JOSH_FOR_MISSION() JOSH3_CREATE_JOSHS_CAR_AT_MOTEL() iJoshSynchedScene = CREATE_SYNCHRONIZED_SCENE(vJoshSynchedScenePos, vJoshSynchedSceneRot) IF IS_ENTITY_ALIVE(pedJosh) TASK_SYNCHRONIZED_SCENE(pedJosh, iJoshSynchedScene, "rcmjosh3", "josh3_lead_in", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE|SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT) TASK_LOOK_AT_ENTITY(pedJosh, PLAYER_PED_ID(), -1) FORCE_PED_AI_AND_ANIMATION_UPDATE(pedJosh) ENDIF IF IS_SCREEN_FADED_OUT() SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerLeadInCP, fPlayerLeadInCP) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // B*1437967 Ensure screen faded in when replaying mission from menu ENDIF REQUEST_CUTSCENE("josh_3_intp1") bDoneLeadInConversation = FALSE iDoneLeadInConversationTimer = GET_GAME_TIMER() iEnterMotelRoomTimer = -1 BREAK CASE JOSH3_STATE_MACHINE_LOOP IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vMotelRoom) > 100 IF IS_SCREEN_FADED_IN() JOSH3_MISSION_FAILED(FAILED_DIDNT_GO_TO_MOTEL_ROOM) ENDIF ELSE JOSH3_MANAGE_LEAD_IN_CONVERSATION_AND_OBJECTIVE() JOSH3_MANAGE_MOTEL_ROOM_REMINDER_CONVERSATION() JOSH3_MANAGE_DAMAGED_JOSH_CAR_CONVERSATION() IF IS_SYNCHRONIZED_SCENE_RUNNING(iJoshSynchedScene) AND NOT IS_SYNCHRONIZED_SCENE_LOOPED(iJoshSynchedScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iJoshSynchedScene) > 0.99 AND IS_ENTITY_ALIVE(pedJosh) iJoshSynchedScene = CREATE_SYNCHRONIZED_SCENE(vJoshSynchedScenePos, vJoshSynchedSceneRot) SET_SYNCHRONIZED_SCENE_LOOPED(iJoshSynchedScene, TRUE) TASK_SYNCHRONIZED_SCENE(pedJosh, iJoshSynchedScene, "rcmjosh3", "josh3_curb_wait_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE|SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT) TASK_LOOK_AT_ENTITY(pedJosh, PLAYER_PED_ID(), -1) ENDIF IF NOT IS_ENTITY_ALIVE(vehJoshCar) JOSH3_MISSION_FAILED(FAILED_CAR_WRECKED) ENDIF ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_LEAD_IN" #ENDIF) SAFE_REMOVE_BLIP(blipMotelRoom) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling the cutscene involving Trevor going to the hotel room. PROC MS_WALK_IN_MOTEL_CUTSCENE() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_WALK_IN_MOTEL_CUTSCENE" #ENDIF) SET_DOOR_STATE(DOORNAME_JOSH_HOTEL, DOORSTATE_UNLOCKED) iTrevorSynchedScene = CREATE_SYNCHRONIZED_SCENE(vJoshSynchedScenePos, vJoshSynchedSceneRot) cameraAnim = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE) PLAY_SYNCHRONIZED_CAM_ANIM(cameraAnim, iTrevorSynchedScene, "TREVOR_ENTER_ROOM_camera", "rcmjosh") PLAY_SYNCHRONIZED_MAP_ENTITY_ANIM(<<549.26, -1773.11, 33.73>>, 10, prop_motel_door_09, iTrevorSynchedScene, "TREVOR_ENTER_ROOM_door", "rcmjosh", INSTANT_BLEND_IN) RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>) RENDER_SCRIPT_CAMS(TRUE, FALSE) REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOWEST) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iTrevorSynchedScene, "rcmjosh", "TREVOR_ENTER_ROOM_Trevor", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) iCutsceneStage = 0 BREAK CASE JOSH3_STATE_MACHINE_LOOP SWITCH iCutsceneStage CASE 0 IF (IS_SYNCHRONIZED_SCENE_RUNNING(iTrevorSynchedScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iTrevorSynchedScene) > 0.99) OR IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() iCutsceneStage++ ENDIF BREAK CASE 1 IF REQUEST_AMBIENT_AUDIO_BANK("TIME_LAPSE") sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA") ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, <<578.9, -1761.4, 31.3>>, <<27.6, 2.5, 11.0>>, 5000) ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, <<578.8, -1761.1, 31.4>>, <<27.6, 2.5, 11.0>>, 5000) SET_CAM_FOV(sTimelapse.splineCamera, 50) SET_CAM_ACTIVE(sTimelapse.splineCamera, TRUE) PLAY_SOUND_FRONTEND(-1, "TIME_LAPSE_MASTER") SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE, FALSE) sTimelapse.sStartTimeOfDay = GET_CURRENT_TIMEOFDAY() todReference = GET_CURRENT_TIMEOFDAY() ADD_TIME_TO_TIMEOFDAY(todReference, 0, 0, CONST_NUM_HOURS_SKIP_FOR_MOTEL_TIMELAPSE, 0) // B*2173568 - ensure iSkipToHour is clamped to a valid hour iSkipToHour = GET_TIMEOFDAY_HOUR(todReference) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: GET_HOUR_TO_SKIP_TO_IN_MOTEL_TIMELAPSE return ", iSkipToHour) ENDIF #ENDIF CLEAR_PED_TASKS(PLAYER_PED_ID()) SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vMotelRoom) // B*1553642 - Prevent Trevor falling through the world iCutsceneStage++ ENDIF BREAK CASE 2 IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(iSkipToHour, 0, "EXTRASUNNY", "cirrocumulus", sTimelapse) OR IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() IF IS_AUDIO_SCENE_ACTIVE("TOD_SHIFT_SCENE") STOP_AUDIO_SCENE("TOD_SHIFT_SCENE") #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Stopped audio scene TOD_SHIFT_SCENE") ENDIF #ENDIF ENDIF missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF BREAK ENDSWITCH BREAK CASE JOSH3_STATE_MACHINE_CLEANUP REPLAY_STOP_EVENT() JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_WALK_IN_MOTEL_CUTSCENE" #ENDIF) RELEASE_AMBIENT_AUDIO_BANK() SET_DOOR_STATE(DOORNAME_JOSH_HOTEL, DOORSTATE_LOCKED) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling the intro cutscene. PROC MS_INTRO() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_INTRO" #ENDIF) RC_REQUEST_CUTSCENE("josh_3_intp1") iCutsceneStage = 0 BREAK CASE JOSH3_STATE_MACHINE_LOOP SWITCH iCutsceneStage CASE 0 IF RC_IS_CUTSCENE_OK_TO_START() IF IS_ENTITY_ALIVE(pedJosh) REGISTER_ENTITY_FOR_CUTSCENE(pedJosh, "Josh", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_JOSH)) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: CU_ANIMATE_EXISTING_SCRIPT_ENTITY Josh") ENDIF #ENDIF ELSE REGISTER_ENTITY_FOR_CUTSCENE(pedJosh, "Josh", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_JOSH)) ENDIF RC_CLEANUP_LAUNCHER() START_CUTSCENE() REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW) iCutsceneStage++ ENDIF BREAK CASE 1 IF IS_CUTSCENE_PLAYING() RENDER_SCRIPT_CAMS(FALSE, FALSE) // Required to stop the walk in door scripted cam RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<567.447693,-1761.026245,27.169291>>, <<565.640137,-1774.562744,31.354511>>, 5.000000, vPlayerCarRespotAtStart, fPlayerCarRespotAtStart) SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespotAtStart, fPlayerCarRespotAtStart) RC_START_CUTSCENE_MODE(<<565.39, -1772.88, 29.77>>) SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // Just in case screen is faded out iCutsceneStage++ ENDIF BREAK CASE 2 IF IS_CUTSCENE_PLAYING() IF NOT DOES_ENTITY_EXIST(pedJosh) AND DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Josh")) pedJosh = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Josh")) SET_ENTITY_AS_MISSION_ENTITY(pedJosh, TRUE, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Grabbed pedJosh from Josh") ENDIF #ENDIF JOSH3_SPAWN_JOSH_FOR_MISSION() ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_PLAYER_PED_MODEL(CHAR_TREVOR)) SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerGetInCarCP, fPlayerGetInCarCP) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK, 2500) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF ELSE RC_END_CUTSCENE_MODE() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: IS_CUTSCENE_PLAYING returned false") ENDIF #ENDIF missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF BREAK ENDSWITCH BREAK CASE JOSH3_STATE_MACHINE_CLEANUP REPLAY_STOP_EVENT() JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_INTRO" #ENDIF) RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling the player getting into Josh's car. PROC MS_GET_IN_CAR() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_GET_IN_CAR" #ENDIF) SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_GET_IN_CAR, "Get in car") iPlayerFuelBeforeMission = 0 IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN) iPlayerFuelBeforeMission = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PETROLCAN) ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: iPlayerFuelBeforeMission = ", iPlayerFuelBeforeMission) ENDIF #ENDIF IF iPlayerFuelBeforeMission = iMaxJerryCanAmmo #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Player already has maximum jerry can ammo") ENDIF #ENDIF bDoneJoshFuelConversation = TRUE ELSE JOSH3_DISPLAY_APPROPRIATE_GASOLINE_IN_CAR_TEXT() IF NOT DOES_BLIP_EXIST(blipJoshCar) AND IS_ENTITY_ALIVE(vehJoshCar) blipJoshCar = CREATE_VEHICLE_BLIP(vehJoshCar) ENDIF bDoneJoshFuelConversation = FALSE ENDIF IF IS_ENTITY_ALIVE(pedJosh) iJoshSynchedScene = CREATE_SYNCHRONIZED_SCENE(vJoshSynchedScenePos, vJoshSynchedSceneRot) TASK_SYNCHRONIZED_SCENE(pedJosh, iJoshSynchedScene, "rcmjosh3", "josh3_leadout_action", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE|SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT) TASK_LOOK_AT_ENTITY(pedJosh, PLAYER_PED_ID(), -1) ENDIF IF IS_ENTITY_ALIVE(vehJoshCar) SET_VEHICLE_DOORS_LOCKED(vehJoshCar, VEHICLELOCK_UNLOCKED) ENDIF bGivenCarDistanceWarning = FALSE bGivenWastingFuelWarning = FALSE bDoneJoshReminderConversation = FALSE bDoneCarefulWithCarConversation = FALSE iJoshReminderTimer = GET_GAME_TIMER() BREAK CASE JOSH3_STATE_MACHINE_LOOP JOSH3_MANAGE_JOSH_AFTER_MOCAP() JOSH3_MANAGE_CURRENT_MISSION_OBJECTIVE() IF IS_ENTITY_ALIVE(vehJoshCar) JOSH3_CHECK_PLAYER_ISNT_ABANDONING_CAR() IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 JOSH3_MANAGE_CAFEFUL_WITH_CAR_CONVERSATION() JOSH3_MANAGE_JOSH_FUEL_CONVERSATION() JOSH3_MANAGE_JOSH_REMINDER_CONVERSATION() JOSH3_MANAGE_DAMAGED_JOSH_CAR_CONVERSATION() IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehJoshCar) JOSH3_GIVE_PISTOL_TO_PLAYER() JOSH3_GIVE_FUEL_CAN_TO_PLAYER() missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ELIF iPlayerFuelBeforeMission = iMaxJerryCanAmmo // Player already has max ammo so continue JOSH3_GIVE_PISTOL_TO_PLAYER() missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF ENDIF ELSE JOSH3_MISSION_FAILED(FAILED_CAR_WRECKED) ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_GET_IN_CAR" #ENDIF) SAFE_REMOVE_BLIP(blipJoshCar) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling going to Josh's house. PROC MS_GO_TO_HOUSE() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_GO_TO_HOUSE" #ENDIF) PRINT_NOW("JOSH3_02", DEFAULT_GOD_TEXT_TIME, 1) // Go to ~y~Josh's house. IF NOT DOES_BLIP_EXIST(blipBBQ) blipBBQ = CREATE_COORD_BLIP(vBBQLocate) ENDIF REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_LOWEST) bDoneCollectedFuelConversation = FALSE bDoneTrevorCarConversation = FALSE bDoneJoshPhoneConversation = FALSE bDoneAfterPhoneConversation = FALSE iJoshReminderTimer = GET_GAME_TIMER() iJoshPhoneTimer = -1 BREAK CASE JOSH3_STATE_MACHINE_LOOP JOSH3_MANAGE_JOSH_AFTER_MOCAP() JOSH3_MANAGE_CURRENT_MISSION_OBJECTIVE() JOSH3_MANAGE_REMAINING_FUEL() IF missionCurrentObjective = MISSION_OBJECTIVE_NORMAL IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1120.502563,341.249268,62.281723>>, <<-1117.929688,267.019928,74.506630>>, 80.000000) missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ELSE JOSH3_MANAGE_CAFEFUL_WITH_CAR_CONVERSATION() JOSH3_PLAY_COLLECTED_FUEL_CONVERSATION() JOSH3_MANAGE_TREVOR_CAR_CONVERSATION() JOSH3_MANAGE_JOSH_REMINDER_CONVERSATION() JOSH3_MANAGE_JOSH_PHONE_CONVERSATION() ENDIF ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_GO_TO_HOUSE" #ENDIF) REMOVE_ANIM_DICT("rcmjosh3") REMOVE_ANIM_DICT("rcmjosh") BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling going inside the grounds of Josh's house to the BBQ. PROC MS_GO_TO_BBQ() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_GO_TO_BBQ" #ENDIF) SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_ARRIVE_AT_HOUSE, "Arrived at house", TRUE) JOSH3_LOAD_ASSETS_FOR_MISSION_STATE(stateGoToBBQ) JOSH3_LOCK_GATES() JOSH3_CREATE_BBQ_OBJECT() IF NOT DOES_BLIP_EXIST(blipBBQ) // If playing from a replay we'll need to create the blip and display the god text again blipBBQ = CREATE_COORD_BLIP(vBBQLocate) PRINT_NOW("JOSH3_02", DEFAULT_GOD_TEXT_TIME, 1) // Go to ~y~Josh's house. ENDIF REPLAY_RECORD_BACK_FOR_TIME(3.0, 7.0, REPLAY_IMPORTANCE_LOWEST) bDoneTrevorClimbWallConversation = TRUE // B*1515411 Not required anymore apparently bDoneTrevorOverWallConversation = FALSE bStartedMusic = FALSE BREAK CASE JOSH3_STATE_MACHINE_LOOP JOSH3_MANAGE_CURRENT_MISSION_OBJECTIVE() JOSH3_MANAGE_REMAINING_FUEL() JOSH3_MANAGE_STARTING_MUSIC() JOSH3_MANAGE_TREVOR_WALL_CONVERSATION() JOSH3_CHECK_BBQ_OBJECT_STILL_ALIVE() IF missionCurrentObjective = MISSION_OBJECTIVE_NORMAL IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vBBQLocate, g_vOnFootLocate, TRUE) OR JOSH3_IS_PLAYER_POURING_FUEL_IN_AREA() missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_GO_TO_BBQ" #ENDIF) SAFE_REMOVE_BLIP(blipBBQ) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling pouring the expected length of fuel trail. PROC MS_DROP_FUEL() SET_DISABLE_PETROL_DECALS_RECYCLING_THIS_FRAME() // B*1075616 REQUEST_ADDITIONAL_COLLISION_AT_COORD(vHouse) // B*2153231 Ensure collision is loaded at the house if the player leaves the area so the petrol decals don't clean up SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_DROP_FUEL" #ENDIF) JOSH3_LOAD_ASSETS_FOR_MISSION_STATE(stateDropFuel) gasTrail[0].coord = <<-1116.0607, 318.2036, 65.9778>> gasTrail[1].coord = <<-1117.0483, 318.3977, 65.9778>> gasTrail[2].coord = <<-1118.0848, 318.5940, 65.9778>> gasTrail[3].coord = <<-1119.1498, 318.7873, 65.9778>> gasTrail[4].coord = <<-1120.1605, 318.8961, 65.9778>> gasTrail[5].coord = <<-1121.1591, 319.0799, 65.9778>> gasTrail[6].coord = <<-1122.1490, 319.2221, 65.9778>> gasTrail[7].coord = <<-1123.2157, 319.3653, 65.9778>> gasTrail[8].coord = <<-1124.2849, 319.5186, 65.9778>> gasTrail[9].coord = <<-1125.3802, 319.5970, 65.9778>> gasTrail[10].coord = <<-1126.3851, 319.1108, 65.9778>> gasTrail[11].coord = <<-1126.9430, 318.2621, 65.7698>> gasTrail[12].coord = <<-1127.5199, 317.5066, 65.1777>> gasTrail[13].coord = <<-1128.1208, 316.6581, 65.1777>> gasTrail[14].coord = <<-1129.0302, 316.0728, 65.1777>> gasTrail[15].coord = <<-1129.7354, 315.2601, 65.1777>> gasTrail[16].coord = <<-1129.8583, 314.1669, 65.1777>> gasTrail[17].coord = <<-1129.6305, 313.1406, 65.1777>> gasTrail[18].coord = <<-1129.7095, 312.1320, 65.1779>> gasTrail[19].coord = <<-1129.7778, 311.0894, 65.1779>> gasTrail[20].coord = <<-1129.7253, 310.0732, 65.1779>> gasTrail[21].coord = <<-1129.6354, 309.0656, 65.1779>> gasTrail[22].coord = <<-1129.4738, 308.0490, 65.1779>> gasTrail[23].coord = <<-1129.3799, 307.0058, 65.1779>> gasTrail[24].coord = <<-1129.3761, 305.9893, 65.1779>> gasTrail[25].coord = <<-1129.2896, 304.9550, 65.2038>> gasTrail[26].coord = <<-1129.1382, 303.9323, 65.2272>> gasTrail[27].coord = <<-1128.9680, 302.8818, 65.2272>> gasTrail[28].coord = <<-1128.6027, 301.8776, 65.2292>> gasTrail[29].coord = <<-1127.8608, 301.1598, 65.2275>> gasTrail[30].coord = <<-1127.0892, 300.4057, 65.2230>> gasTrail[31].coord = <<-1126.0264, 300.0129, 65.1661>> gasTrail[32].coord = <<-1124.9788, 299.7498, 65.1114>> gasTrail[33].coord = <<-1123.9432, 299.6741, 65.0805>> gasTrail[34].coord = <<-1122.9220, 299.5366, 65.0539>> gasTrail[35].coord = <<-1121.8743, 299.3183, 65.0430>> gasTrail[36].coord = <<-1120.8480, 299.0170, 65.0175>> gasTrail[37].coord = <<-1119.7845, 298.8040, 65.0047>> gasTrail[38].coord = <<-1118.7419, 298.5806, 65.0024>> gasTrail[39].coord = <<-1117.7535, 298.3252, 65.0007>> gasTrail[40].coord = <<-1116.7667, 298.1601, 64.9674>> gasTrail[41].coord = <<-1115.7808, 297.9280, 64.9265>> gasTrail[42].coord = <<-1114.7854, 297.6190, 64.8757>> gasTrail[43].coord = <<-1113.8207, 297.3486, 64.8166>> gasTrail[44].coord = <<-1112.8834, 296.9707, 64.7542>> gasTrail[45].coord = <<-1111.9723, 296.5717, 64.6463>> gasTrail[46].coord = <<-1111.0547, 296.1595, 64.5324>> gasTrail[47].coord = <<-1110.1647, 295.7042, 64.3585>> RESET_GAS_TRAIL() PRINT_NOW("JOSH3_04", DEFAULT_GOD_TEXT_TIME, 1) // Pour a ~y~gasoline trail. iDisplayFuelHelpTimer = GET_GAME_TIMER() iPourFuelConversationTimer = GET_GAME_TIMER() iPourFuelConversationsDone = 0 bDisplayedFuelHelpText = FALSE bStartedPouringFuel = FALSE bDidntPourFuelInOneGo = FALSE SET_WANTED_LEVEL_MULTIPLIER(0) SET_CREATE_RANDOM_COPS(FALSE) DISABLE_TAXI_HAILING(TRUE) // B*2153231 Stop being able to hail a taxi at this point in the mission BREAK CASE JOSH3_STATE_MACHINE_LOOP SET_RADAR_AS_INTERIOR_THIS_FRAME() JOSH3_MANAGE_CURRENT_MISSION_OBJECTIVE() JOSH3_MANAGE_DISPLAY_FUEL_HELP_TEXT() JOSH3_MANAGE_REMAINING_FUEL() JOSH3_MANAGE_PLAYER_SHOOTING_FUEL_TOO_EARLY() JOSH3_MANAGE_POURING_FUEL_STAT() JOSH3_MANAGE_POURING_FUEL_CONVERSATIONS() JOSH3_CHECK_BBQ_OBJECT_STILL_ALIVE() CONTROL_GAS_TRAILS(#IF IS_DEBUG_BUILD widgetGroup #ENDIF) IF missionCurrentObjective = MISSION_OBJECTIVE_NORMAL AND IS_GAS_TRAIL_COMPLETE() IF bDidntPourFuelInOneGo = FALSE INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(JO3_POUR_FUEL_IN_ONE_GO) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Achieved stat: JO3_POUR_FUEL_IN_ONE_GO") ENDIF #ENDIF ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Didn't achieve stat: JO3_POUR_FUEL_IN_ONE_GO") ENDIF #ENDIF ENDIF REPLAY_RECORD_BACK_FOR_TIME(8.0, 2.0, REPLAY_IMPORTANCE_LOW) missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_DROP_FUEL" #ENDIF) IF ASSISTED_MOVEMENT_IS_ROUTE_LOADED("Jo_3") ASSISTED_MOVEMENT_REMOVE_ROUTE("Jo_3") ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling igniting the fuel trail. PROC MS_SHOOT_FUEL() SET_DISABLE_PETROL_DECALS_RECYCLING_THIS_FRAME() REQUEST_ADDITIONAL_COLLISION_AT_COORD(vHouse) // B*2153231 Ensure collision is loaded at the house if the player leaves the area so the petrol decals don't clean up SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_SHOOT_FUEL" #ENDIF) IF JOSH3_HAS_PLAYER_GOT_SUITABLE_WEAPON() statusShootFuel = STATUS_SHOOT_FUEL_HAS_WEAPON ELSE statusShootFuel = STATUS_SHOOT_FUEL_NO_WEAPON ENDIF IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vInsideMainGate, <<6,6,LOCATE_SIZE_HEIGHT>>, FALSE) bDisplayedShootFuelObjective = TRUE PRINT_NOW("JOSH3_06", DEFAULT_GOD_TEXT_TIME, 1) // Go to the ~y~main gate. IF NOT DOES_BLIP_EXIST(blipGate) blipGate = CREATE_COORD_BLIP(vInsideMainGate) ENDIF ELSE bDisplayedShootFuelObjective = FALSE ENDIF PREPARE_MUSIC_EVENT("JOSH3_HOUSE_EXPLODE") LOAD_STREAM("JOSH_03_HOUSE_EXPLOSION_MASTER") // Preload the stream streamVolumeJosh3 = STREAMVOL_CREATE_SPHERE(vInsideMainGate, 50.0, FLAG_MAPDATA) // B*1122092 Ensure all props are loaded in DISABLE_TAXI_HAILING(TRUE) // B*2153231 Stop being able to hail a taxi at this point in the mission BREAK CASE JOSH3_STATE_MACHINE_LOOP CONTROL_GAS_TRAILS(#IF IS_DEBUG_BUILD widgetGroup #ENDIF) IF bFireBurning IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) AND LOAD_STREAM("JOSH_03_HOUSE_EXPLOSION_MASTER") REPLAY_START_EVENT() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: REPLAY_START_EVENT for outro") ENDIF #ENDIF bStartedReplayEvent = TRUE SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) CLEAR_PRINTS() CLEAR_HELP() HIDE_HELP_TEXT_THIS_FRAME() // See B*887268 #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Player shot fuel") ENDIF #ENDIF PLAY_STREAM_FRONTEND() // GET_GAS_TRAIL_IGNITE_POS() REPLAY_RECORD_BACK_FOR_TIME(3.0, 12.0, REPLAY_IMPORTANCE_LOWEST) missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF ELSE IF DOES_BLIP_EXIST(blipGate) AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vInsideMainGate, <<6,6,LOCATE_SIZE_HEIGHT>>, TRUE) SAFE_REMOVE_BLIP(blipGate) bDisplayedShootFuelObjective = FALSE ENDIF JOSH3_MANAGE_CURRENT_MISSION_OBJECTIVE() JOSH3_MANAGE_PLAYER_WEAPON_CHECKING() JOSH3_CHECK_BBQ_OBJECT_STILL_ALIVE() ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_SHOOT_FUEL" #ENDIF) SAFE_REMOVE_BLIP(blipGate) SAFE_REMOVE_BLIP(blipHouse) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling the outro cutscene. PROC MS_OUTRO() SET_DISABLE_PETROL_DECALS_RECYCLING_THIS_FRAME() INT i SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_OUTRO" #ENDIF) cameraOutro[JOSH3_CAMERA_EXPLODE_BBQ].vCamPosStart = << -1113.1, 326.0, 67.1 >> cameraOutro[JOSH3_CAMERA_EXPLODE_BBQ].vCamRotStart = << 1.0, 0.2, 158.7 >> cameraOutro[JOSH3_CAMERA_EXPLODE_BBQ].vCamPosEnd = << -1113.1, 326.0, 67.1 >> cameraOutro[JOSH3_CAMERA_EXPLODE_BBQ].vCamRotEnd = << 1.0, 0.2, 158.7 >> cameraOutro[JOSH3_CAMERA_EXPLODE_BBQ].fFOV = 30.0 cameraOutro[JOSH3_CAMERA_EXPLODE_BBQ].camGraphType = GRAPH_TYPE_LINEAR cameraOutro[JOSH3_CAMERA_FRONT_PATHWAY].vCamPosStart = << -1132.196777,298.688141,65.896484 >> cameraOutro[JOSH3_CAMERA_FRONT_PATHWAY].vCamRotStart = << 0.093347,0.300000,-71.295753 >> cameraOutro[JOSH3_CAMERA_FRONT_PATHWAY].vCamPosEnd = << -1132.196777,298.688141,65.896484 >> cameraOutro[JOSH3_CAMERA_FRONT_PATHWAY].vCamRotEnd = << 2.026602,0.300006,-21.158085 >> cameraOutro[JOSH3_CAMERA_FRONT_PATHWAY].fFOV = 30.0 cameraOutro[JOSH3_CAMERA_FRONT_PATHWAY].camGraphType = GRAPH_TYPE_ACCEL cameraOutro[JOSH3_CAMERA_REAR_PATHWAY].vCamPosStart = << -1126.456177,324.424194,69.346909 >> cameraOutro[JOSH3_CAMERA_REAR_PATHWAY].vCamRotStart = << -25.112604,0.626431,177.440063 >> cameraOutro[JOSH3_CAMERA_REAR_PATHWAY].vCamPosEnd = << -1126.456177,324.424194,69.346909 >> cameraOutro[JOSH3_CAMERA_REAR_PATHWAY].vCamRotEnd = << -25.112606,0.626431,-161.700546 >> cameraOutro[JOSH3_CAMERA_REAR_PATHWAY].fFOV = 30.0 cameraOutro[JOSH3_CAMERA_REAR_PATHWAY].camGraphType = GRAPH_TYPE_LINEAR bDoneCutsceneStartCommands = FALSE i = 0 REPEAT NUM_OUTRO_CAMERAS i cameraOutro[i].bDisplayedCamera = FALSE JOSH3_GET_NEAREST_TRAIL_POINT(i) ENDREPEAT explosionOutro.bDoneExplosion = FALSE explosionOutro.iExplosionTimer = -1 bCutsceneSkipped = FALSE iLastCameraDisplayed = -1 iEndCutsceneTimer = -1 iCameraChangeTimer = GET_GAME_TIMER() bDone1stPersonCameraFlash = FALSE BREAK CASE JOSH3_STATE_MACHINE_LOOP HIDE_HELP_TEXT_THIS_FRAME() // See B*887268 IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() bCutsceneSkipped = TRUE missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_ENTITY_ON_FIRE(PLAYER_PED_ID()) // B*1085880 Check for the player being an idiot setting himself on fire AND bDoneCutsceneStartCommands = FALSE // B*2108148 Only do this if the cutscene hasn't yet started IF GET_ENTITY_HEALTH(PLAYER_PED_ID()) > 0 #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Player set himself on fire, setting health to 0") ENDIF #ENDIF SET_ENTITY_HEALTH(PLAYER_PED_ID(), 0) ENDIF ELSE i = 0 REPEAT NUM_OUTRO_CAMERAS i IF cameraOutro[i].bDisplayedCamera = FALSE AND i > iLastCameraDisplayed // Don't go backwards along the fuel trail (towards the main gate) AND (GET_GAME_TIMER() - iCameraChangeTimer) > 500 // Initial delay so the first camera doesn't trigger the instant the trail ignites AND NOT IS_VECTOR_ZERO(cameraOutro[i].vNearestTrailPoint) AND JOSH3_IS_FIRE_NEAR_POS(cameraOutro[i].vNearestTrailPoint, cameraOutro[i].fTriggerRange) JOSH3_SHOW_CAMERA(i) ENDIF ENDREPEAT IF cameraOutro[JOSH3_CAMERA_EXPLODE_BBQ].bDisplayedCamera = TRUE IF iEndCutsceneTimer = -1 iEndCutsceneTimer = GET_GAME_TIMER() ELIF (GET_GAME_TIMER() - iEndCutsceneTimer) > 1500 missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF IF bDone1stPersonCameraFlash = FALSE AND GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON AND (GET_GAME_TIMER() - iEndCutsceneTimer) > 1200 ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bDone1stPersonCameraFlash = TRUE #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "JOSH3: Doing 1st person camera flash") #ENDIF ENDIF ENDIF JOSH3_MANAGE_OUTRO_EXPLOSION(FALSE) ENDIF ENDIF CONTROL_GAS_TRAILS(#IF IS_DEBUG_BUILD widgetGroup #ENDIF) BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_OUTRO" #ENDIF) IF bCutsceneSkipped = TRUE SAFE_FADE_SCREEN_OUT_TO_BLACK() // See B*1720154 - only stop the sounds if skipping, otherwise just let them play out to completion STOP_SOUND(iBBQExplosionSound) STOP_STREAM() ENDIF REPLAY_RECORD_BACK_FOR_TIME(10.0, 3.0, REPLAY_IMPORTANCE_LOW) CLEANUP_GAS_TRAILS() JOSH3_CLEANUP_BIG_FIRE() STOP_FIRE_IN_RANGE(vHouse, 100) CLEAR_AREA_OF_PROJECTILES(vHouse, 100) REMOVE_DECALS_IN_RANGE(vHouse, 100) // B*1484401 SET_AMBIENT_ZONE_LIST_STATE("AZL_JOSH_HOUSE_BURNING", TRUE, TRUE) RENDER_SCRIPT_CAMS(FALSE, FALSE, 0) DESTROY_ALL_CAMS() JOSH3_MANAGE_OUTRO_EXPLOSION(TRUE) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(GET_HEADING_FROM_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vHouse)-180) // B*1243392 Rotate the camera so it's facing away from the house ELSE SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF ENDIF PLAY_SOUND_FROM_COORD(iHouseFireSound, "HOUSE_FIRE", vHouse, "JOSH_03_SOUNDSET") SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE, BUILDINGSTATE_DESTROYED) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_DESTROYED) TRIGGER_MUSIC_EVENT("JOSH3_HOUSE_EXPLODE") IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID())) TASK_PLAY_ANIM(PLAYER_PED_ID(), "reaction@shellshock@unarmed", "back_long", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_TAG_SYNC_OUT, 0.2) // B*1393823 FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Done explosion reaction anim on player") ENDIF #ENDIF ENDIF REMOVE_ANIM_DICT("reaction@shellshock@unarmed") IF NOT IS_GAMEPLAY_CAM_SHAKING() SHAKE_GAMEPLAY_CAM("SMALL_EXPLOSION_SHAKE", 0.15) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Shaking gameplay camera after cutscene") ENDIF #ENDIF ENDIF WAIT(100) SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) RC_END_CUTSCENE_MODE(TRUE, FALSE, TRUE, FALSE) ANIMPOSTFX_PLAY("ExplosionJosh3", 0, FALSE) // B*1525376 START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_josh3_light_explosion", vLightFromFire, <<0,0,0>>) // B*1394068 START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_josh3_exp_debris", vLightFromFire, <<0,0,0>>) IF STREAMVOL_IS_VALID(streamVolumeJosh3) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Deleting streamVolumeJosh3") ENDIF #ENDIF STREAMVOL_DELETE(streamVolumeJosh3) ENDIF IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_ENTITY_HEALTH(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) <= 0 AND IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID())) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Player sat in a destroyed vehicle so killing him") ENDIF #ENDIF SET_ENTITY_HEALTH(PLAYER_PED_ID(), 0) ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling leaving the vicinity of Josh's house before the cops arrive. PROC MS_LEAVE_AREA() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_LEAVE_AREA" #ENDIF) bDoneTrevorCopsConversation = FALSE bDisplayedLeaveAreaObjective = FALSE bHasPlayerGotInAnyVehicle = FALSE JOSH3_LOCK_GATES(FALSE) iLeaveAreaTimer = GET_GAME_TIMER() iRestoreControlTimer = GET_GAME_TIMER() SET_WANTED_LEVEL_MULTIPLIER(1) SET_CREATE_RANDOM_COPS(TRUE) DISABLE_TAXI_HAILING(FALSE) // B*2153231 Allow being able to hail a taxi at this point in the mission BREAK CASE JOSH3_STATE_MACHINE_LOOP IF (GET_GAME_TIMER() - iRestoreControlTimer) > 3000 // B*1513603 Ensure player can't immediately swing camera around to see the building swap occur AND NOT IS_PLAYER_SCRIPT_CONTROL_ON(PLAYER_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Restored player control") ENDIF #ENDIF IF bStartedReplayEvent = TRUE bStartedReplayEvent = FALSE REPLAY_STOP_EVENT() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: REPLAY_STOP_EVENT for outro") ENDIF #ENDIF ENDIF ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_JOSH_3_01", 0.0) // B*1551716 SET_PLAYER_WANTED_CENTRE_POSITION(PLAYER_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID())) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Didn't achieve stat: JO3_ESCAPE_WITHOUT_ALERTING_COPS") ENDIF #ENDIF missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ELIF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vHouse, 100) SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Completing mission without increasing wanted level") ENDIF #ENDIF INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(JO3_ESCAPE_WITHOUT_ALERTING_COPS) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Achieved stat: JO3_ESCAPE_WITHOUT_ALERTING_COPS") ENDIF #ENDIF missionStateSkip = statePhoneCall missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ELSE JOSH3_MANAGE_TREVOR_COPS_CONVERSATION() JOSH3_MANAGE_SETTING_PLAYER_ON_FIRE() JOSH3_MANAGE_CHANGING_MUSIC_WHEN_IN_CAR() IF iLeaveAreaTimer > -1 AND (GET_GAME_TIMER() - iLeaveAreaTimer) > 20000 #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Increasing wanted level") ENDIF #ENDIF SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) iLeaveAreaTimer = -1 ENDIF ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_LEAVE_AREA" #ENDIF) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling losing player's wanted level. PROC MS_LOSE_COPS() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_LOSE_COPS" #ENDIF) PRINT_NOW("JOSH3_11", DEFAULT_GOD_TEXT_TIME, 1) // Lose your wanted level. BREAK CASE JOSH3_STATE_MACHINE_LOOP JOSH3_MANAGE_CHANGING_MUSIC_WHEN_IN_CAR() IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vHouse, 100) SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID()) REPORT_POLICE_SPOTTED_PLAYER(PLAYER_ID()) JOSH3_MANAGE_SETTING_PLAYER_ON_FIRE() ELIF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) TRIGGER_MUSIC_EVENT("JOSH3_COPS_LOST_RADIO") SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE) ELSE TRIGGER_MUSIC_EVENT("JOSH3_COPS_LOST") SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE) ENDIF missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_LOSE_COPS" #ENDIF) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Main state for handling the final phone call. PROC MS_PHONE_CALL() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_PHONE_CALL" #ENDIF) SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_NORMAL) // Player is 100m+ away from the house so we're ok to turn off the fires SET_AMBIENT_ZONE_LIST_STATE("AZL_JOSH_HOUSE_BURNING", FALSE, FALSE) ADD_PED_FOR_DIALOGUE(sTrevorConversation, 3, NULL, "JOSH") // B*1553753 Add this again because pedJosh has been cleaned up by this point bDoneFinalPhoneCallConversation = FALSE BREAK CASE JOSH3_STATE_MACHINE_LOOP IF bDoneFinalPhoneCallConversation = FALSE IF JOSH3_ALLOW_CONVERSATION_TO_PLAY() AND PLAYER_CALL_CHAR_CELLPHONE(sTrevorConversation, CHAR_JOSH, "JOSH3AU", "JOSH3_CALL", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Started JOSH3_CALL cellphone conversation") ENDIF #ENDIF REPLAY_RECORD_BACK_FOR_TIME(3.0, 12.0, REPLAY_IMPORTANCE_LOW) bDoneFinalPhoneCallConversation = TRUE ENDIF ELIF JOSH3_ALLOW_CONVERSATION_TO_PLAY() // Phone call has finished missionStateMachine = JOSH3_STATE_MACHINE_CLEANUP ENDIF BREAK CASE JOSH3_STATE_MACHINE_CLEANUP JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_PHONE_CALL" #ENDIF) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Starts the mission failed sequence. PROC MS_FAILED() SWITCH missionStateMachine CASE JOSH3_STATE_MACHINE_SETUP JOSH3_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_FAILED" #ENDIF) CLEAR_PRINTS() CLEAR_HELP() JOSH3_REMOVE_ALL_BLIPS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() TRIGGER_MUSIC_EVENT("JOSH3_MISSION_FAIL") JOSH3_SET_PED_TO_FLEE() SWITCH failReason CASE FAILED_DEFAULT #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_DEFAULT") ENDIF #ENDIF BREAK CASE FAILED_CAR_WRECKED #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_CAR_WRECKED") ENDIF #ENDIF failString = "JOSH3_F1" // ~s~Josh's car was wrecked. BREAK CASE FAILED_USED_UP_FUEL #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_USED_UP_FUEL") ENDIF #ENDIF failString = "JOSH3_F2" // ~s~You ran out of gasoline. BREAK CASE FAILED_DIDNT_COLLECT_FUEL #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_DIDNT_COLLECT_FUEL") ENDIF #ENDIF failString = "JOSH3_F3" // ~s~You didn't collect the gasoline. BREAK CASE FAILED_USED_TOO_MUCH_GASOLINE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_USED_TOO_MUCH_GASOLINE") ENDIF #ENDIF failString = "JOSH3_F5" // ~s~You don't have enough gasoline remaining. BREAK CASE FAILED_SHOT_TRAIL_TOO_EARLY #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_SHOT_TRAIL_TOO_EARLY") ENDIF #ENDIF failString = "JOSH3_F6" // ~s~You shot the gasoline trail before fully completing it. BREAK CASE FAILED_JOSH_DIED #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_JOSH_DIED") ENDIF #ENDIF failString = "JOSH3_F7" // ~s~Josh died. BREAK CASE FAILED_JOSH_INJURED #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_JOSH_INJURED") ENDIF #ENDIF failString = "JOSH3_F8" // ~s~Josh was injured. BREAK CASE FAILED_JOSH_SCARED #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_JOSH_SCARED") ENDIF #ENDIF failString = "JOSH3_F9" // ~s~Josh was scared away. BREAK CASE FAILED_DIDNT_GO_TO_MOTEL_ROOM #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_DIDNT_GO_TO_MOTEL_ROOM") ENDIF #ENDIF failString = "JOSH3_F4" // ~s~Trevor didn't go to the motel room. BREAK CASE FAILED_DIDNT_BURN_HOUSE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: MISSION_FAILED reason=FAILED_DIDNT_BURN_HOUSE") ENDIF #ENDIF failString = "JOSH3_F10" // ~s~Trevor didn't burn down Josh's house. BREAK ENDSWITCH IF failReason = FAILED_DEFAULT Random_Character_Failed() ELSE Random_Character_Failed_With_Reason(failString) ENDIF BREAK CASE JOSH3_STATE_MACHINE_LOOP IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() JOSH3_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_FAILED" #ENDIF) JOSH3_REMOVE_ALL_VEHICLES(TRUE) JOSH3_REMOVE_ALL_PEDS(TRUE) JOSH3_CLEANUP_BIG_FIRE() SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE, BUILDINGSTATE_NORMAL) // Ensure building state is undamaged SET_BUILDING_STATE(BUILDINGNAME_IPL_JOSHHOUSE_FIRE, BUILDINGSTATE_NORMAL) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Cleaned up MS_FAILED") ENDIF #ENDIF Script_Cleanup() ELSE // not finished fading out: handle dialogue etc here ENDIF BREAK ENDSWITCH ENDPROC #IF IS_DEBUG_BUILD /// PURPOSE: /// Checks for debug keys being pressed. PROC DEBUG_Check_Debug_Keys() IF bZSkipping = FALSE AND (GET_GAME_TIMER() - iDebugSkipTime) > 1000 AND ENUM_TO_INT(missionState) < (ENUM_TO_INT(NUM_MISSION_STATES)-1) // Don't check during stateFailed IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: S key pressed so passing mission") ENDIF #ENDIF IF missionState = stateIntro WAIT_FOR_CUTSCENE_TO_STOP() ENDIF Script_Passed() ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: F key pressed so failing mission") ENDIF #ENDIF IF missionState = stateIntro WAIT_FOR_CUTSCENE_TO_STOP() ENDIF JOSH3_MISSION_FAILED() ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: J key pressed so doing z skip forwards") ENDIF #ENDIF SWITCH missionState CASE stateLeadIn CASE stateWalkInMotelCutscene JOSH3_DEBUG_SKIP_STATE(Z_SKIP_INTRO) BREAK CASE stateIntro IF IS_CUTSCENE_ACTIVE() STOP_CUTSCENE() ENDIF BREAK CASE stateGetInCar CASE stateGoToHouse JOSH3_DEBUG_SKIP_STATE(Z_SKIP_GO_TO_BBQ) BREAK CASE stateGoToBBQ JOSH3_DEBUG_SKIP_STATE(Z_SKIP_DROP_FUEL) BREAK CASE stateDropFuel CASE stateShootFuel JOSH3_DEBUG_SKIP_STATE(Z_SKIP_LEAVE_AREA) BREAK CASE stateLeaveArea CASE stateLoseCops JOSH3_DEBUG_SKIP_STATE(Z_SKIP_MISSION_PASSED) BREAK ENDSWITCH ENDIF IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: P key pressed so doing z skip backwards") ENDIF #ENDIF SWITCH missionState CASE stateIntro WAIT_FOR_CUTSCENE_TO_STOP() JOSH3_DEBUG_SKIP_STATE(Z_SKIP_LEAD_IN) BREAK CASE stateGetInCar JOSH3_DEBUG_SKIP_STATE(Z_SKIP_LEAD_IN) BREAK CASE stateGoToHouse CASE stateGoToBBQ JOSH3_DEBUG_SKIP_STATE(Z_SKIP_GET_IN_CAR) BREAK CASE stateDropFuel JOSH3_DEBUG_SKIP_STATE(Z_SKIP_GO_TO_BBQ) BREAK CASE stateShootFuel CASE stateLeaveArea CASE stateLoseCops JOSH3_DEBUG_SKIP_STATE(Z_SKIP_DROP_FUEL) BREAK ENDSWITCH ENDIF INT i_new_state IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, i_new_state) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "JOSH3: Z skip menu used so doing z skip") ENDIF #ENDIF JOSH3_DEBUG_SKIP_STATE(i_new_state) ENDIF ENDIF ENDPROC #ENDIF SCRIPT(g_structRCScriptArgs sRCLauncherDataIn) sRCLauncherDataLocal = sRCLauncherDataIn RC_TakeEntityOwnership(sRCLauncherDataLocal) IF IS_SYNCHRONIZED_SCENE_RUNNING(sRCLauncherDataLocal.iSyncSceneIndex) TAKE_OWNERSHIP_OF_SYNCHRONIZED_SCENE(sRCLauncherDataLocal.iSyncSceneIndex) // B*1508526 ENDIF SET_MISSION_FLAG(TRUE) 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 ADD_CONTACT_TO_PHONEBOOK(CHAR_JOSH, TREVOR_BOOK, FALSE) JOSH3_MISSION_SETUP() IF IS_REPLAY_IN_PROGRESS() RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE, TRUE) INT istage = GET_REPLAY_MID_MISSION_STAGE() IF g_bShitskipAccepted = TRUE istage++ ENDIF SWITCH istage CASE CP_LEAD_IN START_REPLAY_SETUP(vPlayerLeadInCP, fPlayerLeadInCP) JOSH3_DEBUG_SKIP_STATE(Z_SKIP_LEAD_IN) BREAK CASE CP_GET_IN_CAR START_REPLAY_SETUP(vPlayerGetInCarCP, fPlayerGetInCarCP) JOSH3_DEBUG_SKIP_STATE(Z_SKIP_GET_IN_CAR) BREAK CASE CP_ARRIVE_AT_HOUSE START_REPLAY_SETUP(vPlayerGoToBBQCP, fPlayerGoToBBQCP) JOSH3_DEBUG_SKIP_STATE(Z_SKIP_GO_TO_BBQ) BREAK CASE CP_MISSION_PASSED START_REPLAY_SETUP(vPlayerMissionPassedCP, fPlayerMissionPassedCP) JOSH3_DEBUG_SKIP_STATE(Z_SKIP_MISSION_PASSED) BREAK ENDSWITCH ENDIF WHILE(TRUE) WAIT(0) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_SE") UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene) JOSH3_DEATH_CHECKS() SWITCH missionState CASE stateLeadIn MS_LEAD_IN() BREAK CASE stateWalkInMotelCutscene MS_WALK_IN_MOTEL_CUTSCENE() BREAK CASE stateIntro MS_INTRO() BREAK CASE stateGetInCar MS_GET_IN_CAR() BREAK CASE stateGoToHouse MS_GO_TO_HOUSE() BREAK CASE stateGoToBBQ MS_GO_TO_BBQ() BREAK CASE stateDropFuel MS_DROP_FUEL() BREAK CASE stateShootFuel MS_SHOOT_FUEL() BREAK CASE stateOutro MS_OUTRO() BREAK CASE stateLeaveArea MS_LEAVE_AREA() BREAK CASE stateLoseCops MS_LOSE_COPS() BREAK CASE statePhoneCall MS_PHONE_CALL() BREAK CASE stateMissionPassed Script_Passed() BREAK CASE stateFailed MS_FAILED() BREAK ENDSWITCH #IF IS_DEBUG_BUILD DEBUG_Check_Debug_Keys() #ENDIF ENDWHILE ENDSCRIPT