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

429 lines
13 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : ambient_MrsPhilips.sc //
// AUTHOR : //
// DESCRIPTION : Detects the player getting into a cargen with //
// the Deludamol pharmaceuticals //
// //
//////////////////////////////////////////////////////////////////////////////////////////
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
// Includes
USING "commands_entity.sch"
USING "RC_helper_functions.sch"
USING "RC_launcher_public.sch"
USING "rich_presence_public.sch"
USING "savegame_public.sch"
// Enums
ENUM MAIN_STATE
MS_INIT,
MS_CHECK_FOR_VAN,
MS_LAUNCH_MISSION,
MS_ON_MISSION,
MS_CLEANUP
ENDENUM
ENUM SUB_STATE
SS_SETUP,
SS_UPDATE,
SS_CLEANUP
ENDENUM
// Consts
CONST_INT XVERSION_NUMBER(101)
// Variables
MAIN_STATE eStage = MS_INIT
SUB_STATE sProgress = SS_SETUP
MODEL_NAMES drugVanModel = RUMPO2
BOOL bAttemptToLaunchScript = FALSE
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID mWidgetGroup
BOOL bWarpIntoVan
BOOL bDebugQuitScript
#ENDIF
// -----------------------------------------------------------------------------------------------------------
// Debug
// -----------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Setups Debug Widgets
PROC SETUP_DEBUG_WIDGETS()
mWidgetGroup = START_WIDGET_GROUP("Ambient: Mrs Philips")
ADD_WIDGET_BOOL("Warp Player Into Van", bWarpIntoVan)
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Updates all The Widgets
PROC UPDATE_DEBUG_WIDGETS()
IF (bWarpIntoVan)
MODEL_NAMES vanModel = RUMPO2
// Request van
REQUEST_MODEL(vanModel)
WHILE NOT HAS_MODEL_LOADED(vanModel)
WAIT(0)
ENDWHILE
// Take out of existing vehicle and place into van
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX oldCar
oldCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(oldCar)
IF NOT IS_ENTITY_A_MISSION_ENTITY(oldCar)
SET_ENTITY_AS_MISSION_ENTITY(oldCar)
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()))
DELETE_VEHICLE(oldCar)
ENDIF
ENDIF
VEHICLE_INDEX newCar
newCar = CREATE_VEHICLE(vanModel, <<2031.3892, 3777.4849, 31.3308>>, 32.5615)
IF DOES_ENTITY_EXIST(newCar)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), newCar)
SET_VEHICLE_AS_NO_LONGER_NEEDED(newCar)
ENDIF
ENDIF
// Release model
SET_MODEL_AS_NO_LONGER_NEEDED(vanModel)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
bWarpIntoVan = FALSE
ENDIF
ENDPROC
/// PURPOSE:
/// Cleans up All The Widgets
PROC CLEANUP_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(mWidgetGroup)
DELETE_WIDGET_GROUP(mWidgetGroup)
ENDIF
ENDPROC
#ENDIF
/// PURPOSE:
/// Turn on or off mission vehicle gens
PROC SET_MISSION_VEHICLE_GENS_AVAILABLE(BOOL b_turn_on)
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: mission vehicle gens are : ", b_turn_on)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_PHARMACY1, b_turn_on)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_PHARMACY2, b_turn_on)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_HOSPITAL1, b_turn_on)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_HOSPITAL2, b_turn_on)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_HOSPITAL3, b_turn_on)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MRSP_HOSPITAL4, b_turn_on)
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Script Cleanup
PROC SCRIPT_CLEANUP()
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Cleanup!")
#IF IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
#ENDIF
SET_MISSION_VEHICLE_GENS_AVAILABLE(FALSE)
// No longer require the script to be relaunched when loading from a savegame.
IF IS_THIS_RANDOM_CHARACTER_MISSION_COMPLETED(RC_MRS_PHILIPS_2)
Remove_Script_From_Relaunch_List(LAUNCH_BIT_RC_AMB_MRS_PHILIPS)
ENDIF
TERMINATE_THIS_THREAD()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Functions
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Request and launch RCM script
PROC CUSTOM_REQUEST_AND_LAUNCH_RC()
// Get correct script name
STRING sScriptName = "MrsPhilips2"
// Load script
REQUEST_SCRIPT(sScriptName)
WHILE NOT HAS_SCRIPT_LOADED(sScriptName)
REQUEST_SCRIPT(sScriptName)
WAIT(0)
ENDWHILE
// Setup common requirements
RC_MISSION_STARTING(RC_MRS_PHILIPS_2)
// Launch script
START_NEW_SCRIPT(sScriptName, MISSION_STACK_SIZE)
// Allow script to be released when no longer running
SET_SCRIPT_AS_NO_LONGER_NEEDED(sScriptName)
#IF IS_DEBUG_BUILD
//In debug build inform the autoplay system we are on a RC mission now.
g_txtFlowAutoplayRunningMission = sScriptName
#ENDIF
ENDPROC
/// PURPOSE:
/// Launch RCM through entering the drug van
FUNC BOOL CUSTOM_LAUNCH_RC_MISSION()
// NOTE: Need to stay in this loop until the mission is given permission to run.
// After first asking permission to run, a decision is usually made
// within a few frames - if it returns FALSE, check if it should terminate or not.
WHILE NOT RC_REQUEST_PERMISSION_TO_RUN(RC_MRS_PHILIPS_2)
// Not yet given permission to run, should the script terminate?
IF SHOULD_RC_TERMINATE(RC_MRS_PHILIPS_2)
PRINT_LAUNCHER_DEBUG("LAUNCH_RC_MISSION - Script denied by RC Controller")
RETURN FALSE
ENDIF
WAIT(0)
ENDWHILE
// NOTE: The Random Character mission is now safe to start so request the script and launch.
// The activity MUST trigger because scripts now think the game is OnMission.
CUSTOM_REQUEST_AND_LAUNCH_RC()
// Tell the playstats system that we're starting an RC mission.
g_structRCMissionsStatic sRCMissionDetails
Retrieve_Random_Character_Static_Mission_Details(RC_MRS_PHILIPS_2, sRCMissionDetails)
TEXT_LABEL tStatLabel = GET_RC_STAT_ID(RC_MRS_PHILIPS_2)
SCRIPT_PLAYSTATS_MISSION_STARTED(tStatLabel, sRCMissionDetails.rcStatVariation)
CPRINTLN(DEBUG_FLOW, "Flagging playstat MISSION STARTED for RC mission. Script:", sRCMissionDetails.rcScriptName, " Variation:", sRCMissionDetails.rcStatVariation, " RC Stat ID = ",tStatLabel)
// Set console rich presence values as we go on mission (friend dashboard status message).
SET_RICH_PRESENCE_FOR_SP_RC_MISSION(RC_MRS_PHILIPS_2)
// Store start snapshot if this isn't a replay
IF NOT IS_REPLAY_IN_PROGRESS()
Store_RC_Replay_Starting_Snapshot("MrsPhilips2", TRUE)
ENDIF
// Setup mission ready for stats
PRIME_STATS_FOR_RC_MISSION(RC_MRS_PHILIPS_2, sRCMissionDetails.rcScriptName)
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Updates the mission state and substate
PROC SET_STAGE(MAIN_STATE state)
eStage = state
sProgress = SS_SETUP
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// State Functions
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Initialization
PROC DO_INITALIZE()
#IF IS_DEBUG_BUILD
SETUP_DEBUG_WIDGETS()
#ENDIF
SET_MISSION_VEHICLE_GENS_AVAILABLE(TRUE)
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Setting stage to MS_CHECK_FOR_VAN")
SET_STAGE(MS_CHECK_FOR_VAN)
ENDPROC
/// PURPOSE:
/// Detect Trevor getting into a suitable van
PROC STAGE_CHECK_FOR_VAN()
SWITCH sProgress
CASE SS_SETUP
bAttemptToLaunchScript = FALSE
sProgress = SS_UPDATE
BREAK
CASE SS_UPDATE
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_RC_MRS_PHILIPS_FIND_VAN)
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS() // B*1260505 Don't display while switching
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Displaying MRSP_01_HELP help text")
ADD_HELP_TO_FLOW_QUEUE("MRSP_01_HELP", FHP_MEDIUM, 0, FLOW_HELP_NEVER_EXPIRES, DEFAULT_HELP_TEXT_TIME, BIT_TREVOR) // Find a van with the Deludamol pharmaceuticals logo.
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_RC_MRS_PHILIPS_FIND_VAN)
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// Player is in drug van - attempt to launch mission
MODEL_NAMES vehModel
vehModel = GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF (vehModel = drugVanModel)
bAttemptToLaunchScript = TRUE
SET_STAGE(MS_LAUNCH_MISSION)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Attempt to launch Mrs Philips 2
PROC STAGE_LAUNCH_MISSION()
// Is the player close enough to start the mission off
IF IS_IT_SAFE_TO_TRIGGER_SCRIPT_TYPE(ST_RANDOM_CHARACTER)
// Launch the mission script
IF CUSTOM_LAUNCH_RC_MISSION()
// We are now on mission - keep ambient script running to detect completion
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Setting stage to MS_ON_MISSION()")
bAttemptToLaunchScript = FALSE
SET_STAGE(MS_ON_MISSION)
ELSE
SET_STAGE(MS_CHECK_FOR_VAN)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Monitor mission script whilst it is running
PROC STAGE_MONITOR_MISSION()
// Mission script has finished...
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
// Phone call missions have been completed
IF IS_THIS_RANDOM_CHARACTER_MISSION_COMPLETED(RC_MRS_PHILIPS_2)
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Setting stage to MS_CLEANUP()")
SET_STAGE(MS_CLEANUP)
ELSE
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Setting stage to MS_CHECK_FOR_VAN")
SET_STAGE(MS_CHECK_FOR_VAN)
ENDIF
ENDIF
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Main Script
// -----------------------------------------------------------------------------------------------------------
SCRIPT
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_SP_TO_MP)
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: FORCE CLEANUP")
SCRIPT_CLEANUP()
ENDIF
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("ambient_MrsPhilips")) > 1
PRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Attempting to launch with an instance already active...")
TERMINATE_THIS_THREAD()
ENDIF
// Register the script so that it can be relaunched when loading from a savegame.
Register_Script_To_Relaunch_List(LAUNCH_BIT_RC_AMB_MRS_PHILIPS)
// We are a go-go!
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Initializing version ", XVERSION_NUMBER)
// Main loop
WHILE (TRUE)
// Entity check
IS_PLAYER_PLAYING(PLAYER_ID())
// Update current player
enumCharacterList ePlayer
ePlayer = GET_CURRENT_PLAYER_PED_ENUM()
FLOAT fReplayBlockRange = REPLAY_GET_MAX_DISTANCE_ALLOWED_FROM_PLAYER() + 5.0
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), <<1973.323730, 3815.593994, 31.429359>>) < (fReplayBlockRange*fReplayBlockRange) //30.0f range for replay recording
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2197988
ENDIF
// Current player is Franklin or Michael
IF ePlayer <> CHAR_TREVOR
SWITCH eStage
CASE MS_INIT
CASE MS_CHECK_FOR_VAN
CASE MS_LAUNCH_MISSION
// No need to run these states while not Trevor. Sleep for 5 seconds.
WAIT(5000)
BREAK
CASE MS_ON_MISSION
STAGE_MONITOR_MISSION()
WAIT(0)
BREAK
CASE MS_CLEANUP
SCRIPT_CLEANUP()
WAIT(0)
BREAK
ENDSWITCH
// Only allow mission to trigger if we are Franklin
ELSE
SWITCH eStage
CASE MS_INIT
DO_INITALIZE()
BREAK
CASE MS_CHECK_FOR_VAN
STAGE_CHECK_FOR_VAN()
BREAK
CASE MS_LAUNCH_MISSION
STAGE_LAUNCH_MISSION()
BREAK
CASE MS_ON_MISSION
STAGE_MONITOR_MISSION()
BREAK
CASE MS_CLEANUP
SCRIPT_CLEANUP()
BREAK
ENDSWITCH
// Debug widgets
#IF IS_DEBUG_BUILD
UPDATE_DEBUG_WIDGETS()
IF (bDebugQuitScript)
CPRINTLN(DEBUG_AMBIENT, "Ambient - Mrs Philips: Quitting script via debug...")
SCRIPT_CLEANUP()
ENDIF
#ENDIF
// No need to update every frame
IF NOT bAttemptToLaunchScript
WAIT(1000)
ELSE
WAIT(0)
ENDIF
ENDIF
ENDWHILE
ENDSCRIPT