Files
2025-09-29 00:52:08 +02:00

2605 lines
106 KiB
Python
Executable File

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