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

487 lines
18 KiB
Python
Executable File

//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 "cutscene_public.sch"
USING "commands_cutscene.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "script_player.sch"
USING "randomChar_public.sch"
USING "RC_helper_functions.sch"
USING "player_ped_scenes.sch"
USING "commands_recording.sch"
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : MrsPhilips2.sc
// AUTHOR : David Roberts
// DESCRIPTION : Trevor must deliver the truck back to his mother at the trailer
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
g_structRCScriptArgs sRCLauncherDataLocal
ENUM eRC_MainState
RC_DELIVER_TRUCK,
RC_GO_IN_TRAILER,
RC_MEET_MRS_PHILIPS,
RC_MISSION_FAILED
ENDENUM
ENUM eRC_SubState
SS_SETUP = 0,
SS_UPDATE,
SS_CLEANUP
ENDENUM
// Mission state
eRC_MainState m_eState = RC_DELIVER_TRUCK
eRC_SubState m_eSubState = SS_SETUP
INT iCutsceneStage
VEHICLE_INDEX vehDrugsVan
BLIP_INDEX blipDrugsVan
BLIP_INDEX blipTrailer
VECTOR vParkOutsideTrailer = <<1990.67, 3810.16, 31.24>>
VECTOR vWalkInTrailer = <<1973.84, 3814.89, 32.43>>
BOOL bDisplayedGoToTrailer = FALSE
BOOL bDisplayedGetInVan = FALSE
BOOL bDisplayedGoInTrailer = FALSE
INT iTrevorSynchedScene
structPedsForConversation sConversation
CAMERA_INDEX camDownAtTrevor
// ===========================================================================================================
// Termination
// ===========================================================================================================
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
PROC Script_Cleanup()
// If the mission was triggered then additional mission cleanup will be required.
IF (Random_Character_Cleanup_If_Triggered())
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: ...Random Character Script was triggered so additional cleanup required")
ENDIF
REMOVE_ANIM_DICT("rcmtmom_2leadinout")
// Cleanup the scene created by the launcher
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE)
TERMINATE_THIS_THREAD()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Pass
// -----------------------------------------------------------------------------------------------------------
PROC Script_Passed(BOOL b_do_switch_scene)
IF b_do_switch_scene = TRUE
Trigger_Specific_Switch_And_Wait(PR_SCENE_F_CLUB, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO)) // B*1482800
RC_END_CUTSCENE_MODE(DEFAULT, FALSE, FALSE, FALSE) // B*1546355 - Don't turn radar etc back on prior to the switch scene, the switch scene will turn them back on when it's finished
ELSE
RC_END_CUTSCENE_MODE()
ENDIF
Random_Character_Passed(CP_RAND_C_MRS2)
//forces post-mission switch state for switching back to Trevor
UpdatePostMissionInfo(g_savedGlobals.sPlayerData.sInfo, CHAR_TREVOR, PR_SCENE_Ta_RC_MRSP2)
Script_Cleanup()
ENDPROC
// ===========================================================================================================
// DEBUG FUNCTIONS
// ===========================================================================================================
#IF IS_DEBUG_BUILD
// PURPOSE: Check for Forced Pass or Fail
PROC DEBUG_Check_Debug_Keys()
// Check for Pass
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
IF IS_CUTSCENE_ACTIVE()
STOP_CUTSCENE()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
CLEAR_HELP()
SET_WIDESCREEN_BORDERS(FALSE, 0)
ENDIF
CLEAR_PRINTS()
Script_Passed(FALSE)
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
CLEAR_HELP()
CLEAR_PRINTS()
WAIT_FOR_CUTSCENE_TO_STOP()
Random_Character_Failed()
Script_Cleanup()
ENDIF
ENDPROC
#ENDIF
// ===========================================================================================================
// MISSION FUNCTIONS & PROCEDURES
// ===========================================================================================================
/// PURPOSE: Sets the new mission state and initialises the substate.
PROC SetState(eRC_MainState in)
m_eState = in
m_eSubState = SS_SETUP
ENDPROC
/// PURPOSE:
/// Handles the player delivering the truck
PROC STATE_DeliverTruck()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Initialising STATE_DeliverTruck")
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
REQUEST_ADDITIONAL_TEXT("MRSP2", MISSION_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF IS_ENTITY_ALIVE(vehDrugsVan)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehDrugsVan)
SAFE_REMOVE_BLIP(blipDrugsVan)
IF NOT DOES_BLIP_EXIST(blipTrailer)
CLEAR_PRINTS()
blipTrailer = CREATE_COORD_BLIP(vParkOutsideTrailer)
ENDIF
IF bDisplayedGoToTrailer = FALSE
PRINT_NOW("MRSP2_OBJ_01", DEFAULT_GOD_TEXT_TIME, 1) // Go to the ~y~trailer.
bDisplayedGoToTrailer = TRUE
ENDIF
IF IS_ENTITY_AT_COORD(vehDrugsVan, vParkOutsideTrailer, g_vAnyMeansLocate, TRUE)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 2.0, REPLAY_IMPORTANCE_LOW)
BRING_VEHICLE_TO_HALT(vehDrugsVan, 10.0, 1)
m_eSubState = SS_CLEANUP
ENDIF
ELIF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) // Player has got into something other than the drugs van
IF GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) = RUMPO2 // Check if he's got into another drugs van
SAFE_REMOVE_BLIP(blipDrugsVan)
SAFE_RELEASE_VEHICLE(vehDrugsVan)
vehDrugsVan = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Player got into a different drugs van")
ENDIF
ELSE
SAFE_REMOVE_BLIP(blipTrailer)
IF NOT DOES_BLIP_EXIST(blipDrugsVan)
CLEAR_PRINTS()
blipDrugsVan = CREATE_VEHICLE_BLIP(vehDrugsVan)
ENDIF
IF bDisplayedGetInVan = FALSE
PRINT_NOW("MRSP2_OBJ_02", DEFAULT_GOD_TEXT_TIME, 1) // Get back in the ~b~van.
bDisplayedGetInVan = TRUE
ENDIF
ENDIF
ELSE
SetState(RC_MISSION_FAILED)
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Cleaning up STATE_DeliverTruck")
SAFE_REMOVE_BLIP(blipTrailer)
SAFE_REMOVE_BLIP(blipDrugsVan)
SetState(RC_GO_IN_TRAILER)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles the player going in the trailer
PROC STATE_GoInTrailer()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Initialising STATE_GoInTrailer")
IF bDisplayedGoInTrailer = FALSE
PRINT_NOW("MRSP2_OBJ_03", DEFAULT_GOD_TEXT_TIME, 1) // Go into the ~y~trailer.
bDisplayedGoInTrailer = TRUE
ENDIF
blipTrailer = CREATE_COORD_BLIP(vWalkInTrailer, BLIPPRIORITY_MED, FALSE)
REQUEST_CUTSCENE("TMOM_2_RCM")
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF IS_ENTITY_ALIVE(vehDrugsVan)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vWalkInTrailer, <<1,1,g_vOnFootLocate.z>>, TRUE) // This is just for the visible locate
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1973.323730,3815.593994,31.429359>>, <<1974.935791,3812.747314,34.438004>>, 6.5)
m_eSubState = SS_CLEANUP
ELIF NOT IS_ENTITY_AT_COORD(vehDrugsVan, vParkOutsideTrailer, <<10,10,10>>, FALSE)
REMOVE_CUTSCENE()
SAFE_REMOVE_BLIP(blipTrailer)
SetState(RC_DELIVER_TRUCK)
ENDIF
ELSE
SetState(RC_MISSION_FAILED)
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Cleaning up STATE_GoInTrailer")
SAFE_REMOVE_BLIP(blipTrailer)
IF IS_FLOW_HELP_MESSAGE_QUEUED("MRSP_01_HELP")
REMOVE_HELP_FROM_FLOW_QUEUE("MRSP_01_HELP") // B*2083119 Remove help text from the flow queue if it's still queued for whatever reason
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Removed MRSP_01_HELP from flow queue")
ELSE
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: MRSP_01_HELP already displayed so no need to remove it from flow queue")
ENDIF
SetState(RC_MEET_MRS_PHILIPS)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Triggers the mocap cutscene upon delivering the truck
PROC STATE_MeetMrsPhilips()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Initialising STATE_MeetMrsPhilips")
RC_REQUEST_CUTSCENE("TMOM_2_RCM")
iCutsceneStage = 0
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
SWITCH iCutsceneStage
CASE 0
REQUEST_ANIM_DICT("rcmtmom_2leadinout")
IF RC_IS_CUTSCENE_OK_TO_START()
AND HAS_ANIM_DICT_LOADED("rcmtmom_2leadinout")
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_T_TRAILER_CS))
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_T_TRAILER_CS), v_ilev_trevtraildr, <<1972.77, 3815.37, 33.66>>)
ENDIF
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // Just in case screen is faded out
iCutsceneStage++
ENDIF
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
RC_START_CUTSCENE_MODE(vWalkInTrailer)
iCutsceneStage++
ENDIF
BREAK
CASE 2
IF IS_CUTSCENE_PLAYING()
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
REPLAY_STOP_EVENT()
camDownAtTrevor = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_PARAMS(camDownAtTrevor, <<1973.8564, 3818.2217, 34.3958>>, <<-89.4995, 0.0000, 65.3191>>, 50.0)
SET_CAM_PARAMS(camDownAtTrevor, <<1973.8564, 3818.2217, 34.3958>>, <<-89.4995, 0.0000, 65.3191>>, 50.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
iTrevorSynchedScene = CREATE_SYNCHRONIZED_SCENE(<<1973.909, 3817.762, 33.438>>, <<-0.000, 0.000, -59.400>>)
SET_SYNCHRONIZED_SCENE_LOOPED(iTrevorSynchedScene, FALSE)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iTrevorSynchedScene, "rcmtmom_2leadinout", "tmom_2_leadout_loop", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT|SYNCED_SCENE_USE_PHYSICS)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Playing anim on Trevor")
ADD_PED_FOR_DIALOGUE(sConversation, 0, PLAYER_PED_ID(), "TREVOR")
ENDIF
ELSE
//CREATE_CONVERSATION(sConversation, "TMOMAUD", "TMOM_2_RCMLO", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(sConversation, "TMOMAUD", "TMOM_2_RCMLO", CONV_PRIORITY_AMBIENT_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
Script_Passed(TRUE)
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Starts the mission failed sequence.
PROC STATE_Failed()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Initialising STATE_Failed")
CLEAR_PRINTS()
IF IS_ENTITY_ALIVE(vehDrugsVan)
Random_Character_Failed()
ELSE
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Drugs van was destroyed")
Random_Character_Failed_With_Reason("MRSP2_F_01")
ENDIF
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
Script_Cleanup()
ELSE
// not finished fading out: handle dialogue etc here
ENDIF
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
RC_CLEANUP_LAUNCHER()
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
IF NOT IS_REPLAY_IN_PROGRESS()
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
PRINT_LAUNCHER_DEBUG("Player not in a vehicle [TERMINATING]")
Random_Character_Failed()
Script_Cleanup()
ELSE
vehDrugsVan = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// Find out which veh gen the player got in
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<68.169144,-1558.958130,29.469042>>) < 10 // VEHGEN_MRSP_PHARMACY1
g_replay.iReplayInt[0] = 0
ELIF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<589.439880,2736.707764,42.033165>>) < 10 // VEHGEN_MRSP_PHARMACY2
g_replay.iReplayInt[0] = 1
ELIF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-488.773956,-344.572052,34.363564>>) < 10 // VEHGEN_MRSP_HOSPITAL1
g_replay.iReplayInt[0] = 2
ELIF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<288.880829,-585.472839,43.154282>>) < 10 // VEHGEN_MRSP_HOSPITAL2
g_replay.iReplayInt[0] = 3
ELIF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<304.829376,-1383.674194,31.677443>>) < 10 // VEHGEN_MRSP_HOSPITAL3
g_replay.iReplayInt[0] = 4
ELSE // VEHGEN_MRSP_HOSPITAL4
g_replay.iReplayInt[0] = 5
ENDIF
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Storing g_replay.iReplayInt[0] = ", g_replay.iReplayInt[0])
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Starting setting up MrsPhilips2 replay")
// Put the player back in the same van
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Retrieving g_replay.iReplayInt[0] = ", g_replay.iReplayInt[0])
VECTOR v_replay_start
FLOAT f_replay_start
IF g_replay.iReplayInt[0] = 0 // VEHGEN_MRSP_PHARMACY1
v_replay_start = <<68.169144,-1558.958130,29.469042>>
f_replay_start = 49.905754
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_PHARMACY1, FALSE) // B*1569619 Prevent veh gen appearing in the same place
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Set VEHGEN_MRSP_PHARMACY1 veh gen off")
ELIF g_replay.iReplayInt[0] = 1 // VEHGEN_MRSP_PHARMACY2
v_replay_start = <<589.439880,2736.707764,42.033165>>
f_replay_start = -175.710495
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_PHARMACY2, FALSE)
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Set VEHGEN_MRSP_PHARMACY2 veh gen off")
ELIF g_replay.iReplayInt[0] = 2 // VEHGEN_MRSP_HOSPITAL1
v_replay_start = <<-488.773956,-344.572052,34.363564>>
f_replay_start = 82.404198
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_HOSPITAL1, FALSE)
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Set VEHGEN_MRSP_HOSPITAL1 veh gen off")
ELIF g_replay.iReplayInt[0] = 3 // VEHGEN_MRSP_HOSPITAL2
v_replay_start = <<288.880829,-585.472839,43.154282>>
f_replay_start = -20.807068
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_HOSPITAL2, FALSE)
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Set VEHGEN_MRSP_HOSPITAL2 veh gen off")
ELIF g_replay.iReplayInt[0] = 4 // VEHGEN_MRSP_HOSPITAL3
v_replay_start = <<304.829376,-1383.674194,31.677443>>
f_replay_start = -41.116028
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_HOSPITAL3, FALSE)
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Set VEHGEN_MRSP_HOSPITAL3 veh gen off")
ELSE // VEHGEN_MRSP_HOSPITAL4
v_replay_start = <<1126.194336,-1481.485962,34.701603>>
f_replay_start = -91.433693
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_HOSPITAL4, FALSE)
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Set VEHGEN_MRSP_HOSPITAL4 veh gen off")
ENDIF
START_REPLAY_SETUP(v_replay_start, f_replay_start)
RC_START_Z_SKIP()
REQUEST_MODEL(RUMPO2)
WHILE NOT HAS_MODEL_LOADED(RUMPO2)
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Loading RUMPO2")
WAIT(0)
ENDWHILE
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Loaded RUMPO2")
CLEAR_AREA(v_replay_start, 10.0, TRUE)
vehDrugsVan = CREATE_VEHICLE(RUMPO2, v_replay_start, f_replay_start)
SET_VEHICLE_ON_GROUND_PROPERLY(vehDrugsVan)
END_REPLAY_SETUP(vehDrugsVan)
SetState(RC_DELIVER_TRUCK)
bDisplayedGoToTrailer = FALSE
bDisplayedGetInVan = FALSE
bDisplayedGoInTrailer = FALSE
WAIT(250) // Wait for van to settle
CPRINTLN(DEBUG_MISSION, "MRSPHILIPS2: Finished setting up MrsPhilips2 replay")
RC_END_Z_SKIP()
ENDIF
WHILE(TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_DG")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2197988
SWITCH(m_eState)
CASE RC_DELIVER_TRUCK
STATE_DeliverTruck()
BREAK
CASE RC_GO_IN_TRAILER
STATE_GoInTrailer()
BREAK
CASE RC_MEET_MRS_PHILIPS
STATE_MeetMrsPhilips()
BREAK
CASE RC_MISSION_FAILED
STATE_Failed()
BREAK
ENDSWITCH
// Check debug completion/failure
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT