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

669 lines
22 KiB
Scheme
Executable File

//
// Author: Ben Rollinson Date: 28/03/13
//
//
// GTA V - General Help Message Triggering
//
//
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_audio.sch"
USING "commands_camera.sch"
USING "flow_help_public.sch"
USING "flow_public_game.sch"
USING "Mission_Control_Public.sch"
USING "code_control_public.sch"
TYPEDEF FUNC BOOL HelpCheck()
CONST_INT NUM_CONDITION_PASSES_BEFORE_DISPLAY 5
STRUCT FlowHelpMessageVars
INT iMessageToCheckThisFrame = 0
INT iConditionPassCounter = 0
HelpCheck fpHelpCheck
ENDSTRUCT
/*
GET_CURRENT_WEBPAGE_ID now no longer resets it's value.
It's just a get, but these functions are used all over
*/
FUNC INT GET_CURRENT_WEBSITE_ID_WRAPPED() // END_SCALEFORM_MOVIE_METHOD_INT()
INT raw = GET_CURRENT_WEBSITE_ID()
RETURN raw
ENDFUNC
FUNC BOOL CHECK_CONVERTIBLE_ROOF()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
VEHICLE_INDEX vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(vehPlayer))
IF IS_VEHICLE_A_CONVERTIBLE(vehPlayer)
AND GET_ENTITY_MODEL(vehPlayer) != VOLTIC
CONVERTIBLE_ROOF_STATE eState = GET_CONVERTIBLE_ROOF_STATE(vehPlayer)
IF eState = CRS_RAISED
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_NO_STAMINA()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_PLAYER_SPRINT_TIME_REMAINING(PLAYER_ID()) < 5.0
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_PLAYER_HAVE_MULTIPLE_WEAPONS_IN_A_WEAPON_WHEEL_GROUP()
INT i, iWepGroupIndex
WEAPON_SLOT eWeaponSlot
WEAPON_TYPE eWeaponType
WEAPON_GROUP eWeaponGroup
INT iWeaponsInGroupCount[NUM_PLAYER_PED_WEAPON_GROUPS]
FOR i = 0 TO (ENUM_TO_INT(NUM_WEAPONSLOTS) - 1)
eWeaponSlot = GET_PLAYER_PED_WEAPON_SLOT_FROM_INT(i)
IF eWeaponSlot != WEAPONSLOT_INVALID
eWeaponType = GET_PED_WEAPONTYPE_IN_SLOT(PLAYER_PED_ID(), GET_PLAYER_PED_WEAPON_SLOT_FROM_INT(i))
IF eWeaponType != WEAPONTYPE_INVALID
eWeaponGroup = GET_WEAPONTYPE_GROUP(eWeaponType)
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - eWeaponType is valid : ", eWeaponType, " returned weapon group is :", eWeaponGroup, " i = ", i)
IF eWeaponGroup != WEAPONGROUP_INVALID
//unable to get the weapongroup for unarmed so have to set this based of the weapontype
IF eWeaponType = WEAPONTYPE_UNARMED
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - eWeaponType was unarmed, :", eWeaponType, "set group to WEAPONGROUP_MELEE : ", WEAPONGROUP_MELEE, " i = ", i)
eWeaponGroup = WEAPONGROUP_MELEE
ENDIF
// merge some groups together which appear in the same wheel_ group
SWITCH eWeaponGroup
CASE WEAPONGROUP_FIREEXTINGUISHER
FALLTHRU
CASE WEAPONGROUP_PETROLCAN
eWeaponGroup = WEAPONGROUP_THROWN
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - current eWeaponGroup ", eWeaponGroup, " merged to rWEAPONGROUP_THROWN : ", WEAPONGROUP_THROWN, " i = ", i)
BREAK
CASE WEAPONGROUP_STUNGUN
eWeaponGroup = WEAPONGROUP_PISTOL
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - current eWeaponGroup ", eWeaponGroup, " merged to WEAPONGROUP_PISTOL : ", WEAPONGROUP_PISTOL, " i = ", i)
BREAK
CASE WEAPONGROUP_MG
eWeaponGroup = WEAPONGROUP_SMG
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - current eWeaponGroup ", eWeaponGroup, " merged to WEAPONGROUP_SMG : ", WEAPONGROUP_SMG, " i = ", i)
BREAK
ENDSWITCH
iWepGroupIndex = GET_INT_FROM_PLAYER_PED_WEAPON_GROUP(eWeaponGroup)
// check the returned weapon group index is valid
IF iWepGroupIndex <> -1
iWeaponsInGroupCount[iWepGroupIndex]++
// check if the weapon group now has more than one entry
IF iWeaponsInGroupCount[iWepGroupIndex] > 1
//CDEBUG2LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - DOES_PLAYER_HAVE_MULTIPLE_WEAPONS_IN_A_WEAPON_WHEEL_GROUP - return TRUE, for group : ", iWepGroupIndex, " i = ", i, " Frame Count : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ELSE
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - iWepGroupIndex isn't valid : ", iWepGroupIndex, " i = ", i)
ENDIF
ELSE
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - wep group invalid : ", eWeaponGroup, " i = ", i)
ENDIF
ELSE
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - wep type invalid : ", eWeaponType, " i = ", i)
ENDIF
ELSE
//CDEBUG3LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - wep slot invalid : ", eWeaponSlot, " i = ", i)
ENDIF
ENDFOR
//CDEBUG2LN(DEBUG_FLOW_HELP, "multiWeaponInSlotWheelHelp.sc - DOES_PLAYER_HAVE_MULTIPLE_WEAPONS_IN_A_WEAPON_WHEEL_GROUP - return FALSE", " Frame Count : ", GET_FRAME_COUNT())
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_MULTI_WEAPONS_IN_SLOT()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// detect when the weapon wheel is on screen
IF IS_HUD_COMPONENT_ACTIVE(NEW_HUD_WEAPON_WHEEL)
IF NOT IS_PHONE_ONSCREEN()
AND IS_PED_ON_FOOT(PLAYER_PED_ID()) // Fix B*1061199
IF DOES_PLAYER_HAVE_MULTIPLE_WEAPONS_IN_A_WEAPON_WHEEL_GROUP()
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_VEHICLE_RADIO_HELP_A()
IF IS_PLAYER_PLAYING(PLAYER_ID()) AND (NOT IS_CURRENTLY_ON_MISSION_TO_TYPE())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
VEHICLE_INDEX vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
IF GET_PED_IN_VEHICLE_SEAT(vehPlayer) = PLAYER_PED_ID()
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
IF DOES_PLAYER_VEH_HAVE_RADIO()
//Don't let this help text show if the Simeon call is still queued.
IF NOT IS_COMMUNICATION_REGISTERED(CALL_ARM2_UNLOCK)
and not IS_COMMUNICATION_REGISTERED(CALL_CARDMG_ARM2_UNLOCK)
IF NOT IS_PHONE_ONSCREEN()
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_VEHICLE_RADIO_HELP_B()
IF HAS_ONE_TIME_HELP_DISPLAYED(FHM_VEHICLE_RADIO_A)
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
VEHICLE_INDEX vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
IF GET_PED_IN_VEHICLE_SEAT(vehPlayer) = PLAYER_PED_ID()
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
IF DOES_PLAYER_VEH_HAVE_RADIO()
IF IS_HUD_COMPONENT_ACTIVE(NEW_HUD_RADIO_STATIONS)
//Don't let this help text show if the Simeon call is still queued.
IF NOT IS_COMMUNICATION_REGISTERED(CALL_ARM2_UNLOCK)
and not IS_COMMUNICATION_REGISTERED(CALL_CARDMG_ARM2_UNLOCK)
IF NOT IS_PHONE_ONSCREEN()
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_VEHICLE_ROLLED()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
VEHICLE_INDEX vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
MODEL_NAMES eModel = GET_ENTITY_MODEL(vehPlayer)
IF NOT IS_THIS_MODEL_A_BOAT(eModel)
AND NOT IS_THIS_MODEL_A_HELI(eModel)
AND NOT IS_THIS_MODEL_A_PLANE(eModel)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
IF GET_PED_IN_VEHICLE_SEAT(vehPlayer, VS_DRIVER) = PLAYER_PED_ID()
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_UPSIDEDOWN(vehPlayer)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_OBTAINED_AUTO_PARACHUTE()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
if GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_AIR_VEHICLE_PARACHUTE_UNLOCKED)
VEHICLE_INDEX vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
MODEL_NAMES eModel = GET_ENTITY_MODEL(vehPlayer)
IF IS_THIS_MODEL_A_HELI(eModel)
or IS_THIS_MODEL_A_PLANE(eModel)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
IF GET_PED_IN_VEHICLE_SEAT(vehPlayer, VS_DRIVER) = PLAYER_PED_ID()
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
endif
endif
endif
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_PLAYER_ENTERED_TRAIN_IN_GROUP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
GROUP_INDEX groupPlayer = GET_PLAYER_GROUP(PLAYER_ID())
INT iLeaders, iFollowers
GET_GROUP_SIZE(groupPlayer, iLeaders, iFollowers)
IF iLeaders > 1 OR iFollowers > 0
IF IS_PED_IN_ANY_TRAIN(PLAYER_PED_ID())
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_PLAYER_USING_PROG_AR()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
WEAPON_TYPE eWeapon
IF GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), eWeapon)
IF eWeapon = WEAPONTYPE_DLC_PROGRAMMABLEAR
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_SOCIAL_CLUB_LINK()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_GAME_LINKED_TO_SOCIAL_CLUB(TRUE, TRUE)
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_2)
RETURN TRUE
ENDIF
ELSE
// Linked to social club so stop the checks.
REMOVE_HELP_FROM_FLOW_QUEUE("AM_H_SOCIAL", FALSE)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SOCIAL_CLUB_LINK)
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_FRIEND_ACTIVITY_HELP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF g_savedGlobals.sFriendsData.g_bHelpDoneCanPhoneFriend
OR GET_MISSION_COMPLETE_STATE(SP_MISSION_FAMILY_1)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_ZOOMED_MOVEMENT_HELP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
WEAPON_TYPE eCurrentWeapon
IF GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), eCurrentWeapon)
AND eCurrentWeapon != WEAPONTYPE_INVALID
AND eCurrentWeapon != WEAPONTYPE_UNARMED
AND eCurrentWeapon != WEAPONTYPE_OBJECT
IF GET_WEAPONTYPE_GROUP(eCurrentWeapon) = WEAPONGROUP_SNIPER
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_DRIVEBY_CONTROL_HELP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
VEHICLE_INDEX vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
MODEL_NAMES eModel = GET_ENTITY_MODEL(vehPlayer)
IF IS_THIS_MODEL_A_CAR(eModel)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_TRI_3_UNLOCKED_WHILE_EXILED()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
//Check if player after exile
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MICHAEL_TREVOR_EXILE_FINISHED)
AND (g_savedGlobals.sTriathlonData.eCurrentRaceUnlocked = TRIATHLON_RACE_IRONMAN)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_PLAYER_LOGGED_FOR_STOCKS()
IF NOT IS_PLAYER_ONLINE()
//Numbers for Stock exchange sites
AND (GET_CURRENT_WEBSITE_ID_WRAPPED() = 4)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_FIRST_PERSON_HELP_REMINDER_A()
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_HAS_USED_FP_VIEW)
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_HAS_USED_FP_VIEW, TRUE)
ENDIF
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
IF g_iFlowHelpFirstPersonTimer = -1
g_iFlowHelpFirstPersonTimer = GET_GAME_TIMER()
ELIF (GET_GAME_TIMER() - g_iFlowHelpFirstPersonTimer) > 10000
IF IS_FLOW_HELP_QUEUE_EMPTY()
OR IS_FLOW_HELP_MESSAGE_QUEUED("AM_H_FP1")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ELIF g_iFlowHelpFirstPersonTimer != -1
g_iFlowHelpFirstPersonTimer = -1
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_FIRST_PERSON_HELP_REMINDER_B()
IF HAS_ONE_TIME_HELP_DISPLAYED(FHM_FIRST_PERSON_HELP_REMINDER_A)
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
IF g_iFlowHelpFirstPersonTimer = -1
g_iFlowHelpFirstPersonTimer = GET_GAME_TIMER()
ELIF (GET_GAME_TIMER() - g_iFlowHelpFirstPersonTimer) > 120000
IF IS_FLOW_HELP_QUEUE_EMPTY()
OR IS_FLOW_HELP_MESSAGE_QUEUED("AM_H_FP2")
g_iFlowHelpFirstPersonTimer = -1
RETURN TRUE
ENDIF
ENDIF
ELIF g_iFlowHelpFirstPersonTimer != -1
g_iFlowHelpFirstPersonTimer = -1
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_ROCKSTAR_EDITOR_INTRO_HELP()
#IF USE_REPLAY_RECORDING_TRIGGERS
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
RETURN TRUE
ENDIF
#ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_ROCKSTAR_EDITOR_INTRO_HELP2()
#IF USE_REPLAY_RECORDING_TRIGGERS
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
and HAS_ONE_TIME_HELP_DISPLAYED(FHM_ROCKSTAR_EDITOR_INTRO1)
and IS_SELECTOR_ONSCREEN()
and not HAS_ONE_TIME_HELP_DISPLAYED(FHM_ROCKSTAR_EDITOR_INTRO2)
RETURN TRUE
ENDIF
#ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CHECK_HYDRAULICS_HELP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
VEHICLE_INDEX vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
//IF GET_ENTITY_MODEL(vehPlayer) = BUCCANEER2
IF IS_VEHICLE_A_SUPERMOD_MODEL(GET_ENTITY_MODEL(vehPlayer), SUPERMOD_FLAG_HAS_HYDRAULICS)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_OTH_MESSAGE_REPEATING(FlowHelpMessage fhm)
//Check a list of one-time flow help messages that should be repeated
IF fhm = FHM_PLAYER_LOGGED_FOR_STOCKS
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL PROCESS_HELP_MESSAGE(STRING strHelp, FlowHelpMessage eFlowHelpMessage, FlowHelpMessageVars &sVars, BOOL bDisplayOnMission = FALSE, INT iQueueDelay = 0, INT iHelpDuration = DEFAULT_HELP_TEXT_TIME, FlowHelpPriority fhPriority = FHP_MEDIUM, CC_CodeID eCodeID = CID_BLANK)
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(eFlowHelpMessage)
IF NOT IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
IF CALL sVars.fpHelpCheck()
sVars.iConditionPassCounter++
IF sVars.iConditionPassCounter >= NUM_CONDITION_PASSES_BEFORE_DISPLAY
SWITCH GET_FLOW_HELP_MESSAGE_STATUS(strHelp)
CASE FHS_EXPIRED
ADD_HELP_TO_FLOW_QUEUE(strHelp, fhPriority, iQueueDelay, 2500, iHelpDuration, 7, CID_BLANK, eCodeID)
BREAK
CASE FHS_DISPLAYED
IF NOT IS_OTH_MESSAGE_REPEATING(eFlowHelpMessage)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(eFlowHelpMessage)
ENDIF
BREAK
ENDSWITCH
ENDIF
RETURN TRUE
ELSE
sVars.iConditionPassCounter = 0
IF IS_FLOW_HELP_MESSAGE_QUEUED(strHelp)
REMOVE_HELP_FROM_FLOW_QUEUE(strHelp)
ENDIF
ENDIF
ELIF bDisplayOnMission
IF CALL sVars.fpHelpCheck()
sVars.iConditionPassCounter++
IF sVars.iConditionPassCounter >= NUM_CONDITION_PASSES_BEFORE_DISPLAY
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
IF NOT IS_CUTSCENE_PLAYING()
IF IS_SCREEN_FADED_IN()
IF NOT IS_WARNING_MESSAGE_ACTIVE()
IF g_sPlayerPedRequest.eState != PR_STATE_PROCESSING
PRINT_HELP(strHelp)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(eFlowHelpMessage)
IF eCodeID != CID_BLANK
Execute_Code_ID(eCodeID)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN TRUE
ELSE
sVars.iConditionPassCounter = 0
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC PROCESS_SP_HELP_MESSAGES(FlowHelpMessageVars &sVars)
//Don't process help messages during a debug flow launch.
#IF IS_DEBUG_BUILD
IF g_flowUnsaved.bUpdatingGameflow
EXIT
ENDIF
#ENDIF
#IF FEATURE_SP_DLC_DIRECTOR_MODE
CONST_INT NUM_HELP_MESSAGES 19
#ENDIF
#IF NOT FEATURE_SP_DLC_DIRECTOR_MODE
CONST_INT NUM_HELP_MESSAGES 17
#ENDIF
BOOL bProcessing = FALSE
SWITCH sVars.iMessageToCheckThisFrame
CASE 0
sVars.fpHelpCheck = &CHECK_CONVERTIBLE_ROOF
bProcessing = PROCESS_HELP_MESSAGE("AM_H_CNVRT", FHM_CONVERTIBLE_ROOF, sVars)
BREAK
CASE 1
sVars.fpHelpCheck = &CHECK_NO_STAMINA
bProcessing = PROCESS_HELP_MESSAGE("AM_H_NOSTAM", FHM_NO_STAMINA, sVars)
BREAK
CASE 2
sVars.fpHelpCheck = &CHECK_MULTI_WEAPONS_IN_SLOT
bProcessing = PROCESS_HELP_MESSAGE("AM_H_MULTWEP", FHM_MULTI_WEAPONS_IN_SLOT, sVars)
BREAK
CASE 3
sVars.fpHelpCheck = &CHECK_VEHICLE_RADIO_HELP_A
bProcessing = PROCESS_HELP_MESSAGE("AM_H_RADIO1", FHM_VEHICLE_RADIO_A, sVars)
BREAK
CASE 4
sVars.fpHelpCheck = &CHECK_VEHICLE_RADIO_HELP_B
bProcessing = PROCESS_HELP_MESSAGE("AM_H_RADIO2", FHM_VEHICLE_RADIO_B, sVars)
BREAK
CASE 5
sVars.fpHelpCheck = &CHECK_VEHICLE_ROLLED
bProcessing = PROCESS_HELP_MESSAGE("AM_H_VROLL", FHM_VEHICLE_ROLLED, sVars)
BREAK
CASE 6
sVars.fpHelpCheck = &CHECK_PLAYER_ENTERED_TRAIN_IN_GROUP
bProcessing = PROCESS_HELP_MESSAGE("AM_H_GTRA", FHM_ENTERED_TRAIN_IN_GROUP, sVars, TRUE)
BREAK
CASE 7
sVars.fpHelpCheck = &CHECK_PLAYER_USING_PROG_AR
bProcessing = PROCESS_HELP_MESSAGE("AM_H_PROGAR", FHM_PROG_AR, sVars)
BREAK
CASE 8
sVars.fpHelpCheck = &CHECK_SOCIAL_CLUB_LINK
bProcessing = PROCESS_HELP_MESSAGE("AM_H_SOCIAL", FHM_SOCIAL_CLUB_LINK, sVars, FALSE, 10000, 15000)
BREAK
CASE 9
sVars.fpHelpCheck = &CHECK_OBTAINED_AUTO_PARACHUTE
bProcessing = PROCESS_HELP_MESSAGE("AM_H_PARA", FHM_OBTAINED_AUTO_PARACHUTE, sVars)
BREAK
CASE 10
sVars.fpHelpCheck = &CHECK_FRIEND_ACTIVITY_HELP
bProcessing = PROCESS_HELP_MESSAGE("AM_H_FFRND", FHM_FRIEND_ACTIVITY_HELP, sVars)
BREAK
CASE 11
sVars.fpHelpCheck = &CHECK_ZOOMED_MOVEMENT_HELP
bProcessing = PROCESS_HELP_MESSAGE("AM_H_ZOOMOVE", FHM_SNIPER_ZOOMED_MOVEMENT, sVars)
BREAK
CASE 12
sVars.fpHelpCheck = &CHECK_DRIVEBY_CONTROL_HELP
bProcessing = PROCESS_HELP_MESSAGE("AM_H_DRIVEBY", FHM_DRIVEBY_CONTROL, sVars)
BREAK
CASE 13 //Triathlon 3 unlocked while in exile
sVars.fpHelpCheck = &CHECK_TRI_3_UNLOCKED_WHILE_EXILED
bProcessing = PROCESS_HELP_MESSAGE("TRI_NEWRC",FHM_TRI_3_UNLOCKED_IN_EXILE,sVars)
BREAK
CASE 14 //Player needs to log in to access stocks
sVars.fpHelpCheck = &CHECK_PLAYER_LOGGED_FOR_STOCKS
bProcessing = PROCESS_HELP_MESSAGE("AM_H_LOGSTOCKS",FHM_PLAYER_LOGGED_FOR_STOCKS, sVars, FALSE, 0, DEFAULT_HELP_TEXT_TIME, FHP_VERY_HIGH)
BREAK
CASE 15
sVars.fpHelpCheck = &CHECK_FIRST_PERSON_HELP_REMINDER_A
bProcessing = PROCESS_HELP_MESSAGE("AM_H_FP1", FHM_FIRST_PERSON_HELP_REMINDER_A, sVars)
BREAK
CASE 16
sVars.fpHelpCheck = &CHECK_FIRST_PERSON_HELP_REMINDER_B
bProcessing = PROCESS_HELP_MESSAGE("AM_H_FP2", FHM_FIRST_PERSON_HELP_REMINDER_B, sVars)
BREAK
#IF FEATURE_SP_DLC_DIRECTOR_MODE
CASE 17
sVars.fpHelpCheck = &CHECK_ROCKSTAR_EDITOR_INTRO_HELP
bProcessing = PROCESS_HELP_MESSAGE("AM_H_EDIT_1", FHM_ROCKSTAR_EDITOR_INTRO1, sVars)
BREAK
CASE 18
sVars.fpHelpCheck = &CHECK_ROCKSTAR_EDITOR_INTRO_HELP2
bProcessing = PROCESS_HELP_MESSAGE("AM_H_EDIT_2", FHM_ROCKSTAR_EDITOR_INTRO2, sVars,FALSE, 0, 7500)
BREAK
#ENDIF
//#IF FEATURE_LOWRIDER_CONTENT
// CASE 19
// sVars.fpHelpCheck = &CHECK_HYDRAULICS_HELP
// bProcessing = PROCESS_HELP_MESSAGE("AM_H_HYDR", FHM_HYDRAULICS_HELP, sVars)
// BREAK
//#ENDIF
ENDSWITCH
IF NOT bProcessing
sVars.iMessageToCheckThisFrame++
IF sVars.iMessageToCheckThisFrame = NUM_HELP_MESSAGES
sVars.iMessageToCheckThisFrame = 0
ENDIF
ENDIF
ENDPROC