Files
gtav-src/script/dev_ng/shared/PauseMenu/MP_Unlocks.sc
T
2025-09-29 00:52:08 +02:00

658 lines
28 KiB
Python
Executable File

/***********************************
* Name: MP_Unlocks.sc
* Author: Ryan Baker / Chris McMahon
* Date: 02/09/2013
***********************************/
USING "PauseMenu_public.sch"
USING "net_include.sch"
USING "Transition_Common.sch"
USING "PauseMenu_mp_public.sch"
USING "FMMC_Cloud_Loader.sch"
USING "commands_pad.sch"
// ************************************************************
// ******************** MAIN SCRIPT LOOP **********************
// ************************************************************
//Unlocks Contstants
CONST_INT PM_MAX_SIZE_GENERAL_UNLOCKS 13
CONST_INT PM_MAX_SIZE_CONTENT_UNLOCKS 50
CONST_INT PM_MAX_SIZE_PROGRESS_UNLOCKS 49
CONST_INT PM_D2_GENERAL_UNLOCKS 0
CONST_INT PM_D2_PROGRESS_UNLOCKS 1
CONST_INT PM_D2_CONTENT_UNLOCKS 2
CONST_INT FIRST_COLUMN 0
CONST_INT SECOND_COLUMN 1
CONST_INT THIRD_COLUMN 2
CONST_INT SETTING_COLUMN 4
INT STATS_CATEGORY_MENU_ID = (ENUM_TO_INT(MENU_UNIQUE_ID_STATS_CATEGORY) + PREF_OPTIONS_THRESHOLD)
INT STATS_LISTITEM_MENU_ID = (ENUM_TO_INT(MENU_UNIQUE_ID_STATS_LISTITEM) + PREF_OPTIONS_THRESHOLD)
//Unlocks Variables
BOOL bShouldQuitUnlocksScript = FALSE
SCRIPT_TIMER iRStickTimer
INT iRStickTimerDelay
INT iCurrentMenu
BOOL bCanScroll
BOOL bDataAvailable
BOOL bInitMenu
CONST_INT MASKS_IN_RETAIL 25
CONST_INT HAIR_IN_RETAIL 76
CONST_INT MAKEUP_IN_RETAIL 29
CONST_INT TATTOOS_IN_RETAIL 67
CONST_INT AWARDS_IN_RETAIL 85
CONST_INT MASKS_IN_BEACH_BUM 0
CONST_INT HAIR_IN_BEACH_BUM 4
CONST_INT MAKEUP_IN_BEACH_BUM 0
CONST_INT TATTOOS_IN_BEACH_BUM 16
CONST_INT AWARDS_IN_BEACH_BUM 0
CONST_INT MASKS_IN_VALENTINE 7
CONST_INT HAIR_IN_VALENTINE 1
CONST_INT MAKEUP_IN_VALENTINE 0
CONST_INT TATTOOS_IN_VALENTINE 0
CONST_INT AWARDS_IN_VALENTINE 0
CONST_INT MASKS_IN_BUSINESS 29
CONST_INT HAIR_IN_BUSINESS 4
CONST_INT MAKEUP_IN_BUSINESS 0
CONST_INT TATTOOS_IN_BUSINESS 16
CONST_INT AWARDS_IN_BUSINESS 0
CONST_INT MASKS_IN_HIPSTER 8
CONST_INT HAIR_IN_HIPSTER 4
CONST_INT MAKEUP_IN_HIPSTER 0
CONST_INT TATTOOS_IN_HIPSTER 49
CONST_INT AWARDS_IN_HIPSTER 4
CONST_INT MASKS_IN_INDEPENDENCE 12
CONST_INT HAIR_IN_INDEPENDENCE 1
CONST_INT MAKEUP_IN_INDEPENDENCE 1
CONST_INT TATTOOS_IN_INDEPENDENCE 0
CONST_INT AWARDS_IN_INDEPENDENCE 0
CONST_INT MASKS_IN_PILOT_SCHOOL 1
CONST_INT HAIR_IN_PILOT_SCHOOL 0
CONST_INT MAKEUP_IN_PILOT_SCHOOL 0
CONST_INT TATTOOS_IN_PILOT_SCHOOL 0
CONST_INT AWARDS_IN_PILOT_SCHOOL 0
CONST_INT MASKS_IN_LTS 10
CONST_INT HAIR_IN_LTS 0
CONST_INT MAKEUP_IN_LTS 0
CONST_INT TATTOOS_IN_LTS 0
CONST_INT AWARDS_IN_LTS 0
CONST_INT MASKS_IN_CHRISTMAS14 4
CONST_INT HAIR_IN_CHRISTMAS14 0
CONST_INT MAKEUP_IN_CHRISTMAS14 0
CONST_INT TATTOOS_IN_CHRISTMAS14 30
CONST_INT AWARDS_IN_CHRISTMAS14 0
CONST_INT MASKS_IN_HEISTS 109
CONST_INT HAIR_IN_HEISTS 16
CONST_INT MAKEUP_IN_HEISTS 0
CONST_INT TATTOOS_IN_HEISTS 2
CONST_INT MAKEUP_IN_HALLOWEEN 30
INT AWARDS_IN_HEISTS = 39
//PURPOSE: Returns the an INT for how much of the unlock the player has achieved
FUNC INT GET_PM_UNLOCK_GENERAL_ACHIEVED(INT iNum)
INT iReturnCount
SWITCH iNum
CASE 0 RETURN g_FMMC_ROCKSTAR_CREATED.iTypePlayedCount[FMMC_TYPE_RACE]
CASE 1 RETURN g_FMMC_ROCKSTAR_CREATED.iTypePlayedCount[FMMC_TYPE_DEATHMATCH]
CASE 2 RETURN g_FMMC_ROCKSTAR_CREATED.iTypePlayedCount[FMMC_TYPE_BASE_JUMP]
CASE 3 RETURN g_FMMC_ROCKSTAR_CREATED.iTypePlayedCount[FMMC_TYPE_SURVIVAL]
CASE 4 RETURN g_FMMC_ROCKSTAR_CREATED.iTypePlayedCount[FMMC_TYPE_MISSION]
CASE 5 RETURN GET_MP_INT_CHARACTER_STAT(MP_STAT_NO_WEAPONS_UNLOCK)
CASE 6 RETURN GET_MP_INT_CHARACTER_STAT(MP_STAT_NO_WEAPON_MODS_UNLOCK)
CASE 7 RETURN GET_MP_INT_CHARACTER_STAT(MP_STAT_NO_MASKS_UNLOCK) - 1
CASE 8 RETURN GET_MP_INT_CHARACTER_STAT(MP_STAT_NO_HAIR_UNLOCK)
CASE 9 RETURN GET_MP_INT_CHARACTER_STAT(MP_STAT_NO_MAKEUP_UNLOCK)
CASE 10 RETURN GET_MP_INT_CHARACTER_STAT(MP_STAT_NO_TATTOOS_UNLOCK)
CASE 11 RETURN GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_PLAT_AWARD_COUNT)
CASE 12
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_0)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_1)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_2)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_3)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_4)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_5)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_6)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_7)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_8)
iReturnCount++
ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_PILOT_ASPASSEDLESSON_9)
iReturnCount++
ENDIF
RETURN iReturnCount
BREAK
ENDSWITCH
RETURN -1
ENDFUNC
//PURPOSE: Returns the an INT for the total needed for the unlock
FUNC INT GET_PM_UNLOCK_GENERAL_TOTAL(INT iNum)
INT iAddWeapon
//BOOL bMale = IS_PLAYER_MALE(PLAYER_ID())
SWITCH iNum
CASE 0 RETURN g_FMMC_ROCKSTAR_CREATED.iTypeCount[FMMC_TYPE_RACE]
CASE 1 RETURN g_FMMC_ROCKSTAR_CREATED.iTypeCount[FMMC_TYPE_DEATHMATCH]
CASE 2 RETURN g_FMMC_ROCKSTAR_CREATED.iTypeCount[FMMC_TYPE_BASE_JUMP]
CASE 3 RETURN g_FMMC_ROCKSTAR_CREATED.iTypeCount[FMMC_TYPE_SURVIVAL]
CASE 4 RETURN g_FMMC_ROCKSTAR_CREATED.iTypeCount[FMMC_TYPE_MISSION]
CASE 5 // Weapons
IF IS_SPECIAL_EDITION_GAME() OR IS_COLLECTORS_EDITION_GAME() OR IS_PC_VERSION() OR IS_PLAYSTATION_PLATFORM() OR IS_XBOX_PLATFORM()
iAddWeapon +=2
iAddWeapon +=2
iAddWeapon +=1
iAddWeapon +=7
IF g_sMPTunables.bENABLE_DOUBLE_ACTION_REVOLVER
iAddWeapon +=1
ENDIF
IF g_sMPTunables.bUNLOCK_SERVICE_CARBINE_FOR_PURCHASE
iAddWeapon +=1
ENDIF
RETURN 47+iAddWeapon // 27 Base, 19 DLC
ELSE
RETURN 44 // 27 Base, 17 DLC
ENDIF
BREAK
CASE 6 // Weapon Mods
IF NETWORK_HAS_SOCIAL_CLUB_ACCOUNT() //GET_MP_BOOL_PLAYER_STAT(MPPLY_XP_REWARD_PLAYER_IN_CREW) // IF in social club
OR IS_SPECIAL_EDITION_GAME()
OR IS_COLLECTORS_EDITION_GAME()
iAddWeapon = 0
iAddWeapon +=19
iAddWeapon +=8
RETURN g_sMPTunables.itotalnumberofweaponmods +iAddWeapon//246
ELSE
RETURN g_sMPTunables.itotalnumberofweaponmods //246 // non social club total
ENDIF
BREAK
// MP_STAT_NO_MASKS_UNLOCK
CASE 7 RETURN MASKS_IN_RETAIL+MASKS_IN_BEACH_BUM+MASKS_IN_VALENTINE+MASKS_IN_BUSINESS+MASKS_IN_HIPSTER+MASKS_IN_INDEPENDENCE+MASKS_IN_PILOT_SCHOOL+MASKS_IN_LTS+MASKS_IN_CHRISTMAS14+MASKS_IN_HEISTS
// MP_STAT_NO_HAIR_UNLOCK
CASE 8 RETURN HAIR_IN_RETAIL+HAIR_IN_BEACH_BUM+HAIR_IN_VALENTINE+HAIR_IN_BUSINESS+HAIR_IN_HIPSTER+HAIR_IN_INDEPENDENCE+HAIR_IN_PILOT_SCHOOL+HAIR_IN_LTS+HAIR_IN_CHRISTMAS14+HAIR_IN_HEISTS
// MP_STAT_NO_MAKEUP_UNLOCK
CASE 9 RETURN MAKEUP_IN_RETAIL+MAKEUP_IN_BEACH_BUM+MAKEUP_IN_VALENTINE+MAKEUP_IN_BUSINESS+MAKEUP_IN_HIPSTER+MAKEUP_IN_INDEPENDENCE+MAKEUP_IN_PILOT_SCHOOL+MAKEUP_IN_LTS+MAKEUP_IN_CHRISTMAS14+MAKEUP_IN_HEISTS+MAKEUP_IN_HALLOWEEN
// MP_STAT_NO_TATTOOS_UNLOCK
CASE 10 RETURN TATTOOS_IN_RETAIL+TATTOOS_IN_BEACH_BUM+TATTOOS_IN_VALENTINE+TATTOOS_IN_BUSINESS+TATTOOS_IN_HIPSTER+TATTOOS_IN_INDEPENDENCE+TATTOOS_IN_PILOT_SCHOOL+TATTOOS_IN_LTS+TATTOOS_IN_CHRISTMAS14+TATTOOS_IN_HEISTS
// MP_STAT_NO_AWARDS_UNLOCK
CASE 11 RETURN AWARDS_IN_RETAIL+AWARDS_IN_BEACH_BUM+AWARDS_IN_VALENTINE+AWARDS_IN_BUSINESS+AWARDS_IN_HIPSTER+AWARDS_IN_INDEPENDENCE+AWARDS_IN_PILOT_SCHOOL+AWARDS_IN_LTS+AWARDS_IN_CHRISTMAS14+AWARDS_IN_HEISTS
// Pilot School Lessons
CASE 12 RETURN 10
ENDSWITCH
RETURN -1
ENDFUNC
FUNC BOOL HAS_PLAYER_PLAYED_FLIGHT_SCHOOL()
BOOL bPlayed
bPlayed = FALSE
IF GET_MP_INT_CHARACTER_STAT(MP_STAT_CRPILOTSCHOOL) > 0
bPlayed = TRUE
ENDIF
RETURN bPlayed
ENDFUNC
FUNC BOOL HAS_PLAYER_COMPLETED_A_HEIST_FINALE()
BOOL bPlayed
bPlayed = FALSE
IF GET_MP_INT_CHARACTER_AWARD(MP_AWARD_FINISH_HEISTS) > 0
bPlayed = TRUE
ENDIF
RETURN bPlayed
ENDFUNC
//PURPOSE: Returns the TRUE if the Job has been done
FUNC BOOL GET_PM_UNLOCK_PROGRESS_BOOL(INT iNum)
SWITCH iNum //GET_MP_INT_CHARACTER_STAT GET_MP_BOOL_CHARACTER_STAT
CASE 0 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_RACE_MODDED_CAR)
CASE 1 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_DRIVE_RALLY)
CASE 2 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_PLAY_GTA_RACE)
CASE 3 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_HAS_PLAYER_WON_A_LAND_RACE)
CASE 4 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_PLAY_BOAT_RACE)
CASE 5 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CRBASEJUMP) > 0)
CASE 6 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CRDM) > 0)
CASE 7 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_PLAY_TEAM_DM)
CASE 8 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_BOUGHT_HELISTRIKES) // (GET_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_ON_HELI_STRIKE) > 0)
CASE 9 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_CALL_MERCENARIES)
CASE 10 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_PHONE_MECH_DROP_CAR)
CASE 11 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_GONE_OFF_RADAR)
CASE 12 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_BOUGHT_AIRSTRIKES) //FALSE //(GET_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_ON_AIRSTRIKES) > 0)
CASE 13 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_BOUGHT_CARMODS) //FALSE// (GET_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_CAR_MODS) > 0)
CASE 14 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_FILL_TITAN)
CASE 15 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_MOD_CAR_USING_APP)
CASE 16 RETURN (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_NO_HAIRCUTS) > 0)
CASE 17 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_BOUGHT_TATTOO) //FALSE// (GET_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_ON_TATTOOS) > 0)
CASE 18 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_BOUGHT_CLOTHES) //FALSE// (GET_MP_FLOAT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_IN_CLOTHES) > 0)
CASE 19 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_BOUGHT_WEAPON_MODS) //FALSE//(GET_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_WEAPON_MODS) > 0)
CASE 20 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_BUY_APPARTMENT)
CASE 21 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_SEND_MONEY_TO_PLAYER)// (GET_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SENT_TO_PLY) > 0)
CASE 22 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_BUY_GARAGE)
CASE 23 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_ENTER_FRIENDS_HOUSE)
CASE 24 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_CALL_STRIPPER_HOUSE)
CASE 25 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_CALL_FRIEND)
CASE 26 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_W_WANTED_PLAYER_TV)
CASE 27 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_PLAY_VEHICLE_DM)
CASE 28 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CRMISSION) > 0)
CASE 29 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_PLAY_MISSION_CONTACT)
CASE 30 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CRGOLF) > 0)
CASE 31 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CRTENNIS) > 0)
CASE 32 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CRDARTS) > 0)
CASE 33 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CRSHOOTRNG) > 0)
CASE 34 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_BETAMOUNT) > 0)
CASE 35 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_PLAY_A_PLAYLIST)
CASE 36
IF (GET_MP_INT_PLAYER_STAT(MPPLY_RACE_2_POINT_WINS) > 0)
OR (GET_MP_INT_PLAYER_STAT(MPPLY_RACE_2_POINT_LOST) > 0)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
BREAK
CASE 37 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_CHALLENGE_ONEONONEDM) //GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_PLAY_ONE_ON_ONE_DM)
CASE 38 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_CHALLENGE_IMPROPTURACE)
CASE 39 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CRARMWREST) > 0)
CASE 40 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_TOTAL_NO_SHOPS_HELD_UP) > 0)
CASE 41 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_WENT_TO_CINEMA) //FALSE//(GET_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_ON_CINEMA) > 0)
CASE 42 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_BOUGHT_A_LAPDANCE) //(GET_MP_INT_CHARACTER_STAT(MP_STAT_LAP_DANCED_BOUGHT) > 0)
CASE 43 RETURN (GET_MP_INT_CHARACTER_STAT(MP_STAT_CR_GANGATTACK_CITY) > 0 OR GET_MP_INT_CHARACTER_STAT(MP_STAT_CR_GANGATTACK_COUNTRY)>0)
CASE 44 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_SPENT_BOUNTY)//(GET_MP_INT_CHARACTER_STAT(MP_STAT_MONEY_SPENT_ON_BOUNTY) > 0)
CASE 45 RETURN GET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_SURV_A_BOUNTY)
//CASE 46 RETURN (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_SECURITY_CARS_ROBBED) > 0)
CASE 46 RETURN GET_PACKED_STAT_BOOL(PACKED_MP_COLLECT_AMMO_DROP)
CASE 47 RETURN HAS_PLAYER_PLAYED_FLIGHT_SCHOOL() // Flight School
CASE 48 RETURN HAS_PLAYER_COMPLETED_A_HEIST_FINALE() // Heists
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC ADD_GENERAL_UNLOCK_ITEM(INT& iItemCount, INT iNum1, INT iNum2)
TEXT_LABEL_15 tlLabel = "PM_UGEN_T"
tlLabel += iItemCount
PM_SET_DATA_SLOT_FOR_STAT_WITH_TWO_NUMBERS(SECOND_COLUMN, iItemCount, STATS_LISTITEM_MENU_ID, iItemCount, tlLabel, "PM_UGEN_NUM", iNum1, iNum2)
iItemCount++
ENDPROC
PROC ADD_PROGRESS_UNLOCK_ITEM(INT& iItemCount, BOOL bYes)//, BOOL bUnlocks)
TEXT_LABEL_15 tlLabel = "PM_UJOB_T"
tlLabel += iItemCount
MP_SET_DATA_SLOT_SETTING_YES_NO(SECOND_COLUMN, iItemCount, STATS_LISTITEM_MENU_ID, iItemCount, tlLabel, bYes, FALSE)//bUnlocks)
iItemCount++
ENDPROC
PROC ADD_CONTENT_UNLOCK_ITEM(INT& iItemCount, STRING tlLabel, BOOL bUnlocked)
MP_SET_DATA_SLOT_SETTING_YES_NO(SECOND_COLUMN, iItemCount, STATS_LISTITEM_MENU_ID, iItemCount, tlLabel, bUnlocked, TRUE)
iItemCount++
ENDPROC
//Draw Unlocks Data
FUNC BOOL UPDATE_ALL_LIST_ITEMS(BOOL &bThisDataAvailable)
CPRINTLN(DEBUG_PAUSE_MENU, "[JA@PAUSEMENU] UPDATE_ALL_LIST_ITEMS - SET DATA SLOTS")
SET_PM_HIGHLIGHT(FIRST_COLUMN, iCurrentMenu, FALSE, TRUE)
CLEAR_PM_COLUMN(SECOND_COLUMN)
INT iItemCount = 0
INT i
INT tempachieved
INT temptotal
//Add list items for current tab
SWITCH iCurrentMenu
CASE PM_D2_GENERAL_UNLOCKS
REPEAT PM_MAX_SIZE_GENERAL_UNLOCKS i
tempachieved = GET_PM_UNLOCK_GENERAL_ACHIEVED(i)
temptotal = GET_PM_UNLOCK_GENERAL_TOTAL(i)
IF tempachieved > temptotal
PRINTLN("UPDATE_ALL_LIST_ITEMS. the achieved has gone over the limit for ", i)
PRINTLN("UPDATE_ALL_LIST_ITEMS. tempachieved = ", tempachieved)
PRINTLN("UPDATE_ALL_LIST_ITEMS. temptotal = ", temptotal)
temptotal = tempachieved
ENDIF
ADD_GENERAL_UNLOCK_ITEM(iItemCount, tempachieved, temptotal)
ENDREPEAT
BREAK
CASE PM_D2_PROGRESS_UNLOCKS
REPEAT PM_MAX_SIZE_PROGRESS_UNLOCKS i
ADD_PROGRESS_UNLOCK_ITEM(iItemCount, GET_PM_UNLOCK_PROGRESS_BOOL(i))//, bUnlocks)
ENDREPEAT
BREAK
CASE PM_D2_CONTENT_UNLOCKS
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T21", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_CRATE_DROP)) // Crate Drop
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T22", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_RACE_TO_POINT)) // Impromptu Race
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T0", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_DEATHMATCH)) // Deathmatch (from Rank 1)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T1", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_RACE)) // Race (from Rank 1)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T2", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_STUNT_JUMPS)) // Stunt Jumps (from Rank 2)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T3", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_CAR_MOD)) // Car Mod Shop (from Rank 1)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T4", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_HOLD_UPS)) // Hold Ups (from Rank 3)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T6", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_DEATHMATCH)) // One on One Deathmatch (from Rank 3)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T5", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_CALL_PEGASUS)) // Pegasus (from Rank 3)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T8", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_MG_SHOOTING_RANGE)) // Shooting Range (from Rank 3)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T7", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_SHOPS)) // Shops (from Rank 3)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T9", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_CUSTOM_CAR_GARAGE)) // Garages (from Rank 5)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T11", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_CINEMA)) // Movies (from Rank 5)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T10", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_PVEH_DEL)) // Personal Vehicle Delivery (from Rank 5)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T15", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_MG_ARM_WRESTLING)) // Arm Wrestling (from Rank 6)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T14", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_MG_DARTS)) // Darts (from Rank 6)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T13", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_MG_GOLF)) // Golf (from Rank 6)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T38", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_MG_PILOT_SCHOOL)) // San Andreas Flight School (from Rank 6)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T16", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_STRIP_CLUB)) // Strip Club (from Rank 6)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T12", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_MG_TENNIS)) // Tennis (from Rank 6)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T43", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_MISSION_CTF)) // Captures (From Rank 8)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T17", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_IMPORT_EXPORT)) // Import/Export (from Rank 8)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T18", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_BOUNTIES)) // Bounties (from Rank 10)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T19", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_BASE_JUMP)) // Parachuting (from Rank 11)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T20", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_AMMO_DROP)) // Ammo Drop (from Rank 12)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T42", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_LESTER_NO_COPS)) // Cops Turn Blind Eye (From Rank 12)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T49", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_HEIST_INTRO)) // Heists (from Rank 12) *
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T41", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_DESTROY_VEH)) // Destroy Vehicle (from Rank 15) *
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T39", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_DISTRACT_POLICE)) // Distract Cops (from Rank 15) *
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T48", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_DAILY_OBJ)) // Daily Objectives (from Rank 15) *
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T40", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_PLANE_TAKEDOWN)) // Plane Takedown (from Rank 15) *
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T44", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_LESTER_CAR)) // Locate a Car (From Rank 15)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T23", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_SURVIVAL)) // Survival (from Rank 15)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T24", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_BRUCIE_BOX)) // Bull Shark Testosterone (from Rank 17)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T25", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_GANGHIDEOUT)) // Gang Attack (from Rank 18)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T26", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_SECURITY_VAN)) // Armored Truck (from Rank 19)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T27", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_HELI_STRIKE)) // Backup Helicopter (from Rank 20)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T28", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_CALL_COP)) // Remove Wanted Level (from Rank 21)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T29", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_BOAT_PICKUP)) // Boat Pickup (from Rank 25)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T45", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_LESTER_BOAT)) // Locate a Boat (From Rank 25)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T30", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_HELI_PICKUP)) // Helicopter Pickup (from Rank 30)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T46", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_LESTER_HELI)) // Locate a Helicopter (From Rank 35)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T31", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_SEND_MERCENARIES)) // Send Mercenaries (from Rank 35)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T32", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_OFF_THE_RADAR)) // Off the Radar (from Rank 40)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T33", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_REVEAL_PLAYERS)) // Reveal Players (from Rank 40)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T47", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_LESTER_PLANE)) // Locate a Plane (From Rank 45)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T35", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_AIRSTRIKE)) // Airstrike (from Rank 50)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T34", IS_FM_TYPE_UNLOCKED(FMMC_TYPE_THIEF)) // Mugger (from Rank 50)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T37", (GET_RANK_FROM_XP_VALUE(GET_PLAYER_XP(PLAYER_ID()), FALSE) >= 100)) // Benefactor Dubsta 6x6 Vehicle (from Rank 100)
ADD_CONTENT_UNLOCK_ITEM(iItemCount, "PM_UCON_T36", (GET_RANK_FROM_XP_VALUE(GET_PLAYER_XP(PLAYER_ID()), FALSE) >= GET_CAR_COLOUR_UNLOCK_RANK(MCT_METALS, METALS_SET_2))) // Gold Metal Vehicle Resprays (from Rank 100)
BREAK
ENDSWITCH
// Enable/disable scrolling
IF iItemCount > 16
bCanScroll = TRUE
ADD_SCALEFORMXML_INIT_COLUMN_SCROLL_GEN(SECOND_COLUMN, 2, 1, 1, 0)
ADD_SCALEFORMXML_SET_COLUMN_SCROLL(SECOND_COLUMN, 0, iItemCount)
PAUSE_MENU_ACTIVATE_CONTEXT(HASH("RScrollUpDown"))
CPRINTLN(DEBUG_PAUSE_MENU, "[JA@PAUSEMENU] UPDATE_ALL_LIST_ITEMS - Display Scroll Indicator")
ELSE
bCanScroll = FALSE
ADD_SCALEFORMXML_SET_COLUMN_SCROLL(SECOND_COLUMN, -1, -1)
PAUSE_MENU_DEACTIVATE_CONTEXT(HASH("RScrollUpDown"))
CPRINTLN(DEBUG_PAUSE_MENU, "[JA@PAUSEMENU] UPDATE_ALL_LIST_ITEMS - Hide Scroll Indicator")
ENDIF
PAUSE_MENU_ACTIVATE_CONTEXT(HASH("HIDE_ACCEPTBUTTON"))
PAUSE_MENU_REDRAW_INSTRUCTIONAL_BUTTONS()
// Display setting component
PM_DISPLAY_DATA_SLOT(SECOND_COLUMN)
SHOW_PM_COLUMN(SECOND_COLUMN)
bThisDataAvailable = TRUE
RETURN TRUE
ENDFUNC
PROC CHECK_RIGHT_STICK_SCROLL()
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
INT i_right_y
i_right_y = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)//INPUT_FRONTEND_RIGHT_AXIS_Y)
//Check for Down
IF i_right_y > 180
IF HAS_NET_TIMER_EXPIRED(iRStickTimer, iRStickTimerDelay)
IF bCanScroll
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
CPRINTLN(DEBUG_PAUSE_MENU, "[JA@PAUSEMENU] R-STICK UNLOCK - MOVE DOWN")
// Send dpad-down input to right hand column
IF BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_COLUMN_INPUT_EVENT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_DOWN))
END_SCALEFORM_MOVIE_METHOD()
ENDIF
iRStickTimerDelay = 250
RESET_NET_TIMER(iRStickTimer)
ENDIF
ENDIF
//Check for Up
ELIF i_right_y < 80
IF HAS_NET_TIMER_EXPIRED(iRStickTimer, iRStickTimerDelay)
IF bCanScroll
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
CPRINTLN(DEBUG_PAUSE_MENU, "[JA@PAUSEMENU] R-STICK UNLOCK - MOVE UP")
// Send dpad-up input to right hand column
IF BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_COLUMN_INPUT_EVENT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_UP))
END_SCALEFORM_MOVIE_METHOD()
ENDIF
iRStickTimerDelay = 250
RESET_NET_TIMER(iRStickTimer)
ENDIF
ENDIF
ELSE
IF iRStickTimerDelay != -1
iRStickTimerDelay = -1
ENDIF
ENDIF
ENDIF
ENDPROC
PROC INIT_MENU()
FRONTEND_MENU_SCREEN CurrentScreen
FRONTEND_MENU_SCREEN aNextScreen
INT iMenu
GET_MENU_LAYOUT_CHANGED_EVENT_DETAILS(CurrentScreen, aNextScreen, iMenu)
CLEAR_PM_COLUMN(FIRST_COLUMN)
iCurrentMenu = PM_D2_GENERAL_UNLOCKS
MP_SET_DATA_SLOT(FIRST_COLUMN, PM_D2_GENERAL_UNLOCKS, STATS_CATEGORY_MENU_ID, PM_D2_GENERAL_UNLOCKS, TRUE, "PM_UL_D0")
MP_SET_DATA_SLOT(FIRST_COLUMN, PM_D2_PROGRESS_UNLOCKS, STATS_CATEGORY_MENU_ID, PM_D2_PROGRESS_UNLOCKS, TRUE, "PM_UL_D1")
MP_SET_DATA_SLOT(FIRST_COLUMN, PM_D2_CONTENT_UNLOCKS, STATS_CATEGORY_MENU_ID, PM_D2_CONTENT_UNLOCKS, TRUE, "PM_UL_D2")
SHOW_PM_COLUMN(FIRST_COLUMN)
HIDE_PM_COLUMN(THIRD_COLUMN)
HIDE_PM_COLUMN(3)
HIDE_PM_COLUMN(4)
HIDE_PM_COLUMN(5)
PM_DISPLAY_DATA_SLOT(FIRST_COLUMN)
//SET_PM_HIGHLIGHT(FIRST_COLUMN, iCurrentMenu, FALSE, TRUE)
UPDATE_ALL_LIST_ITEMS(bDataAvailable)
PAUSE_MENU_DEACTIVATE_CONTEXT(HASH("RScrollUpDown"))
PAUSE_MENU_ACTIVATE_CONTEXT(HASH("HIDE_ACCEPTBUTTON"))
PAUSE_MENU_REDRAW_INSTRUCTIONAL_BUTTONS()
bInitMenu = TRUE
CPRINTLN(DEBUG_PAUSE_MENU, "MP_UNLOCKS - INIT_MENU Done")
ENDPROC
SCRIPT( PAUSE_MENU_LAUNCH_DATA args )
CPRINTLN(DEBUG_PAUSE_MENU, "MP_UNLOCKS - Select Menu Launched with args: ", args.operation, ", Menu: ", args.MenuScreenId, ", Prev:", args.PreviousId, ", Unique: ", args.UniqueIdentifier)
FORCE_SCRIPTED_GFX_WHEN_FRONTEND_ACTIVE(TRUE)
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
FRONTEND_MENU_SCREEN CurrentScreen
FRONTEND_MENU_SCREEN aNextScreen
INT iMenu
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
IF IS_XBOX_PLATFORM()
OR IS_PLAYSTATION_PLATFORM()
OR IS_PC_VERSION()
AWARDS_IN_HEISTS = 40
ENDIF
//INIT_MENU()
SWITCH args.operation
CASE kUpdate
WHILE bShouldQuitUnlocksScript = FALSE
WAIT(0)
//Check for right stick scroll
CHECK_RIGHT_STICK_SCROLL()
//Check for Back
IF HAS_HUD_CONTROL_BEEN_PRESSED_PAUSE(INPUT_FRONTEND_CANCEL)
NET_NL()NET_PRINT(" INPUT_FRONTEND_CANCEL PRESSED ")
//PLAY_SOUND_FRONTEND(-1, "CANCEL", "HUD_FRONTEND_DEFAULT_SOUNDSET")
RELEASE_CONTROL_OF_FRONTEND()
bShouldQuitUnlocksScript = TRUE
ENDIF
//Check for Up/Down Press
IF HAS_MENU_LAYOUT_CHANGED_EVENT_OCCURRED()
IF bInitMenu = FALSE
IF RECALCULATE_PLAYED_COUNTS_FOR_PAUSE_MENU()
INIT_MENU()
ENDIF
ELSE
CPRINTLN(DEBUG_PAUSE_MENU, "MP_UNLOCKS - HAS_MENU_LAYOUT_CHANGED_EVENT_OCCURRED = TRUE")
GET_MENU_LAYOUT_CHANGED_EVENT_DETAILS(CurrentScreen, aNextScreen, iMenu)
CPRINTLN(DEBUG_PAUSE_MENU, " - CurrentScreen = ", CurrentScreen, " - ", GET_XML_SCREEN_STRING_VALUE(CurrentScreen))
CPRINTLN(DEBUG_PAUSE_MENU, " - aNextScreen = ", aNextScreen, " - ", GET_XML_SCREEN_STRING_VALUE(aNextScreen))
CPRINTLN(DEBUG_PAUSE_MENU, " - iMenu = ", iMenu, " - ", iMenu)
// If new category has been selected, repopulate listitems
IF aNextScreen = MENU_UNIQUE_ID_STATS_CATEGORY
iCurrentMenu = iMenu
CPRINTLN(DEBUG_PAUSE_MENU, " - iCurrentMenu = ", iCurrentMenu)
UPDATE_ALL_LIST_ITEMS(bDataAvailable)
ENDIF
ENDIF
ENDIF
ENDWHILE
BREAK
CASE kFill
NET_NL()NET_PRINT("MP_Unlocks: args.operation = kFill")
BREAK
CASE kLayoutChange
NET_NL()NET_PRINT("MP_Unlocks: args.operation = kLayoutChange")
BREAK
CASE kTriggerEvent
NET_NL()NET_PRINT("MP_Unlocks: args.operation = kTriggerEvent")
BREAK
ENDSWITCH
PAUSE_MENU_DEACTIVATE_CONTEXT(HASH("RScrollUpDown"))
PAUSE_MENU_DEACTIVATE_CONTEXT(HASH("HIDE_ACCEPTBUTTON"))
PAUSE_MENU_REDRAW_INSTRUCTIONAL_BUTTONS()
NET_NL()NET_PRINT("Quitting Unlocks Screen")
RELEASE_CONTROL_OF_FRONTEND()
WHILE TRUE
WAIT(0)
ENDWHILE
ENDSCRIPT