Files
gtav-src/script/dev_ng/singleplayer/scripts/Minigames/Trafficking/controller_Trafficking.sch
T
2025-09-29 00:52:08 +02:00

260 lines
7.9 KiB
Scheme
Executable File

// controller_Trafficking.sch
USING "commands_script.sch"
USING "globals.sch"
USING "flow_public_core.sch"
USING "flow_public_core_override.sch"
USING "mission_control_public.sch"
USING "replay_public.sch"
USING "commands_task.sch"
USING "rich_presence_public.sch"
CONST_FLOAT TRAF_CONTROLLER_UPDATE_DIST2 62500.0 // 250m2 is when the controller will begin updating.
CONST_FLOAT TRAF_UPDATE_DIST2 50625.0 // 225m2 is when the actual segments of the controller think you're in range.
ENUM TRAFFICKING_STATE
TKS_INIT = 0,
TKS_AREA_WAIT,
TKS_STREAM,
TKS_STREAM_WAIT,
TKS_LAUNCH_WAIT,
TKS_CUTSCENE,
TKS_LAUNCH,
TKS_RUN_WAIT,
TKS_WAIT_FOR_FAILSCREEN_REPLAY,
TKS_LEAVE_WAIT
ENDENUM
// **** CONTROLLER GLOBALS ****
PED_INDEX pedPlayer
VEHICLE_INDEX vehToSave
THREADID traffickingThread
FLOAT fDist2ToLauncher = 9999999.9
VECTOR vLaunchCoords = <<2134.06, 4780.69, 41.664>>
INT iMissionCandidateID = NO_CANDIDATE_ID
BOOL bTriggerWeaponsReset = FALSE
BOOL bSwitchInProgress = FALSE
// TEMP!!! - REMOVE LATER
BOOL bTempBool[6]
BOOL bRequestedLaunchedTrafficking
BOOL bOkayToKeepBlipsActive = FALSE
// **** CONTROLLER CORE FUNCTIONALITY ****
FUNC BOOL IS_TRAFFICKING_ACTIVE()
IF (g_savedGlobals.sFlow.isGameflowActive)
// IF GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_TRAFFICKING_AIR))
// PRINTLN("MINIGAME_TRAFFICKING_AIR IS ACTIVE")
// ELSE
// PRINTLN("MINIGAME_TRAFFICKING_AIR IS NOT ACTIVE")
// ENDIF
// IF GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_TRAFFICKING_GROUND))
// PRINTLN("MINIGAME_TRAFFICKING_GROUND IS ACTIVE")
// ELSE
// PRINTLN("MINIGAME_TRAFFICKING_GROUND IS NOT ACTIVE")
// ENDIF
RETURN ( GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_TRAFFICKING_AIR))
AND GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_TRAFFICKING_GROUND)))
ELSE
// PRINTLN("DEBUG - TRAFFICKING ACTIVE")
// We're in debug, but that shouldn't stop the fun.
RETURN TRUE
ENDIF
// PRINTLN("FAILING HERE - IS_TRAFFICKING_ACTIVE")
RETURN FALSE
ENDFUNC
FUNC BOOL TRAFFICKING_CONTROLLER_SHOULD_UPDATE()
// Don't update if the flowfalg is inactive.
IF NOT IS_TRAFFICKING_ACTIVE()
// PRINTLN("TRAFFICKING IS NOT ACTIVE")
RETURN FALSE
ENDIF
IF NOT bRequestedLaunchedTrafficking
IF Get_Player_Timetable_Scene_In_Progress() = PR_SCENE_T6_TRAF_AIR
// PRINTLN("WE'RE SWITCHING - GO AHEAD AND RETURN TRUE")
RETURN TRUE
ENDIF
IF NOT CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_MINIGAME)
// PRINTLN("NEW CHECK FAIL")
RETURN FALSE
ENDIF
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Traffick_Ground")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Traffick_Air")) = 1)
// PRINTLN("WE'RE STILL RUNNING AIR OR GROUND")
RETURN TRUE
ENDIF
// Don't update if the player is dead.
pedPlayer = PLAYER_PED_ID()
IF IS_ENTITY_DEAD(pedPlayer)
// We don't do this anymore. Controller needs to run despite death to handle replays.
// RETURN FALSE
ENDIF
// need to process if we're setting up a replay
IF IS_REPLAY_BEING_PROCESSED()
PRINTLN("IS_REPLAY_BEING_PROCESSED IS TRUE")
RETURN TRUE
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
// PRINTLN("We're not TREVOR, exiting early.")
RETURN FALSE
ENDIF
IF NOT IS_IT_SAFE_TO_TRIGGER_SCRIPT_TYPE(ST_MINIGAME)
IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
bOkayToKeepBlipsActive = TRUE
// PRINTLN("bOkayToKeepBlipsActive = TRUE - 01")
ENDIF
IF NOT IS_PLAYER_READY_FOR_CUTSCENE(PLAYER_ID())
bOkayToKeepBlipsActive = TRUE
// PRINTLN("bOkayToKeepBlipsActive = TRUE - 02")
ENDIF
IF IS_PED_IN_COMBAT(PLAYER_PED_ID())
// PRINTLN("PED IS IN COMBAT")
ENDIF
IF NOT IS_PLAYER_READY_FOR_CUTSCENE(PLAYER_ID())
// PRINTLN("PLAYER IS NOT READY FOR CUTSCENE")
ENDIF
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
// PRINTLN("PED HAS WANTED LEVEL GREATER THAN ZERO 01")
ENDIF
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(),0)
// PRINTLN("PED HAS WANTED LEVEL GREATER THAN ZERO 02")
ENDIF
IF IS_ENTITY_IN_AIR(PLAYER_PED_ID())
// PRINTLN("PLAYER IS IN THE AIR")
ENDIF
IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
// PRINTLN("PLAYER IS GETTING INTO A VEHICLE")
ENDIF
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
// PRINTLN("PED IS RAGDOLLING")
ENDIF
IF IS_PLAYER_BEING_ARRESTED(PLAYER_ID())
// PRINTLN("PED IS BEING ARRESTED")
ENDIF
IF IS_PLAYER_CLIMBING(PLAYER_ID())
// PRINTLN("PED IS CLIMBING")
ENDIF
IF g_bPlayerIsInTaxi
// PRINTLN("PLAYER IS IN TAXI")
ENDIF
IF g_bIsOnRampage
// PRINTLN("PLAYER IS IN RAMPAGE")
ENDIF
IF IS_TRANSITION_ACTIVE()
// PRINTLN("SP<->MP TRANSITION IS ACTIVE")
ENDIF
IF IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD)
// PRINTLN("SCRIPT HUD IS DISPLAYING")
ENDIF
IF IS_RESULT_SCREEN_DISPLAYING()
// PRINTLN("RESULT SCREEN IS DISPLAYING - GO AHEAD AND RETURN TRUE") // To Fix Bug # 1475703
RETURN TRUE
ENDIF
RETURN FALSE
ELSE
bOkayToKeepBlipsActive = FALSE
// PRINTLN("SETTING bOkayToKeepBlipsActive TO FALSE")
ENDIF
// PRINTLN("WE'RE GOOD TO UPDATE")
// Passed all checks.
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Generic function that'll be called during the launch wait part of a controller.
/// Basically, checks to see if we need to clean and go to a holding state to wait for the player to be able to relaunch.
FUNC BOOL TRAFFICKING_SHOULD_CLEAN_AND_WAIT()
// If there's a mission running, and it's not us, and it's not a cleared mission, we should not update.
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_MINIGAME)
// There are several missions for which we should not clean up.
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Trevor2")) = 1)
IF NOT bTempBool[0]
PRINTLN("MISSION RUNNING - Trevor2, BUT WE'RE STILL OKAY TO RUN!!!")
bTempBool[0] = TRUE
ENDIF
RETURN FALSE
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("finale_heist2b")) = 1)
IF NOT bTempBool[1]
PRINTLN("MISSION RUNNING - finale_heist2b, BUT WE'RE STILL OKAY TO RUN!!!")
bTempBool[1] = TRUE
ENDIF
RETURN FALSE
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Traffick_Air")) = 1)
IF NOT bTempBool[2]
PRINTLN("MISSION RUNNING - Traffick_Air, BUT WE'RE STILL OKAY TO RUN!!!")
bTempBool[2] = TRUE
ENDIF
RETURN FALSE
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Traffick_Ground")) = 1)
IF NOT bTempBool[3]
PRINTLN("MISSION RUNNING - Traffick_Ground, BUT WE'RE STILL OKAY TO RUN!!!")
bTempBool[3] = TRUE
ENDIF
RETURN FALSE
ENDIF
IF g_bLaunchMinigameReplay
RETURN FALSE
ENDIF
IF (iMissionCandidateID != NO_CANDIDATE_ID)
// PRINTLN("RETURNING FALSE - NO_CANDIDATE_ID")
RETURN FALSE
ENDIF
IF Get_Player_Timetable_Scene_In_Progress() = PR_SCENE_T6_TRAF_AIR
// PRINTLN("WE'RE SWITCHING - BUT WE'RE STILL OKAY TO RUN!!!")
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
// We're good to continue, no need to clean and go into a holding pattern.
RETURN FALSE
ENDFUNC
PROC HANDLE_VEHICLE_STORING()
MODEL_NAMES mnToTest
IF NOT DOES_ENTITY_EXIST(vehToSave)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vLaunchCoords) < 2500 // 50m
vehToSave = GET_PLAYERS_LAST_VEHICLE()
// PRINTLN("GRABBING THE PLAYER'S LAST VEHICLE")
IF DOES_ENTITY_EXIST(vehToSave)
mnToTest = GET_ENTITY_MODEL(vehToSave)
IF mnToTest = DUNE
PRINTLN("IT THINKS THE DUNE IS THE LAST VEHICLE")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// PRINTLN("GOT A CAR")
ENDIF
ENDPROC