Files
gtav-src/script/dev_ng/singleplayer/include/private/script_launch_control.sch
T
2025-09-29 00:52:08 +02:00

1566 lines
61 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : script_launch_control.sch //
// AUTHOR : Kenneth Ross //
// DESCRIPTION : Checks if any controller scripts should be launched when //
// required. This was set up to reduce the number of //
// controller scripts that constantly run. //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_script.sch"
USING "script_player.sch"
USING "wardrobe_private.sch"
USING "random_events_public.sch"
USING "director_mode_public.sch"
#IF NOT USE_SP_DLC
USING "photographyWildlife.sch"
USING "randomChar_Public.sch"
#ENDIF
STRUCT ScriptLaunchVars
INT iLaunchCheckStage
INT iCurrentWardrobeFrame
INT iWardrobeScriptRequestedBitset
INT iDirectorModeLaunchState
FEATURE_BLOCK_REASON eDirectorModeBlockLastFrame
BOOL bWardrobeScriptRequested
BOOL bFirstSpawnDone
int iDelayLaunchTime
ENDSTRUCT
CONST_INT BIT_DM_LAUNCH_GAME_PAUSED 0
CONST_INT BIT_DM_LAUNCH_PRE_CLEANUP 1
CONST_INT BIT_DM_LAUNCH_CONTROL_WAS_OFF 2
////////////////////////////////////////////////////
/// WARDROBE
CONST_INT MAX_FRAMES_TO_PROCESS_WARDROBES 30
CONST_FLOAT CABLE_CAR_RESTART_MIN_X -800.0 // if player x is bigger than this - restart
CONST_FLOAT CABLE_CAR_RESTART_MAX_X 640.0 // if player x is smaller than this - restart
CONST_FLOAT CABLE_CAR_RESTART_MIN_Y 5300.0 // if player y is bigger than this - restart
CONST_FLOAT CABLE_CAR_RESTART_MAX_Y 5800.0 // if player y is smaller than this - restart
#IF NOT USE_SP_DLC
VECTOR vAmbSolLaunchCenter = <<-1124.392212,-514.700134,33.214931>>
FLOAT fAmbSolLaunchRadius = 200.0
#endif
VECTOR vAmbUFOPosition0 = <<2490.0, 3777.0, 2402.879>>
VECTOR vAmbUFOPosition1 = <<-2052.0, 3237.0, 1450.078>> // OLD <<-2366.379, 2962.758, 1448.873>>
CONST_FLOAT AMBIENT_UFO_SCRIPT_TRIGGER_RANGE 290.0 // increased range for B*1686895
FUNC BOOL REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH(INT paramScriptHash, #IF IS_DEBUG_BUILD STRING paramScriptName, #ENDIF INT paramStackSize = DEFAULT_STACK_SIZE)
REQUEST_SCRIPT_WITH_NAME_HASH(paramScriptHash)
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(paramScriptHash)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Starting new \"", paramScriptName, "\" thread.")
#ENDIF
START_NEW_SCRIPT_WITH_NAME_HASH(paramScriptHash, paramStackSize)
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(paramScriptHash)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC DO_PLAYER_CONTROLLER_B_CHECKS()
BOOL bPreventPlayerControllerBForMPStart = FALSE
IF g_bInMultiplayer
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Prevent player_controller_b for g_bInMultiplayer")
bPreventPlayerControllerBForMPStart = TRUE
ENDIF
IF MPGlobals.g_bEndSingleplayerNow
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Prevent player_controller_b for g_bEndSingleplayerNow")
bPreventPlayerControllerBForMPStart = TRUE
ENDIF
IF g_TransitionData.SwoopStage = SKYSWOOP_GOINGUP
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Prevent player_controller_b for g_TransitionData.SwoopStage")
bPreventPlayerControllerBForMPStart = TRUE
ENDIF
IF g_bRunMultiplayerOnStartup
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Prevent player_controller_b for g_bRunMultiplayerOnStartup")
bPreventPlayerControllerBForMPStart = TRUE
ENDIF
IF (CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_STORY)
AND NOT bPreventPlayerControllerBForMPStart)
#IF IS_DEBUG_BUILD
OR g_bDebug_KeepPlayerControllerBRunning
#ENDIF
#IF USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("player_controller_bCLF")) = 0
//#1356702
IF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
OR IS_PLAYER_SWITCH_IN_PROGRESS()
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE)
DISABLE_FRONTEND_THIS_FRAME()
ENDIF
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("player_controller_bCLF"),
#IF IS_DEBUG_BUILD "player_controller_bCLF", #ENDIF
MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
ELIF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("player_controller_bCLF"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("player_controller_bCLF"))
#ENDIF
#IF USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("player_controller_bNRM")) = 0
//#1356702
IF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
OR IS_PLAYER_SWITCH_IN_PROGRESS()
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE)
DISABLE_FRONTEND_THIS_FRAME()
ENDIF
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("player_controller_bNRM"),
#IF IS_DEBUG_BUILD "player_controller_bNRM", #ENDIF
MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
ELIF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("player_controller_bNRM"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("player_controller_bNRM"))
#ENDIF
#IF NOT USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("player_controller_b")) = 0
//#1356702
IF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
OR IS_PLAYER_SWITCH_IN_PROGRESS()
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE)
DISABLE_FRONTEND_THIS_FRAME()
ENDIF
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("player_controller_b"),
#IF IS_DEBUG_BUILD "player_controller_b", #ENDIF
MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
ELIF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("player_controller_b"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("player_controller_b"))
#ENDIF
ENDIF
ENDPROC
PROC DO_FRIENDS_CONTROLLER_CHECKS()
IF Should_Friends_Controller_Be_Running()
#IF IS_DEBUG_BUILD
OR g_bDebug_KeepFriendsControllerRunning
#ENDIF
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("friends_controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("friends_controller"),
#IF IS_DEBUG_BUILD "friends_controller", #ENDIF
FRIEND_STACK_SIZE)
ENDIF
ENDIF
ENDPROC
PROC DO_AUTOSAVE_CONTROLLER_CHECKS()
// Check if code are wanting us to make an autosave.
IF HAS_CODE_REQUESTED_AUTOSAVE()
MAKE_AUTOSAVE_REQUEST()
CLEAR_CODE_REQUESTED_AUTOSAVE()
ENDIF
IF g_sAutosaveData.iQueuedRequests > 0
#IF IS_DEBUG_BUILD
OR g_bDebug_KeepAutoSaveControllerRunning
#ENDIF
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("autosave_controllerCLF")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("autosave_controllerCLF") #IF IS_DEBUG_BUILD ,"autosave_controllerCLF" #ENDIF )
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("autosave_controllerNRM")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("autosave_controllerNRM") #IF IS_DEBUG_BUILD ,"autosave_controllerNRM" #ENDIF )
ENDIF
#endif
#IF NOT USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("autosave_controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("autosave_controller") #IF IS_DEBUG_BUILD ,"autosave_controller" #ENDIF )
ENDIF
#endif
ENDIF
ENDPROC
PROC DO_RESPAWN_CONTROLLER_CHECKS()
#if FEATURE_SP_DLC_DIRECTOR_MODE
if !g_bRockstarEditorActive
#endif
#IF USE_CLF_DLC
CONST_INT paramScriptHash HASH("respawn_controllerCLF")
#ENDIF
#IF USE_NRM_DLC
CONST_INT paramScriptHash HASH("respawn_controllerNRM")
#ENDIF
#IF NOT USE_SP_DLC
CONST_INT paramScriptHash HASH("respawn_controller")
#ENDIF
#IF IS_DEBUG_BUILD
g_bDebug_IsRespawnControllerRunning = GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(paramScriptHash) > 0
#ENDIF
IF NOT IS_CURRENT_MINIGAME_SET_TO_BYPASS_RESPAWN_CUTSCENE()
AND NOT IS_REPEAT_PLAY_ACTIVE() //Disable the respawn controller during repeat plays
#IF IS_DEBUG_BUILD
OR g_bDebug_KeepRespawnControllerRunning
#ENDIF
REQUEST_SCRIPT_WITH_NAME_HASH(paramScriptHash)
IF IS_PED_INJURED(PLAYER_PED_ID())
OR IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
#IF IS_DEBUG_BUILD
OR g_bDebug_KeepRespawnControllerRunning
#ENDIF
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
#IF USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(paramScriptHash) = 0
#IF IS_DEBUG_BUILD
IF IS_PED_INJURED(PLAYER_PED_ID())
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "IS_PED_INJURED(PLAYER_PED_ID()).")
ENDIF
IF IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE).")
ENDIF
IF g_bDebug_KeepRespawnControllerRunning
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "g_bDebug_KeepRespawnControllerRunning.")
ENDIF
#ENDIF
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( paramScriptHash #IF IS_DEBUG_BUILD ,"respawn_controllerCLF" #ENDIF )
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(paramScriptHash) = 0
#IF IS_DEBUG_BUILD
IF IS_PED_INJURED(PLAYER_PED_ID())
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "IS_PED_INJURED(PLAYER_PED_ID()).")
ENDIF
IF IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE).")
ENDIF
IF g_bDebug_KeepRespawnControllerRunning
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "g_bDebug_KeepRespawnControllerRunning.")
ENDIF
#ENDIF
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( paramScriptHash #IF IS_DEBUG_BUILD ,"respawn_controllerNRM" #ENDIF )
ENDIF
#ENDIF
#IF NOT USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(paramScriptHash) = 0
#IF IS_DEBUG_BUILD
IF IS_PED_INJURED(PLAYER_PED_ID())
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "IS_PED_INJURED(PLAYER_PED_ID()).")
ENDIF
IF IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE).")
ENDIF
IF g_bDebug_KeepRespawnControllerRunning
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "g_bDebug_KeepRespawnControllerRunning.")
ENDIF
#ENDIF
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( paramScriptHash #IF IS_DEBUG_BUILD ,"respawn_controller" #ENDIF )
ENDIF
#ENDIF
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "IS_PLAYER_SWITCH_IN_PROGRESS().")
#ENDIF
ENDIF
ENDIF
ELSE
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(paramScriptHash)
ENDIF
#if FEATURE_SP_DLC_DIRECTOR_MODE
endif
#endif
ENDPROC
PROC DO_WARDROBE_SCRIPT_CHECKS(ScriptLaunchVars &sVars)
WARDROBE_LAUNCHER_STRUCT sWardrobeLauncherData
// Update the frame that we are processing if not loading for the current
IF NOT sVars.bWardrobeScriptRequested
sVars.iCurrentWardrobeFrame = (sVars.iCurrentWardrobeFrame+1) % MAX_FRAMES_TO_PROCESS_WARDROBES
ENDIF
INT i, j
REPEAT (NUM_PLAYER_PED_WARDROBES / MAX_FRAMES_TO_PROCESS_WARDROBES)+1 j
i = sVars.iCurrentWardrobeFrame+(j*MAX_FRAMES_TO_PROCESS_WARDROBES)
// Only perform an update if this wardrobe is within the range
IF i < NUM_PLAYER_PED_WARDROBES
sWardrobeLauncherData.eWardrobe = INT_TO_ENUM(PLAYER_WARDROBE_ENUM, i)
// Cleanup
IF g_bWardrobeScriptLaunched[i]
IF NOT g_bWardrobeScriptRunning[i]
g_bWardrobeScriptLaunched[i] = FALSE
ENDIF
// Request
ELIF NOT g_bWardrobeScriptRunning[i]
AND NOT IS_BIT_SET(sVars.iWardrobeScriptRequestedBitset, i)
IF GET_DISTANCE_BETWEEN_COORDS(GET_PLAYER_PED_WARDROBE_COORDS(sWardrobeLauncherData.eWardrobe), GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE)) < 20.0
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Requesting wardrobe_sp script ", i)
REQUEST_SCRIPT_WITH_NAME_HASH(HASH("wardrobe_sp"))
SET_BIT(sVars.iWardrobeScriptRequestedBitset, i)
sVars.bWardrobeScriptRequested = TRUE
ENDIF
// Launch
ELSE
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("wardrobe_sp"))
IF GET_NUMBER_OF_FREE_STACKS_OF_THIS_SIZE(SHOP_STACK_SIZE) > 1
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Launching wardrobe script ", i)
g_bWardrobeScriptRunning[i] = TRUE
g_bWardrobeScriptLaunched[i] = TRUE
CLEAR_BIT(sVars.iWardrobeScriptRequestedBitset, i)
// Set the launcher data and start script
START_NEW_SCRIPT_WITH_NAME_HASH_AND_ARGS(HASH("wardrobe_sp"), sWardrobeLauncherData, SIZE_OF(sWardrobeLauncherData), SHOP_STACK_SIZE)
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("wardrobe_sp"))
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Unable to launch wardrobe_sp script ", i, " - no free stacks")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF sVars.bWardrobeScriptRequested
AND sVars.iWardrobeScriptRequestedBitset = 0
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("wardrobe_sp"))
sVars.bWardrobeScriptRequested = FALSE
ENDIF
ENDPROC
PROC DO_MODEL_SUPPRESS_CHECKS()
IF g_bAmbientModelSuppressActive
BOOL bModelSuppressed = FALSE
INT i
REPEAT COUNT_OF(g_eAmbientModelSuppress) i
IF g_eAmbientModelSuppress[i] != DUMMY_MODEL_FOR_SCRIPT
IF (GET_GAME_TIMER() - g_iAmbientModelSuppressTimer[i]) > 0
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "SET_MODEL_IS_SUPPRESSED_FOR_DURATION - No longer suppressing model ", GET_MODEL_NAME_FOR_DEBUG(g_eAmbientModelSuppress[i]))
#ENDIF
IF g_bAmbientModelSuppressVehicle[i]
SET_VEHICLE_MODEL_IS_SUPPRESSED(g_eAmbientModelSuppress[i], FALSE)
ELSE
SET_PED_MODEL_IS_SUPPRESSED(g_eAmbientModelSuppress[i], FALSE)
ENDIF
g_eAmbientModelSuppress[i] = DUMMY_MODEL_FOR_SCRIPT
ELSE
IF g_bAmbientModelSuppressVehicle[i]
SET_VEHICLE_MODEL_IS_SUPPRESSED(g_eAmbientModelSuppress[i], TRUE)
ELSE
SET_PED_MODEL_IS_SUPPRESSED(g_eAmbientModelSuppress[i], TRUE)
ENDIF
bModelSuppressed = TRUE
ENDIF
ENDIF
ENDREPEAT
IF NOT bModelSuppressed
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "SET_MODEL_IS_SUPPRESSED_FOR_DURATION - No more models to suppress")
g_bAmbientModelSuppressActive = FALSE
ENDIF
ENDIF
ENDPROC
PROC DO_MISSION_TRIGGERER_CHECKS()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
#IF USE_CLF_DLC
//If the game has been completed there is never a need to launch the triggerer.
IF NOT g_savedGlobalsClifford.sFlow.flowCompleted
//Don't launch anything until the flow has settled.
IF NOT g_flowUnsaved.bFlowControllerBusy
//Only start the mission trigger if the game is in a state where story missions can trigger.
IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_STORY) AND NOT IS_REPEAT_PLAY_ACTIVE()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_trigger_CLF")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_trigger_CLF") #IF IS_DEBUG_BUILD ,"mission_trigger_CLF" #ENDIF )
ENDIF
ELSE
//We're on mission. Make sure to unload any loaded mission triggers.
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_trigger_CLF"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_trigger_CLF"))
ENDIF
ENDIF
IF g_savedGlobalsClifford.sFlow.flowCompleted
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_trigger_CLF"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_trigger_CLF"))
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
#IF USE_NRM_DLC
//If the game has been completed there is never a need to launch the triggerer.
IF NOT g_savedGlobalsnorman.sFlow.flowCompleted
//Don't launch anything until the flow has settled.
IF NOT g_flowUnsaved.bFlowControllerBusy
//Only start the mission trigger if the game is in a state where story missions can trigger.
IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_STORY) AND NOT IS_REPEAT_PLAY_ACTIVE()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_triggerNRM")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_triggerNRM") #IF IS_DEBUG_BUILD ,"mission_triggerNRM" #ENDIF )
ENDIF
ELSE
//We're on mission. Make sure to unload any loaded mission triggers.
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerNRM"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerNRM"))
ENDIF
ENDIF
IF g_savedGlobalsnorman.sFlow.flowCompleted
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerNRM"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerNRM"))
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
#IF NOT USE_SP_DLC
//If the game has been completed there is never a need to launch the triggerer.
IF NOT g_savedGlobals.sFlow.flowCompleted
//Don't launch anything until the flow has settled.
IF NOT g_flowUnsaved.bFlowControllerBusy
//Only start the mission trigger if the game is in a state where story missions can trigger.
IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_STORY) AND NOT IS_REPEAT_PLAY_ACTIVE()
//Load the mission triggerer with mission data up to the end of Trevor1.
IF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_TREVOR_1)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_triggerer_A")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_triggerer_A")
#IF IS_DEBUG_BUILD ,"mission_triggerer_A" #ENDIF ,
MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
//Load the mission triggerer with mission data from Trevor2 to the end of FIB4.
ELIF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_FBI_4)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_triggerer_B")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_triggerer_B")
#IF IS_DEBUG_BUILD ,"mission_triggerer_B" #ENDIF ,
MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
//Load the mission triggerer with mission data from Carsteal1 to the end of The Big Score 1.
ELIF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_1)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_triggerer_C")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_triggerer_C")
#IF IS_DEBUG_BUILD ,"mission_triggerer_C" #ENDIF ,
MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
//Load the mission triggerer with mission data for the rest of the game.
ELSE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_triggerer_D")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_triggerer_D")
#IF IS_DEBUG_BUILD ,"mission_triggerer_D" #ENDIF ,
MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
ENDIF
ELSE
//We're on mission. Make sure to unload any loaded mission triggers.
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerer_A"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerer_A"))
ENDIF
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerer_B"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerer_B"))
ENDIF
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerer_C"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerer_C"))
ENDIF
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerer_D"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerer_D"))
ENDIF
ENDIF
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_TREVOR_1)
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerer_A"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerer_A"))
ENDIF
ELIF GET_MISSION_COMPLETE_STATE(SP_MISSION_FBI_4)
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerer_B"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerer_B"))
ENDIF
ELIF GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_1)
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerer_C"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerer_C"))
ENDIF
ELIF g_savedGlobals.sFlow.flowCompleted
IF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("mission_triggerer_D"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("mission_triggerer_D"))
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC DO_MISSION_REPEAT_CHECKS()
IF IS_REPEAT_PLAY_ACTIVE(TRUE) //Ignore the benchmark script, not actually a mission
#IF USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_repeat_controllerCLF")) = 0
IF NOT IS_BIT_SET(g_iRepeatPlayBits, ENUM_TO_INT(RPB_PAUSED_GAME))
CPRINTLN(DEBUG_REPEAT, "Pausing game to launch repeat play.")
SET_GAME_PAUSED(TRUE)
SET_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_PAUSED_GAME))
ENDIF
IF REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_repeat_controllerCLF") #IF IS_DEBUG_BUILD ,"mission_repeat_controllerCLF" #ENDIF , FRIEND_STACK_SIZE)
CPRINTLN(DEBUG_REPEAT, "Unpausing game as repeat play script launched.")
SET_GAME_PAUSED(FALSE)
ENDIF
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_repeat_controllerNRM")) = 0
IF NOT IS_BIT_SET(g_iRepeatPlayBits, ENUM_TO_INT(RPB_PAUSED_GAME))
CPRINTLN(DEBUG_REPEAT, "Pausing game to launch repeat play.")
SET_GAME_PAUSED(TRUE)
SET_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_PAUSED_GAME))
ENDIF
IF REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_repeat_controllerNRM") #IF IS_DEBUG_BUILD ,"mission_repeat_controllerNRM" #ENDIF , FRIEND_STACK_SIZE)
CPRINTLN(DEBUG_REPEAT, "Unpausing game as repeat play script launched.")
SET_GAME_PAUSED(FALSE)
ENDIF
ENDIF
#ENDIF
#IF NOT USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_repeat_controller")) = 0
IF NOT IS_BIT_SET(g_iRepeatPlayBits, ENUM_TO_INT(RPB_PAUSED_GAME))
CPRINTLN(DEBUG_REPEAT, "Pausing game to launch repeat play.")
SET_GAME_PAUSED(TRUE)
SET_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_PAUSED_GAME))
ENDIF
IF REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("mission_repeat_controller") #IF IS_DEBUG_BUILD ,"mission_repeat_controller" #ENDIF , FRIEND_STACK_SIZE)
CPRINTLN(DEBUG_REPEAT, "Unpausing game as repeat play script launched.")
SET_GAME_PAUSED(FALSE)
ENDIF
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC DO_CODE_CONTROLLER_CHECKS()
#IF USE_CLF_DLC
IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_STORY)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("code_controllerCLF")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("code_controllerCLF") #IF IS_DEBUG_BUILD ,"code_controllerCLF" #ENDIF )
ENDIF
ELIF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("code_controllerCLF"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("code_controllerCLF"))
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_STORY)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("code_controllerNRM")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("code_controllerNRM") #IF IS_DEBUG_BUILD ,"code_controllerNRM" #ENDIF )
ENDIF
ELIF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("code_controllerNRM"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("code_controllerNRM"))
ENDIF
#ENDIF
#IF NOT USE_SP_DLC
IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_STORY)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("code_controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("code_controller") #IF IS_DEBUG_BUILD ,"code_controller" #ENDIF )
ENDIF
ELIF HAS_SCRIPT_WITH_NAME_HASH_LOADED(HASH("code_controller"))
SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(HASH("code_controller"))
ENDIF
#ENDIF
ENDPROC
PROC DO_RC_CONTROLLER_CHECKS()
IF NOT IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_RANDOM_CHAR)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("RandomChar_Controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("RandomChar_Controller") #IF IS_DEBUG_BUILD ,"RandomChar_Controller" #ENDIF )
ENDIF
ENDIF
ENDPROC
PROC DO_RACE_CONTROLLER_CHECKS()
#IF NOT USE_SP_DLC
IF GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_STREET_RACES))
OR GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_SEA_RACES))
IF NOT IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_MINIGAME)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("controller_Races")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("controller_Races") #IF IS_DEBUG_BUILD ,"controller_Races" #ENDIF )
ENDIF
ENDIF
ENDIF
#endif
ENDPROC
PROC DO_FLOW_HELP_CHECKS()
IF g_OnMissionState = MISSION_TYPE_FRIEND_ACTIVITY
OR g_OnMissionState = MISSION_TYPE_OFF_MISSION
OR g_bHeistBoardViewActive
#IF USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("flow_helpCLF")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("flow_helpCLF") #IF IS_DEBUG_BUILD ,"flow_helpCLF" #ENDIF , MICRO_STACK_SIZE )
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("flow_helpNRM")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("flow_helpNRM") #IF IS_DEBUG_BUILD ,"flow_helpNRM" #ENDIF , MICRO_STACK_SIZE )
ENDIF
#ENDIF
#IF NOT USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("flow_help")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("flow_help") #IF IS_DEBUG_BUILD ,"flow_help" #ENDIF , MICRO_STACK_SIZE )
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC DO_BOOTY_CALL_HANDLER_CHECKS()
IF NOT IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("bootycallhandler")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("bootycallhandler") #IF IS_DEBUG_BUILD ,"bootycallhandler" #ENDIF)
ENDIF
ENDIF
ENDPROC
PROC DO_COMMS_CONTROLLER_CHECKS()
IF NOT IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
#IF USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("comms_controllerCLF")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("comms_controllerCLF") #IF IS_DEBUG_BUILD ,"comms_controllerCLF" #ENDIF )
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("comms_controllerNRM")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("comms_controllerNRM") #IF IS_DEBUG_BUILD ,"comms_controllerNRM" #ENDIF )
ENDIF
#ENDIF
#IF NOT USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("comms_controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("comms_controller") #IF IS_DEBUG_BUILD ,"comms_controller" #ENDIF )
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC DO_REPLAY_CONTROLLER_CHECKS()
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME_FRIENDS)
#IF USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("replay_controllerCLF")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("replay_controllerCLF") #IF IS_DEBUG_BUILD ,"replay_controllerCLF" #ENDIF )
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("replay_controllerNRM")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("replay_controllerNRM") #IF IS_DEBUG_BUILD ,"replay_controllerNRM" #ENDIF )
ENDIF
#ENDIF
#IF NOT USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("replay_controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("replay_controller") #IF IS_DEBUG_BUILD ,"replay_controller" #ENDIF )
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC DO_SAVE_ANYWHERE_CHECKS()
IF g_HasCellphoneRequestedSave
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("save_anywhere")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("save_anywhere") #IF IS_DEBUG_BUILD ,"save_anywhere" #ENDIF )
ENDIF
ENDIF
ENDPROC
#IF FEATURE_SP_DLC_DIRECTOR_MODE
PROC DO_DIRECTOR_MODE_CHECKS(ScriptLaunchVars &sVars)
IF HAS_DIRECTOR_MODE_BEEN_LAUNCHED_BY_CODE()
CPRINTLN(DEBUG_DIRECTOR, "Detected director mode launch coming from code.")
g_bLaunchDirectorMode = TRUE
SET_DIRECTOR_MODE_LAUNCHED_BY_SCRIPT()
ENDIF
FEATURE_BLOCK_REASON eBlockReasonThisFrame = GET_FEATURE_BLOCKED_REASON(TRUE,default,DEBUG_DIRECTOR)
// #IF IS_DEBUG_BUILD
// CDEBUG3LN(DEBUG_DIRECTOR, " - script_launch_control - DO_DIRECTOR_MODE_CHECKS - eBlockReasonThisFrame: ", eBlockReasonThisFrame)
// CDEBUG3LN(DEBUG_DIRECTOR, " - script_launch_control - DO_DIRECTOR_MODE_CHECKS - sVars.eDirectorModeBlockLastFrame: ", sVars.eDirectorModeBlockLastFrame)
// #ENDIF
IF eBlockReasonThisFrame != sVars.eDirectorModeBlockLastFrame
IF eBlockReasonThisFrame = FBR_NONE
CPRINTLN(DEBUG_DIRECTOR, "Detected Director Mode is no longer blocked. Setting available.")
SET_DIRECTOR_MODE_AVAILABLE(TRUE)
ELSE
CPRINTLN(DEBUG_DIRECTOR, "Detected Director Mode is now blocked (Reason:", DEBUG_GET_FEATURE_BLOCK_REASON_STRING(eBlockReasonThisFrame,DEBUG_DIRECTOR), "). Setting unavailable.")
SET_DIRECTOR_MODE_AVAILABLE(FALSE)
ENDIF
sVars.eDirectorModeBlockLastFrame = eBlockReasonThisFrame
ENDIF
IF g_bLaunchDirectorMode
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
CPRINTLN(DEBUG_DIRECTOR, "Main thread detected request to launch the Director Mode script...")
IF eBlockReasonThisFrame = FBR_NONE
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(),TRUE)
//Director Mode is allowed to launch. Fire the script now.
IF NOT IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT()
CPRINTLN(DEBUG_DIRECTOR, "Fading screen out in peraparation for launching Director Mode.")
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ELSE
IF NOT IS_BIT_SET(sVars.iDirectorModeLaunchState, BIT_DM_LAUNCH_PRE_CLEANUP)
CPRINTLN(DEBUG_DIRECTOR, "Running Director Mode pre-launch cleanup..")
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
//Turn player control off, remember if it used to be on
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_BIT(sVars.iDirectorModeLaunchState, BIT_DM_LAUNCH_CONTROL_WAS_OFF)
ENDIF
CPRINTLN(DEBUG_DIRECTOR,"Setting player control OFF as we launch DM, it used to be ",IS_PLAYER_CONTROL_ON(PLAYER_ID()))
SET_PLAYER_CONTROL(PLAYER_ID(),FALSE)
SET_BIT(sVars.iDirectorModeLaunchState, BIT_DM_LAUNCH_PRE_CLEANUP)
ENDIF
IF REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("director_mode") #IF IS_DEBUG_BUILD ,"director_mode" #ENDIF, MISSION_STACK_SIZE)
sVars.iDirectorModeLaunchState = 0
g_bLaunchDirectorMode = FALSE
ENDIF
ENDIF
ELSE
if GET_GAME_TIMER() - sVars.iDelayLaunchTime >= 250
//Draw the warning screen.
SET_GAME_PAUSED(TRUE)
HIDE_LOADING_ON_FADE_THIS_FRAME()
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_FADE)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
STRING strFBLabel = GET_FEATURE_BLOCK_MESSAGE_TEXT(eBlockReasonThisFrame,DEBUG_DIRECTOR)
SET_WARNING_MESSAGE("FBR_GENERIC", FE_WARNING_CONTINUE, DEFAULT, DEFAULT, DEFAULT, "FBR_DIR_MODE", strFBLabel)
CDEBUG3LN(DEBUG_DIRECTOR, "Displaying ", DEBUG_GET_FEATURE_BLOCK_REASON_STRING(eBlockReasonThisFrame,DEBUG_DIRECTOR), " block screen.")
CDEBUG3LN(DEBUG_DIRECTOR, "now able to clear alert screen")
if !IS_BIT_SET(sVars.iDirectorModeLaunchState, BIT_DM_LAUNCH_GAME_PAUSED)
SET_BIT(sVars.iDirectorModeLaunchState, BIT_DM_LAUNCH_GAME_PAUSED)
ELSE
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
IF IS_BIT_SET(sVars.iDirectorModeLaunchState, BIT_DM_LAUNCH_GAME_PAUSED)
CLEAR_BIT(sVars.iDirectorModeLaunchState, BIT_DM_LAUNCH_GAME_PAUSED)
ENDIF
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(),FALSE) //Disable temporary invulnerability in case of exiting
SET_PLAYER_CONTROL(PLAYER_ID(),TRUE)
SET_GAME_PAUSED(FALSE)
CPRINTLN(DEBUG_DIRECTOR, "Cleaning up Director Mode launch due to block reason.")
sVars.iDirectorModeLaunchState = 0
g_bLaunchDirectorMode = FALSE
IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
CPRINTLN(DEBUG_DIRECTOR, "Director Mode is already launched. Flagging to return to trailer instead of launching.")
CDEBUG1LN(DEBUG_DIRECTOR,"DO_DIRECTOR_MODE_CHECKS: setting g_bDirectorSwitchToCastingTrailer to TRUE")
g_bDirectorSwitchToCastingTrailer = TRUE
g_bDirectorSwitchToCastingTrailerFromCode = TRUE
g_bLaunchDirectorMode = FALSE
ENDIF
ELSE
sVars.iDelayLaunchTime = GET_GAME_TIMER()
ENDIF
ENDPROC
#ENDIF
PROC DO_CABLECAR_LAUNCH_CHECKS()
IF (g_bInMultiplayer = FALSE) AND (g_bForceNoCableCar = FALSE) AND NOT GET_MISSION_FLAG()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
VECTOR plyrPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF (plyrPos.x >= CABLE_CAR_RESTART_MIN_X) AND (plyrPos.y >= CABLE_CAR_RESTART_MIN_Y) AND (plyrPos.x <= CABLE_CAR_RESTART_MAX_X) AND (plyrPos.y <= CABLE_CAR_RESTART_MAX_Y)
#IF USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("cablecarCLF")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("cablecarCLF") #IF IS_DEBUG_BUILD ,"cablecarCLF" #ENDIF )
ENDIF
EXIT
#ENDIF
#IF NOT USE_SP_DLC
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1) = TRUE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("cablecar")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("cablecar") #IF IS_DEBUG_BUILD ,"cablecar" #ENDIF )
ENDIF
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
/*
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("cablecar")) = 0)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
#IF NOT USE_SP_DLC
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1) = TRUE
#endif
VECTOR plyrPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF (plyrPos.x >= CABLE_CAR_RESTART_MIN_X) AND (plyrPos.y >= CABLE_CAR_RESTART_MIN_Y) AND (plyrPos.x <= CABLE_CAR_RESTART_MAX_X) AND (plyrPos.y <= CABLE_CAR_RESTART_MAX_Y)
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("cablecar") #IF IS_DEBUG_BUILD ,"cablecar" #ENDIF )
ENDIF
#IF NOT USE_SP_DLC
ENDIF
#endif
ENDIF
ENDIF
*/
ENDPROC
PROC DO_AMBIENT_UFOS_LAUNCH_CHECKS()
IF (g_bInMultiplayer = FALSE) AND (g_bForceNoAmbientUFO = FALSE)
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("ambient_ufos")) = 0)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF (g_savedGlobals.sCompletionPercentageData.b_g_OneHundredPercentReached = TRUE)
IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vAmbUFOPosition0) < AMBIENT_UFO_SCRIPT_TRIGGER_RANGE)
OR (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vAmbUFOPosition1) < AMBIENT_UFO_SCRIPT_TRIGGER_RANGE)
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("ambient_ufos") #IF IS_DEBUG_BUILD ,"ambient_ufos" #ENDIF )
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC DO_AMBIENT_SOLOMON_LAUNCH_CHECKS()
#IF NOT USE_SP_DLC
IF (g_bInMultiplayer = FALSE) AND NOT GET_MISSION_FLAG()
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MOVIE_STUDIO_OPEN) = FALSE
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_SOLOMON_1) = FALSE
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("ambient_solomon")) = 0)
IF IS_MISSION_AVAILABLE(SP_MISSION_SOLOMON_1)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vAmbSolLaunchCenter) <= (fAmbSolLaunchRadius * fAmbSolLaunchRadius)
IF (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("ambient_solomon") #IF IS_DEBUG_BUILD ,"ambient_solomon" #ENDIF )
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
ENDPROC
#IF NOT USE_SP_DLC
PROC DO_PHOTOGRAPHY_WILDLIFE_LAUNCH_CHECKS()
IF IS_LAST_GEN_PLAYER()
AND NOT IS_REPEAT_PLAY_ACTIVE()
AND NOT IS_DIRECTOR_MODE_RUNNING()
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_WILDLIFE_PHOTOGRAPHY_UNLOCKED)
#IF IS_DEBUG_BUILD
AND !g_bBlockPhotographyWildlifeRelaunch
#ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("photographyWildlife")) = 0
AND NOT IS_BIT_SET(g_SavedGlobals.sAmbient.iWildlifePhotographsFlags, BIT_SET_COLLECT_WILDLIFE_PHOTOGRAPHS_FINISHED)
AND NOT g_flowUnsaved.bUpdatingGameflow
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH(HASH("photographyWildlife") #IF IS_DEBUG_BUILD , "photographyWildlife" #ENDIF)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
#ENDIF
PROC DO_MINIGAME_LAUNCH_CHECKS()
IF NOT IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_MINIGAME)
IF NOT g_HasPerformedMiniGameRangeChecks
VECTOR vMyCurrentPlayerCoords
STRING launcherScriptName
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vMyCurrentPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
ELSE
EXIT // Leave if the ped is injured.
ENDIF
//BASE Jumping Helicopter
launcherScriptName = "launcher_BasejumpHeli"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_BasejumpHeli")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_BJ_HELI_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_LARGE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//BASE Jumping Pack
launcherScriptName = "launcher_BasejumpPack"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_BasejumpPack")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_BJ_PACK_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_MEDIUM)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Golf
launcherScriptName = "launcher_golf"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_golf")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_GOLF_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_LARGE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Hunting
launcherScriptName = "launcher_Hunting_Ambient"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_Hunting_Ambient")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_HUNTING_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_LARGE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Off Road Racing
launcherScriptName = "launcher_OffroadRacing"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_OffroadRacing")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_OFFROAD_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_LARGE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Racing
launcherScriptName = "launcher_Racing"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_Racing")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_RACING_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_LARGE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Rampage
launcherScriptName = "launcher_rampage"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_rampage")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_RAMPAGE_LAUNCHER(vMyCurrentPlayerCoords, FLOOR(RC_BRAIN_ACTIVATION_RANGE_EXTRA))
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Flight school
launcherScriptName = "launcher_pilotschool"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_pilotschool")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_PILOT_SCHOOL_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_MEDIUM)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Shooting Range
launcherScriptName = "launcher_range"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_range")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_RANGE_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_SMALL)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Stunt plane time trials
launcherScriptName = "launcher_stunts"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_stunts")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_STUNTS_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_LARGE)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Tennis
launcherScriptName = "launcher_tennis"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_tennis")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_TENNIS_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_MEDIUM)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Triathlon
launcherScriptName = "launcher_Triathlon"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_Triathlon")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_TRIATHLON_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_MEDIUM)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Yoga
launcherScriptName = "launcher_Yoga"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_Yoga")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_YOGA_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_SMALL)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
//Darts
launcherScriptName = "launcher_Darts"
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Checking promximity to ", launcherScriptName)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("launcher_Darts")) = 0
//check if im in range of one of the points
IF IS_PLAYER_WITHIN_RANGE_OF_DARTS_LAUNCHER(vMyCurrentPlayerCoords, MG_BRAIN_ACTIVATION_RANGE_MEDIUM)
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Reactivating script brains for", launcherScriptName)
//object attached, so using object_brains reactivation instead of world_brains
REACTIVATE_NAMED_OBJECT_BRAINS_WAITING_TILL_OUT_OF_RANGE(launcherScriptName)
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "player isn't within range of any ", launcherScriptName, " points")
ENDIF
ELSE
CPRINTLN(DEBUG_SCRIPT_LAUNCH, launcherScriptName, " currently has at least one script already running")
ENDIF
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Finished performing mini game launch script checks ")
g_HasPerformedMiniGameRangeChecks = TRUE //set a flag that we've completed the checks
ENDIF
ELIF g_HasPerformedMiniGameRangeChecks
g_HasPerformedMiniGameRangeChecks = FALSE //clear the flag that we've completed the checks
ENDIF
ENDPROC
#IF NOT USE_SP_DLC
PROC DO_PHOTOGRAPHY_MONKEY_LAUNCH_CHECKS()
IF( g_SavedGlobals.sAmbient.iPhotographyMonkeyFlags[ 1 ] <> -1 )
IF NOT g_bInMultiplayer
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("photographyMonkey")) = 0
AND NOT g_flowUnsaved.bUpdatingGameflow
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("photographyMonkey") #IF IS_DEBUG_BUILD ,"photographyMonkey" #ENDIF , FRIEND_STACK_SIZE)
ENDIF
ENDIF
ENDIF
ENDPROC
#ENDIF
PROC DO_BLIMP_LAUNCH_CHECKS()
#IF NOT USE_SP_DLC
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
IF IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_BLIMP)
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_BLIMP_UNLOCK)
OR GLOBAL_CHARACTER_SHEET_GET_PHONEBOOK_STATE(CHAR_BLIMP, 0) != LISTED
OR GLOBAL_CHARACTER_SHEET_GET_PHONEBOOK_STATE(CHAR_BLIMP, 1) != LISTED
OR GLOBAL_CHARACTER_SHEET_GET_PHONEBOOK_STATE(CHAR_BLIMP, 2) != LISTED
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("ambientblimp")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("ambientblimp") #IF IS_DEBUG_BUILD ,"ambientblimp" #ENDIF )
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
ENDPROC
PROC DO_ENVIRO_LAUNCH_CHECK()
#IF USE_NRM_DLC
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("enviro_controllerNRM")) = 0)
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("enviro_controllerNRM") #IF IS_DEBUG_BUILD ,"enviro_controllerNRM" #ENDIF )
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("norman_controller")) = 0)
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("norman_controller") #IF IS_DEBUG_BUILD ,"norman_controller" #ENDIF )
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("hostile_controller")) = 0)
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("hostile_controller") #IF IS_DEBUG_BUILD ,"hostile_controller" #ENDIF )
ENDIF
#ENDIF
ENDPROC
PROC DO_ANIMAL_CONTROLLER_LAUNCH_CHECKS()
#IF NOT USE_SP_DLC
#IF IS_DEBUG_BUILD
IF NOT g_flowUnsaved.bUpdatingGameflow
AND GET_GAME_TIMER() > g_iDebugPeyoteBlockControllerUntil
#ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_ANIMAL)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("animal_controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("animal_controller") #IF IS_DEBUG_BUILD ,"animal_controller" #ENDIF, MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
#ENDIF
ENDPROC
#IF USE_CLF_DLC
PROC DO_JETPACK_LAUNCH_CHECK
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("jetpack_controller")) = 0)
AND (GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_JP_UNLOCKED))
AND ((NOT IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()) OR g_sjpData.bJPEnabledOnMission)
AND (NOT IS_PED_DEAD_OR_DYING(PLAYER_PED_ID()))
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH(HASH("jetpack_controller") #IF IS_DEBUG_BUILD ,"jetpack_controller" #ENDIF)
ENDIF
ENDPROC
#ENDIF
PROC DO_PI_MENU_LAUNCH_CHECKS()
//add terminate conditions in here
#IF USE_CLF_DLC
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_CLF_TRAIN)
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("PI_MENUCLF")) = 0)
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("PI_MENUCLF") #IF IS_DEBUG_BUILD ,"PI_MENUCLF" #ENDIF )
ENDIF
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_NRM_SUR_START)
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("PI_MENUNRM")) = 0)
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("PI_MENUNRM") #IF IS_DEBUG_BUILD ,"PI_MENUNRM" #ENDIF )
ENDIF
ENDIF
#ENDIF
#IF NOT USE_SP_DLC
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_PIMENU_ACTIVATE)
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("PIMENU_ACTIVATE")
CASE FHS_EXPIRED
ADD_HELP_TO_FLOW_QUEUE("PIMENU_ACTIVATE", FHP_LOW,60000)
BREAK
CASE FHS_DISPLAYED
// Autosave and terminate script
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_PIMENU_ACTIVATE)
BREAK
ENDSWITCH
ENDIF
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("PI_MENU")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("PI_MENU") #IF IS_DEBUG_BUILD ,"PI_MENU" #ENDIF,MULTIPLAYER_MISSION_STACK_SIZE)
ENDIF
ENDIF
#ENDIF
ENDPROC
PROC DO_COUNTRY_RACE_CONTROLLER_LAUNCH_CHECKS()
#IF NOT USE_SP_DLC
//CGtoNG only content.
IF IS_LAST_GEN_PLAYER()
IF NOT GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_COUNTRY_RACE))
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_TREVOR_1)
IF NOT g_savedGlobals.sCountryRaceData.bTextRegistered
Execute_Code_ID(CID_ACTIVATE_MINIGAME_COUNTRY_RACE, 0)
ENDIF
//Fix for 2820744: It is possible we register the text message from Trevor to unlock the MG but
//the player chooses to kill Trevor before it sends. At this point the MG would never unlock.
//Detect this situation and auto unlock it.
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_TREVOR_KILLED)
CPRINTLN(DEBUG_FLOW, "Detected player killed Trevor without Country Races being unlocked. Unlocking.")
Execute_Code_ID(CID_COUNTRY_RACE_TEXT_RECEIVED, 0)
ENDIF
ENDIF
ELSE
IF NOT IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_MINIGAME)
IF NOT IS_MISSION_AVAILABLE(SP_MISSION_CHINESE_2)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), g_GameBlips[STATIC_BLIP_MINIGAME_COUNTRY_RACE].vCoords[0]) < 90000 // 300^2
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("country_race_controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("country_race_controller") #IF IS_DEBUG_BUILD ,"country_race_controller" #ENDIF)
ENDIF
ELSE
//If the player is away from the trigger and the controller isn't running, set blip active.
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("country_race_controller")) = 0
IF g_savedGlobals.sCountryRaceData.bDisrupted
g_savedGlobals.sCountryRaceData.bDisrupted = FALSE
ENDIF
IF g_savedGlobals.sCountryRaceData.bRaceJustCompleted
g_savedGlobals.sCountryRaceData.bRaceJustCompleted = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_COUNTRY_RACE))
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Disabling country races minigame as the player is no longer a Last-Gen player.")
SET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_COUNTRY_RACE), FALSE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_COUNTRY_RACE, FALSE)
ENDIF
ENDIF
#ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
PROC DO_FRIENDS_DEBUG_CONTROLLER_CHECKS()
IF g_bDebug_KeepFriendsDebugControllerRunning
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("friends_debug_controller")) = 0
REQUEST_AND_LAUNCH_SCRIPT_WITH_NAME_HASH( HASH("friends_debug_controller"),
#IF IS_DEBUG_BUILD "friends_debug_controller", #ENDIF
CELLPHONE_STACK_SIZE)
ENDIF
ENDIF
ENDPROC
#ENDIF
PROC INITIALISE_SCRIPT_LAUNCH_CHECKS( #IF IS_DEBUG_BUILD WIDGET_GROUP_ID main_widget #ENDIF )
CPRINTLN(DEBUG_SCRIPT_LAUNCH, "Script launch checks initialising.")
#IF IS_DEBUG_BUILD
SET_CURRENT_WIDGET_GROUP(main_widget)
START_WIDGET_GROUP("Script Launch Controller")
ADD_WIDGET_BOOL("Keep player_controller_b running", g_bDebug_KeepPlayerControllerBRunning)
ADD_WIDGET_BOOL("Keep autosave_controller running", g_bDebug_KeepAutoSaveControllerRunning)
ADD_WIDGET_BOOL("Keep respawn_controller running", g_bDebug_KeepRespawnControllerRunning)
ADD_WIDGET_BOOL("Is respawn_controller running", g_bDebug_IsRespawnControllerRunning)
ADD_WIDGET_BOOL("Keep drunk_controller running", g_bDebug_KeepDrunkControllerRunning)
ADD_WIDGET_BOOL("Keep friends_controller running", g_bDebug_KeepFriendsControllerRunning)
ADD_WIDGET_BOOL("Keep friends_debug_controller running", g_bDebug_KeepFriendsDebugControllerRunning)
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(main_widget)
#ENDIF
// Cleanup previous autosave flags
g_sAutosaveData.bRequest = FALSE
g_sAutosaveData.iQueuedRequests = 0
ENDPROC
PROC DO_SCRIPT_LAUNCH_CHECKS(ScriptLaunchVars &sVars)
IF sVars.bFirstSpawnDone
//Don't check during a debug launch.
//Schedule a set of checks per frame.
SWITCH sVars.iLaunchCheckStage
CASE 0
DO_MISSION_TRIGGERER_CHECKS()
DO_PLAYER_CONTROLLER_B_CHECKS()
DO_PI_MENU_LAUNCH_CHECKS()
DO_COUNTRY_RACE_CONTROLLER_LAUNCH_CHECKS()
#IF NOT USE_SP_DLC
DO_FRIENDS_CONTROLLER_CHECKS()
DO_BLIMP_LAUNCH_CHECKS()
#ENDIF
BREAK
CASE 1
DO_AUTOSAVE_CONTROLLER_CHECKS()
DO_WARDROBE_SCRIPT_CHECKS(sVars)
DO_MODEL_SUPPRESS_CHECKS()
DO_MISSION_REPEAT_CHECKS()
DO_ANIMAL_CONTROLLER_LAUNCH_CHECKS()
BREAK
CASE 2
DO_FLOW_HELP_CHECKS()
DO_COMMS_CONTROLLER_CHECKS()
DO_REPLAY_CONTROLLER_CHECKS()
DO_SAVE_ANYWHERE_CHECKS()
#IF USE_NRM_DLC
DO_ENVIRO_LAUNCH_CHECK()
#ENDIF
#IF USE_CLF_DLC
DO_JETPACK_LAUNCH_CHECK()
#ENDIF
#IF NOT USE_SP_DLC
DO_BOOTY_CALL_HANDLER_CHECKS()
#ENDIF
BREAK
CASE 3
#IF NOT USE_SP_DLC
DO_AMBIENT_UFOS_LAUNCH_CHECKS()
DO_RC_CONTROLLER_CHECKS()
DO_RACE_CONTROLLER_CHECKS()
DO_AMBIENT_SOLOMON_LAUNCH_CHECKS()
DO_PHOTOGRAPHY_WILDLIFE_LAUNCH_CHECKS()
DO_PHOTOGRAPHY_MONKEY_LAUNCH_CHECKS()
#ENDIF
DO_CABLECAR_LAUNCH_CHECKS()
DO_MINIGAME_LAUNCH_CHECKS()
BREAK
ENDSWITCH
sVars.iLaunchCheckStage++
IF sVars.iLaunchCheckStage > 3
sVars.iLaunchCheckStage = 0
ENDIF
#IF IS_DEBUG_BUILD
#IF NOT USE_SP_DLC
DO_FRIENDS_DEBUG_CONTROLLER_CHECKS()
#ENDIF
#ENDIF
//Check during a debug launch.
DO_CODE_CONTROLLER_CHECKS()
DO_RESPAWN_CONTROLLER_CHECKS()
#IF FEATURE_SP_DLC_DIRECTOR_MODE
DO_DIRECTOR_MODE_CHECKS(sVars)
#ENDIF
//Wait until the player has spawned the first time before
//running checks. Might be returning from dead MP player.
ELIF NOT IS_PED_INJURED(PLAYER_PED_ID())
sVars.bFirstSpawnDone = TRUE
ENDIF
ENDPROC