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

864 lines
27 KiB
Python
Executable File

USING "globals.sch"
USING "rage_builtins.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "cellphone_public.sch"
USING "context_control_public.sch"
//USING "flow_help_public.sch"
USING "net_stat_tracking.sch"
USING "freemode_events_header.sch"
/*
. Have an overall controller that is constantly running in the background
. Scripts register with the controller when their object is available to be triggered
. Registration includes a priority and a help message string
. When L1 is pressed the controller lets an object trigger
. The object informs controller when it is no longer available to be triggered
. Include some debug output so we can get a handle on issues that crop up
. Be wary of scripts that register but forget to unregister
. Provide helper functions like, "is player heading within this angle of this vector"
*/
ENUM CONTEXT_CONTROLLER_STATE
WAITING_FOR_BUTTON_PRESS,
//WAITING_FOR_HELD_COUNTER,
BUTTON_PRESSED_WAITING_FOR_HANDLING,
BUTTON_HANDLING_IN_PROGRESS
ENDENUM
BOOL bPrintanHalp = FALSE
BOOL bPrintanSubMode = FALSE
BOOL bPrintPlayerName
TEXT_LABEL tPrintanLabel
TEXT_LABEL_63 tPrintanSub
INT iPrintanStyle
BOOL bMPAtmStartGamertagFromHandle = FALSE
INT iGetNameState = 0
INT iAtmRequestId = -1
PROC GHETTO_HELP_PRINTAN()
IF NOT bPrintanHalp
EXIT
ENDIF
BOOL bPlaySound = TRUE
IF (iPrintanStyle = ENUM_TO_INT(CS_EVENTS))
bPlaySound = FALSE
ENDIF
IF bPrintanSubMode
IF bPrintPlayerName
ADD_NEXT_MESSAGE_TO_PREVIOUS_BRIEFS(FALSE) // 2823310
ENDIF
BEGIN_TEXT_COMMAND_DISPLAY_HELP(tPrintanLabel)
IF bPrintPlayerName
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(tPrintanSub)
ELSE
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_strContextButton)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(tPrintanSub)
ENDIF
END_TEXT_COMMAND_DISPLAY_HELP(HELP_TEXT_SLOT_STANDARD, FALSE, bPlaySound,50)
//PRINTLN("GHETTO CONTEXT HELP PRINTING SUBSTRING")
ELSE
BEGIN_TEXT_COMMAND_DISPLAY_HELP(tPrintanLabel)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_strContextButton)
END_TEXT_COMMAND_DISPLAY_HELP(HELP_TEXT_SLOT_STANDARD, FALSE, bPlaySound,50)
//PRINTLN("GHETTO CONTEXT HELP PRINTING")
ENDIF
// Set the style
SWITCH iPrintanStyle
CASE 0 // CS_DEFAULT
BREAK
CASE 1 // CS_EVENTS
SET_FREEMODE_EVENT_HELP_BACKGROUND(FALSE)
BREAK
CASE 2 // CS_GANG_BOSS
GB_SET_GANG_BOSS_HELP_BACKGROUND(FALSE)
BREAK
ENDSWITCH
ENDPROC
PROC PRINT_GHETTO_HELP(TEXT_LABEL lbl, INT contextStyle)
tPrintanLabel = lbl
bPrintanHalp = TRUE
bPrintanSubMode = FALSE
iPrintanStyle = contextStyle
PRINTLN("GHETTO CONTEXT HELP SHOW")
ENDPROC
PROC PRINT_GHETTO_HELP_WITH_SUBSTRINGS(TEXT_LABEL lbl, TEXT_LABEL_63 adit, INT contextStyle, BOOL isPlayerName)
tPrintanLabel = lbl
tPrintanSub = adit
bPrintanHalp = TRUE
bPrintanSubMode = TRUE
iPrintanStyle = contextStyle
bPrintPlayerName = isPlayerName
CPRINTLN(DEBUG_AMBIENT, "PRINT_GHETTO_HELP_WITH_SUBSTRINGS tPrintanSub = ", tPrintanSub, ", bPrintPlayerName = ", bPrintPlayerName)
ENDPROC
PROC CLEAR_GHETTO_HELP()
If g_iCurrentlyDisplayingContextINDEX != -1 OR bPrintanHalp
bPrintanHalp = FALSE
g_iCurrentlyDisplayingContextINDEX = -1
PRINTLN("GHETTO CONTEXT HELP CLEARED")
ENDIF
ENDPROC
// ===========================================================================================================
// Cleanup
// ===========================================================================================================
// PURPOSE: Ensures that the script gets a chance to cleanup under specific circumstances (ie: moving from SP to MP)
//
PROC Script_Cleanup()
// CURRENTLY NOTHING TO CLEANUP
TERMINATE_THIS_THREAD()
ENDPROC
PROC CHECK_CONTEXT_ENTRIES_FOR_DEAD_SCRIPTS(INT &topPrioIndex)
INT i = 0
REPEAT MAX_CONTEXT_INTENTION i
IF g_IntentionList[i].bUsed AND g_IntentionList[i].bActive
IF g_IntentionList[i].RegisteredBy != NULL
IF NOT IS_THREAD_ACTIVE(g_IntentionList[i].RegisteredBy)
PRINTLN("CHECK_CONTEXT_ENTRIES_FOR_DEAD_SCRIPTS removing trigger due to script end")
IF topPrioIndex > -1
CLEAR_GHETTO_HELP()
//IF IS_CONTEXT_INTENTION_HELP_DISPLAYING(topPrioIndex,TRUE)
// //PRINTLN("Context controller clearing help")
// //CLEAR_HELP()
// //WAIT(50)
//ENDIF
//this is now supported functionality because I'm tired of getting bugs about this
//SCRIPT_ASSERT("CHECK_CONTEXT_ENTRIES_FOR_DEAD_SCRIPTS: active context intention belonging to dead script had priority! This is ignorable")
PRINTLN("CHECK_CONTEXT_ENTRIES_FOR_DEAD_SCRIPTS removed the top priority index ")
ENDIF
g_IntentionList[i].bUsed = FALSE
g_IntentionList[i].RegisteredBy = NULL
g_IntentionList[i].bUsed = FALSE
g_IntentionList[i].bActive = FALSE
g_IntentionList[i].bAccepted = FALSE
g_IntentionList[i].iPriority = 0
g_IntentionList[i].bToBeDeleted = FALSE
g_IntentionList[i].bNoString = FALSE
g_IntentionList[i].iStyle = 0
topPrioIndex = -1
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
FUNC INT GET_HIGHEST_USED_INDEX()
INT i = 0
INT iTopPrio = -1
INT iTopPrioIndex = -1
REPEAT MAX_CONTEXT_INTENTION i
IF g_IntentionList[i].bUsed
//IF (NOT g_IntentionList[i].bToBeDeleted) AND (NOT g_IntentionList[i].)
IF g_IntentionList[i].iPriority > iTopPrio
iTopPrioIndex = i
iTopPrio = g_IntentionList[i].iPriority
ENDIF
//ENDIF
ENDIF
ENDREPEAT
RETURN iTopPrioIndex
ENDFUNC
//INT iCurrentlyDisplayingContext = -1
PROC ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
CLEAR_GHETTO_HELP()
g_iCurrentlyDisplayingContextINDEX = -1
/*
IF g_iCurrentlyDisplayingContextINDEX > -1
PRINTLN("Context controller trying to remove currently displayed help with array index ",g_iCurrentlyDisplayingContextINDEX)
IF IS_CONTEXT_INTENTION_HELP_DISPLAYING(g_iCurrentlyDisplayingContextINDEX,TRUE)
PRINTLN("Context controller cleared help for index ",g_iCurrentlyDisplayingContextINDEX)
CLEAR_GHETTO_HELP()
ELSE
PRINTLN("Context controller detected that ID ",g_iCurrentlyDisplayingContextINDEX, " was not displaying!")
ENDIF
g_iCurrentlyDisplayingContextINDEX = -1
ENDIF
*/
ENDPROC
FUNC BOOL CAN_SHOW_MY_HELP(INT myHelpIndex)
//IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_OFF_MISSION)
// IF NOT IS_FLOW_HELP_QUEUE_EMPTY()
// RETURN FALSE
// ENDIF
//ENDIF
if g_bTriggerSceneBlockHelp
and g_bTriggerSceneActive
CPRINTLN(DEBUG_FLOW_HELP, "Could not start help text because the player is in 7.5m of mission trigger blip.")
RETURN FALSE
endif
IF myHelpIndex > 0
IF IS_CONTEXT_INTENTION_HELP_DISPLAYING(myHelpIndex,TRUE) OR bPrintanHalp
//PRINTLN("CAN_SHOW_MY_HELP: Context can override it's own messages")
RETURN TRUE //can override itself
ENDIF
ENDIF
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
AND (NOT HAS_SCRIPT_HIDDEN_HELP_THIS_FRAME())
INT i
REPEAT MAX_CONTEXT_INTENTION i
IF IS_CONTEXT_INTENTION_HELP_DISPLAYING(i, TRUE)
PRINTLN("CAN_SHOW_MY_HELP: Context can override other context intention messages")
RETURN TRUE //can override other context help text
ENDIF
ENDREPEAT
PRINTLN("Context help cannot display because another help is on screen, if this is spamming and no help is visible it means IS_HELP_MESSAGE_BEING_DISPLAYED is broken, bug 'Default UI Code' about this")
RETURN FALSE //not allowed to override other help messages
ENDIF
RETURN TRUE
ENDFUNC
PROC REMOVE_CONTEXT_ENTRIES_PENDING_DELETE()
INT i = 0
REPEAT MAX_CONTEXT_INTENTION i
IF g_IntentionList[i].bToBeDeleted
IF i = g_iCurrentlyDisplayingContextINDEX
ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
ENDIF
g_IntentionList[i].RegisteredBy = NULL
g_IntentionList[i].bUsed = FALSE
g_IntentionList[i].bActive = FALSE
g_IntentionList[i].bAccepted = FALSE
g_IntentionList[i].iPriority = 0
g_IntentionList[i].bToBeDeleted = FALSE
g_IntentionList[i].bNoString = FALSE
g_IntentionList[i].iID = -1
g_IntentionList[i].iStyle = 0
PRINTLN("REMOVE_CONTEXT_ENTRIES_PENDING_DELETE: Deleted context entry ", i)
ENDIF
ENDREPEAT
ENDPROC
FUNC INT COUNT_ACTIVE_CONTEXT_ENTRIES()//only call in handling mode
INT i = 0
INT c = 0
REPEAT MAX_CONTEXT_INTENTION i
IF g_IntentionList[i].bUsed = TRUE
IF g_IntentionList[i].bActive = FALSE
++c
ENDIF
ENDIF
ENDREPEAT
IF c = 0
PRINTLN("Context controller detected no entries active in handling mode, attempt dropback and help clear")
ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
ENDIF
RETURN c
ENDFUNC
FUNC BOOL IS_CONTEXT_INTENTION_ACCEPTED(int h)
IF h < 0
RETURN FALSE
ENDIF
IF g_IntentionList[h].bAccepted
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC RESET_CONTEXT_SYSTEM_GLOBALS()
g_bSuppressContextHelpDuringHandling = FALSE
g_bSuppressContextActionsThisFrame = FALSE
b_SuppressContextHelpNextUpdate = FALSE
g_iContextIntentionIDGenerator = 1
g_iCurrentlyDisplayingContextINDEX = -1
INT afdg = 0
REPEAT MAX_CONTEXT_INTENTION afdg
g_IntentionList[afdg].bUsed = FALSE
ENDREPEAT
ENDPROC
PROC ResetATMNameVars()
g_iMPAtmLogEntryPendingIndex = -1
bMPAtmStartGamertagFromHandle = FALSE
iAtmRequestId = -1
iGetNameState = 0
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: ResetATMNameVars called")
ENDPROC
/// PURPOSE:
/// Due to 1627644 this had to happen in another script than main
PROC DO_CHECK_FOR_ATM_NAME_PROCESS()
IF g_iMPAtmLogEntryPendingIndex != -1
//Text lable
//g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedATM.LogSourceNames[g_iMPAtmLogEntryPendingIndex] =
GAMER_HANDLE hGamer[1]
hGamer[0].Data1 = g_iMPAtmLogHandle[0]
hGamer[0].Data2 = g_iMPAtmLogHandle[1]
hGamer[0].Data3 = g_iMPAtmLogHandle[2]
hGamer[0].Data4 = g_iMPAtmLogHandle[3]
hGamer[0].Data5 = g_iMPAtmLogHandle[4]
hGamer[0].Data6 = g_iMPAtmLogHandle[5]
hGamer[0].Data7 = g_iMPAtmLogHandle[6]
hGamer[0].Data8 = g_iMPAtmLogHandle[7]
hGamer[0].Data9 = g_iMPAtmLogHandle[8]
hGamer[0].Data10 = g_iMPAtmLogHandle[9]
hGamer[0].Data11 = g_iMPAtmLogHandle[10]
hGamer[0].Data12 = g_iMPAtmLogHandle[11]
hGamer[0].Data13 = g_iMPAtmLogHandle[12]
IF IS_XBOX360_VERSION()
OR IS_XBOX_PLATFORM()
IF NOT bMPAtmStartGamertagFromHandle
IF NETWORK_GAMERTAG_FROM_HANDLE_START(hGamer[0])
bMPAtmStartGamertagFromHandle = TRUE
ENDIF
ENDIF
IF bMPAtmStartGamertagFromHandle
IF NETWORK_GAMERTAG_FROM_HANDLE_PENDING()
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: Waiting for network handle")
ELSE
IF NETWORK_GAMERTAG_FROM_HANDLE_SUCCEEDED()
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedATM.LogSourceNames[g_iMPAtmLogEntryPendingIndex] = NETWORK_GET_GAMERTAG_FROM_HANDLE(hGamer[0])
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: Got XBL gamer handle, string in from handle '",NETWORK_GET_GAMERTAG_FROM_HANDLE(hGamer[0]),"' stored string '",g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedATM.LogSourceNames[g_iMPAtmLogEntryPendingIndex] ,"' to ", g_iMPAtmLogEntryPendingIndex)
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: Failed to set log event player name. NETWORK_GAMERTAG_FROM_HANDLE_SUCCEEDED false")
#ENDIF
ENDIF
ResetATMNameVars()
ENDIF
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: Failed to set log event player name. NETWORK_GAMERTAG_FROM_HANDLE_START false")
#ENDIF
ENDIF
ELIF IS_PS3_VERSION()
OR IS_PLAYSTATION_PLATFORM()
IF IS_GAMER_HANDLE_VALID(hGamer[0])
TEXT_LABEL_63 tlGamerNames[1]
SWITCH iGetNameState
CASE 0
iAtmRequestId = NETWORK_DISPLAYNAMES_FROM_HANDLES_START(hGamer, 1)
IF iAtmRequestId >= 0
iGetNameState += 1
PRINTLN("[CORONA] MAINTAIN_LAST_GANG_OPS_HEIST_PLAYERS - lastGangOpsHeistPlayers.iGamertagRequestID = ", lastGangOpsHeistPlayers.iGamertagRequestID, ". Progressing to pending (1).")
ENDIF
BREAK
CASE 1
INT iNameState
// Grab our status for pending gamertags / names
iNameState = NETWORK_GET_DISPLAYNAMES_FROM_HANDLES(iAtmRequestId, tlGamerNames, 1)
SWITCH iNameState
// Fail
CASE -1
ResetATMNameVars()
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: PSN - failed")
BREAK
// Success
CASE 0
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedATM.LogSourceNames[g_iMPAtmLogEntryPendingIndex] = tlGamerNames[0]
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: Got PSN gamer handle, string in from handle '", tlGamerNames[0],"' stored string '",g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedATM.LogSourceNames[g_iMPAtmLogEntryPendingIndex] ,"' to ", g_iMPAtmLogEntryPendingIndex)
ResetATMNameVars()
BREAK
// Pending
CASE 1
#IF IS_DEBUG_BUILD
IF GET_GAME_TIMER() % 1000 < 75
PRINTLN("[CORONA] DO_CHECK_FOR_ATM_NAME_PROCESS - Pending for g_iMPAtmLogEntryPendingIndex ", g_iMPAtmLogEntryPendingIndex, " - NETWORK_GET_DISPLAYNAMES_FROM_HANDLES() = 1")
ENDIF
#ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ELSE
ResetATMNameVars()
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: PSN - IS_GAMER_HANDLE_VALID = FALSE")
ENDIF
ELSE
IF IS_GAMER_HANDLE_VALID(hGamer[0])
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedATM.LogSourceNames[g_iMPAtmLogEntryPendingIndex] = NETWORK_MEMBER_ID_FROM_GAMER_HANDLE(hGamer[0])
PRINTLN("DO_CHECK_FOR_ATM_NAME_PROCESS: Got PC gamer handle, string in from handle '",NETWORK_MEMBER_ID_FROM_GAMER_HANDLE(hGamer[0]),"' stored string '",g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedATM.LogSourceNames[g_iMPAtmLogEntryPendingIndex] ,"' to ", g_iMPAtmLogEntryPendingIndex)
ENDIF
ResetATMNameVars()
ENDIF
ENDIF
ENDPROC
PROC MINUS_MONEY_FIX()// to fix players already afflicted by 1643668 after title update
BOOL bFixed = FALSE
INT i = 0
REPEAT MAX_BANK_ACCOUNTS i
IF g_BankAccounts[i].iBalance < 0
g_BankAccounts[i].iBalance = 0
bFixed = TRUE
ENDIF
ENDREPEAT
IF bFixed
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_MICHAEL)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_FRANKLIN)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_TREVOR)
ENDIF
ENDPROC
PROC DO_CHECK_FOR_BROWSER_SWITCH_BACK_FROM_SHOP()
IF (NOT IS_PLAYER_SWITCH_IN_PROGRESS()) AND (NOT IS_BROWSER_OPEN())
IF SHOULD_TRANSITION_SESSION_RESTORE_SHOP_STATE_ON_RESPAWN(FALSE)
PRINTLN("Freemode restoring shop state triggered")
IF NOT IS_STRING_NULL_OR_EMPTY(g_sTransitionSessionData.sEndReserve.stMPBrowserFromShopSite)
PRINTLN("Freemode e starting web browser triggered")
CLEAR_TRANSITION_SESSION_RESTORE_SHOP_STATE_ON_RESPAWN()
START_BROWSER(SBSS_SHOP_RESTORE)
ENDIF
ENDIF
ENDIF
ENDPROC
SCRIPT
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("context_controller")) > 1
PRINTLN("Context controller detected duplicate of itself, bailing.")
TERMINATE_THIS_THREAD()
ENDIF
// This script needs to cleanup only when the game moves from SP to MP
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
CONTEXT_CONTROLLER_STATE currentState = WAITING_FOR_BUTTON_PRESS
CONTEXT_CONTROLLER_STATE lastState = currentState
SETTIMERA(0)
g_ContextResetForced = FALSE
RESET_CONTEXT_SYSTEM_GLOBALS()
//start listening for left hold
g_strContextButton = "CC_SUBSTR"//PAD_DPAD_RIGHT
//if no responses have been awarded access
//if there are any registered listeners
//parse for priority and award response to highest
//while response is allowable
//show help text for relevant response
INT highestUsed = -1
INT lastHighestUsed = -1
BOOL bIDisabledHeadlights = FALSE
BOOL bIDisabledRoof = FALSE
BOOL bRefireStopper = FALSE
INT waitingOnID = -1
BOOL mpmodeDetection = g_bInMultiplayer
WHILE TRUE
//atm name processing trigger
IF g_bInMultiplayer
DO_CHECK_FOR_ATM_NAME_PROCESS()
ELSE
MINUS_MONEY_FIX()//1643668
ENDIF
DO_CHECK_FOR_BROWSER_SWITCH_BACK_FROM_SHOP()
#IF IS_DEBUG_BUILD
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("context_controller")) > 1
SCRIPT_ASSERT("Multiple versions of context controller detected running at once! Please pass this bug and log to Default Levels.")
ENDIF
#ENDIF
IF g_bInMultiplayer != mpmodeDetection
PRINTLN("Context controller: detected mp flag changed purging tracking gobals")
ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
RESET_CONTEXT_SYSTEM_GLOBALS()
highestUsed = -1
mpmodeDetection = g_bInMultiplayer
WHILE IS_PLAYER_SWITCH_IN_PROGRESS()
PRINTLN("Context controller: waiting for switch after mp mode change to finish")
WAIT(2000)
ENDWHILE
ENDIF
IF b_SuppressContextHelpNextUpdate
IF g_iCurrentlyDisplayingContextINDEX > -1
//check for refresh
IF (NOT g_IntentionList[g_iCurrentlyDisplayingContextINDEX].bNoString)
IF NOT IS_CONTEXT_INTENTION_HELP_DISPLAYING(g_iCurrentlyDisplayingContextINDEX,TRUE)//check for display with raw index
g_iCurrentlyDisplayingContextINDEX = -1
PRINTLN("context controller: detected current displayed help as not displayed")
ENDIF
ENDIF
//check for change
ENDIF
ENDIF
IF (CONTEXT_CONTROLLER_SUPPRESSION_CONDITIONS())
highestUsed = -1
ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
ENDIF
//maintain help display
IF highestUsed > -1
IF NOT b_SuppressContextHelpNextUpdate
//attempt to show the correct help
IF g_iCurrentlyDisplayingContextINDEX != highestUsed
IF CAN_SHOW_MY_HELP(g_iCurrentlyDisplayingContextINDEX)
ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
IF (NOT g_IntentionList[highestUsed].bAccepted)
AND (g_IntentionList[highestUsed].bUsed)
//Show the help
IF NOT CONTEXT_CONTROLLER_SUPPRESSION_CONDITIONS()
IF (NOT g_IntentionList[highestUsed].bToBeDeleted)
IF (NOT g_IntentionList[highestUsed].bNoString)
IF NOT g_IntentionList[highestUsed].bAdditionalHelp
//PRINT_HELP_FOREVER_WITH_STRING(g_IntentionList[highestUsed].helpLabel, g_strContextButton)
PRINTLN("Context controller displaying help for index: ", highestUsed, " with PRINT_HELP_WITH_STRING, high used index ",highestUsed," previous context ", g_iCurrentlyDisplayingContextINDEX)
PRINT_GHETTO_HELP(g_IntentionList[highestUsed].helpLabel, g_IntentionList[highestUsed].iStyle)
ELSE
/*
BEGIN_TEXT_COMMAND_DISPLAY_HELP(g_IntentionList[highestUsed].helpLabel)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_strContextButton)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_IntentionList[highestUsed].additionalHelpLabel)
END_TEXT_COMMAND_DISPLAY_HELP(HELP_TEXT_SLOT_STANDARD, TRUE, TRUE)
*/
PRINTLN("Context controller displaying help for index: ", highestUsed, " with BEGIN_TEXT_COMMAND_DISPLAY_HELP, high used index ",highestUsed," previous context ", g_iCurrentlyDisplayingContextINDEX)
PRINT_GHETTO_HELP_WITH_SUBSTRINGS(g_IntentionList[highestUsed].helpLabel,g_IntentionList[highestUsed].additionalHelpLabel, g_IntentionList[highestUsed].iStyle, g_IntentionList[highestUsed].subStringIsPlayerName)
ENDIF
g_iCurrentlyDisplayingContextINDEX = highestUsed
// #IF IS_DEBUG_BUILD
// ELSE
// PRINTLN("Context controller: No context help because no string setting")
// #ENDIF
ENDIF
// #IF IS_DEBUG_BUILD
// ELSE
// PRINTLN("Context controller: No context help because to be deleted")
// #ENDIF
ENDIF
// #IF IS_DEBUG_BUILD
// ELSE
// PRINTLN("Context controller: No context help because suppression conditions")
// #ENDIF
ENDIF
//#IF IS_DEBUG_BUILD
//ELSE
//PRINTLN("Context controller: No context help because not used or already accepted")
//#ENDIF
ENDIF
// #IF IS_DEBUG_BUILD
// ELSE
// PRINTLN("Context controller: No context help because can show help failed")
// #ENDIF
ENDIF
ENDIF
ELSE//help is suppressed
ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
ENDIF
ELSE
ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
ENDIF
//maintain button state
SWITCH currentState
CASE WAITING_FOR_BUTTON_PRESS
//PRINTLN("WAITING_FOR_BUTTON_PRESS")
//PRINTLN("context controller(WAITING_FOR_BUTTON_PRESS)")
highestUsed = GET_HIGHEST_USED_INDEX()
IF IS_CONTROL_RELEASED(FRONTEND_CONTROL,INPUT_CONTEXT)
bRefireStopper = TRUE
ENDIF
IF NOT CONTEXT_CONTROLLER_SUPPRESSION_CONDITIONS()
IF highestUsed > -1 AND bRefireStopper
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT)
g_IntentionList[highestUsed].bActive = TRUE
g_IntentionList[highestUsed].bPickedUp = FALSE//used to make "just" mode work
waitingOnID = g_IntentionList[highestUsed].iID
currentState = BUTTON_PRESSED_WAITING_FOR_HANDLING
g_bSuppressContextHelpDuringHandling = FALSE
ENDIF
ENDIF
ELSE
highestUsed = -1 //suppressed, remove
ENDIF
//Context controller now suppresses headlights and car roof
//actions while a context press is available
IF (lastHighestUsed != highestUsed)
//BOOL bIDisabledHeadlights = FALSE
//BOOL bIDisabledRoof = FALSE
IF highestUsed != -1
IF NOT IS_PED_DEAD_OR_DYING(GET_PLAYER_PED(GET_PLAYER_INDEX()))
IF IS_PED_IN_ANY_VEHICLE(GET_PLAYER_PED(GET_PLAYER_INDEX()))
IF IS_CONTROL_ENABLED(PLAYER_CONTROL, INPUT_VEH_ROOF)
bIDisabledRoof = TRUE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ROOF)
ENDIF
IF IS_CONTROL_ENABLED(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
bIDisabledHeadlights = TRUE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
ENDIF
ENDIF
ENDIF
ELSE
IF bIDisabledRoof
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ROOF)
bIDisabledRoof = FALSE
ENDIF
IF bIDisabledHeadlights
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
bIDisabledHeadlights = FALSE
ENDIF
ENDIF
lastHighestUsed = highestUsed
ENDIF
BREAK
CASE BUTTON_PRESSED_WAITING_FOR_HANDLING
//PRINTLN("BUTTON_PRESSED_WAITING_FOR_HANDLING")
IF highestUsed < 0 OR COUNT_ACTIVE_CONTEXT_ENTRIES() = 0//emergency dropback
PRINTLN("context controller(BUTTON_PRESSED_WAITING_FOR_HANDLING) emergency dropback!")
currentState = WAITING_FOR_BUTTON_PRESS
ELSE
IF TIMERA() > 5000
//Timed out
//clear and delete focused since the script that registered it
//apparently doesn't give a crap
g_IntentionList[highestUsed].bToBeDeleted = TRUE
PRINTLN("context_controller: a registered context didn't respond in time, deleting and rechecking.")
//drop back to state
currentState = WAITING_FOR_BUTTON_PRESS
ELSE
//Has the highestUsed been triggered?
PRINTLN("context controller(BUTTON_PRESSED_WAITING_FOR_HANDLING) checking for accept")
IF IS_CONTEXT_INTENTION_ACCEPTED(highestUsed)
currentState = BUTTON_HANDLING_IN_PROGRESS
ENDIF
ENDIF
IF NOT (waitingOnID = g_IntentionList[highestUsed].iID)
PRINTLN("BUTTON_PRESSED_WAITING_FOR_HANDLING waitingOnID is ", waitingOnID, " highestUsed is ",highestUsed, " this index has an ID of ", g_IntentionList[highestUsed].iID)
///SCRIPT_ASSERT("context_controller: In state BUTTON_PRESSED_WAITING_FOR_HANDLING id of waiting context changed! Please pass this bug AND log to Default Levels., thankyou.")
currentState = WAITING_FOR_BUTTON_PRESS
ENDIF
IF g_IntentionList[highestUsed].bToBeDeleted OR g_IntentionList[highestUsed].bUsed = FALSE //it was externally deleted
PRINTLN("context controller(BUTTON_PRESSED_WAITING_FOR_HANDLING) fell back to due to index toDelete flag set or use trigger")
currentState = WAITING_FOR_BUTTON_PRESS //fallback
ENDIF
ENDIF
BREAK
CASE BUTTON_HANDLING_IN_PROGRESS
IF g_bSuppressContextHelpDuringHandling
ATTEMPT_REMOVE_CURRENTLY_DISPLAYED_HELP()
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT)
IF highestUsed > -1
g_IntentionList[highestUsed].bPickedUp = FALSE//used to make "just" mode work
ENDIF
ENDIF
IF(g_ContextResetForced)
//bail
g_ContextResetForced = FALSE
currentState = WAITING_FOR_BUTTON_PRESS
ELSE
IF highestUsed > -1
IF NOT (g_IntentionList[highestUsed].bActive
OR g_IntentionList[highestUsed].bToBeDeleted)
//bail
g_ContextResetForced = FALSE
highestUsed = -1 //force a reselect
ENDIF
ENDIF
ENDIF
IF highestUsed > -1
IF g_IntentionList[highestUsed].bToBeDeleted
OR g_IntentionList[highestUsed].bUsed = FALSE //it was externally deleted
PRINTLN("context controller(BUTTON_HANDLING_IN_PROGRESS) fell back to due to index toDelete flag set or use trigger")
highestUsed = -1
ENDIF
ENDIF
IF highestUsed = -1
PRINTLN("context controller(BUTTON_HANDLING_IN_PROGRESS) fell back to due to highest used being -1")
currentState = WAITING_FOR_BUTTON_PRESS //fallback
bRefireStopper = FALSE
ENDIF
BREAK
ENDSWITCH
//suppress stuff that should be suppressed if any context is active
IF highestUsed > -1
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_TALK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL_TWO)
ENDIF
IF currentState != lastState
PRINTLN("context_controller: state transition (", lastState, " -> ", currentState, ") high index = ", highestUsed)
lastState = currentState
//reset anything that shouldn't carry over states
SETTIMERA(0)
bRefireStopper = FALSE
ENDIF
//prune intentions that are pending deletion
REMOVE_CONTEXT_ENTRIES_PENDING_DELETE()
//check for dead scripts
CHECK_CONTEXT_ENTRIES_FOR_DEAD_SCRIPTS(highestUsed)
g_bSuppressContextActionsThisFrame = FALSE
b_SuppressContextHelpNextUpdate = FALSE
GHETTO_HELP_PRINTAN()
WAIT(0)//there can only be one wait
ENDWHILE
ENDSCRIPT