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

3868 lines
161 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// Name: PI_MENU //
// Description: Runs the Player Interaction Menu //
// Written by: Craig Vincent //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "globals.sch"
// Game Headers
USING "net_race_to_point.sch"
USING "net_friend_request.sch"
using "mission_titles_private.sch"
using "cellphone_public.sch"
//////////////////////////////////////////////////////////////////////////////////////////
// ENUMS //
//////////////////////////////////////////////////////////////////////////////////////////
ENUM ENUM_PI_MENU_STATE
PI_MENU_INACTIVE,
PI_MENU_ACTIVE,
PI_MENU_CLEANUP
ENDENUM
ENUM ENUM_FACE_CAM_STAGE
FCS_WAIT,
FCS_INIT,
FCS_RUNNING,
FCS_CLEANUP
ENDENUM
ENUM ENUM_FACE_SHAPE_TEST_STAGE
FCST_INIT,
FCST_WAITING_RESULT,
FCST_RESULT_READY
ENDENUM
ENUM ENUM_GPS_LIST
eGPS_NONE,
eGPS_HOME,
eGPS_MISSION1,
eGPS_MISSION2,
eGPS_MISSION3,
eGPS_MISSION4,
eGPS_MISSION5,
eGPS_MISSION6,
eGPS_MISSION7,
eGPS_MISSION8,
eGPS_ATM,
eGPS_GUN,
eGPS_MOD,
eGPS_LowCLOTHES,
eGPS_medCLOTHES,
eGPS_highCLOTHES,
eGPS_BARBER,
eGPS_TATTOO,
eGPS_MASK,
eGPS_GARAGE,
eGPS_MAX
ENDENUM
ENUM_GPS_LIST eCurrentGPS
ENUM ENUM_SELFIE
//Michael
eself_finger = 0
,eself_neck
,eSelf_MAX_MIKE
//Franklin
,eself_bump = 0
,eself_WestCoast
,eSelf_MAX_FRANK
//Trevor
,eself_ProudFinger = 0
,eself_SlitThroat
,eSelf_MAX_TREV
ENDENUM
//////////////////////////////////////////////////////////////////////////////////////////
// CONSTANTS //
//////////////////////////////////////////////////////////////////////////////////////////
CONST_INT PI_MENU_DELAY 350
CONST_INT MENU_UPDATE_TIME 2000
CONST_INT iPI_MOVE_DELAY 175
CONST_INT MAX_MENUS 10
CONST_INT ciPI_SUB_MENU_NONE 0
CONST_INT ciPI_SUB_MENU_INVENTORY 1
CONST_INT ciPI_SUB_MENU_OBJECTIVE 2
CONST_INT ciPI_SUB_MENU_HELPTEXT 3
CONST_INT MAX_SUBMENUS 4
CONST_INT ciPI_TYPE_QUICK_GPS 0
CONST_INT ciPI_TYPE_INVENTORY 1
CONST_INT ciPI_TYPE_OBJECTIVE 2
CONST_INT ciPI_TYPE_HELPTEXT 3
#IF FEATURE_SP_DLC_DIRECTOR_MODE
CONST_INT ciPI_TYPE_DIRECTOR 4
CONST_INT ciPI_TYPE_SELFIE 5
CONST_INT ciPI_TYPE_MAX 6
#ENDIF
#IF not FEATURE_SP_DLC_DIRECTOR_MODE
CONST_INT ciPI_TYPE_SELFIE 4
CONST_INT ciPI_TYPE_MAX 5
#ENDIF
CONST_INT ciPI_TYPE_M2_HATS 0
CONST_INT ciPI_TYPE_M2_GLASSES 1
CONST_INT ciPI_TYPE_M2_MASKS 2
CONST_INT MAX_MENU_SELECTIONS 6
#IF FEATURE_SP_DLC_DIRECTOR_MODE
CONST_INT ciPI_MENU_MOVE_MAX 5
#ENDIF
#IF not FEATURE_SP_DLC_DIRECTOR_MODE
CONST_INT ciPI_MENU_MOVE_MAX 4
#ENDIF
CONST_INT ciPI_INVENTORY_TYPE_MAX 3
CONST_INT ciPI_BRIEF_TYPE_MAX 1
CONST_INT MAX_MASKS 26
CONST_INT MAX_GLASS 76
CONST_INT MAX_HATS 40
//////////////////////////////////////////////////////////////////////////////////////////
// STRUCTS //
//////////////////////////////////////////////////////////////////////////////////////////
STRUCT PI_LAUNCHER_MENU_STRUCT
INT iSelection[MAX_MENUS][MAX_SUBMENUS]
TEXT_LABEL_15 tl15
INT iCurrentSelection
ENDSTRUCT
STRUCT PI_SELECTED_ITEMS
INT iSelection[MAX_MENUS][MAX_MENU_SELECTIONS]
INT iSelectionChangeID
ENDSTRUCT
STRUCT PI_MENU_HEADER_DATA
TEXT_STYLE PlayerNameStyle
TEXT_PLACEMENT PlayerNamePlace
RECT Background
ENDSTRUCT
//STRUCT COMP_DATA
// PED_COMP_TYPE_ENUM eType = COMP_TYPE_PROPS
// PED_COMP_NAME_ENUM eName = DUMMY_PED_COMP
//ENDSTRUCT
//////////////////////////////////////////////////////////////////////////////////////////
// BITSETS //
//////////////////////////////////////////////////////////////////////////////////////////
INT iBoolsBitSet = 0
CONST_INT biSwitchButtonCheck 0
CONST_INT biM_MenuSetup 1
CONST_INT biEnableFaceCam 2
//////////////////////////////////////////////////////////////////////////////////////////
// VARIABLES //
//////////////////////////////////////////////////////////////////////////////////////////
ENUM_PI_MENU_STATE ePI_MENU_STATE = PI_MENU_INACTIVE
PI_LAUNCHER_MENU_STRUCT sPI_MenuData
PI_MENU_HEADER_DATA sPIM_HeaderData
PI_SELECTED_ITEMS sSelection
COMP_DATA MaskData[MAX_MASKS]
COMP_DATA GlassesData[MAX_GLASS]
COMP_DATA HatsData[MAX_HATS]
//menu scale
float fMenuExtension = CUSTOM_MENU_W
//resolution
INT iOldScrX
INT iOldScrY
//menu header
string sGraphicHeader
bool bHeaderGraphicRequested
//timers
INT iPi_menu_timer
INT iPi_submenu_timer
INT iPI_MoveTimer
INT iMenuUpdateTimer
INT ijustClosedTimer
//INT iScrollTimer
//menu positions
INT iStoredSelection
INT iSubMenu = ciPI_SUB_MENU_NONE
//bools
bool bResetMenuNow = TRUE
BOOL bUseSelectArrows = FALSE
BOOL bSelectAvailable = FALSE
bool bSwitchMenuState = FALSE
BOOL bFirstTimeHit = TRUE
FLOAT fPreviousAspectRatio
#IF FEATURE_SP_DLC_DIRECTOR_MODE
bool bDirectorWarningScreen = FALSE
#endif
//Face cam
ENUM_FACE_CAM_STAGE eFaceCamStage = FCS_WAIT
ENUM_FACE_SHAPE_TEST_STAGE eFaceCamShapeTestStage = FCST_INIT
SHAPETEST_INDEX sti_FaceCam
Bool b_FaceCamShapeTestHitSomething
CAMERA_INDEX FaceCam
TWEAK_FLOAT FC_FOV 50.0
FLOAT fXpos
FLOAT fYpos
VECTOR vFCAttachOffset = <<0, 0.7, 0>>
VECTOR vFCPointOffset
float fCamMoveSpeed = 0.0006//0.0002
//Selfie
INT iSelfieStage
int iCurrentSelfie = 0
int iFastSelectSelfie = 0
bool bdoAnim = FALSE
BOOL bChangeAnim = FALSE
//brief scaleform
TWEAK_FLOAT sf_x 0.113 //0.120//0.196
FLOAT sf_y = 0.754
TWEAK_FLOAT sf_w 0.225 //0.240//0.225
TWEAK_FLOAT sf_h 1.000 //0.225
FLOAT sf_y_adj = 8.00 // B* 2147964 Adjustment to the y depending on the aspect ratio (Magic number)
TWEAK_FLOAT wl_x 0.1125 //.188
FLOAT wl_y = 0.253
TWEAK_FLOAT wl_w 0.225
TWEAK_FLOAT wl_h 0.003 //0.225
TWEAK_FLOAT txt_x 0.182
TWEAK_FLOAT txt_y 0.107
#if IS_DEBUG_BUILD
WIDGET_GROUP_ID wGroup
int iwidgetMenuState
#endif
SCALEFORM_INDEX sfMenu
//Items
INT iMaskTotalCount
INT iGlassesTotalCount
INT iHatTotalCount
INT ciPI_MAX_TYPE_MASKS = 0 // Vary depending on how many items are unlocked.
INT ciPI_MAX_TYPE_GLASSES = 0
INT ciPI_MAX_TYPE_HATS = 0
INT ciPI_MAX_GPS = 2 // will always include <none>, ATM's and savehouse from start
//char test
enumCharacterList echarPrev
enumCharacterList echarCurr
enumCharacterList eSelfiecharPrev
enumCharacterList eSelfiecharCurr
// PC mouse
BOOL bCursorAccept
BOOL bCursorCancel
BOOL bCursorScrollUp
BOOL bCursorScrollDown
BOOL bCursorQuitMenu
INT iCursorValueChange
BOOL bCursorMenuFirstTime
BOOL bCursorCamMove
#IF FEATURE_SP_DLC_DIRECTOR_MODE
//Director Mode blocking
FEATURE_BLOCK_REASON lastBlockReason = FBR_NONE
#ENDIF
//////////////////////////////////////////////////////////////////////////////////////////
// PROCEDURES AND FUNCTIONS //
//////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///
// request the sf movie
FUNC BOOL HAVE_SF_ASSETS_LOADED()
sfMenu = REQUEST_SCALEFORM_MOVIE_WITH_IGNORE_SUPER_WIDESCREEN("TEXTFIELD")
IF HAS_SCALEFORM_MOVIE_LOADED(sfMenu)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//Added by Steve T. 26.0.1.15
//Dan made a director mode fix for the selector wheel that has impacted how GET_CURRENT_PLAYER_PED_ENUM() works in Director Mode. It doesn't return the correct player ped enum.
//It's hard to achieve the effect of his fix another way, so we're modifying the scripts impacted to get the model before returning an enum.
//Primarily updating this script to get the Selfie Snapmatic actions working in Director Mode.
FUNC EnumCharacterList Get_Player_Director_Mode_Compatible()
IF IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR) //the player enum isn't returned correctly in Director mode, so we go for an explicit model check.
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_MICHAEL].game_model //Check the explicit model from the character sheet.
RETURN CHAR_MICHAEL
ELSE
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_FRANKLIN].game_model
RETURN CHAR_FRANKLIN
ELSE
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_TREVOR].game_model
RETURN CHAR_TREVOR
ELSE
/*
#if IS_DEBUG_BUILD
cdPrintstring("PI_menu.sc - Get_Player_Director_Mode_Compatible() is returning an abnormal player model in Director Mode. Returning CHAR_MULTIPLAYER for safety.")
cdPrintnl()
#endif
*/
RETURN CHAR_MULTIPLAYER //Default to Multiplayer phone as a failsafe. PI_Menu doesn't look to be checking for anyone outwith the standard three SP playable flow characters.
ENDIF
ENDIF
ENDIF
ELSE
RETURN CHAR_MULTIPLAYER
ENDIF
ELSE
//Not in Director Mode, safe to just go ahead with the standard player enum retrieval process.
RETURN GET_CURRENT_PLAYER_PED_ENUM()
ENDIF
ENDFUNC
FUNC VECTOR RETURN_ATM_COORDS_BY_INDEX(INT iATM)
SWITCH iATM
CASE 0
RETURN <<2558.324 , 350.988 , 107.5975>>
CASE 1
RETURN <<-301.6573, -829.5886, 31.41977>>
CASE 2
RETURN <<-303.2257, -829.3121, 31.41977>>
CASE 3
RETURN <<-204.0193, -861.0091, 29.27133>>
CASE 4
RETURN <<118.6416 , -883.5695, 30.13945>>
CASE 5
RETURN <<24.5933 , -945.543 , 28.33305>>
CASE 6
RETURN <<5.686035 , -919.9551, 28.48088>>
CASE 7
RETURN <<296.1756 , -896.2318, 28.29015>>
CASE 8
RETURN <<296.8775 , -894.3196, 28.26148>>
CASE 9
RETURN <<147.4731 , -1036.218, 28.38707>>
CASE 10
RETURN<<145.8392 ,-1035.625, 28.38707>>
CASE 11
RETURN <<-256.6386 ,-715.8899, 32.7883 >>
CASE 12
RETURN <<112.4762 ,-819.8081, 30.33955>>
CASE 13
RETURN <<-259.2767 ,-723.2651, 32.70155>>
CASE 14
RETURN <<-254.5219 ,-692.8869, 32.57825>>
CASE 15
RETURN <<-27.89034 ,-724.1089, 43.22287>>
CASE 16
RETURN <<-30.09956 ,-723.2863, 43.22287>>
CASE 17
RETURN <<111.3886 ,-774.8402, 30.43766>>
CASE 18
RETURN <<114.5474 ,-775.972, 30.41737>>
CASE 19
RETURN <<289.53 ,-1256.788, 28.44057>>
CASE 20
RETURN <<289.2679 ,-1282.32 ,28.65519>>
CASE 21
RETURN <<158.7965 ,234.7452 ,105.6433>>
CASE 22
RETURN <<228.0324 ,337.8501 ,104.5013>>
CASE 23
RETURN <<527.7776 ,-160.6609 ,56.13671>>
CASE 24
RETURN <<-57.17029 ,-92.37918 ,56.75069>>
CASE 25
RETURN <<285.3485 ,142.9751 ,103.1623>>
CASE 26
RETURN <<357.1284 ,174.0836 ,102.0597>>
CASE 27
RETURN <<89.81339 ,2.880329 ,67.35216>>
CASE 28
RETURN <<1077.779 ,-776.9664 ,57.25652>>
CASE 29
RETURN <<1137.811 ,-468.8625 ,65.69865>>
CASE 30
RETURN <<1167.06 ,-455.6541 ,65.81857>>
CASE 31
RETURN <<-165.5844 ,234.7659 ,93.92897>>
CASE 32
RETURN <<-165.5844 ,232.6955 ,93.92897>>
CASE 33
RETURN <<-1205.378 ,-326.5286 ,36.85104>>
CASE 34
RETURN <<-1206.142 ,-325.0316 ,36.85104>>
CASE 35
RETURN <<-846.6537 ,-341.509 ,37.6685 >>
CASE 36
RETURN <<-847.204 ,-340.4291 ,37.6793 >>
CASE 37
RETURN <<-720.6288 ,-415.5243 ,33.97996>>
CASE 38
RETURN <<-867.013 ,-187.9928 ,36.88218>>
CASE 39
RETURN <<-867.9745 ,-186.3419 ,36.88218>>
CASE 40
RETURN <<-1415.48 ,-212.3324 ,45.49542>>
CASE 41
RETURN <<-1430.663 ,-211.3587 ,45.47162>>
CASE 42
RETURN <<-1410.736 ,-98.92789 ,51.39701>>
CASE 43
RETURN <<-1410.183 ,-100.6454 ,51.39652>>
CASE 44
RETURN <<-1282.098 ,-210.5599 ,41.43031>>
CASE 45
RETURN <<-1286.704 ,-213.7827 ,41.43031>>
CASE 46
RETURN <<-1289.742 ,-227.165 ,41.43031>>
CASE 47
RETURN <<-1285.136 ,-223.9422 ,41.43031>>
CASE 48
RETURN <<-1569.84 ,-547.0309 ,33.93216>>
CASE 49
RETURN <<-1570.765 ,-547.7035 ,33.93216>>
//CASE 50
// RETURN <<-1305.708 ,-706.6881 ,24.31447>>
CASE 50
RETURN <<-1315.416 ,-834.431 ,15.95233>>
CASE 51
RETURN <<-1314.466 ,-835.6913 ,15.95233>>
CASE 52
RETURN <<-2071.928 ,-317.2862 ,12.31808>>
CASE 53
RETURN <<-821.8936 ,-1081.555 ,10.13664>>
CASE 54
RETURN <<-1110.228 ,-1691.154 ,3.378483>>
//CASE 56
// RETURN <<-1044.466 ,-2739.641 ,8.12406 >>
CASE 55
RETURN <<-712.9357 ,-818.4827 ,22.74066>>
CASE 56
RETURN <<-710.0828 ,-818.4756 ,22.73634>>
CASE 57
RETURN <<-617.8035 ,-708.8591 ,29.04321>>
CASE 58
RETURN <<-617.8035 ,-706.8521 ,29.04321>>
CASE 59
RETURN <<2564 ,2584.553 ,37.06807>>
CASE 60
RETURN <<-3241.455 ,997.9085 ,11.66582>>
CASE 61
RETURN <<-614.5187 ,-705.5981 ,30.224 >>
CASE 62
RETURN <<-611.8581 ,-705.5981 ,30.224 >>
CASE 63
RETURN <<-660.6763 ,-854.4882 ,23.45663>>
CASE 64
RETURN <<-537.8052 ,-854.9357 ,28.27543>>
CASE 65
RETURN <<-594.6144 ,-1160.852 ,21.33351>>
CASE 66
RETURN <<-596.1251 ,-1160.85 ,21.3336 >>
CASE 67
RETURN <<-526.7791 ,-1223.374 ,17.45272>>
CASE 68
RETURN <<156.1886 ,6643.2 ,30.59372>>
CASE 69
RETURN <<173.8246 ,6638.217 ,30.59372>>
CASE 70
RETURN <<-386.4596 ,6046.411 ,30.47399>>
CASE 71
RETURN <<-282.7141 ,6226.43 ,30.49648>>
CASE 72
RETURN <<-132.6663 ,6366.876 ,30.47258>>
CASE 73
RETURN <<-95.87029 ,6457.462 ,30.47394>>
CASE 74
RETURN <<-97.63721 ,6455.732 ,30.46793>>
CASE 75
RETURN <<1687.395 ,4815.9 ,41.00647>>
CASE 76
RETURN <<1700.694 ,6426.762 ,31.63297>>
CASE 77
RETURN <<1822.971 ,3682.577 ,33.26745>>
CASE 78
RETURN <<1171.523 ,2703.139 ,37.1477 >>
CASE 79
RETURN <<1172.457 ,2703.139 ,37.1477 >>
CASE 80
RETURN <<-2956.848 ,487.2158 ,14.478 >>
CASE 81
RETURN <<-2958.977 ,487.3071 ,14.478 >>
CASE 82
RETURN <<-2974.586 ,380.1269 ,14.32212>>
CASE 83
RETURN <<-1091.887 ,2709.053 ,17.91941>>
CASE 84
RETURN <<-2295.853 ,357.9348 ,173.6014>>
CASE 85
RETURN <<-2295.069 ,356.2556 ,173.6014>>
CASE 86
RETURN <<-2294.3 ,354.6056 ,173.6014>>
CASE 87
RETURN <<-3043.835 ,594.1639 ,6.732796>>
CASE 88
RETURN <<-3144.887 ,1127.811 ,19.83804>>
ENDSWITCH
RETURN <<158.7965 ,234.7452 ,105.6433>> //<<0,0,0>>
ENDFUNC
FUNC string GET_STRAND_LABEL(SP_MISSIONS emission)
switch emission
case SP_HEIST_JEWELRY_PREP_1A
return "M_JHP1A"
break
case SP_HEIST_JEWELRY_PREP_1B
return "M_JHP1B"
break
case SP_HEIST_JEWELRY_PREP_2A
return "M_JHP2A"
break
case SP_HEIST_DOCKS_PREP_1
return "M_DHP1"
break
case SP_HEIST_DOCKS_PREP_2B
return "M_DHP2b"
break
case SP_HEIST_FINALE_PREP_A
return "M_FHPRA"
break
case SP_HEIST_FINALE_PREP_B
return "M_FHPRB"
break
case SP_HEIST_FINALE_PREP_D
return "PIM_TRAIN"
break
case SP_MISSION_FBI_4_PREP_1
return "M_FB4P1"
break
case SP_MISSION_FBI_4_PREP_2
return "M_FB4P2"
break
case SP_MISSION_FBI_4_PREP_3
return "M_FB4P3"
break
case SP_MISSION_FBI_4_PREP_4
return "M_FB4P4"
break
case SP_MISSION_FBI_4_PREP_5
return "M_FB4P5"
break
case SP_MISSION_MICHAEL_2
return "PIM_FRANK"// michael mission actually start with F blip.
break
case SP_MISSION_TREVOR_1
return "PIM_MIKE"
break
case SP_MISSION_FAMILY_3
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
return "PIM_MIKE"
endif
break
endswitch
STRANDS eStrand = GET_STORY_MISSION_STRAND(emission)
switch eStrand
case STRAND_AGENCY_HEIST
return "PIM_AGEN"
break
case STRAND_ARMENIAN
return "PIM_ARM"
break
case STRAND_ASSASSINATIONS
return "PIM_ASSA"
break
case STRAND_CAR_STEAL
return "PIM_CARS"
break
case STRAND_CHINESE
return "PIM_CHIN"
break
case STRAND_DOCKS_HEIST
return "PIM_DOCKS"
break
case STRAND_DOCKS_HEIST_2
return "PIM_DOCKS"
break
case STRAND_EXILE
return "PIM_EXIL"
break
case STRAND_FAMILY
return "PIM_FAM"
break
case STRAND_FBI_OFFICERS
return "PIM_FIB"
break
case STRAND_FBI_OFFICERS_2
return "PIM_FIB"
break
case STRAND_FBI_OFFICERS_3
return "PIM_FIB"
break
case STRAND_FBI_OFFICERS_4
return "PIM_FIB"
break
case STRAND_FBI_OFFICERS_5
return "PIM_FIB"
break
case STRAND_FINALE
return "PIM_FINAL"
break
case STRAND_FINALE_HEIST
return "PIM_BIGS"
break
case STRAND_FINALE_HEIST_2
return "PIM_BIGS"
break
case STRAND_FINALE_HEIST_3
return "PIM_BIGS"
break
case STRAND_FINALE_HEIST_4
return "PIM_BIGS"
break
case STRAND_FRANKLIN
return "PIM_FRANK"
break
case STRAND_JEWEL_HEIST
return "PIM_JEWEL"
break
case STRAND_JEWEL_HEIST_2
return "PIM_JEWEL"
break
case STRAND_LAMAR
return "PIM_LAM"
break
case STRAND_LESTER
return "PIM_LEST"
break
case STRAND_MARTIN
return "PIM_MART"
break
case STRAND_MICHAEL
return "PIM_MIKE"
break
case STRAND_MICHAEL_EVENTS
return ""
break
case STRAND_PROLOGUE
return ""
break
case STRAND_RURAL_BANK_HEIST
return "PIM_RURAL"
break
case STRAND_SHRINK
return "PIM_SHRINK"
break
case STRAND_SOLOMON
return "PIM_SOL"
break
case STRAND_TREVOR
return "PIM_TREV"
break
endswitch
return ""
ENDFUNC
FUNC string GET_SHORT_LABEL(string sCurrentLabel)
if ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_H2")
return "PIM_P0_H2"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E4_6")
return "PIM_P0_E4_6"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5")
return "PIM_P0_E5"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5_1")
return "PIM_P0_E5_1"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5_2")
return "PIM_P0_E5_2"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5_4")
return "PIM_P0_E5_4"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5_5")
return "PIM_P0_E5_5"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5_6")
return "PIM_P0_E5_6"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5_7")
return "PIM_P0_E5_7"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5_8")
return "PIM_P0_E5_8"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E5_9")
return "PIM_P0_E5_9"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E6")
return "PIM_P0_E6"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E6_1")
return "PIM_P0_E6_1"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E6_5")
return"PIM_P0_E6_5"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E6_8")
return"PIM_P0_E6_8"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E8_6")
return "PIM_P0_E8_6"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E8_7")
return "PIM_P0_E8_7"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E9_1")
return "PIM_P0_E9_1"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P0_E9_4")
return "PIM_P0_E9_4"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E1_5")
return "PIM_P1_E1_5"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E4_0")
return "PIM_P1_E4_0"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E4_1")
return "PIM_P1_E4_1"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E7_0")
return "PIM_P1_E7_0"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E7_1")
return "PIM_P1_E7_1"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E7_3")
return "PIM_P1_E7_3"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E8_5")
return "PIM_P1_E8_5"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E8_7")
return "PIM_P1_E8_7"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E9_2")
return "PIM_P1_E9_2"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E9_7")
return "PIM_P1_E9_7"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E10_3")
return "PIM_P1_E10_3"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_E10_4")
return "PIM_P1_E10_4"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_H26_4")
return "PIM_P1_H26_4"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_H19_0")
return "PIM_P1_H19_0"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_H19_3")
return "PIM_P1_H19_3"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_H19_5")
return "PIM_P1_H19_5"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_H19_10")
return "PIM_P1_H19_10"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_H19_12")
return "PIM_P1_H19_12"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_H19_13")
return "PIM_P1_H19_13"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P1_H19_14")
return "PIM_P1_H19_14"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E1")
return "PIM_P2_E1"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E3")
return "PIM_P2_E3"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E3_6")
return "PIM_P2_E3_6"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E3_7")
return "PIM_P2_E3_7"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E3_8")
return "PIM_P2_E3_8"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E8_4")
return "PIM_P2_E8_4"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E8_5")
return "PIM_P2_E8_5"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E8_6")
return "PIM_P2_E8_6"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E9_1")
return "PIM_P2_E9_1"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E9_2")
return "PIM_P2_E9_2"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E9_3")
return "PIM_P2_E9_3"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E9_5")
return "PIM_P2_E9_5"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E9_6")
return "PIM_P2_E9_6"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E9_7")
return "PIM_P2_E9_7"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E9_8")
return "PIM_P2_E9_8"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E9_9")
return "PIM_P2_E9_9"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E10_3")
return "PIM_P2_E10_3"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E10_7")
return "PIM_P2_E10_7"
elif ARE_STRINGS_EQUAL(sCurrentLabel,"PROPS_P2_E10_8")
return "PIM_P2_E10_8"
endif
CPRINTLN(DEBUG_MISSION, "GET_SHORT_LABEL: Using orginal text label: ",sCurrentLabel )
return sCurrentLabel
ENDFUNC
FUNC VECTOR GET_CLOSEST_ATM_COORDS()
//**TWH - CMcM - #1383555 - Added all supplied ATM coords to quick GPS.
CONST_INT MAX_NUMBER_OF_ATMs 89
FLOAT fNewDistance
FLOAT fShortestDistance = 9999.9
VECTOR vNearest = <<-717.7181, -915.6580, 18.2156>>
INT i
REPEAT MAX_NUMBER_OF_ATMs i
fNewDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), RETURN_ATM_COORDS_BY_INDEX(i))
IF fNewDistance < fShortestDistance
fShortestDistance = fNewDistance
vNearest = RETURN_ATM_COORDS_BY_INDEX(i)
ENDIF
ENDREPEAT
RETURN vNearest
ENDFUNC
//PURPOSE: Returns the Comp Name based on the players gender
FUNC PED_COMP_NAME_ENUM GET_PROP_NAME_OF_TYPE(INT iType,int iPropNum,PED_COMP_TYPE_ENUM CompType = COMP_TYPE_PROPS)
// Glasses are listed seperately
IF iType = ciPI_TYPE_M2_GLASSES
INT iNewPropnum
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
iNewPropnum = enum_to_int(PROPS_P0_GLASSES)+ iPropNum
if iNewPropnum = enum_to_int(PROPS_P0_EXTERMINATOR_MASK) //If scuba mask go one extra
or iNewPropnum = enum_to_int(PROPS_P0_SCUBA_MASK)
RETURN DUMMY_PED_COMP
endif
if iNewPropnum > enum_to_int(PROPS_P0_GLASSES_THICK_RIM_7)
RETURN DUMMY_PED_COMP
else
RETURN int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum)
endif
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
iNewPropnum = enum_to_int(PROPS_P1_SCUBA_MASK)+ iPropNum
if iNewPropnum > enum_to_int(PROPS_P1_SUNGLASSES_I_6)
RETURN DUMMY_PED_COMP
else
RETURN int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum)
endif
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
iNewPropnum = enum_to_int(PROPS_P2_SCUBA_MASK)+ iPropNum
if iNewPropnum > enum_to_int(PROPS_P2_SQUARE_GLASSES_9)
RETURN DUMMY_PED_COMP
else
RETURN int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum)
endif
endif
//Hats and Masks
ELSE
PED_COMP_NAME_ENUM ePropListEnd
INT iNewPropnum
int ICurrentProp = 0
enumCharacterList eCurrentchar = GET_CURRENT_PLAYER_PED_ENUM()
MODEL_NAMES charModel = GET_PLAYER_PED_MODEL(eCurrentchar)
IF eCurrentchar = CHAR_MICHAEL
if compType = COMP_TYPE_PROPS
iNewPropnum = enum_to_int(PROPS_P0_FIREMAN_HAT) //start of head props for mike
ePropListEnd = PROPS_P0_FLIGHT_CAP //end of head props for mike
elif compType = COMP_TYPE_SPECIAL2
iNewPropnum = enum_to_int(SPECIAL2_P0_WRESTLER_MASK_0) //start of SPECIAL2 for mike
ePropListEnd = SPECIAL2_P0_WRESTLER_MASK_5 //end of SPECIAL2 for mike
endif
ELIF eCurrentchar = CHAR_FRANKLIN
if compType = COMP_TYPE_PROPS
iNewPropnum = enum_to_int(PROPS_P1_HOCKEY_MASK) //start of head props for frank
ePropListEnd = PROPS_P1_FLIGHT_CAP //end of head props for frank
elif compType = COMP_TYPE_SPECIAL2
iNewPropnum = enum_to_int(SPECIAL2_P1_WRESTLER_MASK_0) //start of SPECIAL2 for frank
ePropListEnd = SPECIAL2_P1_WRESTLER_MASK_5 //end of SPECIAL2 for frank
endif
ELIF eCurrentchar = CHAR_TREVOR
if compType = COMP_TYPE_PROPS
iNewPropnum = enum_to_int(PROPS_P2_FIREMAN_HAT) //start of head props for trev
ePropListEnd = PROPS_P2_CAP_15 //end of head props for trev
elif compType = COMP_TYPE_SPECIAL2
iNewPropnum = enum_to_int(SPECIAL2_P2_WRESTLER_MASK_0) //start of SPECIAL2 for trev
ePropListEnd = SPECIAL2_P2_MASK_MONSTER_RED //end of SPECIAL2 for trev
endif
endif
//Cycle through list of head props
WHILE iNewPropnum <= enum_to_int(ePropListEnd)
// If looking for a hat
IF iType = ciPI_TYPE_M2_HATS
if IS_ITEM_A_HAT(charModel,compType,int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum))
if eCurrentchar = CHAR_TREVOR AND ( iNewPropnum != enum_to_int(PROPS_P2_BEANIE_HAT_1))// block this no name hat
if ICurrentProp = iPropNum
//This is the hat we are looking for
RETURN int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum)
else
//Increase amount of hats cycled through
ICurrentProp++
endif
elif eCurrentchar = CHAR_FRANKLIN AND ( iNewPropnum != enum_to_int(PROPS_P1_BUGSTAR_CAP)) // block this no name hat
if ICurrentProp = iPropNum
//This is the hat we are looking for
RETURN int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum)
else
//Increase amount of hats cycled through
ICurrentProp++
endif
elif eCurrentchar = CHAR_MICHAEL
if ICurrentProp = iPropNum
//This is the hat we are looking for
RETURN int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum)
else
//Increase amount of hats cycled through
ICurrentProp++
endif
endif
endif
elif iType = ciPI_TYPE_M2_MASKS
if IS_ITEM_A_MASK(charModel,compType,int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum))
if ICurrentProp = iPropNum
//This is the hat we are looking for
RETURN int_to_enum(PED_COMP_NAME_ENUM,iNewPropnum)
else
//Increase amount of hats cycled through
ICurrentProp++
endif
endif
endif
iNewPropnum++
ENDWHILE
//No current hats
if iNewPropnum > enum_to_int(ePropListEnd)
RETURN DUMMY_PED_COMP
endif
ENDIF
RETURN DUMMY_PED_COMP
ENDFUNC
PROC GET_COMP_DATA()
INT i
MODEL_NAMES PlayerModel = GET_PLAYER_PED_MODEL(GET_CURRENT_PLAYER_PED_ENUM())
//Masks
REPEAT MAX_MASKS i
IF IS_PED_COMP_ITEM_ACQUIRED_SP(PlayerModel, COMP_TYPE_SPECIAL2, GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_MASKS,(i-1),COMP_TYPE_SPECIAL2))
MaskData[iMaskTotalCount].eType = COMP_TYPE_SPECIAL2
MaskData[iMaskTotalCount].eName = GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_MASKS,(i-1),COMP_TYPE_SPECIAL2)
CPRINTLN(DEBUG_MISSION, "MASK2 COMP_TYPE_SPECIAL2---CV:GET_COMP_DATA: IS_PED_COMP_ITEM_ACQUIRED_SP: ",i)
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL2, GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_MASKS,(i-1),COMP_TYPE_SPECIAL2))
CPRINTLN(DEBUG_MISSION, "MASK2 COMP_TYPE_SPECIAL2---CV:GET_COMP_DATA: IS_PED_COMP_ITEM_CURRENT_SP: ",i)
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] = iMaskTotalCount
ENDIF
iMaskTotalCount++
ciPI_MAX_TYPE_MASKS = (iMaskTotalCount-1)
ENDIF
IF IS_PED_COMP_ITEM_ACQUIRED_SP(PlayerModel, COMP_TYPE_PROPS, GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_MASKS,(i-1),COMP_TYPE_PROPS))
MaskData[iMaskTotalCount].eType = COMP_TYPE_PROPS
MaskData[iMaskTotalCount].eName = GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_MASKS,(i-1),COMP_TYPE_PROPS)
CPRINTLN(DEBUG_MISSION, "MASK COMP_TYPE_PROPS---CV:GET_COMP_DATA: IS_PED_COMP_ITEM_ACQUIRED_SP: ",i)
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_MASKS,(i-1),COMP_TYPE_PROPS))
CPRINTLN(DEBUG_MISSION, "MASK COMP_TYPE_PROPS---CV:GET_COMP_DATA: IS_PED_COMP_ITEM_CURRENT_SP: ",i)
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] = iMaskTotalCount
ENDIF
iMaskTotalCount++
ciPI_MAX_TYPE_MASKS = (iMaskTotalCount-1)
ENDIF
IF i = 0
MaskData[iMaskTotalCount].eType = COMP_TYPE_PROPS
MaskData[iMaskTotalCount].eName = PROPS_HEAD_NONE
CPRINTLN(DEBUG_MISSION, "masks---CV:GET_COMP_DATA:PROPS_HEAD_NONE")
iMaskTotalCount++
ciPI_MAX_TYPE_MASKS = (iMaskTotalCount-1)
endif
ENDREPEAT
//balaclava check for franklin
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF IS_PED_COMP_ITEM_ACQUIRED_SP(PlayerModel, COMP_TYPE_SPECIAL, SPECIAL_P1_MASK)
MaskData[iMaskTotalCount].eType = COMP_TYPE_SPECIAL
MaskData[iMaskTotalCount].eName = SPECIAL_P1_MASK
CPRINTLN(DEBUG_MISSION, "MASK2 COMP_TYPE_SPECIAL---CV:GET_COMP_DATA: SPECIAL_P1_MASK ACQUIRED")
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL, SPECIAL_P1_MASK)
CPRINTLN(DEBUG_MISSION, "MASK2 COMP_TYPE_SPECIAL2---CV:GET_COMP_DATA: SPECIAL_P1_MASK EQUIPPED ")
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] = iMaskTotalCount
ENDIF
iMaskTotalCount++
ciPI_MAX_TYPE_MASKS = (iMaskTotalCount-1)
ENDIF
ENDIF
CPRINTLN(DEBUG_MISSION, "MASKS max : ",iMaskTotalCount)
//Glasses
REPEAT MAX_GLASS i
IF i > 0
IF IS_PED_COMP_ITEM_ACQUIRED_SP(PlayerModel, COMP_TYPE_PROPS, GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_GLASSES,(i-1)))
GlassesData[iGlassesTotalCount].eType = COMP_TYPE_PROPS
GlassesData[iGlassesTotalCount].eName = GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_GLASSES,(i-1))
CPRINTLN(DEBUG_MISSION, "GLASS---CV:GET_COMP_DATA: ACQUIRED_SP: ",i)
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_GLASSES,(i-1)))
CPRINTLN(DEBUG_MISSION, "GLASS---CV:GET_COMP_DATA: CURRENT_SP: ",i)
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_GLASSES] = iGlassesTotalCount
ENDIF
iGlassesTotalCount++
ciPI_MAX_TYPE_GLASSES = (iGlassesTotalCount-1)
ENDIF
ELSE
GlassesData[iGlassesTotalCount].eType = COMP_TYPE_PROPS
GlassesData[iGlassesTotalCount].eName = PROPS_EYES_NONE
CPRINTLN(DEBUG_MISSION, "Glasses---CV:GET_COMP_DATA:PROPS_HEAD_NONE")
iGlassesTotalCount++
ciPI_MAX_TYPE_GLASSES = (iGlassesTotalCount-1)
ENDIF
ENDREPEAT
//Hats
REPEAT MAX_HATS i
IF i > 0
IF IS_PED_COMP_ITEM_ACQUIRED_SP(PlayerModel, COMP_TYPE_PROPS, GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_HATS,(i-1)))
HatsData[iHatTotalCount].eType = COMP_TYPE_PROPS
HatsData[iHatTotalCount].eName = GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_HATS,(i-1))
CPRINTLN(DEBUG_MISSION, "Hats---CV:GET_COMP_DATA: ACQUIRED_SP: ",i)
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, GET_PROP_NAME_OF_TYPE(ciPI_TYPE_M2_HATS,(i-1)))
CPRINTLN(DEBUG_MISSION, "Hats---CV:GET_COMP_DATA: CURRENT_SP: ",i)
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_HATS] = iHatTotalCount
ENDIF
iHatTotalCount++
ciPI_MAX_TYPE_HATS = (iHatTotalCount-1)
ENDIF
ELSE
HatsData[iHatTotalCount].eType = COMP_TYPE_PROPS
HatsData[iHatTotalCount].eName = PROPS_HEAD_NONE
CPRINTLN(DEBUG_MISSION, "Hats---CV:GET_COMP_DATA:PROPS_HEAD_NONE")
iHatTotalCount++
ciPI_MAX_TYPE_HATS = (iHatTotalCount-1)
ENDIF
ENDREPEAT
ENDPROC
//PURPOSE: Returns the Max size of the current menu
FUNC INT GET_MENU_MAX()
SWITCH iSubMenu
CASE ciPI_SUB_MENU_NONE RETURN ciPI_MENU_MOVE_MAX
CASE ciPI_SUB_MENU_INVENTORY RETURN ciPI_INVENTORY_TYPE_MAX
CASE ciPI_SUB_MENU_OBJECTIVE RETURN ciPI_BRIEF_TYPE_MAX
CASE ciPI_SUB_MENU_HELPTEXT RETURN ciPI_BRIEF_TYPE_MAX
ENDSWITCH
RETURN ciPI_TYPE_MAX
ENDFUNC
//PURPOSE: Returns the max options for the current selection
FUNC INT GET_SELECTION_MAX_PI(INT iSelection)
IF iSubMenu = ciPI_SUB_MENU_NONE
SWITCH iSelection
CASE ciPI_TYPE_QUICK_GPS RETURN ciPI_MAX_GPS
CASE ciPI_TYPE_SELFIE
if Get_Player_Director_Mode_Compatible() = CHAR_MICHAEL
RETURN enum_to_int(eSelf_MAX_MIKE)-1
elif Get_Player_Director_Mode_Compatible() = CHAR_FRANKLIN
RETURN enum_to_int(eSelf_MAX_FRANK)-1
elif Get_Player_Director_Mode_Compatible() = CHAR_TREVOR
RETURN enum_to_int(eSelf_MAX_TREV)-1
endif
BREAK
ENDSWITCH
ELIF iSubMenu = ciPI_SUB_MENU_INVENTORY
SWITCH iSelection
CASE ciPI_TYPE_M2_HATS RETURN ciPI_MAX_TYPE_HATS
CASE ciPI_TYPE_M2_GLASSES RETURN ciPI_MAX_TYPE_GLASSES
CASE ciPI_TYPE_M2_MASKS RETURN ciPI_MAX_TYPE_MASKS
ENDSWITCH
ENDIF
RETURN 0
ENDFUNC
FUNC SHOP_NAME_ENUM GET_CLOSEST_LOWENDSHOP()
FLOAT fCurrentDist
FLOAT fShortDist = 999999.99
vector vCoords = GET_ENTITY_COORDS(player_ped_id())
SHOP_NAME_ENUM eshop =CLOTHES_SHOP_L_01_SC
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_L_01_SC))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_L_01_SC
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_L_02_GS))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_L_02_GS
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_L_03_DT))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_L_03_DT
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_L_04_CS))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_L_04_CS
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_L_05_GSD))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_L_05_GSD
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_L_06_VC))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_L_06_VC
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_L_07_PB))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_L_07_PB
ENDIF
RETURN eShop
ENDFUNC
FUNC SHOP_NAME_ENUM GET_CLOSEST_MEDENDSHOP()
FLOAT fCurrentDist
FLOAT fShortDist = 999999.99
vector vCoords = GET_ENTITY_COORDS(player_ped_id())
SHOP_NAME_ENUM eshop =CLOTHES_SHOP_M_01_SM
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_M_01_SM))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_M_01_SM
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_M_03_H))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_M_03_H
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_M_04_HW))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_M_04_HW
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_M_05_GOH))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_M_05_GOH
ENDIF
RETURN eShop
ENDFUNC
FUNC SHOP_NAME_ENUM GET_CLOSEST_HIGHENDSHOP()
FLOAT fCurrentDist
FLOAT fShortDist = 999999.99
vector vCoords = GET_ENTITY_COORDS(player_ped_id())
SHOP_NAME_ENUM eshop = CLOTHES_SHOP_H_01_BH
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_H_01_BH))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_H_01_BH
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_H_02_B))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_H_02_B
ENDIF
fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vCoords, GET_SHOP_COORDS(CLOTHES_SHOP_H_03_MW))
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
eShop = CLOTHES_SHOP_H_03_MW
ENDIF
RETURN eShop
ENDFUNC
FUNC STRING GET_HEADER_GRAPHIC_FOR_PI()
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL RETURN "ShopUI_Title_Graphics_Michael" BREAK
CASE CHAR_FRANKLIN RETURN "ShopUI_Title_Graphics_Franklin" BREAK
CASE CHAR_TREVOR RETURN "ShopUI_Title_Graphics_Trevor" BREAK
ENDSWITCH
RETURN ""
ENDFUNC
FUNC BOOL REQUEST_HEADER_GRAPHIC_FOR_PI()
IF NOT IS_STRING_NULL_OR_EMPTY(sGraphicHeader)
REQUEST_STREAMED_TEXTURE_DICT(sGraphicHeader)
bHeaderGraphicRequested = TRUE
RETURN HAS_STREAMED_TEXTURE_DICT_LOADED(sGraphicHeader)
ENDIF
RETURN TRUE
ENDFUNC
PROC CLEANUP_HEADER_GRAPHIC_FOR_PI()
IF bHeaderGraphicRequested
IF NOT IS_STRING_NULL_OR_EMPTY(sGraphicHeader)
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED(sGraphicHeader)
ENDIF
bHeaderGraphicRequested = FALSE
ENDIF
ENDPROC
FUNC BOOL GET_CHARACTER_COLOUR_PI(INT &iHeadRed, INT &iHeadGreen, INT &iHeadBlue, INT &iFootRed, INT &iFootGreen, INT &iFootBlue)
BOOL bColourSet = FALSE
INT iAlphsDummy
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
GET_HUD_COLOUR(HUD_COLOUR_MICHAEL, iFootRed, iFootGreen, iFootBlue, iAlphsDummy)
iHeadRed = 15
iHeadGreen = 27
iHeadBlue = 32
bColourSet = TRUE
BREAK
CASE CHAR_FRANKLIN
GET_HUD_COLOUR(HUD_COLOUR_FRANKLIN, iFootRed, iFootGreen, iFootBlue, iAlphsDummy)
iHeadRed = 25
iHeadGreen = 35
iHeadBlue = 25
bColourSet = TRUE
BREAK
CASE CHAR_TREVOR
GET_HUD_COLOUR(HUD_COLOUR_TREVOR, iFootRed, iFootGreen, iFootBlue, iAlphsDummy)
iHeadRed = 38
iHeadGreen = 24
iHeadBlue = 13
bColourSet = TRUE
BREAK
ENDSWITCH
RETURN bColourSet
ENDFUNC
FUNC VECTOR GET_STATIC_MISSION_BLIP_COORD(STATIC_BLIP_NAME_ENUM eblip)
vector vTemp = <<0,0,0>>
if eBlip = STATIC_BLIP_MISSION_DOCKS_P2B //overide static blip location to place for better waypoint location
vTemp = <<-1581.04492, 2791.69409, 15.85525>>
else
vTemp = GET_STATIC_BLIP_POSITION(eBlip,GET_CURRENT_PLAYER_PED_INT())
if IS_VECTOR_ZERO(vTemp)
vTemp = GET_STATIC_BLIP_POSITION(eBlip)
endif
endif
return vTemp
ENDFUNC
PROC SET_QUICK_GPS_WAYPOINT()
if not IS_PED_INJURED(player_ped_id())
SHOP_NAME_ENUM thisShop
VECTOR vTemp
SWITCH eCurrentGPS
CASE eGPS_NONE
DELETE_WAYPOINTS_FROM_THIS_PLAYER()
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_HOME
SAVEHOUSE_NAME_ENUM eSavehouse
eSavehouse = GET_CLOSEST_SAVEHOUSE(GET_ENTITY_COORDS(player_ped_id()),GET_CURRENT_PLAYER_PED_ENUM(),true)
vTemp = GET_STATIC_BLIP_POSITION(g_sSavehouses[eSavehouse].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MISSION1
vtemp = GET_STATIC_MISSION_BLIP_COORD(g_TriggerableMissions[0].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MISSION2
vtemp = GET_STATIC_MISSION_BLIP_COORD(g_TriggerableMissions[1].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MISSION3
vtemp = GET_STATIC_MISSION_BLIP_COORD(g_TriggerableMissions[2].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MISSION4
vtemp = GET_STATIC_MISSION_BLIP_COORD(g_TriggerableMissions[3].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MISSION5
vtemp = GET_STATIC_MISSION_BLIP_COORD(g_TriggerableMissions[4].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MISSION6
vtemp = GET_STATIC_MISSION_BLIP_COORD(g_TriggerableMissions[5].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MISSION7
vtemp = GET_STATIC_MISSION_BLIP_COORD(g_TriggerableMissions[6].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MISSION8
vtemp = GET_STATIC_MISSION_BLIP_COORD(g_TriggerableMissions[7].eBlip)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_ATM
vTemp = GET_CLOSEST_ATM_COORDS()
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_GUN
thisShop = GET_CLOSEST_SHOP_OF_TYPE(GET_ENTITY_COORDS(player_ped_id()), SHOP_TYPE_GUN)
vTemp = GET_SHOP_COORDS(thisShop)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MOD
thisShop = GET_CLOSEST_SHOP_OF_TYPE(GET_ENTITY_COORDS(player_ped_id()), SHOP_TYPE_CARMOD, DEFAULT, DEFAULT , DEFAULT, CARMOD_SHOP_SUPERMOD )
vTemp = GET_SHOP_COORDS(thisShop)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_lowCLOTHES
thisShop = GET_CLOSEST_LOWENDSHOP()
vTemp = GET_SHOP_COORDS(thisShop)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_medCLOTHES
thisShop = GET_CLOSEST_MEDENDSHOP()
vTemp = GET_SHOP_COORDS(thisShop)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_highCLOTHES
thisShop = GET_CLOSEST_HIGHENDSHOP()
vTemp = GET_SHOP_COORDS(thisShop)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_BARBER
thisShop = GET_CLOSEST_SHOP_OF_TYPE(GET_ENTITY_COORDS(player_ped_id()), SHOP_TYPE_HAIRDO)
vTemp = GET_SHOP_COORDS(thisShop)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_TATTOO
thisShop = GET_CLOSEST_SHOP_OF_TYPE(GET_ENTITY_COORDS(player_ped_id()), SHOP_TYPE_TATTOO)
vTemp = GET_SHOP_COORDS(thisShop)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_MASK
thisShop = CLOTHES_SHOP_A_01_VB
vTemp = GET_SHOP_COORDS(thisShop)
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
CASE eGPS_GARAGE
VEHICLE_GEN_NAME_ENUM ename
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eName = VEHGEN_WEB_CAR_MICHAEL
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
eName = VEHGEN_WEB_CAR_FRANKLIN
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
eName = VEHGEN_WEB_CAR_TREVOR
ENDIF
if DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[eName])
vTemp = GET_BLIP_COORDS(g_sVehicleGenNSData.blipID[eName])
ENDIF
SET_NEW_WAYPOINT(vTemp.x, vTemp.y)
REFRESH_WAYPOINT()
EXIT
BREAK
ENDSWITCH
endif
ENDPROC
// B* 2147964 - Gets the multiplier for the fake vs physical aspect ratio
// (If not in triple head)
FUNC FLOAT GET_ASPECT_RATIO_MULTIPLIER()
INT xScreen, yScreen
GET_ACTUAL_SCREEN_RESOLUTION(xScreen, yScreen)
IF IS_PHYSICAL_RES_CONSIDERED_TRIPLE_HEAD(xScreen, yScreen)
RETURN 1.0
ENDIF
FLOAT fFakeAspect = GET_ASPECT_RATIO(FALSE)
FLOAT fActualAspect = TO_FLOAT(xScreen) / TO_FLOAT(yScreen)
RETURN fActualAspect / fFakeAspect
ENDFUNC
//PURPOSE: Initialises the Menu Header - Shows Player Headshot, Name + CrewTag, Crew Name
PROC INIT_PI_MENU_HEADER(PI_MENU_HEADER_DATA &HeaderData)
//Move Main Menu Down
CUSTOM_MENU_Y = (((CUSTOM_MENU_ITEM_BAR_H / GET_ASPECT_RATIO_MULTIPLIER() ) * (3.0 / GET_ASPECT_RATIO_MULTIPLIER() ))+0.05)
//Background
HeaderData.Background.x = 0.188
HeaderData.Background.y = 0.100 + CUSTOM_MENU_ITEM_BAR_H //0.111
HeaderData.Background.w = CUSTOM_MENU_W
HeaderData.Background.h = 0.090 //(CUSTOM_MENU_ITEM_BAR_H*2)
INT iHudR, iHudG, iHudB, iHudA
HUD_COLOURS hudColour
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
hudColour = HUD_COLOUR_MICHAEL
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
hudColour = HUD_COLOUR_FRANKLIN
else //trev
hudColour = HUD_COLOUR_TREVOR
endif
echarPrev = GET_CURRENT_PLAYER_PED_ENUM()
GET_HUD_COLOUR(hudColour, iHudR, iHudG, iHudB, iHudA)
HeaderData.Background.r = iHudR //68 //200
HeaderData.Background.g = iHudG //158 //66
HeaderData.Background.b = iHudB //208 //66
HeaderData.Background.a = iHudA //255
//Player Name
HeaderData.PlayerNameStyle.aFont = FONT_CURSIVE
HeaderData.PlayerNameStyle.XScale = 0.8//0.500
HeaderData.PlayerNameStyle.YScale = 1.05//0.750
HeaderData.PlayerNameStyle.r = 255
HeaderData.PlayerNameStyle.g = 255
HeaderData.PlayerNameStyle.b = 255
HeaderData.PlayerNameStyle.a = 255
HeaderData.PlayerNameStyle.drop = DROPSTYLE_NONE
HeaderData.PlayerNameStyle.wrapEndX = 0
HeaderData.PlayerNameStyle.wrapStartX = 0
HeaderData.PlayerNamePlace.x = txt_x
HeaderData.PlayerNamePlace.y = txt_y
//
// sGraphicHeader = GET_HEADER_GRAPHIC_FOR_PI()
// REQUEST_HEADER_GRAPHIC_FOR_PI()
CPRINTLN(DEBUG_MISSION, "header init---CV:sGraphicHeader: ",sGraphicHeader)
SET_MENU_USES_HEADER_GRAPHIC((NOT IS_STRING_NULL_OR_EMPTY(sGraphicHeader)), sGraphicHeader, sGraphicHeader)
ENDPROC
PROC DRAW_TEXT_WITH_CHAR_NAME(TEXT_PLACEMENT &inText, TEXT_STYLE &Style, HUD_COLOURS aColour = HUD_COLOUR_WHITE, eTextJustification Justifyied = FONT_LEFT)
TEXT_LABEL_15 inCharName
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
inCharName = "BLIP_78"//"CHAR_SEL_M"
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
inCharName = "BLIP_88"//"CHAR_SEL_F"
else //trev
inCharName = "BLIP_79"//"CHAR_SEL_T"
endif
IF NOT IS_STRING_EMPTY_HUD(inCharName)
IF IS_SAFE_TO_DRAW_ON_SCREEN()
SET_TEXT_STYLE(Style)
SET_TEXT_JUSTIFICATION(Justifyied)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
SET_COLOUR_OF_NEXT_TEXT_COMPONENT(aColour)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(inCharName)
END_TEXT_COMMAND_DISPLAY_TEXT(ADJUST_SCREEN_X_POSITION(inText.x), ADJUST_SCREEN_Y_POSITION(inText.y))
ENDIF
ENDIF
ENDPROC
PROC DRAW_PI_Menu_HEADER(PI_MENU_HEADER_DATA &HeaderData)
SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP)
SET_SCRIPT_GFX_ALIGN_PARAMS(fAlignX, fAlignY, 0.0, 0.0)
//Move Main Menu Down
CUSTOM_MENU_Y = ( ( ( CUSTOM_MENU_ITEM_BAR_H / GET_ASPECT_RATIO_MULTIPLIER() ) * ( 3.0 / GET_ASPECT_RATIO_MULTIPLIER() ) ) + 0.05 )
//Background
DRAW_RECTANGLE(HeaderData.Background)
//char name
DRAW_TEXT_WITH_CHAR_NAME(HeaderData.PlayerNamePlace,HeaderData.PlayerNameStyle,HUD_COLOUR_BLACK,FONT_CENTRE)
RESET_SCRIPT_GFX_ALIGN()
ENDPROC
PROC SPECIAL1_PED_RESET(bool bAddingMask = FALSE)
//if applying a mask then remove all special conflicts
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
if GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P0_FIREMAN_ACCS
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P0_BALACLAVA
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P0_GAS_MASK
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P0_CLOWN_ACCS
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P0_FIREMAN_ACCS_1
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P0_BALACLAVA_B
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL_P0_NONE)
endif
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
if GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P1_BALLISTICS
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P1_BALACLAVA
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P1_EXTERMINATOR
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P1_FIREMAN
or( GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL)= SPECIAL_P1_MASK and bAddingMask)
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P1_FIREMAN_1
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL ,SPECIAL_P1_DUMMY)
endif
if GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_HAIR) = HAIR_P1_MASK
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_HAIR ,HAIR_P1_SHORT_1)
endif
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
if GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P2_FIREMAN_ACCS
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P2_BALACLAVA
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P2_NCHEIFMASK
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P2_MASK
or GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL) = SPECIAL_P2_FIREMAN_ACCS_1
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL ,SPECIAL_P2_DUMMY)
endif
endif
ENDPROC
//PURPOSE: Sets the currently selected item
PROC SET_CURRENT_PED_COMPONENT()
IF iSubMenu = ciPI_SUB_MENU_INVENTORY
//Masks
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_MASKS
IF iMaskTotalCount > 1
CPRINTLN(DEBUG_MISSION, "Masks---CV:SET_CURRENT_PED_COMPONENT:SET name: ",ENUM_TO_INT( MaskData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName))
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
if MaskData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName != SPECIAL_P1_MASK
//Remove Conflicts
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_HATS] = 0
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_GLASSES] = 0
endif
else
//Remove Conflicts
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_HATS] = 0
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_GLASSES] = 0
endif
//Remove Mask
if sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] != 0
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P0_NONE)
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P1_NONE)
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL, SPECIAL_P1_MASK)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL ,SPECIAL_P1_WATCH_AND_BRACELET) //Reset to watch and bracelet
endif
else
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P2_NONE)
endif
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_PROPS ,PROPS_HEAD_NONE)
endif
SPECIAL1_PED_RESET(true)
//only set hats and glasses here if not franklin or not wearing bandana as franklin
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
if MaskData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName != SPECIAL_P1_MASK
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),HatsData[sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_HATS]].eType,HatsData[sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_HATS]].eName)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),GlassesData[sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_GLASSES]].eType,GlassesData[sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_GLASSES]].eName)
endif
else
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),HatsData[sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_HATS]].eType,HatsData[sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_HATS]].eName)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),GlassesData[sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_GLASSES]].eType,GlassesData[sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_GLASSES]].eName)
endif
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
//Add Mask
REMOVE_INVALID_PROP_ITEMS_FOR_ITEM(PLAYER_PED_ID(), MaskData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eType, MaskData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), MaskData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eType, MaskData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName)
if MaskData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName = PROPS_HEAD_NONE
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P0_NONE)
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P1_NONE)
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL, SPECIAL_P1_MASK)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL ,SPECIAL_P1_WATCH_AND_BRACELET) //Reset to watch and bracelet
endif
else
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P2_NONE)
endif
endif
SET_BIT(iBoolsBitSet, biEnableFaceCam)
ENDIF
//Glasses
ELIF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_GLASSES
IF iGlassesTotalCount > 1
CPRINTLN(DEBUG_MISSION, "Glasses---CV:SET_CURRENT_PED_COMPONENT:SET name: ",ENUM_TO_INT( GlassesData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName))
//Remove Mask
if sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] != 0
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF not IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL, SPECIAL_P1_MASK)
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] = 0
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P0_NONE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eType, MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eName)
endif
else
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] = 0
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P0_NONE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eType, MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eName)
endif
endif
SPECIAL1_PED_RESET()
//Remove Helmet
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
//add glasses
REMOVE_INVALID_PROP_ITEMS_FOR_ITEM(PLAYER_PED_ID(), GlassesData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eType, GlassesData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName)
// FORCE_VALID_PED_COMPONENT_COMBO_FOR_ITEM_SP(PLAYER_PED_ID(), GlassesData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eType, GlassesData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), GlassesData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eType, GlassesData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName)
SET_BIT(iBoolsBitSet, biEnableFaceCam)
ENDIF
//Hats
ELIF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_HATS
IF iHatTotalCount > 1
AND NOT IS_PED_ON_ANY_BIKE(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "HATS---CV:SET_CURRENT_PED_COMPONENT:SET name: ",ENUM_TO_INT( HatsData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName))
//Remove Mask
if sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] != 0
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF not IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL, SPECIAL_P1_MASK)
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] = 0
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P0_NONE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eType, MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eName)
endif
else
sSelection.iSelection[ciPI_SUB_MENU_INVENTORY][ciPI_TYPE_M2_MASKS] = 0
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL2 ,SPECIAL2_P0_NONE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eType, MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eName)
endif
endif
SPECIAL1_PED_RESET()
//Remove Helmet
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
//Add hat
REMOVE_INVALID_PROP_ITEMS_FOR_ITEM(PLAYER_PED_ID(), HatsData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eType, HatsData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName)
// FORCE_VALID_PED_COMPONENT_COMBO_FOR_ITEM_SP(PLAYER_PED_ID(), HatsData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eType, HatsData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), HatsData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eType, HatsData[sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]].eName)
// ALTER_WANTED_LEVEL_FOR_CHANGED_LOOK()
SET_BIT(iBoolsBitSet, biEnableFaceCam)
ENDIF
ENDIF
ENDIF
STORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
ENDPROC
//PURPOSE: Controls what should happen when selecting an option
PROC CONTROL_PI_MENU_INPUT()
#IF FEATURE_SP_DLC_DIRECTOR_MODE
IF bDirectorWarningScreen
SET_GAME_PAUSED(TRUE)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
SET_WARNING_MESSAGE_WITH_HEADER("VEUI_HDR_ALERT", "VE_DIR_MODE_SURE", FE_WARNING_OKCANCEL)
if IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
g_bLaunchDirectorMode = true
ePI_MENU_STATE = PI_MENU_CLEANUP
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_SHORT)
bDirectorWarningScreen = false
SET_PLAYER_CONTROL(player_id(),true)
SET_GAME_PAUSED(FALSE)
elif IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
or (IS_PC_VERSION() AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL))
bDirectorWarningScreen = false
SET_PLAYER_CONTROL(player_id(),true)
SET_GAME_PAUSED(FALSE)
endif
else
#endif
if bSelectAvailable
IF IS_CELLPHONE_ACCEPT_ONLY_JUST_RELEASED()
OR bCursorAccept = TRUE
PLAY_SOUND_FRONTEND(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
IF iSubMenu = ciPI_SUB_MENU_NONE
SWITCH sPI_MenuData.iCurrentSelection
case ciPI_TYPE_QUICK_GPS
SET_QUICK_GPS_WAYPOINT()
ePI_MENU_STATE = PI_MENU_CLEANUP
break
case ciPI_TYPE_INVENTORY
iStoredSelection = sPI_MenuData.iCurrentSelection
sPI_MenuData.iCurrentSelection = 0
iSubMenu = ciPI_SUB_MENU_INVENTORY
bResetMenuNow = TRUE
break
case ciPI_TYPE_OBJECTIVE
iStoredSelection = sPI_MenuData.iCurrentSelection
sPI_MenuData.iCurrentSelection = 0
iSubMenu = ciPI_SUB_MENU_OBJECTIVE
bResetMenuNow = TRUE
break
case ciPI_TYPE_HELPTEXT
iStoredSelection = sPI_MenuData.iCurrentSelection
sPI_MenuData.iCurrentSelection = 0
iSubMenu = ciPI_SUB_MENU_HELPTEXT
bResetMenuNow = TRUE
break
#IF FEATURE_SP_DLC_DIRECTOR_MODE
case ciPI_TYPE_DIRECTOR
SET_PLAYER_CONTROL(player_id(),false)
bDirectorWarningScreen = true
break
#ENDIF
endswitch
elif iSubMenu = ciPI_SUB_MENU_INVENTORY
sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]++
IF sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection] > GET_SELECTION_MAX_PI(sPI_MenuData.iCurrentSelection)
sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection] = 0
ENDIF
bResetMenuNow = TRUE
SET_CURRENT_PED_COMPONENT()
endif
endif
endif
#IF FEATURE_SP_DLC_DIRECTOR_MODE
Endif
#endif
ENDPROC
//purpose: checks the missions and other situations to stop inventory working
FUNC BOOL SAFE_TO_USE_INVENTORY()
// Are these missions running
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Family2")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Lester1")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Michael2")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Michael4")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Franklin0")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Franklin2")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("carsteal3")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("FBI1")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("FBI2")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("FBI4")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("FBI5A")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("agency_heist2")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("agency_heist3A")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("agency_heist3B")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("docks_setup")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("docks_heistA")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("docks_heistB")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("finale_heist2a")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("finale_heist2b")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Jewelry_setup1")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Jewelry_heist")) != 0
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("rural_bank_heist")) != 0
return false
endif
//Blocking the use of the inventory in any vehicle that isn't a car or a boat
if not IS_PED_INJURED(player_ped_id())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
VEHICLE_INDEX thisVeh = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
IF not IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(thisVeh))
and not IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(thisVeh))
RETURN FALSE
Endif
endif
endif
RETURN TRUE
ENDFUNC
PROC CONTROL_PI_MENU_PC_MOUSE_INPUT()
bCursorAccept = FALSE
bCursorCancel = FALSE
bCursorQuitMenu = FALSE
bCursorScrollUp = FALSE
bCursorScrollDown = FALSE
iCursorValueChange = 0
bCursorCamMove = FALSE
INT iTempCursorChange = 0
CONST_FLOAT LEFT_SIDE_ACCEPT_SIZE 0.045
IF ePI_MENU_STATE != PI_MENU_ACTIVE
IF NOT HAVE_SF_ASSETS_LOADED()
EXIT
ENDIF
ENDIF
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF eFaceCamStage != FCS_RUNNING
HANDLE_PI_MENU_MOUSE_CAMERA(FALSE, bCursorMenuFirstTime)
ELSE
bCursorCamMove = HANDLE_PI_MENU_MOUSE_CAMERA(TRUE, bCursorMenuFirstTime)
ENDIF
// Cursor is inside the menu
IF g_iMenuCursorItem > MENU_CURSOR_NO_ITEM
// Clicking on an item
IF IS_CURSOR_ACCEPT_HELD()
// Clicking on currently selected item
IF g_iMenuCursorItem = sPI_MenuData.iCurrentSelection
// Item is a < item > style with value change, so handle that.
IF (GET_SELECTION_MAX_PI(sPI_MenuData.iCurrentSelection) > 0) AND (bUseSelectArrows = TRUE)
// Some options can be confirmed with a click to the left hand side of the menu.
iTempCursorChange = GET_CURSOR_MENU_ITEM_VALUE_CHANGE(LEFT_SIDE_ACCEPT_SIZE)
IF (iTempCursorChange = -1) OR (iTempCursorChange = 1)
iCursorValueChange = iTempCursorChange
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_CURSOR_ACCEPT_ONLY_JUST_RELEASED()
// Clicking on currently selected item
IF g_iMenuCursorItem = sPI_MenuData.iCurrentSelection
// Item is a < item > style with value change, so handle that.
IF GET_SELECTION_MAX_PI(sPI_MenuData.iCurrentSelection) > 0
AND bUseSelectArrows = TRUE
// Some options can be confirmed with a click to the left hand side of the menu.
IF iSubMenu = ciPI_SUB_MENU_NONE
AND sPI_MenuData.iCurrentSelection = ciPI_TYPE_QUICK_GPS
iCursorValueChange = GET_CURSOR_MENU_ITEM_VALUE_CHANGE(LEFT_SIDE_ACCEPT_SIZE)
IF iCursorValueChange = -999
bCursorAccept = TRUE
ENDIF
ELSE
iCursorValueChange = GET_CURSOR_MENU_ITEM_VALUE_CHANGE()
ENDIF
ELSE
// Item is a normal item, so just confirm
bCursorAccept = TRUE
ENDIF
ELSE
// Select new item.
sPI_MenuData.iCurrentSelection = g_iMenuCursorItem
SET_CURRENT_MENU_ITEM(sPI_MenuData.iCurrentSelection)
bResetMenuNow = TRUE
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
ENDIF
ENDIF
// Different cursor if value can be confirmed by a click to the left of the menu.
IF g_iMenuCursorItem = sPI_MenuData.iCurrentSelection
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_QUICK_GPS
AND iSubMenu = ciPI_SUB_MENU_NONE
AND GET_CURSOR_MENU_ITEM_VALUE_CHANGE(LEFT_SIDE_ACCEPT_SIZE) = -999
SET_MOUSE_CURSOR_STYLE(MOUSE_CURSOR_STYLE_HAND_MIDDLE_FINGER)
ENDIF
ENDIF
ELSE
// Cancel if clicked outside the menu, but not if face-cam is running.
IF eFaceCamStage != FCS_RUNNING
AND iMenuUpdateTimer != GET_GAME_TIMER() // B*2280267: Also needed to make sure that menu has not been rebuilt this frame (as that means clicking anywhere counts as off-menu). The menu sets this timer when it rebuilds, so I've added a check to it.
IF IS_CURSOR_ACCEPT_ONLY_JUST_RELEASED()
bCursorQuitMenu = TRUE
ENDIF
ENDIF
ENDIF
// Cancel menu
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
bCursorCancel = TRUE
ENDIF
// Scroll up
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP)
OR (IS_CURSOR_ACCEPT_ONLY_JUST_RELEASED() AND g_iMenuCursorItem = MENU_CURSOR_SCROLL_UP)
bCursorScrollUp = TRUE
ENDIF
// Scroll down
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN)
OR (IS_CURSOR_ACCEPT_ONLY_JUST_RELEASED() AND g_iMenuCursorItem = MENU_CURSOR_SCROLL_DOWN)
bCursorScrollDown = TRUE
ENDIF
/*
IF IS_CURSOR_ACCEPT_HELD()
IF (GET_GAME_TIMER() > iScrollTimer)
IF (g_iMenuCursorItem = MENU_CURSOR_SCROLL_UP)
iScrollTimer = GET_GAME_TIMER() + 250
bCursorScrollUp = TRUE
EXIT
ENDIF
IF (g_iMenuCursorItem = MENU_CURSOR_SCROLL_DOWN)
iScrollTimer = GET_GAME_TIMER() + 250
bCursorScrollDown = TRUE
EXIT
ENDIF
ENDIF
ENDIF
*/
ENDIF
ENDPROC
//PURPOSE: Controls movement of the menu
FUNC BOOL CONTROL_PI_MENU_MOVEMENT()
//FLOAT fTemp
#IF FEATURE_SP_DLC_DIRECTOR_MODE
IF !bDirectorWarningScreen
#endif
//Move Up and Down
IF (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_DOWN) OR bCursorScrollDown)
IF get_Game_timer() - iPI_MoveTimer > iPI_MOVE_DELAY OR bCursorScrollDown
iPI_MoveTimer = get_Game_timer()
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
sPI_MenuData.iCurrentSelection++
IF sPI_MenuData.iCurrentSelection > (GET_MENU_MAX() -1)
sPI_MenuData.iCurrentSelection = 0
ENDIF
SET_CURRENT_MENU_ITEM(sPI_MenuData.iCurrentSelection)
bResetMenuNow = TRUE
RETURN TRUE
ENDIF
ELIF (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_UP) OR bCursorScrollUp)
IF get_Game_timer() - iPI_MoveTimer > iPI_MOVE_DELAY OR bCursorScrollUp
iPI_MoveTimer = get_Game_timer()
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
sPI_MenuData.iCurrentSelection--
IF sPI_MenuData.iCurrentSelection < 0
sPI_MenuData.iCurrentSelection = (GET_MENU_MAX() -1)
ENDIF
SET_CURRENT_MENU_ITEM(sPI_MenuData.iCurrentSelection)
bResetMenuNow = TRUE
RETURN TRUE
ENDIF
ELIF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_LEFT) OR iCursorValueChange = -1)
IF get_Game_timer() - iPI_MoveTimer > iPI_MOVE_DELAY
iPI_MoveTimer = get_Game_timer()
IF GET_SELECTION_MAX_PI(sPI_MenuData.iCurrentSelection) > 0
AND bUseSelectArrows = TRUE
sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]--
IF sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection] < 0
sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection] = GET_SELECTION_MAX_PI(sPI_MenuData.iCurrentSelection)
ENDIF
SET_CURRENT_PED_COMPONENT()
PLAY_SOUND_FRONTEND(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
bResetMenuNow = TRUE
RETURN TRUE
ENDIF
ENDIF
ELIF ( IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_RIGHT) OR iCursorValueChange = 1)
IF get_Game_timer() - iPI_MoveTimer > iPI_MOVE_DELAY
iPI_MoveTimer = get_Game_timer()
IF GET_SELECTION_MAX_PI(sPI_MenuData.iCurrentSelection) > 0
AND bUseSelectArrows = TRUE
sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection]++
IF sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection] > GET_SELECTION_MAX_PI(sPI_MenuData.iCurrentSelection)
sSelection.iSelection[iSubMenu][sPI_MenuData.iCurrentSelection] = 0
ENDIF
SET_CURRENT_PED_COMPONENT()
PLAY_SOUND_FRONTEND(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
bResetMenuNow = TRUE
RETURN TRUE
ENDIF
ENDIF
ENDIF
#IF FEATURE_SP_DLC_DIRECTOR_MODE
endif
#endif
RETURN TRUE
ENDFUNC
//PURPOSE: Stops and clears the Face Cam
PROC CLEANUP_FACE_CAM()
IF IS_BIT_SET(iBoolsBitSet, biEnableFaceCam)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_CAM_ACTIVE(FaceCam, FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE) //TRUE)
DESTROY_CAM(FaceCam)
CLEAR_BIT(iBoolsBitSet, biEnableFaceCam)
eFaceCamStage = FCS_WAIT
fXpos = 0
fYpos = 0
NET_PRINT_TIME() NET_PRINT(" ----------> PIM - PROCESS_FACE_CAM - CLEANUP_FACE_CAM - iFaceCamStage = FCS_WAIT") NET_NL()
ENDIF
ENDPROC
FUNC BOOL MENU_OFF_CHECK()
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
// Don't allow the menu to be closed when we are displaying a warning screen.
// Player control is off and we have to let the warning screen clear before
// killing the menu.
#IF FEATURE_SP_DLC_DIRECTOR_MODE
IF !bDirectorWarningScreen //dont apply this check when on the warning screen
#endif
IF NOT IS_PED_INJURED(player_ped_id()) // ped alive
if IS_PAUSE_MENU_ACTIVE() // is pause menu active
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: is pause menu active")
return true
endif
if GET_PAUSE_MENU_STATE()!= PM_INACTIVE // is pause menu active
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: is pause menu activate state")
return true
endif
if IS_RESULT_SCREEN_DISPLAYING() // passed screen on
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: passed screen on")
return true
endif
if IS_PHONE_ONSCREEN() // phone is on screen
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: phone is on screen")
return true
endif
if IS_HUD_HIDDEN() // hud is hidden
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: hud is hidden")
return true
endif
if IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME) // Any minigame block
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: Any minigame block")
return true
endif
if IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME_FRIENDS) // any friends block
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: MINIGAME_FRIENDS")
return true
endif
if IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) // any friends block
or IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: any FRIEND_ACTIVITY")
return true
endif
if( not IS_PLAYER_CONTROL_ON(player_id()) and not IS_BIT_SET(iBoolsBitSet, biEnableFaceCam) ) // make sure menu close if control off and not in cam mode
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: make sure menu close if control off and not in cam mode")
return true
endif
if( not IS_GAMEPLAY_CAM_RENDERING()
and not IS_CINEMATIC_FIRST_PERSON_VEHICLE_INTERIOR_CAM_RENDERING()
and not IS_BIT_SET(iBoolsBitSet, biEnableFaceCam)) // if a scripted cam is running block menu
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: if a scripted cam is running block menu")
return true
endif
if IS_HELP_MESSAGE_BEING_DISPLAYED()
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_OFF_MISSION) // help message displayed
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: help message displayed on mission")
return true
endif
if g_iCurrentlyDisplayingContextINDEX != -1 // context displayed
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: context displayed")
return true
endif
if not IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
if IS_PED_SWIMMING(PLAYER_PED_ID()) //is ped swimming
or IS_PED_SWIMMING_UNDER_WATER(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: is ped swimming")
return true
endif
endif
if IS_CUTSCENE_PLAYING() // Cutscene playing
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: Cutscene playing")
return true
endif
if IS_PED_BEING_ARRESTED(player_ped_id()) // Being arrested
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: Being arrested")
return true
endif
if IS_FIRST_PERSON_AIM_CAM_ACTIVE() // player aiming
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: player aiming")
return true
endif
if IS_PED_FALLING(player_ped_id()) // player falling
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: player falling")
return true
endif
if IS_PED_RAGDOLL(player_ped_id()) // ped ragdolling
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: ped ragdolling")
return true
endif
if GET_PED_PARACHUTE_STATE(player_ped_id()) = PPS_SKYDIVING // skydiving should block
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: skydiving should block")
return true
endif
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Prologue1")) > 0 // Prologue block menu
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: Prologue block menu")
return true
endif
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Armenian1")) > 0 // arm1 block menu
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: arm1 block menu")
return true
endif
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Appinternet")) > 0 // internet check
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: internet check")
return true
endif
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("hao1")) > 0 // hao race check
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: street race mini game RC version")
return true
endif
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Fanatic1")) > 0 // fanatic race check
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Fanatic2")) > 0 // fanatic race check
or GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Fanatic3")) > 0 // fanatic race check
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: fanatic race check")
return true
endif
if (GET_PLAYER_CHAR_COMMUNICATION_PRIORITY_LEVEL(ePed) = CPR_VERY_HIGH) // end of mission call disable menu
and IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_OFF_MISSION)
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: end of mission call disable menu")
return true
endif
if g_bInATM // ATM check
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: ATM check")
return true
endif
if IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP() // browsing in a shop
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: browsing in a shop")
return true
ENDIF
if IS_PLAYER_IN_SHOP_OF_TYPE(SHOP_TYPE_CARMOD)
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: in SHOP_TYPE_CARMOD") // In mod shop
return true
endif
if g_bPlayerLockedInToTrigger // Triggering mission
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: g_bPlayerLockedInToTrigger")
return true
endif
echarCurr = GET_CURRENT_PLAYER_PED_ENUM()
if echarCurr != echarPrev
echarPrev = echarCurr
iCurrentSelfie = 0
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: switched to a different Char")
return true
endif
if IS_PLAYER_SWITCH_IN_PROGRESS() // switching
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: IS_PLAYER_SWITCH_IN_PROGRESS")
return true
endif
if IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_ANIMAL) //peyote mission block.
or IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
return true
endif
if ARE_STRINGS_EQUAL(g_sMenuData.tl15Title,"IMPOUND_TITLE")
and IS_CUSTOM_MENU_ON_SCREEN()
CPRINTLN(DEBUG_MISSION, "---CV MENU_OFF_CHECK: Multiple vehcile impound menu")
return true
endif
// ---- resolution update check ----
INT scrX,scrY
GET_ACTUAL_SCREEN_RESOLUTION(scrX,scrY)
IF scrX != iOldScrX
OR scrY != iOldScrY
iOldScrX = scrX
iOldScrY = scrY
RETURN FALSE //TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
#IF FEATURE_SP_DLC_DIRECTOR_MODE
endif
#endif
RETURN FALSE
ENDFUNC
FUNC BOOL CONTROL_MENU_CLOSE()
if not IS_BIT_SET(iBoolsBitSet, biSwitchButtonCheck)
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_CANCEL)//IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_CANCEL)
OR bCursorCancel OR bCursorQuitMenu
IF bCursorQuitMenu
iPi_menu_timer = get_Game_timer()
return true
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
if iSubMenu = ciPI_SUB_MENU_INVENTORY
or iSubMenu = ciPI_SUB_MENU_OBJECTIVE
or iSubMenu = ciPI_SUB_MENU_HELPTEXT
CLEANUP_FACE_CAM()
PLAY_SOUND_FRONTEND(-1, "BACK", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
sPI_MenuData.iCurrentSelection = iStoredSelection
iSubMenu = ciPI_SUB_MENU_NONE
bResetMenuNow = TRUE
iPi_submenu_timer = get_Game_timer()
RETURN FALSE
elif iSubMenu = ciPI_SUB_MENU_NONE
and get_Game_timer() - iPi_submenu_timer >= PI_MENU_DELAY
iPi_menu_timer = get_Game_timer()
return true
endif
ENDIF
endif
if MENU_OFF_CHECK()
#IF FEATURE_SP_DLC_DIRECTOR_MODE
IF bDirectorWarningScreen
bDirectorWarningScreen = FALSE
ENDIF
#ENDIF
return true
endif
if iSubMenu = ciPI_SUB_MENU_INVENTORY
and IS_PED_ON_ANY_BIKE(PLAYER_PED_ID())
CLEANUP_FACE_CAM()
PLAY_SOUND_FRONTEND(-1, "BACK", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
sPI_MenuData.iCurrentSelection = iStoredSelection
iSubMenu = ciPI_SUB_MENU_NONE
bResetMenuNow = TRUE
iPi_submenu_timer = get_Game_timer()
endif
if iSubMenu = ciPI_SUB_MENU_OBJECTIVE
and not IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
PLAY_SOUND_FRONTEND(-1, "BACK", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
sPI_MenuData.iCurrentSelection = iStoredSelection
iSubMenu = ciPI_SUB_MENU_NONE
bResetMenuNow = TRUE
iPi_submenu_timer = get_Game_timer()
endif
RETURN FALSE
ENDFUNC
PROC PRE_SETUP_PI_MENU()
//set menu start values
sPI_MenuData.iCurrentSelection = ciPI_TYPE_QUICK_GPS
iFastSelectSelfie = iCurrentSelfie
GET_ACTUAL_SCREEN_RESOLUTION(iOldScrX,iOldScrY)
GET_COMP_DATA()
HAVE_SF_ASSETS_LOADED()
INIT_PI_MENU_HEADER(sPIM_HeaderData)
bResetMenuNow = TRUE
iPI_MoveTimer = get_Game_timer()
ENDPROC
FUNC BOOL SWITCH_MENU_STATE()
if not IS_BIT_SET(iBoolsBitSet, biSwitchButtonCheck)
//Is PI menu button down for PI_MENU_DELAY(350ms)
bool bMenubuttonPressed = False
if not IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_INTERACTION_MENU)
bMenubuttonPressed = true
endif
else
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_INTERACTION_MENU)
bMenubuttonPressed = true
endif
endif
IF bMenubuttonPressed
and not MENU_OFF_CHECK()
and not IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE)//Stat button cant be pressed at the same time
IF not IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
IF get_Game_timer() - iPi_menu_timer >= PI_MENU_DELAY
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
CPRINTLN(DEBUG_MISSION, "---CV biSwitchButtonCheck: SET PAD")
SET_BIT(iBoolsBitSet, biSwitchButtonCheck)
iPi_menu_timer = get_Game_timer()
PLAY_SOUND_FRONTEND(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
RETURN TRUE
ENDIF
else
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
CPRINTLN(DEBUG_MISSION, "---CV biSwitchButtonCheck: SET keyboard & mouse")
SET_BIT(iBoolsBitSet, biSwitchButtonCheck)
iPi_menu_timer = get_Game_timer()
PLAY_SOUND_FRONTEND(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
RETURN TRUE
endif
ELSE
iPi_menu_timer = get_Game_timer()
RETURN FALSE
ENDIF
else
IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_INTERACTION_MENU)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
ELSE
CPRINTLN(DEBUG_MISSION, "---CV biSwitchButtonCheck: CLEAR")
CLEAR_BIT(iBoolsBitSet, biSwitchButtonCheck)
ENDIF
endif
RETURN FALSE
ENDFUNC
PROC PROCESS_LOCAL_PLAYER_MENU()
//TITLE
SET_MENU_TITLE("PIM_TITLE1") //HIDE") //PIM_TITLE0") //PIM_TITLE1")
SET_MENU_USES_HEADER_GRAPHIC((NOT IS_STRING_NULL_OR_EMPTY(sGraphicHeader)), sGraphicHeader, sGraphicHeader)
INT iRed, iGreen, iBlue, iRedF, iGreenF, iBlueF
IF GET_CHARACTER_COLOUR_PI(iRed, iGreen, iBlue, iRedF, iGreenF, iBlueF)
//SET_MENU_HEADER_COLOUR(iRed, iGreen, iBlue, 255, TRUE)
SET_MENU_HEADER_TEXT_COLOUR(iRedF, iGreenF, iBlueF, 255, TRUE)
SET_MENU_FOOTER_COLOUR(iRedF, iGreenF, iBlueF, 255, TRUE)
SET_MENU_USES_INVERTED_SCROLL_ICON(TRUE)
ELSE
//SET_MENU_HEADER_COLOUR(iRed, iGreen, iBlue, 255, FALSE)
SET_MENU_HEADER_TEXT_COLOUR(iRedF, iGreenF, iBlueF, 255, FALSE)
SET_MENU_FOOTER_COLOUR(iRedF, iGreenF, iBlueF, 255, FALSE)
SET_MENU_USES_INVERTED_SCROLL_ICON(FALSE)
ENDIF
sPIM_HeaderData.Background.w = CUSTOM_MENU_W
fMenuExtension = CUSTOM_MENU_W
BOOL bUseArrows = FALSE
BOOL bAvailable = FALSE
//QUICK GPS
ADD_MENU_ITEM_TEXT(ciPI_TYPE_QUICK_GPS, "PIM_TQGPS", 0, TRUE)
sPI_MenuData.tl15 = "PIM_QGPS0"
eCurrentGPS = eGPS_NONE // set values to minimum then check for unlocked shops
int iMissionsAvailable[MAX_MISSION_TRIGGERS]
int triggerLoop
enumCharacterList eCurrentPlayer = GET_CURRENT_PLAYER_PED_ENUM()
//NONE
ciPI_MAX_GPS = 0
//HOME
ciPI_MAX_GPS++
//missions
repeat MAX_MISSION_TRIGGERS triggerLoop
if g_TriggerableMissions[triggerLoop].eMissionID != SP_MISSION_NONE
and g_TriggerableMissions[triggerLoop].eMissionID != SP_HEIST_FINALE_PREP_C1
and g_TriggerableMissions[triggerLoop].eMissionID != SP_HEIST_FINALE_PREP_C2
and g_TriggerableMissions[triggerLoop].eMissionID != SP_HEIST_FINALE_PREP_C3
IF Is_Mission_Triggerable_By_Character(g_sMissionStaticData[g_TriggerableMissions[triggerLoop].eMissionID].triggerCharBitset, eCurrentPlayer)
and IS_STATIC_BLIP_CURRENTLY_VISIBLE(g_TriggerableMissions[triggerLoop].eBlip)
if IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_OFF_MISSION)
or IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_EVENT)
ciPI_MAX_GPS++
iMissionsAvailable[triggerLoop] = ciPI_MAX_GPS
endif
endif
endif
endrepeat
//ATM
ciPI_MAX_GPS++
int iAtmAvailable = ciPI_MAX_GPS
//Are gun shops open
int iGunshopAvailable = -1
if IS_SHOP_AVAILABLE(GUN_SHOP_01_DT) or IS_SHOP_AVAILABLE(GUN_SHOP_02_SS)or IS_SHOP_AVAILABLE(GUN_SHOP_03_HW)
or IS_SHOP_AVAILABLE(GUN_SHOP_04_ELS)or IS_SHOP_AVAILABLE(GUN_SHOP_05_PB)or IS_SHOP_AVAILABLE(GUN_SHOP_06_LS)
or IS_SHOP_AVAILABLE(GUN_SHOP_07_MW) or IS_SHOP_AVAILABLE(GUN_SHOP_08_CS)or IS_SHOP_AVAILABLE(GUN_SHOP_09_GOH)
or IS_SHOP_AVAILABLE(GUN_SHOP_10_VWH) or IS_SHOP_AVAILABLE(GUN_SHOP_11_ID1)
ciPI_MAX_GPS++
iGunshopAvailable = ciPI_MAX_GPS
endif
//mod shops
int iCarShopsAvailable = -1
if IS_SHOP_AVAILABLE(CARMOD_SHOP_01_AP) or IS_SHOP_AVAILABLE(CARMOD_SHOP_05_ID2)or IS_SHOP_AVAILABLE(CARMOD_SHOP_06_BT1)
or IS_SHOP_AVAILABLE(CARMOD_SHOP_07_CS1)or IS_SHOP_AVAILABLE(CARMOD_SHOP_08_CS6)
or IS_SHOP_AVAILABLE(CARMOD_SHOP_SUPERMOD)
ciPI_MAX_GPS++
iCarShopsAvailable = ciPI_MAX_GPS
endif
//clothes shop
int ilowClothesAvailable = -1
if IS_SHOP_AVAILABLE(CLOTHES_SHOP_L_01_SC) or IS_SHOP_AVAILABLE(CLOTHES_SHOP_L_02_GS)or IS_SHOP_AVAILABLE(CLOTHES_SHOP_L_03_DT)
or IS_SHOP_AVAILABLE(CLOTHES_SHOP_L_04_CS)or IS_SHOP_AVAILABLE(CLOTHES_SHOP_L_05_GSD)or IS_SHOP_AVAILABLE(CLOTHES_SHOP_L_06_VC)
or IS_SHOP_AVAILABLE(CLOTHES_SHOP_L_07_PB)
ciPI_MAX_GPS++
ilowClothesAvailable = ciPI_MAX_GPS
endif
int imedClothesAvailable = -1
if IS_SHOP_AVAILABLE(CLOTHES_SHOP_M_01_SM)or IS_SHOP_AVAILABLE(CLOTHES_SHOP_M_03_H)
or IS_SHOP_AVAILABLE(CLOTHES_SHOP_M_04_HW)or IS_SHOP_AVAILABLE(CLOTHES_SHOP_M_05_GOH)
ciPI_MAX_GPS++
imedClothesAvailable = ciPI_MAX_GPS
endif
int ihighClothesAvailable = -1
if IS_SHOP_AVAILABLE(CLOTHES_SHOP_H_01_BH)
or IS_SHOP_AVAILABLE(CLOTHES_SHOP_H_02_B)or IS_SHOP_AVAILABLE(CLOTHES_SHOP_H_03_MW)
ciPI_MAX_GPS++
ihighClothesAvailable = ciPI_MAX_GPS
endif
//mask shop
int iMasksAvailable = -1
if IS_SHOP_AVAILABLE(CLOTHES_SHOP_A_01_VB)
ciPI_MAX_GPS++
iMasksAvailable = ciPI_MAX_GPS
endif
//hair shop
int ihairAvailable = -1
if IS_SHOP_AVAILABLE(HAIRDO_SHOP_01_BH) or IS_SHOP_AVAILABLE(HAIRDO_SHOP_02_SC)or IS_SHOP_AVAILABLE(HAIRDO_SHOP_03_V)
or IS_SHOP_AVAILABLE(HAIRDO_SHOP_04_SS)or IS_SHOP_AVAILABLE(HAIRDO_SHOP_05_MP)or IS_SHOP_AVAILABLE(HAIRDO_SHOP_06_HW)
or IS_SHOP_AVAILABLE(HAIRDO_SHOP_07_PB)
ciPI_MAX_GPS++
ihairAvailable = ciPI_MAX_GPS
endif
//tattoo shop
int iTattooAvailable = -1
if IS_SHOP_AVAILABLE(TATTOO_PARLOUR_01_HW) or IS_SHOP_AVAILABLE(TATTOO_PARLOUR_02_SS)or IS_SHOP_AVAILABLE(TATTOO_PARLOUR_03_PB)
or IS_SHOP_AVAILABLE(TATTOO_PARLOUR_04_VC)or IS_SHOP_AVAILABLE(TATTOO_PARLOUR_05_ELS)or IS_SHOP_AVAILABLE(TATTOO_PARLOUR_06_GOH)
ciPI_MAX_GPS++
iTattooAvailable = ciPI_MAX_GPS
endif
//Garage
int iGarageAvailable = -1
VEHICLE_GEN_NAME_ENUM ename
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eName = VEHGEN_WEB_CAR_MICHAEL
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
eName = VEHGEN_WEB_CAR_FRANKLIN
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
eName = VEHGEN_WEB_CAR_TREVOR
ENDIF
if DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[eName])
ciPI_MAX_GPS++
iGarageAvailable = ciPI_MAX_GPS
ENDIF
int iGPS
triggerLoop = 0
for iGPS = 0 to ciPI_MAX_GPS
if sSelection.iSelection[ciPI_SUB_MENU_NONE][ciPI_TYPE_QUICK_GPS] = iGPS
if iGPS = enum_to_int(eGPS_NONE)
eCurrentGPS = eGPS_NONE
sPI_MenuData.tl15 = "PIM_QGPS0" //sPI_MenuData.tl15 += sSelection.iSelection[ciPI_SUB_MENU_NONE][ciPI_TYPE_QUICK_GPS]
elif iGPS = enum_to_int(eGPS_HOME)
eCurrentGPS = eGPS_HOME
sPI_MenuData.tl15 = "BLIP_40"//safehouse
elif iGPS = iAtmAvailable
eCurrentGPS = eGPS_ATM
sPI_MenuData.tl15 = "SPPIM_ATM"//atm
elif iGPS = iGunshopAvailable
eCurrentGPS = eGPS_GUN
sPI_MenuData.tl15 = "BLIP_110"//gun
elif iGPS = iCarShopsAvailable
eCurrentGPS = eGPS_MOD
sPI_MenuData.tl15 = "BLIP_72"//mod
elif iGPS = ilowClothesAvailable
eCurrentGPS = eGPS_lowCLOTHES
sPI_MenuData.tl15 = "PIM_LECLTH"//clothes
elif iGPS = imedClothesAvailable
eCurrentGPS = eGPS_medCLOTHES
sPI_MenuData.tl15 = "PIM_MECLTH"//clothes
elif iGPS = ihighClothesAvailable
eCurrentGPS = eGPS_highCLOTHES
sPI_MenuData.tl15 = "PIM_HECLTH"//clothes
elif iGPS = iMasksAvailable
eCurrentGPS = eGPS_MASK
sPI_MenuData.tl15 = "BLIP_362"//mask
elif iGPS = ihairAvailable
eCurrentGPS = eGPS_BARBER
sPI_MenuData.tl15 = "BLIP_71"//barber
elif iGPS = iTattooAvailable
eCurrentGPS = eGPS_TATTOO
sPI_MenuData.tl15 = "BLIP_75"//tattoo
elif iGPS = iGarageAvailable
eCurrentGPS = eGPS_GARAGE
sPI_MenuData.tl15 = "BLIP_357"//Garage
else
repeat MAX_MISSION_TRIGGERS triggerLoop
if iGPS = iMissionsAvailable[triggerLoop]
eCurrentGPS = INT_TO_ENUM(ENUM_GPS_LIST, ENUM_TO_INT(eGPS_MISSION1) + triggerLoop)
TEXT_LABEL_15 txtTemp
txtTemp = GET_STRAND_LABEL(g_TriggerableMissions[triggerLoop].eMissionID)
sPI_MenuData.tl15 = txtTemp
endif
endrepeat
endif
endif
endfor
bAvailable = TRUE
//GPS
ADD_MENU_ITEM_TEXT(ciPI_TYPE_QUICK_GPS, sPI_MenuData.tl15, 0, bAvailable)
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Michael1")) > 0
bAvailable = false
endif
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_QUICK_GPS
IF bAvailable = TRUE
bSelectAvailable = TRUE
ELSE
bSelectAvailable = FALSE
ENDIF
ENDIF
//INVENTORY
if SAFE_TO_USE_INVENTORY()
ADD_MENU_ITEM_TEXT(ciPI_TYPE_INVENTORY, "PIM_TINVE", 0, TRUE)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_INVENTORY
bSelectAvailable = TRUE
ENDIF
else
ADD_MENU_ITEM_TEXT(ciPI_TYPE_INVENTORY, "PIM_TINVE", 0, FALSE)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_INVENTORY
bSelectAvailable = FALSE
ENDIF
endif
//Objective
if IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME_FRIENDS)
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME)
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_EVENT)
and DOES_LATEST_BRIEF_STRING_EXIST(PREV_MESSAGE_TYPE_MISSION)
ADD_MENU_ITEM_TEXT(ciPI_TYPE_OBJECTIVE, "PIM_TOBJ", 0, TRUE)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_OBJECTIVE
bSelectAvailable = TRUE
ENDIF
else
ADD_MENU_ITEM_TEXT(ciPI_TYPE_OBJECTIVE, "PIM_TOBJ", 0, FALSE)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_OBJECTIVE
bSelectAvailable = FALSE
ENDIF
endif
//Help Text
if DOES_LATEST_BRIEF_STRING_EXIST(PREV_MESSAGE_TYPE_HELP)
ADD_MENU_ITEM_TEXT(ciPI_TYPE_HELPTEXT, "PIM_THELP", 0, TRUE)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_HELPTEXT
bSelectAvailable = TRUE
ENDIF
else
ADD_MENU_ITEM_TEXT(ciPI_TYPE_HELPTEXT, "PIM_THELP", 0, FALSE)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_HELPTEXT
bSelectAvailable = FALSE
ENDIF
endif
//Director Mode
#IF FEATURE_SP_DLC_DIRECTOR_MODE
FEATURE_BLOCK_REASON newBlockReason = GET_FEATURE_BLOCKED_REASON()
IF lastBlockReason != newBlockReason
//block reason updated, force update PI menu
bResetMenuNow = TRUE
lastBlockReason = newBlockReason
ENDIF
IF newBlockReason = FBR_NONE
ADD_MENU_ITEM_TEXT(ciPI_TYPE_DIRECTOR, "CM_IN_TIT", 0, TRUE)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_DIRECTOR
bSelectAvailable = TRUE
ENDIF
ELSE
ADD_MENU_ITEM_TEXT(ciPI_TYPE_DIRECTOR, "CM_IN_TIT", 0, FALSE)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_DIRECTOR
bSelectAvailable = FALSE
ENDIF
ENDIF
#ENDIF
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_QUICK_GPS
bUseArrows = TRUE
ENDIF
//Control Arrows
IF bUseArrows
and bAvailable
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
bUseSelectArrows = true
ELSE
SET_MENU_ITEM_TOGGLEABLE(FALSE, FALSE)
bUseSelectArrows = false
ENDIF
ENDPROC
PROC PROCESS_LOCAL_INVENTORY_MENU()
PED_COMP_ITEM_DATA_STRUCT ItemData
MODEL_NAMES PlayerModel = GET_PLAYER_PED_MODEL(GET_CURRENT_PLAYER_PED_ENUM())
TEXT_LABEL_15 sShortVersionLabel
// is_player
BOOL bAvailable
// BOOL bPlayerInVehicle = IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
BOOL bPlayerOnBike = IS_PED_ON_ANY_BIKE(PLAYER_PED_ID())
SET_MENU_TITLE("PIM_TITLE2")
SET_MENU_USES_HEADER_GRAPHIC((NOT IS_STRING_NULL_OR_EMPTY(sGraphicHeader)), sGraphicHeader, sGraphicHeader)
INT iRed, iGreen, iBlue, iRedF, iGreenF, iBlueF
IF GET_CHARACTER_COLOUR_PI(iRed, iGreen, iBlue, iRedF, iGreenF, iBlueF)
//SET_MENU_HEADER_COLOUR(iRed, iGreen, iBlue, 255, TRUE)
SET_MENU_HEADER_TEXT_COLOUR(iRedF, iGreenF, iBlueF, 255, TRUE)
SET_MENU_FOOTER_COLOUR(iRedF, iGreenF, iBlueF, 255, TRUE)
SET_MENU_USES_INVERTED_SCROLL_ICON(TRUE)
ELSE
//SET_MENU_HEADER_COLOUR(iRed, iGreen, iBlue, 255, FALSE)
SET_MENU_HEADER_TEXT_COLOUR(iRedF, iGreenF, iBlueF, 255, FALSE)
SET_MENU_FOOTER_COLOUR(iRedF, iGreenF, iBlueF, 255, FALSE)
SET_MENU_USES_INVERTED_SCROLL_ICON(FALSE)
ENDIF
sPIM_HeaderData.Background.w = CUSTOM_MENU_W //+ 0.05
fMenuExtension = CUSTOM_MENU_W //+ 0.05
//HATS
bAvailable = TRUE
IF iHatTotalCount <= 1
OR bPlayerOnBike
bAvailable = TRUE//FALSE #1879097 - none barely visible with new gradient texture
ENDIF
ADD_MENU_ITEM_TEXT(ciPI_TYPE_M2_HATS, "PIM_THELM", 0, TRUE)
IF sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_HATS] > 0
ItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(PlayerModel,HatsData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_HATS]].eType,HatsData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_HATS]].eName)
else
ItemData.sLabel = "PIM_NHELM"
endif
sShortVersionLabel = GET_SHORT_LABEL(ItemData.sLabel)
ADD_MENU_ITEM_TEXT(ciPI_TYPE_M2_HATS, sShortVersionLabel, 0, bAvailable)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_HATS
AND bAvailable = TRUE
bSelectAvailable = TRUE
ENDIF
//GLASSES
ADD_MENU_ITEM_TEXT(ciPI_TYPE_M2_GLASSES, "PIM_TGLAS", 0, TRUE)
IF sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_GLASSES] > 0
ItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(PlayerModel,GlassesData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_GLASSES]].eType,GlassesData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_GLASSES]].eName)
//Names that are too long for glasses shorterned
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
if GlassesData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_GLASSES]].eName = PROPS_P0_GLASSES_THICK_RIM_1
ItemData.sLabel = "PIM_SHDE1"//Hawaiian snow charcoal
elif GlassesData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_GLASSES]].eName = PROPS_P0_GLASSES_THICK_RIM_5
ItemData.sLabel = "PIM_SHDE2"//Hawaiian snow Tortoiseshell
elif GlassesData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_GLASSES]].eName = PROPS_P0_GLASSES_THICK_RIM_7
ItemData.sLabel = "PIM_SHDE3"//Hawaiian snow marbled
elif GlassesData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_GLASSES]].eName = PROPS_P0_GLASSES_THICK_RIM_6
ItemData.sLabel = "PIM_SHDE4"//Hawaiian snow walnut
endif
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
if GlassesData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_GLASSES]].eName = PROPS_P1_SUNGLASSES_F_2
ItemData.sLabel = "PIM_SHDE5"//Suburban Tortoiseshell
endif
endif
else
ItemData.sLabel = "PIM_NGLAS"
endif
sShortVersionLabel = GET_SHORT_LABEL(ItemData.sLabel)
ADD_MENU_ITEM_TEXT(ciPI_TYPE_M2_GLASSES, sShortVersionLabel, 0, true)//(iGlassesTotalCount > 1))#1879097 - none barely visible with new gradient texture
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_GLASSES
bSelectAvailable = TRUE
ENDIF
//MASK
bAvailable = TRUE
IF iMaskTotalCount <= 1
OR bPlayerOnBike
bAvailable = TRUE//FALSE #1879097 - none barely visible with new gradient texture
ENDIF
ADD_MENU_ITEM_TEXT(ciPI_TYPE_M2_MASKS, "PIM_TMASK", 0, TRUE)
IF sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS] > 0
ItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(PlayerModel, MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eType, MaskData[sSelection.iSelection[iSubMenu][ciPI_TYPE_M2_MASKS]].eName)
else
ItemData.sLabel = "PIM_NHELM1"
endif
sShortVersionLabel = GET_SHORT_LABEL(ItemData.sLabel)
ADD_MENU_ITEM_TEXT(ciPI_TYPE_M2_MASKS, sShortVersionLabel, 0, bAvailable)
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_MASKS
AND bAvailable = TRUE
bSelectAvailable = TRUE
ENDIF
//Control Arrows
IF (sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_MASKS AND bSelectAvailable = TRUE)
OR (sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_HATS AND bSelectAvailable = TRUE)
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
bUseSelectArrows = TRUE
Elif (sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_GLASSES AND iGlassesTotalCount > 1)
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
bUseSelectArrows = TRUE
else
SET_MENU_ITEM_TOGGLEABLE(FALSE, FALSE)
ENDIF
ENDPROC
// draw the sf movie
PROC SET_BRIEF_TEXT_MENU(bool bObjective)
if HAVE_SF_ASSETS_LOADED()
BEGIN_SCALEFORM_MOVIE_METHOD(sfMenu,"SET_TEXT")
if bObjective
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LATEST_BRIEF_STRING(PREV_MESSAGE_TYPE_MISSION)
else
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LATEST_BRIEF_STRING(PREV_MESSAGE_TYPE_HELP)
endif
END_SCALEFORM_MOVIE_METHOD()
bResetMenuNow = true
endif
ENDPROC
PROC PROCESS_LOCAL_OBJECTIVE_MENU()
SET_MENU_TITLE("PIM_TITLE1")
SET_MENU_USES_HEADER_GRAPHIC((NOT IS_STRING_NULL_OR_EMPTY(sGraphicHeader)), sGraphicHeader, sGraphicHeader)
INT iRed, iGreen, iBlue, iRedF, iGreenF, iBlueF
IF GET_CHARACTER_COLOUR_PI(iRed, iGreen, iBlue, iRedF, iGreenF, iBlueF)
//SET_MENU_HEADER_COLOUR(iRed, iGreen, iBlue, 255, TRUE)
SET_MENU_HEADER_TEXT_COLOUR(iRedF, iGreenF, iBlueF, 255, TRUE)
SET_MENU_FOOTER_COLOUR(iRedF, iGreenF, iBlueF, 255, TRUE)
SET_MENU_USES_INVERTED_SCROLL_ICON(TRUE)
ELSE
//SET_MENU_HEADER_COLOUR(iRed, iGreen, iBlue, 255, FALSE)
SET_MENU_HEADER_TEXT_COLOUR(iRedF, iGreenF, iBlueF, 255, FALSE)
SET_MENU_FOOTER_COLOUR(iRedF, iGreenF, iBlueF, 255, FALSE)
SET_MENU_USES_INVERTED_SCROLL_ICON(FALSE)
ENDIF
ADD_MENU_ITEM_TEXT(0, "PIM_TOBJ", 0)
SET_BRIEF_TEXT_MENU(true)
ENDPROC
PROC PROCESS_LOCAL_HELPTEXT_MENU()
SET_MENU_TITLE("PIM_TITLE1")
SET_MENU_USES_HEADER_GRAPHIC((NOT IS_STRING_NULL_OR_EMPTY(sGraphicHeader)), sGraphicHeader, sGraphicHeader)
INT iRed, iGreen, iBlue, iRedF, iGreenF, iBlueF
IF GET_CHARACTER_COLOUR_PI(iRed, iGreen, iBlue, iRedF, iGreenF, iBlueF)
//SET_MENU_HEADER_COLOUR(iRed, iGreen, iBlue, 255, TRUE)
SET_MENU_HEADER_TEXT_COLOUR(iRedF, iGreenF, iBlueF, 255, TRUE)
SET_MENU_FOOTER_COLOUR(iRedF, iGreenF, iBlueF, 255, TRUE)
SET_MENU_USES_INVERTED_SCROLL_ICON(TRUE)
ELSE
//SET_MENU_HEADER_COLOUR(iRed, iGreen, iBlue, 255, FALSE)
SET_MENU_HEADER_TEXT_COLOUR(iRedF, iGreenF, iBlueF, 255, FALSE)
SET_MENU_FOOTER_COLOUR(iRedF, iGreenF, iBlueF, 255, FALSE)
SET_MENU_USES_INVERTED_SCROLL_ICON(FALSE)
ENDIF
ADD_MENU_ITEM_TEXT(0, "PIM_THELP", 0)
SET_BRIEF_TEXT_MENU(false)
ENDPROC
PROC PROCESS_BELOW_MENU_HELP()
SWITCH iSubMenu
CASE ciPI_SUB_MENU_NONE
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_QUICK_GPS
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Michael1")) > 0
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_GPSOFF")
else
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_HQGPS")
endif
ELIF sPI_MenuData.iCurrentSelection = ciPI_TYPE_INVENTORY
if SAFE_TO_USE_INVENTORY()
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_INV")
ELSE
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_INVOFF")
ENDIF
ELIF sPI_MenuData.iCurrentSelection = ciPI_TYPE_OBJECTIVE
if IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME_FRIENDS)
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME)
and not IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_EVENT)
and DOES_LATEST_BRIEF_STRING_EXIST(PREV_MESSAGE_TYPE_MISSION)
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_THOBJ")
else
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_OBJOFF")
endif
ELIF sPI_MenuData.iCurrentSelection = ciPI_TYPE_HELPTEXT
if DOES_LATEST_BRIEF_STRING_EXIST(PREV_MESSAGE_TYPE_HELP)
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_THHELP")
else
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_HELPOF")
endif
#IF FEATURE_SP_DLC_DIRECTOR_MODE
ELIF sPI_MenuData.iCurrentSelection = ciPI_TYPE_DIRECTOR
SWITCH GET_FEATURE_BLOCKED_REASON(default,default,DEBUG_DIRECTOR)
CASE FBR_NONE SET_CURRENT_MENU_ITEM_DESCRIPTION( "PIM_DIRECT" ) BREAK
CASE FBR_FORCE_CLEANUP SET_CURRENT_MENU_ITEM_DESCRIPTION( "FBR_BLK_CLEAN" ) BREAK
CASE FBR_RUNNING_CURR SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_RNNNG" ) BREAK
CASE FBR_DEAD SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_DEAD" ) BREAK
CASE FBR_ON_MISSION SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_MISS" ) BREAK
CASE FBR_IN_SHOP SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_SHOP" ) BREAK
CASE FBR_IN_CUTSCENE SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_CUTS" ) BREAK
CASE FBR_WANTED SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_WANT" ) BREAK
CASE FBR_ONLINE SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_ONLI" ) BREAK
CASE FBR_UNSAFE_ACTION SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_ACT" ) BREAK
CASE FBR_UNSAFE_LOCATION SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_LOC" ) BREAK
CASE FBR_IN_VEHICLE SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_VEH" ) BREAK
CASE FBR_WEARING_PARA SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_PARA" ) BREAK
CASE FBR_FALLING SET_CURRENT_MENU_ITEM_DESCRIPTION( "DI_BLK_FALL" ) BREAK
DEFAULT
CASSERTLN(DEBUG_DIRECTOR, " - pi_menu - PROCESS_BELOW_MENU_HELP: Feature is blocked for a reason that is not being handled. RowanJ")
BREAK
ENDSWITCH
#ENDIF
ENDIF
BREAK
CASE ciPI_SUB_MENU_INVENTORY
IF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_HATS
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_HATS")
elIF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_GLASSES
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_HGLAS")
elIF sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_MASKS
SET_CURRENT_MENU_ITEM_DESCRIPTION("PIM_HMASK")
endif
BREAK
ENDSWITCH
ENDPROC
PROC SETUP_PI_MENU()
// B* 2147964 - very hacky fix using magic numbers.
// Positions the brief text depending on the aspect ratio
// (which changes the height a pos of the menu)
FLOAT fAspectMulti = GET_ASPECT_RATIO_MULTIPLIER()
FLOAT fTempMulti = ( ( ( fAspectMulti - 1.0 ) / sf_y_adj ) + 1.0 ) // Magic number ask Rowan Jones/ Ben Rollinson if required edit
sf_y = 0.754 * fTempMulti
wl_y = sf_y - 0.501 // White line const distance from breif box
bSelectAvailable = FALSE
bUseSelectArrows = FALSE
CLEAR_MENU_DATA( TRUE )
//STRUCTURE
SET_MENU_ITEM_LAYOUT(MENU_ITEM_TEXT, MENU_ITEM_TEXT)
SET_MENU_ITEM_JUSTIFICATION(FONT_LEFT, FONT_RIGHT)
#IF FEATURE_SP_DLC_DIRECTOR_MODE
SET_MAX_MENU_ROWS_TO_DISPLAY(5)
#ENDIF
#IF not FEATURE_SP_DLC_DIRECTOR_MODE
SET_MAX_MENU_ROWS_TO_DISPLAY(4)
#ENDIF
INT iHudR, iHudG, iHudB, iHudA
HUD_COLOURS hudColour
if GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
hudColour = HUD_COLOUR_MICHAEL
elif GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
hudColour = HUD_COLOUR_FRANKLIN
else
hudColour = HUD_COLOUR_TREVOR
endif
GET_HUD_COLOUR(hudColour, iHudR, iHudG, iHudB, iHudA)
SET_MENU_FOOTER_COLOUR(iHudR, iHudG, iHudB, iHudA, TRUE)
// g_sMenuData.bForceFooter = TRUE
SWITCH iSubMenu
//setup main menu
CASE ciPI_SUB_MENU_NONE
PROCESS_LOCAL_PLAYER_MENU()
IF bSelectAvailable = TRUE
ADD_MENU_HELP_KEY_CLICKABLE(INPUT_CELLPHONE_SELECT, "PIM_CSEL") //SELECT
endif
ADD_MENU_HELP_KEY_CLICKABLE(INPUT_CELLPHONE_CANCEL, "PIM_CEXI") //EXIT
BREAK
//Setup Inventory Menu
CASE ciPI_SUB_MENU_INVENTORY
// if SAFE_TO_USE_INVENTORY()
PROCESS_LOCAL_INVENTORY_MENU()
IF bSelectAvailable = TRUE
IF (sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_HATS AND iHatTotalCount > 1)
OR (sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_GLASSES AND iGlassesTotalCount > 1)
OR (sPI_MenuData.iCurrentSelection = ciPI_TYPE_M2_MASKS AND iMaskTotalCount > 1)
ADD_MENU_HELP_KEY_CLICKABLE(INPUT_CELLPHONE_SELECT, "PIM_CNEX") //NEXT
endif
endif
// endif
ADD_MENU_HELP_KEY_CLICKABLE(INPUT_CELLPHONE_CANCEL, "PIM_CEXI") //EXIT
BREAK
//Setup Objective Menu
CASE ciPI_SUB_MENU_OBJECTIVE
PROCESS_LOCAL_OBJECTIVE_MENU()
ADD_MENU_HELP_KEY_CLICKABLE(INPUT_CELLPHONE_CANCEL, "PIM_CEXI") //EXIT
BREAK
//Setup Help Menu
CASE ciPI_SUB_MENU_HELPTEXT
PROCESS_LOCAL_HELPTEXT_MENU()
ADD_MENU_HELP_KEY_CLICKABLE(INPUT_CELLPHONE_CANCEL, "PIM_CEXI") //EXIT
BREAK
ENDSWITCH
SET_CURRENT_MENU_ITEM(sPI_MenuData.iCurrentSelection)
SET_CURRENT_MENU_ITEM_DESCRIPTION("") // Pass in "" to clear
ENDPROC
PROC Maintain_Active_PI_Menu()
IF LOAD_MENU_ASSETS()
AND NOT IS_WARNING_MESSAGE_ACTIVE()
IF NOT IS_BIT_SET(iBoolsBitSet, biM_MenuSetup)
or bResetMenuNow
SETUP_PI_MENU()
bResetMenuNow = FALSE
iMenuUpdateTimer = get_Game_timer()
ELSE
if Get_Game_timer() - iMenuUpdateTimer > MENU_UPDATE_TIME
bResetMenuNow = TRUE
endif
ENDIF
IF NOT IS_BIT_SET(iBoolsBitSet, biM_MenuSetup)
SET_USER_RADIO_CONTROL_ENABLED(FALSE)
SET_BIT(iBoolsBitSet, biM_MenuSetup)
ENDIF
if iSubMenu = ciPI_SUB_MENU_OBJECTIVE
or iSubMenu = ciPI_SUB_MENU_HELPTEXT
if HAVE_SF_ASSETS_LOADED()
SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP)
SET_SCRIPT_GFX_ALIGN_PARAMS(fAlignX, fAlignY, 0.0, 0.0)
ADJUST_NEXT_POS_SIZE_AS_NORMALIZED_16_9() //b* 2147964
DRAW_SCALEFORM_MOVIE(sfMenu,sf_x,sf_y,sf_w,sf_h, 255, 255, 255, 255)
ADJUST_NEXT_POS_SIZE_AS_NORMALIZED_16_9() //b* 2147964
DRAW_RECT(wl_x,wl_y,wl_w,wl_h,255,255,255,255)
RESET_SCRIPT_GFX_ALIGN()
endif
endif
PROCESS_BELOW_MENU_HELP()
HIDE_HELP_TEXT_THIS_FRAME()
HANDLE_CURSOR_HIGHLIGHTED_MENU_ITEMS()
DRAW_MENU(DEFAULT, DEFAULT, DEFAULT, DEFAULT, FALSE,fMenuExtension, DEFAULT, TRUE)
endif
ENDPROC
PROC Maintain_Menu_Controls()
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CURSOR_X)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CURSOR_Y)
ENABLE_CONTROL_ACTION( FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT)
ELSE
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CELLPHONE_CANCEL)
ENDIF
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CELLPHONE_UP)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CELLPHONE_DOWN)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CELLPHONE_LEFT)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CELLPHONE_RIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_UNARMED)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_MELEE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_HANDGUN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_SHOTGUN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_SMG)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_AUTO_RIFLE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_SNIPER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_SPECIAL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_WHEEL_NEXT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_WHEEL_PREV)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL_TWO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CONTEXT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_RELOAD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DIVE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PUSHBIKE_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PUSHBIKE_PEDAL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_CHARACTER_FRANKLIN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_CHARACTER_MICHAEL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_CHARACTER_TREVOR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_CHARACTER_MULTIPLAYER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CHARACTER_WHEEL)
CONTROL_PI_MENU_PC_MOUSE_INPUT()
CONTROL_PI_MENU_MOVEMENT()
CONTROL_PI_MENU_INPUT()
ENDPROC
//PURPOSE: Return TRUE if the currently highlighted option can trigger the FaceCam
FUNC BOOL DOES_CURRENT_SELECTION_USE_FACECAM()
IF iSubMenu = ciPI_SUB_MENU_INVENTORY
and SAFE_TO_USE_INVENTORY()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC PROCESS_FACE_CAM_SHAPETEST()
// 2nd frame of being ready, we need to restart the test
IF eFaceCamShapeTestStage = FCST_RESULT_READY
eFaceCamShapeTestStage = FCST_INIT
ENDIF
SWITCH eFaceCamShapeTestStage
CASE FCST_INIT
IF DOES_CURRENT_SELECTION_USE_FACECAM()
IF not IS_PED_INJURED(PLAYER_PED_ID())
VECTOR vHeadPos
vHeadPos = GET_WORLD_POSITION_OF_ENTITY_BONE(PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_HEAD))
sti_FaceCam = START_SHAPE_TEST_SWEPT_SPHERE(
GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vHeadPos, GET_ENTITY_HEADING(PLAYER_PED_ID()), vFCPointOffset),
GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vHeadPos, GET_ENTITY_HEADING(PLAYER_PED_ID()), vFCAttachOffset),
0.5, SCRIPT_INCLUDE_ALL, PLAYER_PED_ID(), SCRIPT_SHAPETEST_OPTION_IGNORE_NO_COLLISION)
b_FaceCamShapeTestHitSomething = FALSE
eFaceCamShapeTestStage = FCST_WAITING_RESULT
ENDIF
ENDIF
BREAK
CASE FCST_WAITING_RESULT
INT iHitSomething
VECTOR vPosHit, vNormalAtPosHit
ENTITY_INDEX entityHit
SHAPETEST_STATUS sResult
sResult = GET_SHAPE_TEST_RESULT(sti_FaceCam, iHitSomething, vPosHit, vNormalAtPosHit, entityHit)
// result is ready
IF sResult = SHAPETEST_STATUS_RESULTS_READY
IF iHitSomething = 0
b_FaceCamShapeTestHitSomething = FALSE
ELSE
b_FaceCamShapeTestHitSomething = TRUE
ENDIF
eFaceCamShapeTestStage = FCST_RESULT_READY
// test not running, jump back to init stage
ELIF sResult = SHAPETEST_STATUS_NONEXISTENT
eFaceCamShapeTestStage = FCST_INIT
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL HAS_FACE_CAM_PASSED_SHAPE_TEST()
IF eFaceCamShapeTestStage = FCST_RESULT_READY
AND NOT b_FaceCamShapeTestHitSomething
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//PURPOSE: Returns TRUE if its okay to use the Face Cam
FUNC BOOL SAFE_TO_USE_FACE_CAM()
IF not IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
RETURN FALSE
ELSE
IF NOT IS_PLAYER_FREE_FOR_AMBIENT_TASK(PLAYER_ID())
RETURN FALSE
ENDIF
IF GET_ENTITY_SPEED(PLAYER_PED_ID()) > 3
RETURN FALSE
ENDIF
IF NOT HAS_FACE_CAM_PASSED_SHAPE_TEST()
RETURN FALSE
ENDIF
ENDIF
if GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("chop")) > 0
RETURN FALSE
endif
IF IS_ENTITY_IN_AIR(PLAYER_PED_ID())
RETURN FALSE
ENDIF
IF IS_ENTITY_IN_WATER(PLAYER_PED_ID())
RETURN FALSE
ENDIF
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
RETURN FALSE
ENDIF
if IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
return false
endif
IF IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID())
RETURN FALSE
ENDIF
IF IS_ANY_INTERACTION_ANIM_PLAYING()
RETURN FALSE
ENDIF
IF IS_STRIPCLUB_USING_BAR()
RETURN FALSE
ENDIF
IF GET_IS_TASK_ACTIVE(PLAYER_PED_ID(), CODE_TASK_CLIMB_LADDER)
RETURN FALSE
ENDIF
if GET_PLAYER_WANTED_LEVEL(player_ID()) > 0
RETURN FALSE
endif
ELSE
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
//PURPOSE: Listen for user control of camera
PROC MAINTAIN_FACE_CAM_CONTROL()
// Allow player to move the camera
INT iLeftX, iLeftY, iRightX, iRightY
BOOL bUpdateCamera
INT iLimit = 8
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS_UNBOUND( iLeftX, iLeftY, iRightX, iRightY, bCursorCamMove)
//iRightX *= -1
IF IS_LOOK_INVERTED()
iRightY *= -1
ENDIF
// We allow them full cycle of the vehicle
IF ((iRightX < -iLimit) OR (iRightX > iLimit))
bUpdateCamera = TRUE
fXpos += (TO_FLOAT(iRightX)*fCamMoveSpeed)//0.0006) //0.025)
ENDIF
IF ((iRightY < -iLimit) OR (iRightY > iLimit))
bUpdateCamera = TRUE
fYpos += (TO_FLOAT(iRightY)*fCamMoveSpeed)//0.0006) //0.003)
ENDIF
FLOAT fXmin = -0.4
FLOAT fXmax = 0.4
FLOAT fYmin = -0.2
FLOAT fYmax = 0.3
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
fXmin = -0.1
fXmax = 0.1
fYmin = -0.05
fYmax = 0.075
ENDIF
//Cap X
IF fXpos < fXmin
fXpos = fXmin
ELIF fXpos > fXmax
fXpos = fXmax
ENDIF
//Cap Y
IF fYpos < fYmin
fYpos = fYmin
ELIF fYpos > fYmax
fYpos = fYmax
ENDIF
IF bUpdateCamera
ATTACH_CAM_TO_PED_BONE(FaceCam, PLAYER_PED_ID(), BONETAG_HEAD, <<fXpos, 0.7, fYpos>>)
POINT_CAM_AT_PED_BONE(FaceCam, PLAYER_PED_ID(), BONETAG_HEAD, <<0, 0, 0>>)//vFCPointOffset)
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
ENDPROC
//PURPOSE: Returns TRUE if the Face Cam should be cleaned up.
FUNC BOOL SHOULD_CLEANUP_FACE_CAM()
IF NOT DOES_CURRENT_SELECTION_USE_FACECAM()
RETURN TRUE
ENDIF
IF NOT SAFE_TO_USE_FACE_CAM()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC CLEANUP_PI_MENU()
//Clean up
bUseSelectArrows = FALSE
bSelectAvailable = FALSE
#IF FEATURE_SP_DLC_DIRECTOR_MODE
bDirectorWarningScreen = false
#endif
iSubMenu = ciPI_SUB_MENU_NONE
iStoredSelection = 0
//Items
iMaskTotalCount = 0
iGlassesTotalCount = 0
iHatTotalCount = 0
// iHelmetTotalCount = 0
bCursorMenuFirstTime = FALSE
INT k
INT i
REPEAT MAX_MENUS i
REPEAT MAX_MENU_SELECTIONS k
if i = ciPI_SUB_MENU_NONE
//...dont refresh selfie
ELSE
sSelection.iSelection[i][k] = 0
ENDIF
ENDREPEAT
ENDREPEAT
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfMenu)
SET_USER_RADIO_CONTROL_ENABLED(TRUE)
CLEANUP_FACE_CAM()
CLEANUP_HEADER_GRAPHIC_FOR_PI()
CLEANUP_MENU_ASSETS()
BLOCK_MISSION_TITLE(false)
ENDPROC
//PURPOSE: Controls the Face Cam. Enabled when player swaps face props like glasses.
PROC Maintain_Face_Cam()
IF eFaceCamStage = FCS_WAIT
PROCESS_FACE_CAM_SHAPETEST()
ENDIF
SWITCH eFaceCamStage
CASE FCS_WAIT
IF IS_BIT_SET(iBoolsBitSet, biEnableFaceCam)
IF SAFE_TO_USE_FACE_CAM()
eFaceCamStage = FCS_INIT
NET_PRINT_TIME() NET_PRINT(" ----------> PIM - PROCESS_FACE_CAM - iFaceCamStage = FCS_INIT") NET_NL()
ELSE
IF eFaceCamShapeTestStage = FCST_RESULT_READY
CLEAR_BIT(iBoolsBitSet, biEnableFaceCam)
NET_PRINT_TIME() NET_PRINT(" ----------> PIM - PROCESS_FACE_CAM - Not safe to start cam") NET_NL()
ENDIF
ENDIF
ENDIF
BREAK
CASE FCS_INIT
IF NOT DOES_CAM_EXIST(FaceCam)
if not IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
endif
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_ALLOW_PLAYER_DAMAGE|SPC_PREVENT_EVERYBODY_BACKOFF)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
FaceCam = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", GET_ENTITY_COORDS(PLAYER_PED_ID()), <<0, 0, 0>>, FC_FOV, FALSE)
//SET_CAM_COORD(FaceCam, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), vFCOffset))
ATTACH_CAM_TO_PED_BONE(FaceCam, PLAYER_PED_ID(), BONETAG_HEAD, vFCAttachOffset) //vFCAttachOffsetPre) //
POINT_CAM_AT_PED_BONE(FaceCam, PLAYER_PED_ID(), BONETAG_HEAD, vFCPointOffset)
SET_CAM_FOV(FaceCam, FC_FOV)
SET_CAM_ACTIVE(FaceCam, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE) //TRUE)
ENDIF
eFaceCamStage = FCS_RUNNING
NET_PRINT_TIME() NET_PRINT(" ----------> PIM - PROCESS_FACE_CAM - iFaceCamStage = FCS_RUNNING") NET_NL()
BREAK
CASE FCS_RUNNING
MAINTAIN_FACE_CAM_CONTROL()
//Cleanup Checks
IF SHOULD_CLEANUP_FACE_CAM()
eFaceCamStage = FCS_CLEANUP
NET_PRINT_TIME() NET_PRINT(" ----------> PIM - PROCESS_FACE_CAM - iFaceCamStage = FCS_CLEANUP - A") NET_NL()
ENDIF
BREAK
CASE FCS_CLEANUP
CLEANUP_FACE_CAM()
BREAK
ENDSWITCH
ENDPROC
FUNC STRING GET_SELFIE_DICT_NAME()
if Get_Player_Director_Mode_Compatible() = CHAR_MICHAEL
return "cellphone@self@michael@"
elif Get_Player_Director_Mode_Compatible() = CHAR_FRANKLIN
return "cellphone@self@franklin@"
elif Get_Player_Director_Mode_Compatible() = CHAR_TREVOR
return "cellphone@self@trevor@"
endif
return ""
ENDFUNC
FUNC STRING GET_SELFIE_ANIM_NAME()
if Get_Player_Director_Mode_Compatible() = CHAR_MICHAEL
switch INT_TO_ENUM(ENUM_SELFIE,iCurrentSelfie)
case eself_finger
return "FINGER_POINT"
break
// case eself_Chin
// return "RUN_CHIN"
// break
case eself_neck
return "STRETCH_NECK"
break
endswitch
elif Get_Player_Director_Mode_Compatible() = CHAR_FRANKLIN
switch INT_TO_ENUM(ENUM_SELFIE,iCurrentSelfie)
case eself_bump
return "CHEST_BUMP"
break
// case eself_peace
// return "PEACE"
// break
case eself_WestCoast
return "WEST_COAST"
break
endswitch
elif Get_Player_Director_Mode_Compatible() = CHAR_TREVOR
switch INT_TO_ENUM(ENUM_SELFIE,iCurrentSelfie)
// case eself_AgroFinger
// return "AGGRESSIVE_FINGER"
// break
case eself_ProudFinger
return "PROUD_FINGER"
break
case eself_SlitThroat
return "THROAT_SLIT"
break
endswitch
endif
return ""
ENDFUNC
FUNC STRING GET_SELFIE_DISPLAY_NAME()
if Get_Player_Director_Mode_Compatible() = CHAR_MICHAEL
switch INT_TO_ENUM(ENUM_SELFIE,iCurrentSelfie)
case eself_finger
return "SELF_M1"
break
// case eself_Chin
// return "SELF_M2"
// break
case eself_neck
return "SELF_M3"
break
endswitch
elif Get_Player_Director_Mode_Compatible() = CHAR_FRANKLIN
switch INT_TO_ENUM(ENUM_SELFIE,iCurrentSelfie)
case eself_bump
return "SELF_F1"
break
// case eself_peace
// return "SELF_F2"
// break
case eself_WestCoast
return "SELF_F3"
break
endswitch
elif Get_Player_Director_Mode_Compatible() = CHAR_TREVOR
switch INT_TO_ENUM(ENUM_SELFIE,iCurrentSelfie)
// case eself_AgroFinger
// return "SELF_T1"
// break
case eself_ProudFinger
return "SELF_T2"
break
case eself_SlitThroat
return "SELF_T3"
break
endswitch
endif
return ""
ENDFUNC
PROC manage_selfie_anims()
// *********************************************************************************************
// SELECT FILTER
// *********************************************************************************************
string animName
string dictName = GET_SELFIE_DICT_NAME()
STRING sFilter = "IgnoreMoverBlend_filter"
IF IS_CELLPHONE_CAMERA_IN_SELFIE_MODE()
AND (IS_SNAPMATIC_NOT_IN_VIEWFINDER_MODE() = FALSE) //Inverted by Steve T.
if IS_CONTROL_PRESSED(PLAYER_CONTROL,INPUT_CELLPHONE_LEFT)
bdoAnim = TRUE
ELSE
bdoAnim = false
ENDIF
bool bCharSwapped = false
eSelfiecharCurr = GET_CURRENT_PLAYER_PED_ENUM()
if eSelfiecharCurr != eSelfiecharPrev
eSelfiecharPrev = eSelfiecharCurr
bCharSwapped = true
endif
if (IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL,INPUT_CELLPHONE_RIGHT)
and get_Game_timer() - iPI_MoveTimer > iPI_MOVE_DELAY
and not IS_BIT_SET(BitSet_CellphoneTU,g_BSTU_APPCAMERA_NEEDS_TO_UPDATE_ACTION))
OR bCharSwapped// update the anim if the character has switched
iPI_MoveTimer = get_Game_timer()
CPRINTLN(DEBUG_MISSION, "---CV manage_selfie_anims: iFastSelectSelfie: ",iFastSelectSelfie," MAX: ",GET_SELECTION_MAX_PI(ciPI_TYPE_SELFIE))
iFastSelectSelfie++
IF iFastSelectSelfie > GET_SELECTION_MAX_PI(ciPI_TYPE_SELFIE)
iFastSelectSelfie = 0
ENDIF
g_txtSP_CurrentSelfie_anim = GET_SELFIE_DISPLAY_NAME()
bChangeAnim = TRUE
SET_BIT (BitSet_CellphoneTU, g_BSTU_APPCAMERA_NEEDS_TO_UPDATE_ACTION)
CPRINTLN(DEBUG_MISSION, "---CV manage_selfie_anims: next selfie: ",iFastSelectSelfie," name: ",g_txtSP_CurrentSelfie_anim)
ENDIF
ELSE
bdoAnim = FALSE
ENDIF
switch iSelfieStage
CASE 0
IF IS_CELLPHONE_CAMERA_IN_SELFIE_MODE()
AND (IS_SNAPMATIC_NOT_IN_VIEWFINDER_MODE() = FALSE) //Inverted by Steve T
if bChangeAnim
iCurrentSelfie = iFastSelectSelfie
g_txtSP_CurrentSelfie_anim = GET_SELFIE_DISPLAY_NAME()
CPRINTLN(DEBUG_MISSION, "---CV manage_selfie_anims: iCurrentSelfie = iFastSelectSelfie: ",iFastSelectSelfie)
bChangeAnim = FALSE
ELSE
IF not IS_STRING_NULL_OR_EMPTY(dictName)
REQUEST_ANIM_DICT(dictName)
ENDIF
if bdoAnim
and not IS_STRING_NULL_OR_EMPTY(dictName)
IF HAS_ANIM_DICT_LOADED(dictName)
animName = GET_SELFIE_ANIM_NAME()
if not IS_PLAYING_PHONE_GESTURE_ANIM(PLAYER_PED_ID())
and not IS_STRING_NULL_OR_EMPTY(dictName)
and not IS_STRING_NULL_OR_EMPTY(animName)
CPRINTLN(DEBUG_MISSION, "---CV manage_selfie_anims: iCurrentSelfie name: ",animName," Global label: ",g_txtSP_CurrentSelfie_anim)
//anim trigger
TASK_PLAY_PHONE_GESTURE_ANIMATION(PLAYER_PED_ID(),dictName ,animName, sFilter,SLOW_BLEND_DURATION,SLOW_BLEND_DURATION)
iSelfieStage = 1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_CELLPHONE_CAMERA_IN_SELFIE_MODE()
AND (IS_SNAPMATIC_NOT_IN_VIEWFINDER_MODE() = FALSE) //Inverted by Steve T
if not IS_PLAYING_PHONE_GESTURE_ANIM(PLAYER_PED_ID())
iSelfieStage = 0
ENDIF
else
if IS_PLAYING_PHONE_GESTURE_ANIM(PLAYER_PED_ID())
TASK_STOP_PHONE_GESTURE_ANIMATION(PLAYER_PED_ID(),INSTANT_BLEND_OUT)
endif
iSelfieStage = 0
endif
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL CHECK_ASPECT_RATIO_FOR_FRAME()
FLOAT fCurrAspectRatio = GET_ASPECT_RATIO( FALSE )
IF bFirstTimeHit
fPreviousAspectRatio = fCurrAspectRatio
bFirstTimeHit = FALSE
RETURN FALSE
ELSE
IF fPreviousAspectRatio != fCurrAspectRatio
fPreviousAspectRatio = fCurrAspectRatio
PRINTLN("[PI_MENU] - PI_menu.sc - CHECK_ASPECT_RATIO_FOR_FRAME returning TRUE")
RETURN TRUE
ELSE
fPreviousAspectRatio = fCurrAspectRatio
RETURN FALSE
ENDIF
ENDIF
ENDFUNC
//////////////////////////////////////////////////////////////////////////////
// Main Loop //
//////////////////////////////////////////////////////////////////////////////
SCRIPT
PRINTLN("...Starting PI_MENU.sc")
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_DIRECTOR)
CLEANUP_PI_MENU()
ePI_MENU_STATE = PI_MENU_INACTIVE
TERMINATE_THIS_THREAD()
ENDIF
#if IS_DEBUG_BUILD
wGroup = START_WIDGET_GROUP("PI MENU")
ADD_WIDGET_INT_READ_ONLY("g_iCurrentlyDisplayingContextINDEX", g_iCurrentlyDisplayingContextINDEX)
ADD_WIDGET_FLOAT_SLIDER("PosX", sf_X, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("PosY", sf_y, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Width",sf_w, -10.0, 10.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Height",sf_h, -10.0, 10.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("PosYAdj", sf_y_adj, 0.0, 100.0, 0.0001)
ADD_WIDGET_FLOAT_SLIDER("WLPosX", wl_x, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("WLPosY", wl_y, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("WLWidth",wl_w, -10.0, 10.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("WLHeight",wl_h, -10.0, 10.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("TitleX", txt_X, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("TitleY", txt_y, -1.0, 1.0, 0.001)
ADD_WIDGET_INT_READ_ONLY("Menu stage",iwidgetMenuState)
START_WIDGET_GROUP("face cam")
ADD_WIDGET_FLOAT_SLIDER("fCamMoveSpeed",fCamMoveSpeed,0.000000001,1,0.000000001)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SET_LOCATES_HEADER_WIDGET_GROUP(wGroup)
#endif
//set default selfie
iCurrentSelfie = 0
iSelfieStage = 0
eSelfiecharPrev = GET_CURRENT_PLAYER_PED_ENUM()
g_txtSP_CurrentSelfie_anim = GET_SELFIE_DISPLAY_NAME()
// Main loop
WHILE TRUE
IF CHECK_ASPECT_RATIO_FOR_FRAME()
PRINTLN("[PI_MENU] - PI_menu.sc - Setting ePI_MENU_STATE to PI_MENU_CLEANUP as aspect ratio changed whilst menu was up")
ePI_MENU_STATE = PI_MENU_CLEANUP
ENDIF
// Disable Pause menu so it doesn't trigger if Esc is pressed when you quit.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF ePI_MENU_STATE != PI_MENU_INACTIVE
IF NOT IS_PAUSE_MENU_ACTIVE()
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE)
ENDIF
ENDIF
ENDIF
IF IS_PED_INJURED(player_ped_id())
IF IS_BIT_SET(iBoolsBitSet, biSwitchButtonCheck)
IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_INTERACTION_MENU)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
ELSE
CPRINTLN(DEBUG_MISSION, "---CV biSwitchButtonCheck: PI_MENU_CLEANUP CLEAR")
CLEAR_BIT(iBoolsBitSet, biSwitchButtonCheck)
ENDIF
endif
ijustClosedTimer = get_game_timer()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_FLY_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
CLEANUP_PI_MENU()
ePI_MENU_STATE = PI_MENU_INACTIVE
ELSE
manage_selfie_anims()
endif
// switch menu state ready requested to switch
if SWITCH_MENU_STATE()
bSwitchMenuState = true
endif
SWITCH ePI_MENU_STATE
CASE PI_MENU_INACTIVE // check if menu is to be turned on
#IF FEATURE_SP_DLC_DIRECTOR_MODE
IF NOT g_bLaunchDirectorMode
AND NOT IS_DIRECTOR_MODE_RUNNING()
g_bDirectorPIMenuUp = FALSE
ENDIF
#ENDIF
if bSwitchMenuState
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CONTEXT)// just to stop conflicting menus
iPi_submenu_timer = get_Game_timer()
bCursorMenuFirstTime = TRUE
sGraphicHeader = GET_HEADER_GRAPHIC_FOR_PI()
REQUEST_HEADER_GRAPHIC_FOR_PI()
if REQUEST_HEADER_GRAPHIC_FOR_PI()
PRE_SETUP_PI_MENU()
bSwitchMenuState = false
CLEAR_HELP()
SET_CURSOR_POSITION_FOR_MENU()
ePI_MENU_STATE = PI_MENU_ACTIVE
endif
endif
if GET_GAME_TIMER() - ijustClosedTimer < 500
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_FLY_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CONTEXT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
// Disable Pause menu so it doesn't trigger if Esc is pressed when you quit.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF NOT IS_PAUSE_MENU_ACTIVE()
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE)
ENDIF
ENDIF
iPi_menu_timer = get_Game_timer()
endif
BREAK
CASE PI_MENU_ACTIVE
#IF FEATURE_SP_DLC_DIRECTOR_MODE
g_bDirectorPIMenuUp = TRUE //Mark as active
#ENDIF
Maintain_Active_PI_Menu() // draw
Maintain_Menu_Controls() // Controls
Maintain_Face_Cam() // Cam
PAUSE_FLOW_HELP_QUEUE(TRUE)
if bSwitchMenuState // Check if menu is to be turned off
or CONTROL_MENU_CLOSE()
PLAY_SOUND_FRONTEND(-1, "CANCEL", "HUD_FRONTEND_DEFAULT_SOUNDSET",FALSE)
bSwitchMenuState = false
ePI_MENU_STATE = PI_MENU_CLEANUP
endif
//stop interferance with jet weapons
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_FLY_ATTACK)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
BLOCK_MISSION_TITLE()
g_sMenuData.bKeepPhoneForNextDrawMenuCall = TRUE //allow phone to draw and stop menu
BREAK
CASE PI_MENU_CLEANUP
IF IS_BIT_SET(iBoolsBitSet, biSwitchButtonCheck)
IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_INTERACTION_MENU)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
ELSE
CPRINTLN(DEBUG_MISSION, "---CV biSwitchButtonCheck: PI_MENU_CLEANUP CLEAR")
CLEAR_BIT(iBoolsBitSet, biSwitchButtonCheck)
ENDIF
endif
ijustClosedTimer = get_game_timer()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_FLY_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
PAUSE_FLOW_HELP_QUEUE(false)
CLEANUP_PI_MENU()
bFirstTimeHit = TRUE
ePI_MENU_STATE = PI_MENU_INACTIVE
BREAK
ENDSWITCH
WAIT(0)
ENDWHILE
ENDSCRIPT