aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/mod
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-10-20 20:11:43 +0100
committerBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-10-20 20:11:43 +0100
commite79a58640e1ef1ea1c3c954aefccd36c3cb55286 (patch)
tree8c7b822f8777ccdf6b0d86587da853b8451953c1 /Northstar.CustomServers/mod
parentd37c5ae333b4e622ebd0d18cf02a87d66aac62f9 (diff)
downloadNorthstarMods-e79a58640e1ef1ea1c3c954aefccd36c3cb55286.tar.gz
NorthstarMods-e79a58640e1ef1ea1c3c954aefccd36c3cb55286.zip
automatic mod enable/disable, refactors and item registration callbacks
Diffstat (limited to 'Northstar.CustomServers/mod')
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/_items.nut10600
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/_menu_callbacks.gnut4
2 files changed, 10602 insertions, 2 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_items.nut b/Northstar.CustomServers/mod/scripts/vscripts/_items.nut
new file mode 100644
index 00000000..539b72bc
--- /dev/null
+++ b/Northstar.CustomServers/mod/scripts/vscripts/_items.nut
@@ -0,0 +1,10600 @@
+untyped
+
+global function InitItems
+global function InitUnlock
+
+global function ItemDefined
+global function IsRefValid
+global function IsUnlockValid
+global function SubitemDefined
+
+global function IsDisabledRef
+
+global function GetIconForTitanClass
+
+global function GetItemData
+global function GetItemType
+global function GetItemMenuAnimClass
+global function GetItemId
+global function GetItemName
+global function GetItemLongName
+global function GetItemDescription
+global function GetItemLongDescription
+global function GetItemPersistenceId
+global function GetItemDisplayDataFromGuid
+#if UI
+global function GetItemUnlockReqText
+global function GetUnlockProgressText
+global function GetUnlockProgressFrac
+global function Player_GetRecentUnlock
+global function Player_GetRecentUnlockCount
+global function IsItemPurchasableEntitlement
+global function GetPurchasableEntitlementMenu
+#endif
+global function GetItemImage
+global function GetItemCost
+global function GetSubItemClipSizeStat
+global function GetPlayerDecalUnlockData
+global function GetItemStat
+global function GetModdedItemStat
+global function GetSubitemStat
+global function GetTitanStat
+global function GetImage
+global function GetAllWeaponsByType
+global function GetItemTypeName
+global function GetItemRefTypeName
+global function GetItemRequiresPrime
+
+global function IsItemInEntitlementUnlock
+global function GetEntitlementIds
+
+global function GetItemImageAspect
+
+global function GetItemUnlockType
+global function GetSubItemUnlockType
+
+global function GetItemDisplayData
+
+global function GetRefFromItem
+
+global function GetUnlockLevelReq
+global function GetUnlockLevelReqWithParent
+
+global function GetSubitemDisplayData
+global function GetSubitemType
+global function GetSubitemId
+global function GetSubitemName
+global function GetSubitemDescription
+global function GetSubitemLongDescription
+global function GetSubitemImage
+global function GetSubitemCost
+
+global function HasSubitem
+
+global function GetAllItemsOfType
+global function GetAllItemRefsOfType
+global function GetVisibleItemsOfType
+global function GetVisibleItemsOfTypeForCategory
+global function GetVisibleItemsOfTypeWithoutEntitlements
+global function GetVisibleItemsOfTypeMatchingEntitlementID
+global function GetIndexForUnlockItem
+global function GetAllItemRefs
+global function GetAllSubitemRefs
+global function GetDisplaySubItemsOfType
+
+global function GetAllRefsOfType
+global function GetRandomItemRefOfType
+
+global function GetItemRefOfTypeByIndex
+global function GetItemIndexOfTypeByRef
+
+global function ItemSupportsAttachments
+global function ItemSupportsAttachment
+global function ItemSupportsMods
+
+global function ItemTypeSupportsAttachments
+global function ItemTypeSupportsMods
+
+global function IsItemTypeMod
+global function IsItemTypeAttachment
+
+global function IsSubItemType
+
+global function IsItemLocked
+global function IsSubItemLocked
+
+global function IsItemOwned
+global function IsSubItemOwned
+
+global function IsItemLockedForPlayer
+global function IsItemLockedForWeapon
+global function IsItemLockedForTitan
+
+global function IsItemLockedForPlayerLevel
+global function IsItemLockedForWeaponLevel
+global function IsItemLockedForTitanLevel
+global function IsItemLockedForFDTitanLevel
+
+global function GetItemPersistenceStruct
+global function IsItemNew
+
+global function GetOwnedEliteWeaponSkins
+global function GetStatUnlockStatVal
+#if UI
+global function UpdateCachedNewItems
+global function GetCachedNewItemsVar
+global function ClearNewStatus
+global function HasAnyNewPilotItems
+global function HasAnyNewTitanItems
+global function HasAnyNewBoosts
+global function HasAnyNewDpadCommsIcons
+global function HasAnyNewFactions
+global function HasAnyNewCallsignBanners
+global function HasAnyNewCallsignPatches
+global function HasAnyNewArmoryItems
+global function ButtonShouldShowNew
+global function RefHasAnyNewSubitem
+global function HasAnyNewItemOfCategory
+global function GetStatUnlockProgress
+global function GetStatUnlockProgressFrac
+#endif
+#if UI || CLIENT
+global function GetStatUnlockReq
+#endif
+#if SERVER
+global function SetItemNewStatus
+global function SetItemOwned
+global function ClearItemOwned
+global function CodeCallback_GivePersistentItem
+global function Player_AddRecentUnlock
+global function PersistenceCleanup
+global function GetNoseArtRefFromTitanClassAndPersistenceValue
+global function GetSkinRefFromTitanClassAndPersistenceValue
+global function UnlockUltimateEdition
+#endif
+global function GetSkinRefFromWeaponRefAndPersistenceValue
+global function GetUnlockItemsForPlayerLevels
+global function GetUnlockItemsForTitanLevels
+global function GetNextUnlockForTitanLevel
+global function GetUnlockItemsForWeaponLevels
+global function GetNextUnlockForWeaponLevel
+global function GetUnlockItemsForFactionLevels
+global function GetUnlockItemsForPlayerLevel
+global function GetUnlockItemsForTitanLevel
+global function GetUnlockItemsForWeaponLevel
+global function GetUnlockItemsForFactionLevel
+
+global function GetUnlockItemsForFDTitanLevel
+global function GetUnlockItemsForFDTitanLevels
+global function GetNextUnlockForFDTitanLevel
+global function FD_GetUpgradesForTitanClass
+
+global function GetUnlockItemsForPlayerRawLevel
+
+global function GetTitanCoreIcon
+
+global function DidPlayerBuyItemFromBlackMarket
+
+global function GetDisplayNameFromItemType
+global function PrintItemData
+global function PrintItems
+
+global function CheckItemUnlockType
+
+global function CreateWeaponData
+
+global function GetSuitAndGenderBasedSetFile
+global function GetSuitBasedTactical
+//global function GetSuitBasedDefaultPassive
+global function GetWeaponBasedDefaultMod
+
+global function GetTitanLoadoutPropertyPassiveType
+global function GetTitanLoadoutPropertyExecutionType
+global function GetPrimeTitanSetFileFromNonPrimeSetFile
+
+global function CheckEverythingUnlockedAchievement
+
+global function DevFindItemByName
+global function DEV_GetEnumStringFromIndex
+
+global function ItemReport
+global function UnlockReport
+global function UnlockDump
+
+#if SERVER
+global function Player_SetDoubleXPCount
+global function Player_SetColiseumTicketCount
+
+global function Player_GiveColiseumTickets
+global function Player_GiveDoubleXP
+global function Player_GiveCredits
+global function Player_ActivateDoubleXP
+global function Player_GiveFDUnlockPoints
+
+global function AwardCredits
+#endif
+
+global function Player_GetColiseumTicketCount
+global function Player_GetDoubleXPCount
+
+global function GetWeaponForTitan
+global function GetTitanForWeapon
+
+global function StringHash
+
+global function RefreshSortedElems
+global function GetSortedIndex
+
+global function SortItemsAlphabetically
+global function ItemsInSameMenuCategory
+global function GetTitanLoadoutIconFD
+
+global function GetTitanPrimeBg
+
+global function GetItemRefsForEntitlements
+
+global function WeaponWarpaint_GetByIndex
+
+#if DEV
+global function GenerateValidateDataTableCRCText
+global function GenerateAllValidateDataTableCRCCheckText
+#endif
+
+// northstar additional global funcs, some of these are new, some are preexisting ones i'm making global for modularity reasons
+global function AddCallback_OnRegisterCustomItems
+
+global function CreateGenericSubItemData
+global function CreateGenericItem
+global function CreateModData
+global function CreatePassiveData
+global function CreatePilotSuitData
+global function CreateTitanExecutionData
+global function CreateTitanData
+global function CreatePrimeTitanData
+global function CreateNoseArtData
+global function CreateSkinData
+global function CreateFDTitanUpgradeData
+global function CreateBaseItemData
+global function CreateWeaponSkinData
+
+global const MOD_ICON_NONE = $"ui/menu/items/mod_icons/none"
+
+global enum eUnlockType
+{
+ DISABLED,
+ PLAYER_LEVEL,
+ TITAN_LEVEL,
+ WEAPON_LEVEL,
+ FACTION_LEVEL,
+ ENTITLEMENT,
+ PERSISTENT_ITEM,
+ STAT,
+ RANDOM,
+ FD_UNLOCK_POINTS,
+}
+
+
+global struct PurchaseData
+{
+ string purchaseMenu
+}
+
+global struct ChildUnlock
+{
+ int unlockType = eUnlockType.DISABLED
+ int unlockLevel = 1
+ float unlockFloatVal = 0
+ int unlockIntVal = 0
+ array<int> entitlementIds
+ int cost
+ string additionalRef
+ table additionalData
+ PurchaseData purchaseData
+}
+
+global struct Unlock
+{
+ int unlockType = eUnlockType.DISABLED
+ int unlockLevel = 1
+ float unlockFloatVal = 0
+ int unlockIntVal = 0
+ array<int> entitlementIds
+ table<string, ChildUnlock> child
+ int cost
+ string parentRef
+ string additionalRef
+ table additionalData
+ PurchaseData purchaseData
+}
+
+
+global struct GlobalItemRef
+{
+ int guid
+ string ref
+ int itemType
+
+ bool hidden // TODO: remove
+}
+
+
+struct modCommonDef
+{
+ string modType
+ string name
+ string description
+ asset image
+ int dataTableIndex
+ int cost
+ int costSniper
+ int costPistol
+ int costAT
+}
+
+
+global struct ItemDisplayData
+{
+ int itemType
+ string ref
+ string parentRef
+
+ string name
+ string desc
+ string longdesc
+ asset image
+ int imageAtlas
+ int persistenceId
+
+ bool hidden
+ bool reqPrime
+ int slot
+
+ table< var, var > i
+}
+
+global struct SubItemData
+{
+ int itemType // TODO: temp until PRIMARY_MOD/ATTACHEMENT/SECONDARY are gone
+ string ref
+ string parentRef
+ int cost
+ int slot
+
+ table< var, var > i
+}
+
+
+global struct ItemData
+{
+// GlobalItemRef& globalItemRef if we do this, we should remove itemType and ref.
+
+ int itemType
+ string ref
+ string parentRef
+
+ string name
+ string longname
+ string desc
+ string longdesc
+ asset image
+ int imageAtlas
+
+ int cost
+
+ bool hidden
+ bool reqPrime
+ int slot
+
+ string persistenceStruct
+ int persistenceId
+
+ table< string, SubItemData > subitems
+
+ table< var, var > i
+}
+
+struct
+{
+ array<GlobalItemRef> allItems
+ table< string, int > itemRefToGuid
+ table< int, string > guidToItemRef
+
+ table<string, ItemData> itemData
+ table< int, array<string> > itemsOfType
+ table<string, ItemData> itemsWithPersistenceStruct
+
+ array<GlobalItemRef>[eItemTypes.COUNT] globalItemRefsOfType
+
+ table < string, ItemDisplayData > displayDataCache
+
+ table <string, int> cachedNewItems
+
+ table<string, Unlock> unlocks
+ table<string, Unlock> entitlementUnlocks
+
+ table<string, array<int> > sortedElems
+
+ table<string, table<int, string> > titanClassAndPersistenceValueToNoseArtRefTable //Primarily used to speed up validation of persistence data
+ table<string, table<int, string> > titanClassAndPersistenceValueToSkinRefTable //Primarily used to speed up validation of persistence data
+ table<string, table<int, string> > weaponRefAndPersistenceValueToSkinRefTable //Primarily used to speed up validation of persistence data
+
+ // northstar custom hooks
+ array<void functionref()> itemRegistrationCallbacks
+} file
+
+void function InitItems()
+{
+ file.unlocks = {}
+ file.entitlementUnlocks = {}
+
+ file.allItems = []
+ file.itemRefToGuid = {}
+ file.guidToItemRef = {}
+ file.guidToItemRef[0] <- "reserved"
+
+ file.itemData = {}
+ file.itemsOfType = {}
+
+ file.displayDataCache = {}
+
+ for ( int i = 0; i < eItemTypes.COUNT; i++ )
+ {
+ file.itemsOfType[ i ] <- []
+ file.globalItemRefsOfType[ i ] = []
+ }
+
+ #if SERVER
+ AddClientCommandCallback( "BuyItem", ClientCommand_BuyItem )
+ AddClientCommandCallback( "BuyTicket", ClientCommand_BuyTicket )
+ AddClientCommandCallback( "ClearNewStatus", ClientCommand_ClearNewStatus )
+ AddClientCommandCallback( "UseDoubleXP", ClientCommand_UseDoubleXP )
+ AddClientCommandCallback( "DEV_GiveFDUnlockPoint", ClientCommand_DEV_GiveFDUnlockPoint )
+ AddClientCommandCallback( "DEV_ResetTitanProgression", ClientCommand_DEV_ResetTitanProgression )
+ #endif
+
+ #if UI
+ uiGlobal.itemsInitialized = true
+ #endif
+
+ #if CLIENT
+ ClearItemTypes();
+ #endif
+
+ if ( IsSingleplayer() )
+ {
+ InitTitanWeaponDataSP()
+ return
+ }
+
+ #if DEV
+ //Updated with DLC 4
+ ValidateDataTableCRC( $"datatable/burn_meter_rewards.rpak", 13, -195196861 )
+ ValidateDataTableCRC( $"datatable/calling_cards.rpak", 379, -93927632 )
+ ValidateDataTableCRC( $"datatable/callsign_icons.rpak", 167, 2015621078 )
+ ValidateDataTableCRC( $"datatable/camo_skins.rpak", 140, -320502469 )
+ ValidateDataTableCRC( $"datatable/faction_leaders.rpak", 7, -686839648 )
+ ValidateDataTableCRC( $"datatable/features_mp.rpak", 18, 1879135085 )
+ ValidateDataTableCRC( $"datatable/pilot_abilities.rpak", 15, 2112045689 )
+ ValidateDataTableCRC( $"datatable/pilot_executions.rpak", 10, 1341275658 )
+ ValidateDataTableCRC( $"datatable/pilot_passives.rpak", 8, 981112716 )
+ ValidateDataTableCRC( $"datatable/pilot_properties.rpak", 7, -1114320894 )
+ ValidateDataTableCRC( $"datatable/pilot_weapon_features.rpak", 4, 439636371 )
+ ValidateDataTableCRC( $"datatable/pilot_weapon_mods.rpak", 249, 2010060417 )
+ ValidateDataTableCRC( $"datatable/pilot_weapon_mods_common.rpak", 25, -761470088 )
+ ValidateDataTableCRC( $"datatable/pilot_weapons.rpak", 32, 1625188373 )
+ ValidateDataTableCRC( $"datatable/playlist_items.rpak", 19, -1360623070 )
+ ValidateDataTableCRC( $"datatable/titan_nose_art.rpak", 150, 1922555441 )
+ ValidateDataTableCRC( $"datatable/titan_passives.rpak", 51, 1139205682 )
+ ValidateDataTableCRC( $"datatable/titan_primary_mods.rpak", 0, 0 )
+ ValidateDataTableCRC( $"datatable/titan_primary_mods_common.rpak", 0, 0 )
+ ValidateDataTableCRC( $"datatable/titan_properties.rpak", 8, -1270130815 )
+ ValidateDataTableCRC( $"datatable/titan_skins.rpak", 42, 1057626784 )
+ ValidateDataTableCRC( $"datatable/titan_voices.rpak", 8, -1605184394 )
+ ValidateDataTableCRC( $"datatable/titans_mp.rpak", 7, 420442720 )
+ #endif
+
+ var dataTable
+ int numRows
+
+ ////////////////////
+ //CAMO SKINS DATA
+ ////////////////////
+ //CreateBaseItemData( eItemTypes.FEATURE, "no_item", true )
+
+ dataTable = GetDataTable( $"datatable/camo_skins.rpak" )
+ table<int, int> categoryCounts = {}
+ for ( int row = 0; row < GetDatatableRowCount( dataTable ); row++ )
+ {
+ string camoRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CAMO_REF_COLUMN_NAME ) )
+ string pilotCamoRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CAMO_PILOT_REF_COLUMN_NAME ) )
+ string titanCamoRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CAMO_TITAN_REF_COLUMN_NAME ) )
+ asset image = GetDataTableAsset( dataTable, row, GetDataTableColumnByName( dataTable, CAMO_IMAGE_COLUMN_NAME ) )
+ string name = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CAMO_NAME_COLUMN_NAME ) )
+ string desc = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CAMO_DESCRIPTION_COLUMN_NAME ) )
+ int pilotCost = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, CAMO_PILOT_COST_COLUMN_NAME ) )
+ int categoryId = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, CAMO_CATEGORY_COLUMN_NAME ) )
+
+ if ( !(categoryId in categoryCounts) )
+ categoryCounts[categoryId] <- 0
+
+ categoryCounts[categoryId]++
+
+ int datatableIndex = row
+
+ const bool IS_HIDDEN_ARG = false
+
+ ItemData item
+ item = CreateGenericItem( datatableIndex, eItemTypes.CAMO_SKIN_PILOT, pilotCamoRef, name, desc, desc, image, pilotCost, IS_HIDDEN_ARG )
+ item.imageAtlas = IMAGE_ATLAS_CAMO
+ item.i.categoryId <- categoryId
+
+ item = CreateGenericItem( datatableIndex, eItemTypes.CAMO_SKIN_TITAN, titanCamoRef, name, desc, desc, image, 0, IS_HIDDEN_ARG )
+ item.imageAtlas = IMAGE_ATLAS_CAMO
+ item.i.categoryId <- categoryId
+
+ item = CreateGenericItem( datatableIndex, eItemTypes.CAMO_SKIN, camoRef, name, desc, desc, image, 0, IS_HIDDEN_ARG )
+ item.imageAtlas = IMAGE_ATLAS_CAMO
+ item.i.categoryId <- categoryId
+ }
+
+ InitTitanWeaponDataMP()
+
+ ////////////////////
+ //PILOT WEAPON DATA
+ ////////////////////
+
+ dataTable = GetDataTable( $"datatable/pilot_weapons.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "itemRef" ) )
+ int itemType = eItemTypes[ GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "type" ) ) ]
+ bool hidden = GetDataTableBool( dataTable, i, GetDataTableColumnByName( dataTable, "hidden" ) )
+ string xpPerLevelType = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "xpPerLevelType" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+ WeaponSetXPPerLevelType( itemRef, xpPerLevelType )
+
+ CreateWeaponData( i, itemType, hidden, itemRef, true, cost )
+
+ var camoSkinsDataTable = GetDataTable( $"datatable/camo_skins.rpak" )
+ for ( int camoRow = 0; camoRow < GetDatatableRowCount( camoSkinsDataTable ); camoRow++ )
+ {
+ string camoRef = GetDataTableString( camoSkinsDataTable, camoRow, GetDataTableColumnByName( camoSkinsDataTable, CAMO_REF_COLUMN_NAME ) )
+ int weaponCamoCost = GetDataTableInt( camoSkinsDataTable, camoRow, GetDataTableColumnByName( camoSkinsDataTable, CAMO_PILOT_WEAPON_COST_COLUMN_NAME ) )
+ int categoryId = GetDataTableInt( camoSkinsDataTable, camoRow, GetDataTableColumnByName( camoSkinsDataTable, CAMO_CATEGORY_COLUMN_NAME ) )
+
+ CreateGenericSubItemData( eItemTypes.CAMO_SKIN, itemRef, camoRef, weaponCamoCost, { categoryId = categoryId } )
+ }
+ }
+
+ SetupWeaponSkinData()
+
+ dataTable = GetDataTable( $"datatable/pilot_abilities.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "itemRef" ) )
+ int itemType = eItemTypes[ GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "type" ) ) ]
+ bool isDamageSource = GetDataTableBool( dataTable, i, GetDataTableColumnByName( dataTable, "damageSource" ) )
+ bool hidden = GetDataTableBool( dataTable, i, GetDataTableColumnByName( dataTable, "hidden" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ CreateWeaponData( i, itemType, hidden, itemRef, isDamageSource, cost )
+ }
+
+ ////////////////////////
+ //PILOT MODS/ATTACHMENTS
+ ////////////////////////
+
+ dataTable = GetDataTable( $"datatable/pilot_weapon_mods_common.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ table<string, modCommonDef> modCommonTable
+
+ for ( int i = 0; i < numRows; i++ )
+ {
+ modCommonDef modCommon
+ modCommon.modType = GetDataTableString( dataTable, i, PILOT_WEAPON_MOD_COMMON_TYPE_COLUMN )
+ Assert( modCommon.modType == "attachment" || modCommon.modType == "mod" || modCommon.modType == "mod3" )
+
+ modCommon.name = GetDataTableString( dataTable, i, PILOT_WEAPON_MOD_COMMON_NAME_COLUMN )
+ modCommon.description = GetDataTableString( dataTable, i, PILOT_WEAPON_MOD_COMMON_DESCRIPTION_COLUMN )
+ modCommon.image = GetDataTableAsset( dataTable, i, PILOT_WEAPON_MOD_COMMON_IMAGE_COLUMN )
+ modCommon.cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+ modCommon.costSniper = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "costSniper" ) )
+ modCommon.costPistol = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "costPistol" ) )
+ modCommon.costAT = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "costAT" ) )
+
+ modCommon.dataTableIndex = i
+
+ string itemRef = GetDataTableString( dataTable, i, PILOT_WEAPON_MOD_COMMON_COLUMN )
+ modCommonTable[ itemRef ] <- modCommon
+
+ ItemData modCommonData
+ if ( modCommon.modType == "attachment" )
+ modCommonData = CreateBaseItemData( eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT, itemRef, false )
+ else
+ modCommonData = CreateBaseItemData( eItemTypes.SUB_PILOT_WEAPON_MOD, itemRef, false )
+
+ modCommonData.name = modCommon.name
+ modCommonData.longname = modCommon.name
+ modCommonData.desc = modCommon.description
+ modCommonData.image = modCommon.image
+ modCommonData.persistenceId = modCommon.dataTableIndex
+ modCommonData.imageAtlas = IMAGE_ATLAS_MENU
+ }
+
+ dataTable = GetDataTable( $"datatable/pilot_weapon_mods.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ var weaponTable = GetDataTable( $"datatable/pilot_weapons.rpak" )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string mod = GetDataTableString( dataTable, i, PILOT_WEAPON_MOD_COLUMN )
+ string weapon = GetDataTableString( dataTable, i, PILOT_WEAPON_MOD_WEAPON_COLUMN )
+ bool hidden = GetDataTableBool( dataTable, i, PILOT_WEAPON_MOD_HIDDEN_COLUMN )
+
+ int typeRow = GetDataTableRowMatchingStringValue( weaponTable, GetDataTableColumnByName( weaponTable, "itemRef" ), weapon )
+ int weaponType = eItemTypes[ GetDataTableString( weaponTable, typeRow, GetDataTableColumnByName( weaponTable, "type" ) ) ]
+
+ int cost
+ string xpPerLevelType = GetDataTableString( weaponTable, typeRow, GetDataTableColumnByName( weaponTable, "xpPerLevelType" ) )
+ switch ( xpPerLevelType )
+ {
+ case "sniper":
+ cost = modCommonTable[ mod ].costSniper
+ break
+
+ case "pistol":
+ cost = modCommonTable[ mod ].costPistol
+ break
+
+ case "antititan":
+ cost = modCommonTable[ mod ].costAT
+ break
+
+ default:
+ cost = modCommonTable[ mod ].cost
+ }
+
+ if ( modCommonTable[ mod ].modType == "attachment" )
+ {
+ Assert( weaponType == eItemTypes.PILOT_PRIMARY )
+
+ CreateModData( eItemTypes.PILOT_PRIMARY_ATTACHMENT, weapon, mod, cost )
+ }
+ else if ( modCommonTable[ mod ].modType == "mod" )
+ {
+ Assert( weaponType == eItemTypes.PILOT_PRIMARY || weaponType == eItemTypes.PILOT_SECONDARY )
+ int itemType = weaponType == eItemTypes.PILOT_PRIMARY ? eItemTypes.PILOT_PRIMARY_MOD : eItemTypes.PILOT_SECONDARY_MOD
+
+ int damageDisplay = GetDataTableInt( dataTable, i, PILOT_WEAPON_MOD_DAMAGEDISPLAY_COLUMN )
+ int accuracyDisplay = GetDataTableInt( dataTable, i, PILOT_WEAPON_MOD_ACCURACYDISPLAY_COLUMN )
+ int rangeDisplay = GetDataTableInt( dataTable, i, PILOT_WEAPON_MOD_RANGEDISPLAY_COLUMN )
+ int fireRateDisplay = GetDataTableInt( dataTable, i, PILOT_WEAPON_MOD_FIRERATEDISPLAY_COLUMN )
+ int clipSizeDisplay = GetDataTableInt( dataTable, i, PILOT_WEAPON_MOD_CLIPSIZEDISPLAY_COLUMN )
+
+ CreateModData( itemType, weapon, mod, cost, damageDisplay, accuracyDisplay, rangeDisplay, fireRateDisplay, clipSizeDisplay )
+ }
+ else
+ {
+ Assert( modCommonTable[ mod ].modType == "mod3" )
+ CreateModData( eItemTypes.PILOT_WEAPON_MOD3, weapon, mod, cost )
+ }
+ }
+
+ /////////////////////
+ //PILOT PASSIVE DATA
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/pilot_passives.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "passive" ) )
+ int itemType = eItemTypes[ GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "type" ) ) ]
+ string name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "name" ) )
+ string description = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "description" ) )
+ asset image = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "image" ) )
+ bool hidden = GetDataTableBool( dataTable, i, GetDataTableColumnByName( dataTable, "hidden" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ CreatePassiveData( i, itemType, hidden, itemRef, name, description, description, image, cost )
+ }
+
+ /////////////////////
+ //SUIT DATA
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/pilot_properties.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "type" ) )
+ asset image = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "image" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ CreatePilotSuitData( i, eItemTypes.PILOT_SUIT, itemRef, image, cost )
+ }
+
+ CreateBaseItemData( eItemTypes.RACE, "race_human_male", false )
+ CreateBaseItemData( eItemTypes.RACE, "race_human_female", false )
+
+ /////////////////////
+ //PILOT EXECUTION DATA
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/pilot_executions.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string ref = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "ref" ) )
+ string name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "name" ) )
+ string description = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "description" ) )
+ asset image = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "image" ) )
+ bool hidden = GetDataTableBool( dataTable, i, GetDataTableColumnByName( dataTable, "hidden" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ if ( IsDisabledRef( ref ) )
+ continue
+
+ CreatePassiveData( i, eItemTypes.PILOT_EXECUTION, hidden, ref, name, description, description, image, cost )
+ }
+ /////////////////////
+ //TITAN EXECUTION DATA
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/titan_executions.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ bool hidden = GetDataTableBool( dataTable, i, GetDataTableColumnByName( dataTable, "hidden" ) )
+ if ( hidden == true )
+ continue
+
+ string ref = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "ref" ) )
+ int itemType = eItemTypes[ GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "type" ) ) ]
+ string name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "name" ) )
+ string description = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "description" ) )
+ asset image = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "image" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+ bool reqPrime = GetDataTableBool( dataTable, i, GetDataTableColumnByName( dataTable, "reqPrime" ) )
+
+ if ( IsDisabledRef( ref ) )
+ continue
+
+ CreateTitanExecutionData( i, itemType, hidden, ref, name, description, description, image, cost, reqPrime )
+ }
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/features_mp.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ int featureIndex = 0
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string featureRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "featureRef" ) )
+ string name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "featureName" ) )
+ string desc = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "featureDesc" ) )
+ asset image = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "featureIcon" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+ string specificType = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "specificType" ) )
+
+ const bool IS_HIDDEN_ARG = false
+ ItemData featureItem = CreateGenericItem( featureIndex, eItemTypes.FEATURE, featureRef, name, desc, "", image, cost, IS_HIDDEN_ARG )
+ featureItem.i.specificType <- specificType
+
+ featureIndex++
+ }
+
+ dataTable = GetDataTable( $"datatable/playlist_items.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string playlistRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "playlist" ) )
+ string name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "name" ) )
+ asset image = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "image" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ const bool IS_HIDDEN_ARG = false
+ ItemData featureItem = CreateGenericItem( featureIndex, eItemTypes.FEATURE, playlistRef, name, "", "", image, cost, IS_HIDDEN_ARG )
+ featureItem.i.specificType <- "#ITEM_TYPE_PLAYLIST"
+ featureItem.i.isPlaylist <- true
+
+ featureIndex++
+ }
+
+ //{
+ // int featureIndex = 0
+ // int gameModeCount = PersistenceGetEnumCount( "gameModes" )
+ // for ( int modeIndex = 0; modeIndex < gameModeCount; modeIndex++ )
+ // {
+ // string gameModeRef = PersistenceGetEnumItemNameForIndex( "gameModes", modeIndex )
+ // if ( !IsRefValid( gameModeRef ) )
+ // {
+ // string name = GameMode_GetName( gameModeRef )
+ // string desc = GameMode_GetDesc( gameModeRef )
+ // asset image = GameMode_GetIcon( gameModeRef )
+ // int cost = 0
+ //
+ // CreateGenericItem( featureIndex, eItemTypes.GAME_MODE, gameModeRef, name, desc, "", image, cost )
+ // featureIndex++
+ // }
+ // }
+ //}
+
+ dataTable = GetDataTable( $"datatable/pilot_weapon_features.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string featureRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "featureRef" ) )
+ string name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "featureName" ) )
+ string desc = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "featureDesc" ) )
+ asset image = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "featureIcon" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+ int dataTableIndex = i
+ const bool IS_HIDDEN_ARG = false
+ CreateGenericItem( dataTableIndex, eItemTypes.WEAPON_FEATURE, featureRef, name, desc, "", image, cost, IS_HIDDEN_ARG )
+ }
+
+ /////////////////////
+ //PILOT SECONDARY MOD SLOTS
+ /////////////////////
+ dataTable = GetDataTable( $"datatable/pilot_weapons.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string weaponRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "itemRef" ) )
+ int weaponType = eItemTypes[ GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "type" ) ) ]
+ if ( weaponType == eItemTypes.PILOT_PRIMARY )
+ {
+ CreateGenericSubItemData( eItemTypes.WEAPON_FEATURE, weaponRef, "primarymod2", file.itemData["primarymod2"].cost )
+ CreateGenericSubItemData( eItemTypes.WEAPON_FEATURE, weaponRef, "primarymod3", file.itemData["primarymod3"].cost )
+ }
+ else
+ {
+ CreateGenericSubItemData( eItemTypes.WEAPON_FEATURE, weaponRef, "secondarymod2", file.itemData["secondarymod2"].cost )
+ CreateGenericSubItemData( eItemTypes.WEAPON_FEATURE, weaponRef, "secondarymod3", file.itemData["secondarymod3"].cost )
+ }
+ }
+
+ /////////////////////
+ //FACTION DATA
+ /////////////////////
+ dataTable = GetDataTable( $"datatable/faction_leaders.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string factionRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "persistenceRef" ) )
+ asset logo = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "logo" ) )
+ string name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "factionName" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ ItemData item = CreateBaseItemData( eItemTypes.FACTION, factionRef, false )
+ item.image = logo
+ item.name = name
+ item.cost = cost
+ item.imageAtlas = IMAGE_ATLAS_FACTION_LOGO
+ item.persistenceId = i
+ }
+
+ /////////////////
+ //TITAN MOD DATA
+ /////////////////
+ dataTable = GetDataTable( $"datatable/titan_primary_mods_common.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ modCommonTable.clear()
+
+ for ( int i = 0; i < numRows; i++ )
+ {
+ modCommonDef modCommon
+ modCommon.name = GetDataTableString( dataTable, i, TITAN_PRIMARY_MOD_COMMON_NAME_COLUMN )
+ modCommon.description = GetDataTableString( dataTable, i, TITAN_PRIMARY_MOD_COMMON_DESCRIPTION_COLUMN )
+ modCommon.image = GetDataTableAsset( dataTable, i, TITAN_PRIMARY_MOD_COMMON_IMAGE_COLUMN )
+
+ modCommon.dataTableIndex = i
+
+ string itemRef = GetDataTableString( dataTable, i, TITAN_PRIMARY_MOD_COMMON_COLUMN )
+ modCommonTable[ itemRef ] <- modCommon
+ }
+
+ dataTable = GetDataTable( $"datatable/titan_primary_mods.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string mod = GetDataTableString( dataTable, i, TITAN_PRIMARY_MOD_COLUMN )
+ string weapon = GetDataTableString( dataTable, i, TITAN_PRIMARY_MOD_WEAPON_COLUMN )
+
+ string name = modCommonTable[ mod ].name
+ string description = modCommonTable[ mod ].description
+ asset image = modCommonTable[ mod ].image
+ int dataTableIndex = modCommonTable[ mod ].dataTableIndex
+
+ int damageDisplay = GetDataTableInt( dataTable, i, TITAN_PRIMARY_MOD_DAMAGEDISPLAY_COLUMN )
+ int accuracyDisplay = GetDataTableInt( dataTable, i, TITAN_PRIMARY_MOD_ACCURACYDISPLAY_COLUMN )
+ int rangeDisplay = GetDataTableInt( dataTable, i, TITAN_PRIMARY_MOD_RANGEDISPLAY_COLUMN )
+ int fireRateDisplay = GetDataTableInt( dataTable, i, TITAN_PRIMARY_MOD_FIRERATEDISPLAY_COLUMN )
+ int clipSizeDisplay = GetDataTableInt( dataTable, i, TITAN_PRIMARY_MOD_CLIPSIZEDISPLAY_COLUMN )
+
+ bool hidden = GetDataTableBool( dataTable, i, TITAN_PRIMARY_MOD_HIDDEN_COLUMN )
+
+// CreateModData( dataTableIndex, eItemTypes.TITAN_PRIMARY_MOD, weapon, mod, name, description, description, image, damageDisplay, accuracyDisplay, rangeDisplay, fireRateDisplay, clipSizeDisplay )
+ }
+
+ /////////////////////
+ //TITAN PASSIVE DATA
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/titan_passives.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, TITAN_PASSIVE_COLUMN )
+ int itemType = eItemTypes[ GetDataTableString( dataTable, i, TITAN_PASSIVE_TYPE_COLUMN ) ]
+ string name = GetDataTableString( dataTable, i, TITAN_PASSIVE_NAME_COLUMN )
+ string description = GetDataTableString( dataTable, i, TITAN_PASSIVE_DESCRIPTION_COLUMN )
+ string longDescription = GetDataTableString( dataTable, i, TITAN_PASSIVE_LONGDESCRIPTION_COLUMN )
+ asset image = GetDataTableAsset( dataTable, i, TITAN_PASSIVE_IMAGE_COLUMN )
+ bool hidden = GetDataTableBool( dataTable, i, TITAN_PASSIVE_HIDDEN_COLUMN )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ CreatePassiveData( i, itemType, hidden, itemRef, name, description, longDescription, image, cost )
+ }
+
+ /////////////////////
+ //TITAN OS DATA
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/titan_voices.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, TITAN_VOICE_COLUMN )
+ string name = GetDataTableString( dataTable, i, TITAN_VOICE_NAME_COLUMN )
+ string description = GetDataTableString( dataTable, i, TITAN_VOICE_DESCRIPTION_COLUMN )
+ asset image = GetDataTableAsset( dataTable, i, TITAN_VOICE_IMAGE_COLUMN )
+ bool hidden = GetDataTableBool( dataTable, i, TITAN_VOICE_HIDDEN_COLUMN )
+
+ const bool IS_HIDDEN_ARG = false
+ CreateGenericItem( i, eItemTypes.TITAN_OS, itemRef, name, description, description, image, 0, IS_HIDDEN_ARG )
+ }
+
+
+ var titanPropertiesDataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ var titansMpDataTable = GetDataTable( $"datatable/titans_mp.rpak" )
+ numRows = GetDatatableRowCount( titansMpDataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string titanRef = GetDataTableString( titansMpDataTable, i, GetDataTableColumnByName( titansMpDataTable, "titanRef" ) )
+ int cost = GetDataTableInt( titansMpDataTable, i, GetDataTableColumnByName( titansMpDataTable, "cost" ) )
+ asset image = GetDataTableAsset( titansMpDataTable, i, GetDataTableColumnByName( titansMpDataTable, "image" ) )
+ asset coreIcon = GetDataTableAsset( titansMpDataTable, i, GetDataTableColumnByName( titansMpDataTable, "coreIcon" ) )
+
+ if ( IsDisabledRef( titanRef ) )
+ continue
+
+ CreateTitanData( i, titanRef, cost, image, coreIcon )
+
+ ItemData itemData = GetItemData( titanRef )
+ int passive1Type = expect int( itemData.i.passive1Type )
+ int passive2Type = expect int( itemData.i.passive2Type )
+ int passive3Type = expect int( itemData.i.passive3Type )
+ int passive4Type = expect int( itemData.i.passive4Type )
+ int passive5Type = expect int( itemData.i.passive5Type )
+ int passive6Type = expect int( itemData.i.passive6Type )
+
+ {
+ array<ItemData> items = GetAllItemsOfType( passive1Type )
+ foreach ( item in items )
+ {
+ CreateGenericSubItemData( passive1Type, titanRef, item.ref, GetItemCost( item.ref ) )
+ }
+ }
+
+ if ( passive1Type != passive2Type )
+ {
+ array<ItemData> items = GetAllItemsOfType( passive2Type )
+ foreach ( item in items )
+ {
+ CreateGenericSubItemData( passive2Type, titanRef, item.ref, GetItemCost( item.ref ) )
+ }
+ }
+
+ if ( passive3Type != passive1Type && passive3Type != passive2Type )
+ {
+ array<ItemData> items = GetAllItemsOfType( passive3Type )
+ foreach ( item in items )
+ {
+ CreateGenericSubItemData( passive3Type, titanRef, item.ref, GetItemCost( item.ref ) )
+ }
+ }
+
+ array<ItemData> passive4items = GetAllItemsOfType( passive4Type )
+ foreach ( item in passive4items )
+ {
+ CreateGenericSubItemData( passive4Type, titanRef, item.ref, GetItemCost( item.ref ) )
+ }
+
+ array<ItemData> passive5items = GetAllItemsOfType( passive5Type )
+ foreach ( item in passive5items )
+ {
+ CreateGenericSubItemData( passive5Type, titanRef, item.ref, GetItemCost( item.ref ) )
+ }
+
+ array<ItemData> passive6items = GetAllItemsOfType( passive6Type )
+ foreach ( item in passive6items )
+ {
+ CreateGenericSubItemData( passive6Type, titanRef, item.ref, GetItemCost( item.ref ) )
+ }
+
+ {
+ var camoSkinsDataTable = GetDataTable( $"datatable/camo_skins.rpak" )
+ for ( int camoRow = 0; camoRow < GetDatatableRowCount( camoSkinsDataTable ); camoRow++ )
+ {
+ string camoRef = GetDataTableString( camoSkinsDataTable, camoRow, GetDataTableColumnByName( camoSkinsDataTable, CAMO_REF_COLUMN_NAME ) )
+ string titanCamoRef = GetDataTableString( camoSkinsDataTable, camoRow, GetDataTableColumnByName( camoSkinsDataTable, CAMO_TITAN_REF_COLUMN_NAME ) )
+ int titanWeaponCost = GetDataTableInt( camoSkinsDataTable, camoRow, GetDataTableColumnByName( camoSkinsDataTable, CAMO_TITAN_WEAPON_COST_COLUMN_NAME ) )
+ int titanCost = GetDataTableInt( camoSkinsDataTable, camoRow, GetDataTableColumnByName( camoSkinsDataTable, CAMO_TITAN_COST_COLUMN_NAME ) )
+ int categoryId = GetDataTableInt( camoSkinsDataTable, camoRow, GetDataTableColumnByName( camoSkinsDataTable, CAMO_CATEGORY_COLUMN_NAME ) )
+
+ CreateGenericSubItemData( eItemTypes.CAMO_SKIN, titanRef, camoRef, titanWeaponCost, { categoryId = categoryId } )
+ CreateGenericSubItemData( eItemTypes.CAMO_SKIN_TITAN, titanRef, titanCamoRef, titanCost, { categoryId = categoryId } )
+ }
+ }
+
+ #if SERVER || CLIENT
+ int propertyRow = GetDataTableRowMatchingStringValue( titanPropertiesDataTable, GetDataTableColumnByName( titanPropertiesDataTable, "titanRef" ), titanRef )
+ string setFile = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "setFile" ) )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( setFile, "bodymodel" ) )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( setFile, "armsmodel" ) )
+ string primeSetFile = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "primeSetFile" ) )
+ if ( primeSetFile != "" )
+ {
+ PrecacheModel( GetPlayerSettingsAssetForClassName( primeSetFile, "bodymodel" ) )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( primeSetFile, "armsmodel" ) )
+ }
+ #endif
+
+ //string primary = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "primary" ) )
+ //string melee = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "melee" ) )
+ //string ordnance = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "ordnance" ) )
+ //string special = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "special" ) )
+ //string antirodeo = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "antirodeo" ) )
+ //string coreAbility = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "coreAbility" ) )
+ }
+
+ //////////////////////////
+ // DLC1
+ //////////////////////////
+ //Need to be moved up here for prime_titan_nose_art to work
+ CreatePrimeTitanData( eItemTypes.PRIME_TITAN, "ion_prime", "ion", true )
+ CreatePrimeTitanData( eItemTypes.PRIME_TITAN, "tone_prime", "tone", true )
+ CreatePrimeTitanData( eItemTypes.PRIME_TITAN, "scorch_prime", "scorch", true )
+ CreatePrimeTitanData( eItemTypes.PRIME_TITAN, "legion_prime", "legion", true )
+ CreatePrimeTitanData( eItemTypes.PRIME_TITAN, "ronin_prime", "ronin", true )
+ CreatePrimeTitanData( eItemTypes.PRIME_TITAN, "northstar_prime", "northstar", true )
+ CreatePrimeTitanData( eItemTypes.PRIME_TITAN, "vanguard_prime", "vanguard", true )
+
+ dataTable = GetDataTable( $"datatable/titan_nose_art.rpak" )
+ table<string, int> decalIndexTable
+ for ( int row = 0; row < GetDatatableRowCount( dataTable ); row++ )
+ {
+ string titanRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "titanRef" ) )
+ string ref = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "ref" ) )
+ asset image = GetDataTableAsset( dataTable, row, GetDataTableColumnByName( dataTable, "image" ) )
+ string name = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "name" ) )
+ int cost = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ if ( IsDisabledRef( titanRef ) )
+ continue
+
+ if ( !( titanRef in decalIndexTable ) )
+ decalIndexTable[titanRef] <- 0
+ else
+ decalIndexTable[titanRef]++
+
+ //CreateGenericItem( datatableIndex, eItemTypes.TITAN_NOSE_ART, ref, name, "", "", image )
+ //CreateBaseItemData( eItemTypes.TITAN_NOSE_ART, ref, false )
+ CreateNoseArtData( decalIndexTable[titanRef], eItemTypes.TITAN_NOSE_ART, false, ref, name, image, decalIndexTable[titanRef] )
+ CreateGenericSubItemData( eItemTypes.TITAN_NOSE_ART, titanRef, ref, cost )
+
+
+ if ( !( titanRef in file.titanClassAndPersistenceValueToNoseArtRefTable ) )
+ file.titanClassAndPersistenceValueToNoseArtRefTable[ titanRef ] <- {}
+
+ file.titanClassAndPersistenceValueToNoseArtRefTable[ titanRef ][ decalIndexTable[titanRef] ] <- ref
+
+ }
+
+ dataTable = GetDataTable( $"datatable/titan_skins.rpak" )
+ for ( int row = 0; row < GetDatatableRowCount( dataTable ); row++ )
+ {
+ string titanRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "titanRef" ) )
+ string ref = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "ref" ) )
+ asset image = GetDataTableAsset( dataTable, row, GetDataTableColumnByName( dataTable, "image" ) )
+ string name = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "name" ) )
+ int cost = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "cost" ) )
+ int skinIndex = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "skinIndex" ) )
+ int datatableIndex = row
+
+ if ( IsDisabledRef( titanRef ) || IsDisabledRef( ref ) )
+ continue
+
+ CreateSkinData( datatableIndex, eItemTypes.TITAN_WARPAINT, false, ref, name, image, skinIndex )
+ CreateGenericSubItemData( eItemTypes.TITAN_WARPAINT, titanRef, ref, cost, { skinIndex = skinIndex } )
+
+ if ( !( titanRef in file.titanClassAndPersistenceValueToSkinRefTable ) )
+ file.titanClassAndPersistenceValueToSkinRefTable[ titanRef ] <- {}
+
+ file.titanClassAndPersistenceValueToSkinRefTable[ titanRef ][ skinIndex ] <- ref
+ }
+
+ {
+ var dataTable = GetDataTable( $"datatable/calling_cards.rpak" )
+ for ( int row = 0; row < GetDatatableRowCount( dataTable ); row++ )
+ {
+ string cardRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CALLING_CARD_REF_COLUMN_NAME ) )
+ string name = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CALLING_CARD_NAME_COLUMN_NAME ) )
+ asset image = GetDataTableAsset( dataTable, row, GetDataTableColumnByName( dataTable, CALLING_CARD_IMAGE_COLUMN_NAME ) )
+ int cost = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "cost" ) )
+ bool isHidden = false
+ if ( cost < 0 )
+ {
+ isHidden = true
+ cost = 0
+ }
+
+ string desc = "Undefined"
+ string longdesc = "Undefined"
+
+ int datatableIndex = row
+
+ CreateGenericItem( datatableIndex, eItemTypes.CALLING_CARD, cardRef, name, desc, longdesc, image, cost, isHidden )
+ GetItemData( cardRef ).imageAtlas = IMAGE_ATLAS_CALLINGCARD
+ }
+ }
+
+ {
+ var dataTable = GetDataTable( $"datatable/callsign_icons.rpak" )
+ for ( int row = 0; row < GetDatatableRowCount( dataTable ); row++ )
+ {
+ string iconRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CALLSIGN_ICON_REF_COLUMN_NAME ) )
+ string name = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, CALLSIGN_ICON_NAME_COLUMN_NAME ) )
+ asset image = GetDataTableAsset( dataTable, row, GetDataTableColumnByName( dataTable, CALLSIGN_ICON_IMAGE_COLUMN_NAME ) )
+ int cost = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "cost" ) )
+ bool isHidden = false
+ if ( cost < 0 )
+ {
+ isHidden = true
+ cost = 0
+ }
+
+ string desc = "Undefined"
+ string longdesc = "Undefined"
+
+ int datatableIndex = row
+
+ if ( IsDisabledRef( iconRef ) )
+ continue
+
+ CreateGenericItem( datatableIndex, eItemTypes.CALLSIGN_ICON, iconRef, name, desc, longdesc, image, cost, isHidden )
+ GetItemData( iconRef ).imageAtlas = IMAGE_ATLAS_CALLINGCARD
+ }
+ }
+
+ /////////////////////
+ // NON-LOADOUT WEAPONS
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/non_loadout_weapons.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string weapon = GetDataTableString( dataTable, i, NON_LOADOUT_WEAPON_COLUMN )
+
+ #if SERVER || CLIENT
+ if ( !IsDisabledRef( weapon ) )
+ PrecacheWeapon( weapon )
+ #endif
+ //CreateWeaponData( i, eItemTypes.NOT_LOADOUT, true, weapon, true )
+ }
+
+ /////////////////////
+ // NON-LOADOUT MODS
+ /////////////////////
+
+ //dataTable = GetDataTable( $"datatable/non_loadout_mods.rpak" )
+ //numRows = GetDatatableRowCount( dataTable )
+ //for ( int i = 0; i < numRows; i++ )
+ //{
+ // string mod = GetDataTableString( dataTable, i, NON_LOADOUT_MOD_COLUMN )
+ // string parentItem = GetDataTableString( dataTable, i, NON_LOADOUT_MOD_PARENT_COLUMN )
+ // string name = GetDataTableString( dataTable, i, NON_LOADOUT_MOD_NAME_COLUMN )
+ // string description = GetDataTableString( dataTable, i, NON_LOADOUT_MOD_DESCRIPTION_COLUMN )
+ // asset image = GetDataTableAsset( dataTable, i, NON_LOADOUT_MOD_IMAGE_COLUMN )
+ //
+ // CreateModData( -1, eItemTypes.NOT_LOADOUT, parentItem, mod, name, description, description, image )
+ //}
+
+ /////////////////////
+ //BURN METER REWARD DATA
+ /////////////////////
+
+ dataTable = GetDataTable( $"datatable/burn_meter_rewards.rpak" )
+ for ( int row = 0; row < GetDatatableRowCount( dataTable ); row++ )
+ {
+ string itemRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, BURN_REF_COLUMN_NAME ) )
+ string name = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, BURN_NAME_COLUMN_NAME ) )
+ string description = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, BURN_NAME_COLUMN_NAME ) )
+ int cost = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "cost" ) )
+ asset image = GetDataTableAsset( dataTable, row, GetDataTableColumnByName( dataTable, "image" ) )
+
+ if ( IsDisabledRef( itemRef ) )
+ continue
+
+ // Why does the server need this? Client script error happens otherwise.
+ #if SERVER || CLIENT
+ asset model = GetDataTableAsset( dataTable, row, GetDataTableColumnByName( dataTable, "model" ) )
+ PrecacheModel( model )
+ #endif // SERVER || CLIENT
+
+ bool hidden = !GetDataTableBool( dataTable, row, GetDataTableColumnByName( dataTable, "selectable" ) )
+ CreateGenericItem( row, eItemTypes.BURN_METER_REWARD, itemRef, name, description, description, image, cost, hidden )
+ }
+
+ InitRandomUnlocks()
+
+ SetupFrontierDefenseItems()
+
+ InitUnlocks()
+
+ foreach ( item in file.itemData )
+ {
+ if ( item.persistenceStruct != "" )
+ file.itemsWithPersistenceStruct[ item.persistenceStruct ] <- item
+ }
+
+ // northstar hook: custom item registrations
+ foreach ( void functionref() callback in file.itemRegistrationCallbacks )
+ callback()
+
+ // Sort some items based on unlock level
+ file.globalItemRefsOfType[eItemTypes.PILOT_PRIMARY].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.PILOT_SECONDARY].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.PILOT_SPECIAL].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.PILOT_ORDNANCE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.PILOT_PASSIVE1].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.PILOT_PASSIVE2].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.PILOT_SUIT].sort( SortByUnlockLevel )
+
+ file.globalItemRefsOfType[eItemTypes.TITAN_PRIMARY].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_ORDNANCE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_SPECIAL].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_GENERAL_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_TITANFALL_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_RONIN_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_NORTHSTAR_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_ION_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_TONE_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_SCORCH_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_LEGION_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_VANGUARD_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_UPGRADE1_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_UPGRADE2_PASSIVE].sort( SortByUnlockLevel )
+ file.globalItemRefsOfType[eItemTypes.TITAN_UPGRADE3_PASSIVE].sort( SortByUnlockLevel )
+
+ #if !UI
+ // Non-player weapons
+ #if SERVER || CLIENT
+ PrecacheWeapon( "mp_weapon_yh803" )
+ PrecacheWeapon( "mp_weapon_yh803_bullet" )
+ PrecacheWeapon( "mp_weapon_yh803_bullet_overcharged" )
+ PrecacheWeapon( "mp_weapon_super_spectre" )
+ PrecacheWeapon( "mp_weapon_dronebeam" )
+ PrecacheWeapon( "mp_weapon_dronerocket" )
+ PrecacheWeapon( "mp_weapon_droneplasma" )
+ PrecacheWeapon( "mp_weapon_turretplasma" )
+ PrecacheWeapon( "mp_weapon_turretplasma_mega" )
+ PrecacheWeapon( "mp_weapon_turretlaser_mega_fort_war" )
+ PrecacheWeapon( "mp_weapon_turretlaser_mega" )
+ PrecacheWeapon( "mp_weapon_gunship_launcher" )
+ PrecacheWeapon( "mp_weapon_gunship_turret" )
+ PrecacheWeapon( "mp_weapon_gunship_missile" )
+
+ // NPC weapons
+ PrecacheWeapon( "mp_weapon_mega_turret" )
+ PrecacheWeapon( "mp_weapon_spectre_spawner" )
+
+ PrecacheWeapon( "mp_weapon_engineer_turret" )
+ PrecacheWeapon( "mp_weapon_engineer_combat_drone" )
+ #endif
+
+ #if DEV && ( SERVER || CLIENT )
+ PrecacheWeapon( "weapon_cubemap" )
+ #endif
+
+ #if CLIENT
+ PrecacheHUDMaterial( MOD_ICON_NONE )
+ #endif
+ #endif
+}
+
+void function AddCallback_OnRegisterCustomItems( void functionref() callback )
+{
+ file.itemRegistrationCallbacks.append( callback )
+}
+
+void function InitUnlocks()
+{
+ InitUnlock( "race_human_male", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "race_human_female", "", eUnlockType.PLAYER_LEVEL, 1 )
+
+ InitUnlock( "speedball", "", eUnlockType.PLAYER_LEVEL, 1 )
+
+ var dataTable = GetDataTable( $"datatable/unlocks_player_level.rpak" )
+ int numRows = GetDatatableRowCount( dataTable )
+ for ( int column = 1; column <= 13; column++ )
+ {
+ for ( int row = 0; row < numRows; row++ )
+ {
+ string unlockField = GetDataTableString( dataTable, row, column )
+ array<string> unlockArray = SplitAndStripUnlockField( unlockField )
+
+ foreach ( unlock in unlockArray )
+ {
+ if ( unlock != "" )
+ {
+ if ( unlock != "random" && !ItemDefined( unlock ) )
+ {
+ #if DEV && DEVSCRIPTS
+ CodeWarning( unlock + " does not appear to be a valid eItemType" )
+ #else
+ continue
+ #endif
+ }
+
+ InitUnlock( unlock, "", eUnlockType.PLAYER_LEVEL, row + 1 )
+ }
+ }
+ }
+ }
+
+ dataTable = GetDataTable( $"datatable/unlocks_titan_level.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ int column = 1
+ while ( true )
+ {
+ string titanRef = GetDataTableString( dataTable, 0, column )
+ if ( titanRef == "END" )
+ break
+
+ if ( IsDisabledRef( titanRef ) )
+ {
+ column++
+ continue
+ }
+
+ for ( int row = 1; row < numRows; row++ )
+ {
+ string unlockField = GetDataTableString( dataTable, row, column )
+ array<string> unlockArray = SplitAndStripUnlockField( unlockField )
+
+ foreach ( unlock in unlockArray )
+ {
+ if ( unlock != "" )
+ InitUnlock( unlock, titanRef, eUnlockType.TITAN_LEVEL, row )
+ }
+ }
+
+ column++
+ }
+
+ dataTable = GetDataTable( $"datatable/unlocks_faction_level.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ int NUM_FACTIONS = GetAllItemRefsOfType( eItemTypes.FACTION ).len()
+ for ( int column = 1; column <= NUM_FACTIONS; column++ )
+ {
+ string additionalRef = GetDataTableString( dataTable, 0, column )
+
+ for ( int row = 1; row < numRows; row++ )
+ {
+ string unlockField = GetDataTableString( dataTable, row, column )
+ array<string> unlockArray = SplitAndStripUnlockField( unlockField )
+
+ foreach ( unlock in unlockArray )
+ {
+ if ( unlock != "" )
+ {
+ string parentRef
+ var periodPos = unlock.find( "." )
+ if ( periodPos != null )
+ {
+ parentRef = unlock.slice( 0, periodPos )
+ unlock = unlock.slice( periodPos + 1 )
+ }
+
+ InitUnlock( unlock, parentRef, eUnlockType.FACTION_LEVEL, row, 0, additionalRef )
+ }
+ }
+ }
+ }
+
+ var titanLoadoutsDataTable = GetDataTable( $"datatable/default_titan_loadouts.rpak" )
+ var titanPropertiesDataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ var titansMpDataTable = GetDataTable( $"datatable/titans_mp.rpak" )
+ numRows = GetDatatableRowCount( titansMpDataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string titanRef = GetDataTableString( titansMpDataTable, i, GetDataTableColumnByName( titansMpDataTable, "titanRef" ) )
+
+ if ( IsDisabledRef( titanRef ) )
+ continue
+
+ int propertyRow = GetDataTableRowMatchingStringValue( titanPropertiesDataTable, GetDataTableColumnByName( titanPropertiesDataTable, "titanRef" ), titanRef )
+
+ string primary = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "primary" ) )
+ InitUnlock( primary, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+
+ //string melee = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "melee" ) )
+ //InitUnlock( melee, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+
+ string ordnance = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "ordnance" ) )
+ InitUnlock( ordnance, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+
+ string special = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "special" ) )
+ InitUnlock( special, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+
+ string antirodeo = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "antirodeo" ) )
+ InitUnlock( antirodeo, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+
+ string coreAbility = GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "coreAbility" ) )
+ InitUnlock( coreAbility, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+
+ InitUnlock( "mp_titanweapon_vortex_shield", titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ InitUnlock( "mp_titanweapon_rocketeer_rocketstream", titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ InitUnlock( "mp_titanweapon_shoulder_rockets", titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ InitUnlock( "mp_titanweapon_salvo_rockets", titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ InitUnlock( "mp_titanweapon_homing_rockets", titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ InitUnlock( "mp_titanweapon_xo16_shorty", titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ //
+ //{
+ // int passive1Type = GetTitanProperty_Passive1Type( titanRef )
+ // array<ItemData> items = GetAllItemsOfType( passive1Type )
+ // foreach ( item in items )
+ // {
+ // InitUnlock( item.ref, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ // }
+ //}
+ //
+ //{
+ // int passive2Type = GetTitanProperty_Passive2Type( titanRef )
+ // array<ItemData> items = GetAllItemsOfType( passive1Type )
+ // foreach ( item in items )
+ // {
+ // InitUnlock( item.ref, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ // }
+ //}
+ //{
+ // int passive3Type = GetTitanProperty_Passive3Type( titanRef )
+ // array<ItemData> items = GetAllItemsOfType( passive1Type )
+ // foreach ( item in items )
+ // {
+ // InitUnlock( item.ref, titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ // }
+ //}
+ //int loadoutRow = GetDataTableRowMatchingStringValue( titanLoadoutsDataTable, GetDataTableColumnByName( titanLoadoutsDataTable, "titanRef" ), titanRef )
+ //InitUnlock( GetDataTableString( titanLoadoutsDataTable, i, GetDataTableColumnByName( titanLoadoutsDataTable, "passive1" ) ), titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ //InitUnlock( GetDataTableString( titanLoadoutsDataTable, i, GetDataTableColumnByName( titanLoadoutsDataTable, "passive2" ) ), titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ //InitUnlock( GetDataTableString( titanLoadoutsDataTable, i, GetDataTableColumnByName( titanLoadoutsDataTable, "passive3" ) ), titanRef, eUnlockType.TITAN_LEVEL, 1 )
+ }
+
+ dataTable = GetDataTable( $"datatable/default_pilot_loadouts.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < NUM_PERSISTENT_PILOT_LOADOUTS; i++ )
+ {
+ PilotLoadoutDef loadout
+ loadout.name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "name" ) )
+ loadout.suit = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "suit" ) )
+ loadout.race = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "race" ) )
+ loadout.primary = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "primary" ) )
+ loadout.primaryAttachment = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "primaryAttachment" ) )
+ loadout.primaryMod1 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "primaryMod1" ) )
+ loadout.primaryMod2 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "primaryMod2" ) )
+ loadout.primaryMod3 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "primaryMod3" ) )
+ loadout.secondary = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "secondary" ) )
+ loadout.secondaryMod1 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "secondaryMod1" ) )
+ loadout.secondaryMod2 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "secondaryMod2" ) )
+ loadout.secondaryMod3 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "secondaryMod3" ) )
+ loadout.weapon3 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "weapon3" ) )
+ loadout.weapon3Mod1 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "weapon3Mod1" ) )
+ loadout.weapon3Mod2 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "weapon3Mod2" ) )
+ loadout.weapon3Mod3 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "weapon3Mod3" ) )
+ loadout.ordnance = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "ordnance" ) )
+ loadout.passive1 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "passive1" ) )
+ loadout.passive2 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "passive2" ) )
+
+ UpdateDerivedPilotLoadoutData( loadout )
+
+ if ( !(loadout.suit in file.unlocks) )
+ InitUnlock( loadout.suit, "", eUnlockType.PLAYER_LEVEL, 1 )
+
+ if ( !(loadout.primary in file.unlocks) )
+ {
+ InitUnlock( loadout.primary, "", eUnlockType.PLAYER_LEVEL, 1 )
+ if ( loadout.primaryAttachment != "" )
+ InitUnlock( loadout.primaryAttachment, loadout.primary, eUnlockType.WEAPON_LEVEL, 1 )
+ if ( loadout.primaryMod1 != "" )
+ InitUnlock( loadout.primaryMod1, loadout.primary, eUnlockType.WEAPON_LEVEL, 1 )
+ if ( loadout.primaryMod2 != "" )
+ InitUnlock( loadout.primaryMod2, loadout.primary, eUnlockType.WEAPON_LEVEL, 1 )
+ if ( loadout.primaryMod3 != "" )
+ InitUnlock( loadout.primaryMod3, loadout.primary, eUnlockType.WEAPON_LEVEL, 1 )
+ }
+
+ if ( !(loadout.secondary in file.unlocks) )
+ {
+ InitUnlock( loadout.secondary, "", eUnlockType.PLAYER_LEVEL, 1 )
+
+ if ( loadout.secondaryMod1 != "" )
+ InitUnlock( loadout.secondaryMod1, loadout.secondary, eUnlockType.WEAPON_LEVEL, 1 )
+ if ( loadout.secondaryMod2 != "" )
+ InitUnlock( loadout.secondaryMod2, loadout.secondary, eUnlockType.WEAPON_LEVEL, 1 )
+ if ( loadout.secondaryMod3 != "" )
+ InitUnlock( loadout.secondaryMod3, loadout.secondary, eUnlockType.WEAPON_LEVEL, 1 )
+ }
+
+ if ( !(loadout.special in file.unlocks) )
+ InitUnlock( loadout.special, "", eUnlockType.PLAYER_LEVEL, 1 )
+
+ if ( !(loadout.ordnance in file.unlocks) )
+ InitUnlock( loadout.ordnance, "", eUnlockType.PLAYER_LEVEL, 1 )
+
+ if ( !(loadout.passive1 in file.unlocks) )
+ InitUnlock( loadout.passive1, "", eUnlockType.PLAYER_LEVEL, 1 )
+
+ if ( !(loadout.passive2 in file.unlocks) )
+ InitUnlock( loadout.passive2, "", eUnlockType.PLAYER_LEVEL, 1 )
+ }
+
+ dataTable = GetDataTable( $"datatable/pilot_weapons.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "itemRef" ) )
+
+ string defaultAttachment = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "defaultAttachment" ) )
+ string defaultMod1 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "defaultMod1" ) )
+ string defaultMod2 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "defaultMod2" ) )
+ string defaultMod3 = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "defaultMod3" ) )
+
+ if ( defaultAttachment != "" )
+ InitUnlock( defaultAttachment, itemRef, eUnlockType.WEAPON_LEVEL, 1 )
+ if ( defaultMod1 != "" )
+ InitUnlock( defaultMod1, itemRef, eUnlockType.WEAPON_LEVEL, 1 )
+ if ( defaultMod2 != "" )
+ InitUnlock( defaultMod2, itemRef, eUnlockType.WEAPON_LEVEL, 1 )
+ if ( defaultMod3 != "" )
+ InitUnlock( defaultMod3, itemRef, eUnlockType.WEAPON_LEVEL, 1 )
+ }
+
+ dataTable = GetDataTable( $"datatable/unlocks_weapon_level_pilot.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ column = 1
+ while ( true )
+ {
+ string weaponRef = GetDataTableString( dataTable, 0, column )
+ if ( weaponRef == "END" )
+ break
+
+ for ( int row = 1; row < numRows; row++ )
+ {
+ string unlockField = GetDataTableString( dataTable, row, column )
+ array<string> unlockArray = SplitAndStripUnlockField( unlockField )
+
+ foreach ( unlock in unlockArray )
+ {
+ if ( unlock != "" )
+ InitUnlock( unlock, weaponRef, eUnlockType.WEAPON_LEVEL, row )
+ }
+ }
+
+ column++
+ }
+
+ dataTable = GetDataTable( $"datatable/pilot_weapon_mods.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ var weaponTable = GetDataTable( $"datatable/pilot_weapons.rpak" )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string mod = GetDataTableString( dataTable, i, PILOT_WEAPON_MOD_COLUMN )
+ string weapon = GetDataTableString( dataTable, i, PILOT_WEAPON_MOD_WEAPON_COLUMN )
+ Assert( weapon in file.unlocks, "Weapon " + weapon + " does not exist in the unlock datatables." )
+ Assert( mod in file.unlocks[ weapon ].child, "Mod " + mod + " for weapon " + weapon + " does not exist in the unlock datatables." )
+ }
+
+ int titanClassEnumCount = PersistenceGetEnumCount( "titanClasses" )
+ array<string> pilotWeaponRefs = GetAllItemRefsOfType( eItemTypes.PILOT_PRIMARY )
+ pilotWeaponRefs.extend( GetAllItemRefsOfType( eItemTypes.PILOT_SECONDARY ) )
+
+
+ //////////////////////////
+ // DEV
+ //////////////////////////
+ InitUnlock( "gc_icon_respawn_dev", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+ //////////////////////////
+ // SP
+ //////////////////////////
+ InitUnlock( "callsign_103_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_103_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_103_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+ //////////////////////////
+ // Tech Test
+ //////////////////////////
+ InitUnlock( "callsign_105_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+ //////////////////////////
+ // Email Signup
+ //////////////////////////
+ InitUnlock( "callsign_104_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_104_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_104_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+ InitUnlock( "callsign_goodboy", "", eUnlockType.PLAYER_LEVEL, 1 )
+
+
+ InitUnlock( "callsign_contest_01", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_02", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_03", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_04", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_05", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_06", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_07", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_08", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_09", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_contest_10", "", eUnlockType.PLAYER_LEVEL, 1 )
+
+ //////////////////////////
+ // Holidays
+ //////////////////////////
+ InitUnlock( "callsign_126_col", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_127_col", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_130_col", "", eUnlockType.PLAYER_LEVEL, 1 )
+ InitUnlock( "callsign_131_col", "", eUnlockType.PLAYER_LEVEL, 1 )
+ //InitUnlock( "callsign_126_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 ) //Unlocked in-game or via advocate gifts
+ //InitUnlock( "callsign_127_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 ) //Unlocked in-game or via advocate gifts
+
+ //////////////////////////
+ // Reserved for future use
+ //////////////////////////
+ InitUnlock( "callsign_65_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_14_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_14_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+ InitUnlock( "callsign_129_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_132_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_133_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_134_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_135_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_136_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_137_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_125_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_126_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_127_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_129_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_130_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_131_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_132_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_133_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_134_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_135_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_136_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_137_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_125_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_126_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_127_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_129_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_130_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_131_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_132_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_133_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_134_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_135_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_136_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_137_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_125_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_128_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_129_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_130_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_131_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_132_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_133_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_134_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_135_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_136_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_137_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_138_col_prism", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_140_col", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_140_col_fire", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_140_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+// InitUnlock( "callsign_14_col_gold", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_38_col_gold", "", eUnlockType.PLAYER_LEVEL, 2500 )
+ InitUnlock( "callsign_33_col_gold", "", eUnlockType.PLAYER_LEVEL, 5000 )
+
+ InitUnlock( "gc_icon_blank", "", eUnlockType.PLAYER_LEVEL, 451 )
+
+ InitUnlock( "callsign_regen_10_col", "", eUnlockType.PLAYER_LEVEL, 451 )
+ InitUnlock( "callsign_regen_10_col_prism", "", eUnlockType.PLAYER_LEVEL, 950 )
+ InitUnlock( "callsign_regen_20_col", "", eUnlockType.PLAYER_LEVEL, 951 )
+ InitUnlock( "callsign_regen_20_col_prism", "", eUnlockType.PLAYER_LEVEL, 1450 )
+ InitUnlock( "callsign_regen_30_col", "", eUnlockType.PLAYER_LEVEL, 1451 )
+ InitUnlock( "callsign_regen_30_col_prism", "", eUnlockType.PLAYER_LEVEL, 1950 )
+ InitUnlock( "callsign_regen_40_col", "", eUnlockType.PLAYER_LEVEL, 1951 )
+ InitUnlock( "callsign_regen_40_col_prism", "", eUnlockType.PLAYER_LEVEL, 2450 )
+ InitUnlock( "callsign_regen_50_col", "", eUnlockType.PLAYER_LEVEL, 2451 )
+ InitUnlock( "callsign_regen_50_col_prism", "", eUnlockType.PLAYER_LEVEL, 2950 )
+ InitUnlock( "callsign_regen_60_col", "", eUnlockType.PLAYER_LEVEL, 2951 )
+ InitUnlock( "callsign_regen_60_col_prism", "", eUnlockType.PLAYER_LEVEL, 3450 )
+ InitUnlock( "callsign_regen_70_col", "", eUnlockType.PLAYER_LEVEL, 3451 )
+ InitUnlock( "callsign_regen_70_col_prism", "", eUnlockType.PLAYER_LEVEL, 3950 )
+ InitUnlock( "callsign_regen_80_col", "", eUnlockType.PLAYER_LEVEL, 3951 )
+ InitUnlock( "callsign_regen_80_col_prism", "", eUnlockType.PLAYER_LEVEL, 4450 )
+ InitUnlock( "callsign_regen_90_col", "", eUnlockType.PLAYER_LEVEL, 4451 )
+ InitUnlock( "callsign_regen_90_col_prism", "", eUnlockType.PLAYER_LEVEL, 4950 )
+ InitUnlock( "callsign_regen_100_col", "", eUnlockType.PLAYER_LEVEL, 4951 )
+ InitUnlock( "callsign_regen_100_col_prism", "", eUnlockType.PLAYER_LEVEL, 5000 )
+
+
+ InitUnlock( "gc_icon_deuce", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+ for ( int i = 0; i < titanClassEnumCount; i++ )
+ {
+ string titanClass = PersistenceGetEnumItemNameForIndex( "titanClasses", i )
+
+ if ( IsDisabledRef( titanClass ) )
+ continue
+
+ if ( titanClass != "" )
+ {
+ InitUnlock( "titan_camo_skin09", titanClass, eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "camo_skin09", titanClass, eUnlockType.PERSISTENT_ITEM, 0 )
+ }
+ }
+
+ InitUnlock( "pilot_camo_skin09", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+ foreach ( weaponClassName in pilotWeaponRefs )
+ {
+ InitUnlock( "camo_skin09", weaponClassName, eUnlockType.PERSISTENT_ITEM, 0 )
+ }
+ //////////////////////////
+ // CHALLENGES
+ //////////////////////////
+// InitUnlockForStatInt( "titan_camo_skin67", "ion", 100, "misc_stats", "titanFalls" )
+
+////////////////// CALLSIGN CHALLENGES //////////////////////////////////////////////////////////////////
+
+ //Live Fire Wins
+ InitUnlockForStatInt( "callsign_142_col", "", 5, "game_stats", "mode_won", "speedball" )
+ InitUnlockForStatInt( "callsign_142_col_fire", "", 10, "game_stats", "mode_won", "speedball" )
+ InitUnlockForStatInt( "callsign_142_col_gold", "", 20, "game_stats", "mode_won", "speedball" )
+ InitUnlockForStatInt( "callsign_138_col", "", 35, "game_stats", "mode_won", "speedball" )
+ InitUnlockForStatInt( "callsign_138_col_fire", "", 50, "game_stats", "mode_won", "speedball" )
+ InitUnlockForStatInt( "callsign_138_col_gold", "", 100, "game_stats", "mode_won", "speedball" )
+ //Live Fire Played
+ InitUnlockForStatInt( "callsign_141_col", "", 2, "game_stats", "mode_played", "speedball" )
+ InitUnlockForStatInt( "callsign_141_col_fire", "", 5, "game_stats", "mode_played", "speedball" )
+ InitUnlockForStatInt( "callsign_141_col_gold", "", 15, "game_stats", "mode_played", "speedball" )
+ //Live Fire Kills
+ InitUnlockForStatInt( "gc_icon_threebullets", "", 3, "game_stats", "pvp_kills_by_mode", "speedball" )
+ InitUnlockForStatInt( "gc_icon_prowlerhead", "", 10, "game_stats", "pvp_kills_by_mode", "speedball" )
+ InitUnlockForStatInt( "gc_icon_shuriken", "", 25, "game_stats", "pvp_kills_by_mode", "speedball" )
+ InitUnlockForStatInt( "gc_icon_squid", "", 50, "game_stats", "pvp_kills_by_mode", "speedball" )
+ InitUnlockForStatInt( "gc_icon_tick", "", 100, "game_stats", "pvp_kills_by_mode", "speedball" )
+ InitUnlockForStatInt( "gc_icon_scythe", "", 250, "game_stats", "pvp_kills_by_mode", "speedball" )
+
+ InitUnlockForStatInt( "gc_icon_fd_normal", "", 10, "fd_stats", "normalWins" )
+ InitUnlockForStatInt( "gc_icon_fd_hard", "", 10, "fd_stats", "hardWins" )
+ InitUnlockForStatInt( "gc_icon_fd_master", "", 10, "fd_stats", "masterWins" )
+ InitUnlockForStatInt( "gc_icon_fd_insane", "", 10, "fd_stats", "insaneWins" )
+
+ InitUnlockForStatInt( "fd_hard", "", 5, "fd_stats", "highestTitanFDLevel" )
+ InitUnlockForStatInt( "fd_master", "", 11, "fd_stats", "highestTitanFDLevel" )
+ InitUnlockForStatInt( "fd_insane", "", 14, "fd_stats", "highestTitanFDLevel" )
+
+ //Distance
+ InitUnlockForStatFloat( "callsign_97_col", "", 40.0, "distance_stats", "total" )
+ InitUnlockForStatFloat( "callsign_97_col_fire", "", 400.0, "distance_stats", "total" )
+ InitUnlockForStatFloat( "callsign_97_col_gold", "", 4000.0, "distance_stats", "total" )
+ //Wallrun Distance
+ InitUnlockForStatFloat( "callsign_99_col", "", 5.0, "distance_stats", "asPilot" )
+ InitUnlockForStatFloat( "callsign_99_col_fire", "", 10.0, "distance_stats", "asPilot" )
+ InitUnlockForStatFloat( "callsign_99_col_gold", "", 25.0, "distance_stats", "asPilot" )
+ //Headshots
+ InitUnlockForStatInt( "callsign_04_col", "", 50, "kills_stats", "pilot_headshots_total" )
+ InitUnlockForStatInt( "callsign_04_col_fire", "", 100, "kills_stats", "pilot_headshots_total" )
+ InitUnlockForStatInt( "callsign_04_col_gold", "", 250, "kills_stats", "pilot_headshots_total" )
+ //MVP
+ InitUnlockForStatInt( "gc_icon_pro", "", 10, "game_stats", "mvp_total" )
+ //Evac
+ InitUnlockForStatInt( "gc_icon_balloon", "", 5, "misc_stats", "evacsSurvived" )
+ //First Strike
+ InitUnlockForStatInt( "gc_icon_vip", "", 5, "kills_stats", "firstStrikes" )
+ //Eject
+ InitUnlockForStatInt( "gc_icon_bat", "", 3, "kills_stats", "ejectingPilots" )
+ //Titanfall Kills
+ InitUnlockForStatInt( "gc_icon_apostrophe", "", 3, "kills_stats", "titanFallKill" )
+ //Rodeo Kills
+ InitUnlockForStatInt( "gc_icon_cowboy_hat", "", 3, "kills_stats", "rodeo_total" )
+ //First to Fall
+ InitUnlockForStatInt( "gc_icon_striketwice", "", 3, "misc_stats", "titanFallsFirst" )
+ //Titanfalls
+ InitUnlockForStatInt( "callsign_23_col", "", 15, "misc_stats", "titanFalls" )
+ InitUnlockForStatInt( "callsign_23_col_fire", "", 50, "misc_stats", "titanFalls" )
+ InitUnlockForStatInt( "callsign_23_col_gold", "", 150, "misc_stats", "titanFalls" )
+// ////////////////// PILOT CHALLENGES //////////////////
+
+ //Pilot Kills
+ InitUnlockForStatInt( "pilot_camo_skin67", "", 100, "kills_stats", "pilots" )
+ InitUnlockForStatInt( "pilot_camo_skin65", "", 500, "kills_stats", "pilots" )
+ InitUnlockForStatInt( "pilot_camo_skin66", "", 1000, "kills_stats", "pilots" )
+ InitUnlockForStatInt( "pilot_camo_skin64", "", 2500, "kills_stats", "pilots" )
+ InitUnlockForStatInt( "pilot_camo_skin63", "", 5000, "kills_stats", "pilots" )
+ //Kill Spree 3
+ InitUnlockForStatInt( "pilot_camo_skin13", "", 10, "misc_stats", "killingSprees" )
+ InitUnlockForStatInt( "pilot_camo_skin07", "", 25, "misc_stats", "killingSprees" )
+ InitUnlockForStatInt( "pilot_camo_skin87", "", 100, "misc_stats", "killingSprees" )
+ //Pilot Executions
+ InitUnlockForStatInt( "pilot_camo_skin60", "", 3, "kills_stats", "pilotExecutePilot" )
+ InitUnlockForStatInt( "pilot_camo_skin61", "", 5, "kills_stats", "pilotExecutePilot" )
+ InitUnlockForStatInt( "pilot_camo_skin62", "", 10, "kills_stats", "pilotExecutePilot" )
+ InitUnlockForStatInt( "pilot_camo_skin59", "", 25, "kills_stats", "pilotExecutePilot" )
+ InitUnlockForStatInt( "execution_telefrag", "", 50, "kills_stats", "pilotExecutePilot" )
+ InitUnlockForStatInt( "execution_stim", "", 10, "kills_stats", "pilotExecutePilotUsing_execution_telefrag" )
+ InitUnlockForStatInt( "execution_grapple", "", 75, "kills_stats", "pilotExecutePilot" )
+ InitUnlockForStatInt( "execution_pulseblade", "", 10, "weapon_kill_stats", "pilots" , "mp_weapon_grenade_sonar" )
+ InitUnlockForStatInt( "execution_random", "", 0, "kills_stats", "pilotExecutePilot" )
+ InitUnlockForStatInt( "execution_cloak", "", 10, "kills_stats", "pilotExecutePilotWhileCloaked" )
+ InitUnlockForStatInt( "execution_holopilot", "", 20, "kills_stats", "pilotKillsWithHoloPilotActive" )
+ InitUnlockForStatInt( "execution_ampedwall", "", 5, "kills_stats", "pilotKillsWithAmpedWallActive" )
+
+ //Distance
+ InitUnlockForStatFloat( "pilot_camo_skin56", "", 100.0, "distance_stats", "asPilot" )
+ InitUnlockForStatFloat( "pilot_camo_skin58", "", 250.0, "distance_stats", "asPilot" )
+ InitUnlockForStatFloat( "pilot_camo_skin55", "", 500.0, "distance_stats", "asPilot" )
+ InitUnlockForStatFloat( "pilot_camo_skin57", "", 1000.0, "distance_stats", "asPilot" )
+ InitUnlockForStatFloat( "pilot_camo_skin91", "", 2500.0, "distance_stats", "asPilot" )
+ //Wallrun Distance
+ InitUnlockForStatFloat( "pilot_camo_skin93", "", 2.0, "distance_stats", "wallrunning" )
+ InitUnlockForStatFloat( "pilot_camo_skin94", "", 20.0, "distance_stats", "wallrunning" )
+ InitUnlockForStatFloat( "pilot_camo_skin85", "", 200.0, "distance_stats", "wallrunning" )
+ //Pilot Headshot Kills
+// InitUnlockForStatInt( "pilot_camo_skin56", "", 25, "kills_stats", "pilot_headshots_total" )
+// InitUnlockForStatInt( "pilot_camo_skin57", "", 100, "kills_stats", "pilot_headshots_total" )
+// InitUnlockForStatInt( "pilot_camo_skin85", "", 250, "kills_stats", "pilot_headshots_total" )
+// //Assists
+// InitUnlockForStatInt( "pilot_camo_skin93", "", 5, "misc_stats", "killingSprees" )
+// InitUnlockForStatInt( "pilot_camo_skin94", "", 15, "misc_stats", "killingSprees" )
+// InitUnlockForStatInt( "pilot_camo_skin85", "", 30, "misc_stats", "killingSprees" )
+
+
+// ////////////////// PILOT WEAPON CHALLENGES //////////////////
+
+ //Pilot Weapon Kills
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_rspn101", 100, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_rspn101", 250, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_rspn101", 500, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_rspn101", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_rspn101", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_rspn101_og", 100, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_rspn101_og", 250, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_rspn101_og", 500, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_rspn101_og", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_rspn101_og", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_rspn101_og" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_hemlok", 100, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_hemlok", 250, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_hemlok", 500, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_hemlok", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_hemlok", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_g2", 100, "weapon_kill_stats", "pilots" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_g2", 250, "weapon_kill_stats", "pilots" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_g2", 500, "weapon_kill_stats", "pilots" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_g2", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_g2", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_g2" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_vinson", 100, "weapon_kill_stats", "pilots" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_vinson", 250, "weapon_kill_stats", "pilots" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_vinson", 500, "weapon_kill_stats", "pilots" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_vinson", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_vinson", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_vinson" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_car", 100, "weapon_kill_stats", "pilots" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_car", 250, "weapon_kill_stats", "pilots" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_car", 500, "weapon_kill_stats", "pilots" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_car", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_car", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_car" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_r97", 100, "weapon_kill_stats", "pilots" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_r97", 250, "weapon_kill_stats", "pilots" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_r97", 500, "weapon_kill_stats", "pilots" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_r97", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_r97", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_r97" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_alternator_smg", 100, "weapon_kill_stats", "pilots" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_alternator_smg", 250, "weapon_kill_stats", "pilots" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_alternator_smg", 500, "weapon_kill_stats", "pilots" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_alternator_smg", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_alternator_smg", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_alternator_smg" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_hemlok_smg", 100, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_hemlok_smg", 250, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_hemlok_smg", 500, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_hemlok_smg", 1000, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_hemlok_smg", 2500, "weapon_kill_stats", "pilots" , "mp_weapon_hemlok_smg" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_lmg", 100, "weapon_kill_stats", "pilots", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_lmg", 250, "weapon_kill_stats", "pilots", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_lmg", 500, "weapon_kill_stats", "pilots", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_lmg", 1000, "weapon_kill_stats", "pilots", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_lmg", 2500, "weapon_kill_stats", "pilots", "mp_weapon_lmg" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_lstar", 100, "weapon_kill_stats", "pilots", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_lstar", 250, "weapon_kill_stats", "pilots", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_lstar", 500, "weapon_kill_stats", "pilots", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_lstar", 1000, "weapon_kill_stats", "pilots", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_lstar", 2500, "weapon_kill_stats", "pilots", "mp_weapon_lstar" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_esaw", 100, "weapon_kill_stats", "pilots", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_esaw", 250, "weapon_kill_stats", "pilots", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_esaw", 500, "weapon_kill_stats", "pilots", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_esaw", 1000, "weapon_kill_stats", "pilots", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_esaw", 2500, "weapon_kill_stats", "pilots", "mp_weapon_esaw" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_shotgun", 100, "weapon_kill_stats", "pilots", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_shotgun", 250, "weapon_kill_stats", "pilots", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_shotgun", 500, "weapon_kill_stats", "pilots", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_shotgun", 1000, "weapon_kill_stats", "pilots", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_shotgun", 2500, "weapon_kill_stats", "pilots", "mp_weapon_shotgun" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_mastiff", 100, "weapon_kill_stats", "pilots", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_mastiff", 250, "weapon_kill_stats", "pilots", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_mastiff", 500, "weapon_kill_stats", "pilots", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_mastiff", 1000, "weapon_kill_stats", "pilots", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_mastiff", 2500, "weapon_kill_stats", "pilots", "mp_weapon_mastiff" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_doubletake", 100, "weapon_kill_stats", "pilots", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_doubletake", 250, "weapon_kill_stats", "pilots", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_doubletake", 500, "weapon_kill_stats", "pilots", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_doubletake", 1000, "weapon_kill_stats", "pilots", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_doubletake", 2500, "weapon_kill_stats", "pilots", "mp_weapon_doubletake" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_sniper", 100, "weapon_kill_stats", "pilots", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_sniper", 250, "weapon_kill_stats", "pilots", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_sniper", 500, "weapon_kill_stats", "pilots", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_sniper", 1000, "weapon_kill_stats", "pilots", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_sniper", 2500, "weapon_kill_stats", "pilots", "mp_weapon_sniper" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_dmr", 100, "weapon_kill_stats", "pilots", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_dmr", 250, "weapon_kill_stats", "pilots", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_dmr", 500, "weapon_kill_stats", "pilots", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_dmr", 1000, "weapon_kill_stats", "pilots", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_dmr", 2500, "weapon_kill_stats", "pilots", "mp_weapon_dmr" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_epg", 100, "weapon_kill_stats", "pilots", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_epg", 250, "weapon_kill_stats", "pilots", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_epg", 500, "weapon_kill_stats", "pilots", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_epg", 1000, "weapon_kill_stats", "pilots", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_epg", 2500, "weapon_kill_stats", "pilots", "mp_weapon_epg" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_softball", 100, "weapon_kill_stats", "pilots", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_softball", 250, "weapon_kill_stats", "pilots", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_softball", 500, "weapon_kill_stats", "pilots", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_softball", 1000, "weapon_kill_stats", "pilots", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_softball", 2500, "weapon_kill_stats", "pilots", "mp_weapon_softball" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_smr", 100, "weapon_kill_stats", "pilots", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_smr", 250, "weapon_kill_stats", "pilots", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_smr", 500, "weapon_kill_stats", "pilots", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_smr", 1000, "weapon_kill_stats", "pilots", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_smr", 2500, "weapon_kill_stats", "pilots", "mp_weapon_smr" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_pulse_lmg", 100, "weapon_kill_stats", "pilots", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_pulse_lmg", 250, "weapon_kill_stats", "pilots", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_pulse_lmg", 500, "weapon_kill_stats", "pilots", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_pulse_lmg", 1000, "weapon_kill_stats", "pilots", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_pulse_lmg", 2500, "weapon_kill_stats", "pilots", "mp_weapon_pulse_lmg" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_autopistol", 100, "weapon_kill_stats", "pilots", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_autopistol", 250, "weapon_kill_stats", "pilots", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_autopistol", 500, "weapon_kill_stats", "pilots", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_autopistol", 1000, "weapon_kill_stats", "pilots", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_autopistol", 2500, "weapon_kill_stats", "pilots", "mp_weapon_autopistol" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_semipistol", 100, "weapon_kill_stats", "pilots", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_semipistol", 250, "weapon_kill_stats", "pilots", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_semipistol", 500, "weapon_kill_stats", "pilots", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_semipistol", 1000, "weapon_kill_stats", "pilots", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_semipistol", 2500, "weapon_kill_stats", "pilots", "mp_weapon_semipistol" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_shotgun_pistol", 100, "weapon_kill_stats", "pilots", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_shotgun_pistol", 250, "weapon_kill_stats", "pilots", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_shotgun_pistol", 500, "weapon_kill_stats", "pilots", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_shotgun_pistol", 1000, "weapon_kill_stats", "pilots", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_shotgun_pistol", 2500, "weapon_kill_stats", "pilots", "mp_weapon_shotgun_pistol" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_wingman", 100, "weapon_kill_stats", "pilots", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_wingman", 250, "weapon_kill_stats", "pilots", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_wingman", 500, "weapon_kill_stats", "pilots", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_wingman", 1000, "weapon_kill_stats", "pilots", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_wingman", 2500, "weapon_kill_stats", "pilots", "mp_weapon_wingman" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_wingman_n", 100, "weapon_kill_stats", "pilots", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_wingman_n", 250, "weapon_kill_stats", "pilots", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_wingman_n", 500, "weapon_kill_stats", "pilots", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_wingman_n", 1000, "weapon_kill_stats", "pilots", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_wingman_n", 2500, "weapon_kill_stats", "pilots", "mp_weapon_wingman_n" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_defender", 2, "weapon_kill_stats", "titansTotal", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_defender", 20, "weapon_kill_stats", "titansTotal", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_defender", 100, "weapon_kill_stats", "titansTotal", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_defender", 200, "weapon_kill_stats", "titansTotal", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_defender", 500, "weapon_kill_stats", "titansTotal", "mp_weapon_defender" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_mgl", 2, "weapon_kill_stats", "titansTotal", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_mgl", 20, "weapon_kill_stats", "titansTotal", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_mgl", 100,"weapon_kill_stats", "titansTotal", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_mgl", 200, "weapon_kill_stats", "titansTotal", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_mgl", 500, "weapon_kill_stats", "titansTotal", "mp_weapon_mgl" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_arc_launcher", 2, "weapon_kill_stats", "titansTotal", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_arc_launcher", 20, "weapon_kill_stats", "titansTotal", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_arc_launcher", 100,"weapon_kill_stats", "titansTotal", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_arc_launcher", 200, "weapon_kill_stats", "titansTotal", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_arc_launcher", 500, "weapon_kill_stats", "titansTotal", "mp_weapon_arc_launcher" )
+
+ InitUnlockForStatInt( "camo_skin67", "mp_weapon_rocket_launcher", 2, "weapon_kill_stats", "titansTotal", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin65", "mp_weapon_rocket_launcher", 20, "weapon_kill_stats", "titansTotal", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin66", "mp_weapon_rocket_launcher", 100,"weapon_kill_stats", "titansTotal", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin64", "mp_weapon_rocket_launcher", 200, "weapon_kill_stats", "titansTotal", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin63", "mp_weapon_rocket_launcher", 500, "weapon_kill_stats", "titansTotal", "mp_weapon_rocket_launcher" )
+ //Pilot Weapon Assists
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_rspn101", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_rspn101", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_rspn101", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_rspn101", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_rspn101", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_rspn101_og", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_rspn101_og", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_rspn101_og", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_rspn101_og", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_rspn101_og", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_rspn101_og" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_hemlok", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_hemlok", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_hemlok", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_hemlok", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_hemlok", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_g2", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_g2", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_g2", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_g2", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_g2", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_g2" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_vinson", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_vinson", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_vinson", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_vinson", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_vinson", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_vinson" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_car", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_car", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_car", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_car", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_car", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_car" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_r97", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_r97", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_r97", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_r97", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_r97", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_r97" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_alternator_smg", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_alternator_smg", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_alternator_smg", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_alternator_smg", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_alternator_smg", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_alternator_smg" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_hemlok_smg", 10, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_hemlok_smg", 100, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_hemlok_smg", 500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_hemlok_smg", 1000, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_hemlok_smg", 2500, "weapon_kill_stats", "assistsTotal" , "mp_weapon_hemlok_smg" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_lmg", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_lmg", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_lmg", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_lmg", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_lmg", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_lmg" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_lstar", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_lstar", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_lstar", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_lstar", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_lstar", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_lstar" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_esaw", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_esaw", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_esaw", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_esaw", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_esaw", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_esaw" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_shotgun", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_shotgun", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_shotgun", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_shotgun", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_shotgun", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_mastiff", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_mastiff", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_mastiff", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_mastiff", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_mastiff", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_mastiff" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_doubletake", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_doubletake", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_doubletake", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_doubletake", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_doubletake", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_doubletake" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_sniper", 10, "weapon_stats", "shotsHit", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_sniper", 100, "weapon_stats", "shotsHit", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_sniper", 500, "weapon_stats", "shotsHit", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_sniper", 1000, "weapon_stats", "shotsHit", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_sniper", 2500, "weapon_stats", "shotsHit", "mp_weapon_sniper" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_dmr", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_dmr", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_dmr", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_dmr", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_dmr", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_dmr" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_epg", 5, "weapon_kill_stats", "assistsTotal", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_epg", 50, "weapon_kill_stats", "assistsTotal", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_epg", 250, "weapon_kill_stats", "assistsTotal", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_epg", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_epg", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_epg" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_softball", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_softball", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_softball", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_softball", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_softball", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_softball" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_smr", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_smr", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_smr", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_smr", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_smr", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_smr" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_pulse_lmg", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_pulse_lmg", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_pulse_lmg", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_pulse_lmg", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_pulse_lmg", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_pulse_lmg" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_autopistol", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_autopistol", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_autopistol", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_autopistol", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_autopistol", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_autopistol" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_semipistol", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_semipistol", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_semipistol", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_semipistol", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_semipistol", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_semipistol" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_shotgun_pistol", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_shotgun_pistol", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_shotgun_pistol", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_shotgun_pistol", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_shotgun_pistol", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_shotgun_pistol" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_wingman", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_wingman", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_wingman", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_wingman", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_wingman", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_wingman_n", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_wingman_n", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_wingman_n", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_wingman_n", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_wingman_n", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_wingman_n" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_defender", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_defender", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_defender", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_defender", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_defender", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_defender" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_mgl", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_mgl", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_mgl", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_mgl", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_mgl", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_mgl" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_arc_launcher", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_arc_launcher", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_arc_launcher", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_arc_launcher", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_arc_launcher", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_arc_launcher" )
+
+ InitUnlockForStatInt( "camo_skin56", "mp_weapon_rocket_launcher", 10, "weapon_kill_stats", "assistsTotal", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin58", "mp_weapon_rocket_launcher", 100, "weapon_kill_stats", "assistsTotal", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin55", "mp_weapon_rocket_launcher", 500, "weapon_kill_stats", "assistsTotal", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin57", "mp_weapon_rocket_launcher", 1000, "weapon_kill_stats", "assistsTotal", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin91", "mp_weapon_rocket_launcher", 2500, "weapon_kill_stats", "assistsTotal", "mp_weapon_rocket_launcher" )
+ //Pilot Weapon SPREE
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_rspn101", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_rspn101", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_rspn101", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_rspn101", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_rspn101", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_rspn101_og", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_rspn101_og", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_rspn101_og", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_rspn101_og", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_rspn101_og", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_rspn101_og" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_hemlok", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_hemlok", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_hemlok", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_hemlok", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_hemlok", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_g2", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_g2", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_g2", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_g2", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_g2", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_g2" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_vinson", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_vinson", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_vinson", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_vinson", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_vinson", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_vinson" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_car", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_car", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_car", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_car", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_car", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_car" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_r97", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_r97", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_r97", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_r97", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_r97", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_r97" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_alternator_smg", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_alternator_smg", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_alternator_smg", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_alternator_smg", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_alternator_smg", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_alternator_smg" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_hemlok_smg", 2, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_hemlok_smg", 5, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_hemlok_smg", 10, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_hemlok_smg", 25, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_hemlok_smg", 50, "weapon_kill_stats", "killingSprees" , "mp_weapon_hemlok_smg" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_lmg", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_lmg", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_lmg", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_lmg", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_lmg", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_lmg" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_lstar", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_lstar", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_lstar", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_lstar", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_lstar", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_lstar" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_esaw", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_esaw", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_esaw", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_esaw", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_esaw", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_esaw" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_shotgun", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_shotgun", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_shotgun", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_shotgun", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_shotgun", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_mastiff", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_mastiff", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_mastiff", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_mastiff", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_mastiff", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_mastiff" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_doubletake", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_doubletake", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_doubletake", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_doubletake", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_doubletake", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_doubletake" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_sniper", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_sniper", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_sniper", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_sniper", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_sniper", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_sniper" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_dmr", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_dmr", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_dmr", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_dmr", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_dmr", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_dmr" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_epg", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_epg", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_epg", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_epg", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_epg", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_epg" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_softball", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_softball", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_softball", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_softball", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_softball", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_softball" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_smr", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_smr", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_smr", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_smr", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_smr", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_smr" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_pulse_lmg", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_pulse_lmg", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_pulse_lmg", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_pulse_lmg", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_pulse_lmg", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_pulse_lmg" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_autopistol", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_autopistol", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_autopistol", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_autopistol", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_autopistol", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_autopistol" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_semipistol", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_semipistol", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_semipistol", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_semipistol", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_semipistol", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_semipistol" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_shotgun_pistol", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_shotgun_pistol", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_shotgun_pistol", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_shotgun_pistol", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_shotgun_pistol", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_shotgun_pistol" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_wingman", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_wingman", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_wingman", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_wingman", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_wingman", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_wingman_n", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_wingman_n", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_wingman_n", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_wingman_n", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_wingman_n", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_wingman_n" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_defender", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_defender", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_defender", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_defender", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_defender", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_defender" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_mgl", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_mgl", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_mgl", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_mgl", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_mgl", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_mgl" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_arc_launcher", 2, "weapon_kill_stats", "killingSprees", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_arc_launcher", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_arc_launcher", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_arc_launcher", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_arc_launcher", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_arc_launcher" )
+
+ InitUnlockForStatInt( "camo_skin93", "mp_weapon_rocket_launcher", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin94", "mp_weapon_rocket_launcher", 5, "weapon_kill_stats", "killingSprees", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin13", "mp_weapon_rocket_launcher", 10, "weapon_kill_stats", "killingSprees", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin07", "mp_weapon_rocket_launcher", 25, "weapon_kill_stats", "killingSprees", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin85", "mp_weapon_rocket_launcher", 50, "weapon_kill_stats", "killingSprees", "mp_weapon_rocket_launcher" )
+ //Pilot Weapon Headshot
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_rspn101", 10, "weapon_stats", "headshots", "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_rspn101", 25, "weapon_stats", "headshots", "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_rspn101", 50, "weapon_stats", "headshots", "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_rspn101", 100, "weapon_stats", "headshots", "mp_weapon_rspn101" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_rspn101", 250, "weapon_stats", "headshots", "mp_weapon_rspn101" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_rspn101_og", 10, "weapon_stats", "headshots", "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_rspn101_og", 25, "weapon_stats", "headshots", "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_rspn101_og", 50, "weapon_stats", "headshots", "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_rspn101_og", 100, "weapon_stats", "headshots", "mp_weapon_rspn101_og" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_rspn101_og", 250, "weapon_stats", "headshots", "mp_weapon_rspn101_og" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_hemlok", 10, "weapon_stats", "headshots", "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_hemlok", 25, "weapon_stats", "headshots", "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_hemlok", 50, "weapon_stats", "headshots", "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_hemlok", 100, "weapon_stats", "headshots", "mp_weapon_hemlok" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_hemlok", 250, "weapon_stats", "headshots", "mp_weapon_hemlok" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_g2", 10, "weapon_stats", "headshots", "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_g2", 25, "weapon_stats", "headshots", "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_g2", 50, "weapon_stats", "headshots", "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_g2", 100, "weapon_stats", "headshots", "mp_weapon_g2" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_g2", 250, "weapon_stats", "headshots", "mp_weapon_g2" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_vinson", 10, "weapon_stats", "headshots", "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_vinson", 25, "weapon_stats", "headshots", "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_vinson", 50, "weapon_stats", "headshots", "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_vinson", 100, "weapon_stats", "headshots", "mp_weapon_vinson" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_vinson", 250, "weapon_stats", "headshots", "mp_weapon_vinson" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_car", 10, "weapon_stats", "headshots", "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_car", 25, "weapon_stats", "headshots", "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_car", 50, "weapon_stats", "headshots", "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_car", 100, "weapon_stats", "headshots", "mp_weapon_car" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_car", 250, "weapon_stats", "headshots", "mp_weapon_car" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_r97", 10, "weapon_stats", "headshots", "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_r97", 25, "weapon_stats", "headshots", "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_r97", 50, "weapon_stats", "headshots", "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_r97", 100, "weapon_stats", "headshots", "mp_weapon_r97" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_r97", 250, "weapon_stats", "headshots", "mp_weapon_r97" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_alternator_smg", 10, "weapon_stats", "headshots", "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_alternator_smg", 25, "weapon_stats", "headshots", "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_alternator_smg", 50, "weapon_stats", "headshots", "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_alternator_smg", 100, "weapon_stats", "headshots", "mp_weapon_alternator_smg" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_alternator_smg", 250, "weapon_stats", "headshots", "mp_weapon_alternator_smg" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_hemlok_smg", 10, "weapon_stats", "headshots", "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_hemlok_smg", 25, "weapon_stats", "headshots", "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_hemlok_smg", 50, "weapon_stats", "headshots", "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_hemlok_smg", 100, "weapon_stats", "headshots", "mp_weapon_hemlok_smg" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_hemlok_smg", 250, "weapon_stats", "headshots", "mp_weapon_hemlok_smg" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_lmg", 10, "weapon_stats", "headshots", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_lmg", 25, "weapon_stats", "headshots", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_lmg", 50, "weapon_stats", "headshots", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_lmg", 100, "weapon_stats", "headshots", "mp_weapon_lmg" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_lmg", 250, "weapon_stats", "headshots", "mp_weapon_lmg" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_lstar", 10, "weapon_stats", "headshots", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_lstar", 25, "weapon_stats", "headshots", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_lstar", 50, "weapon_stats", "headshots", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_lstar", 100, "weapon_stats", "headshots", "mp_weapon_lstar" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_lstar", 250, "weapon_stats", "headshots", "mp_weapon_lstar" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_esaw", 10, "weapon_stats", "headshots", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_esaw", 25, "weapon_stats", "headshots", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_esaw", 50, "weapon_stats", "headshots", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_esaw", 100, "weapon_stats", "headshots", "mp_weapon_esaw" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_esaw", 250, "weapon_stats", "headshots", "mp_weapon_esaw" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_shotgun", 10, "weapon_stats", "headshots", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_shotgun", 25, "weapon_stats", "headshots", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_shotgun", 50, "weapon_stats", "headshots", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_shotgun", 100, "weapon_stats", "headshots", "mp_weapon_shotgun" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_shotgun", 250, "weapon_stats", "headshots", "mp_weapon_shotgun" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_mastiff", 10, "weapon_stats", "headshots", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_mastiff", 25, "weapon_stats", "headshots", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_mastiff", 50, "weapon_stats", "headshots", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_mastiff", 100, "weapon_stats", "headshots", "mp_weapon_mastiff" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_mastiff", 250, "weapon_stats", "headshots", "mp_weapon_mastiff" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_sniper", 10, "weapon_stats", "headshots", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_sniper", 25, "weapon_stats", "headshots", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_sniper", 50, "weapon_stats", "headshots", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_sniper", 100, "weapon_stats", "headshots", "mp_weapon_sniper" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_sniper", 250, "weapon_stats", "headshots", "mp_weapon_sniper" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_doubletake", 10, "weapon_stats", "headshots", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_doubletake", 25, "weapon_stats", "headshots", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_doubletake", 50, "weapon_stats", "headshots", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_doubletake", 100, "weapon_stats", "headshots", "mp_weapon_doubletake" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_doubletake", 250, "weapon_stats", "headshots", "mp_weapon_doubletake" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_dmr", 10, "weapon_stats", "headshots", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_dmr", 25, "weapon_stats", "headshots", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_dmr", 50, "weapon_stats", "headshots", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_dmr", 100, "weapon_stats", "headshots", "mp_weapon_dmr" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_dmr", 250, "weapon_stats", "headshots", "mp_weapon_dmr" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_autopistol", 5, "weapon_stats", "headshots", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_autopistol", 10, "weapon_stats", "headshots", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_autopistol", 25, "weapon_stats", "headshots", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_autopistol", 50, "weapon_stats", "headshots", "mp_weapon_autopistol" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_autopistol", 100, "weapon_stats", "headshots", "mp_weapon_autopistol" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_semipistol", 5, "weapon_stats", "headshots", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_semipistol", 10, "weapon_stats", "headshots", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_semipistol", 25, "weapon_stats", "headshots", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_semipistol", 50, "weapon_stats", "headshots", "mp_weapon_semipistol" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_semipistol", 100, "weapon_stats", "headshots", "mp_weapon_semipistol" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_shotgun_pistol", 5, "weapon_stats", "headshots", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_shotgun_pistol", 10, "weapon_stats", "headshots", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_shotgun_pistol", 25, "weapon_stats", "headshots", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_shotgun_pistol", 50, "weapon_stats", "headshots", "mp_weapon_shotgun_pistol" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_shotgun_pistol", 100, "weapon_stats", "headshots", "mp_weapon_shotgun_pistol" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_wingman", 5, "weapon_stats", "headshots", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_wingman", 10, "weapon_stats", "headshots", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_wingman", 25, "weapon_stats", "headshots", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_wingman", 50, "weapon_stats", "headshots", "mp_weapon_wingman" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_wingman", 100, "weapon_stats", "headshots", "mp_weapon_wingman" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_wingman_n", 5, "weapon_stats", "headshots", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_wingman_n", 10, "weapon_stats", "headshots", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_wingman_n", 25, "weapon_stats", "headshots", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_wingman_n", 50, "weapon_stats", "headshots", "mp_weapon_wingman_n" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_wingman_n", 100, "weapon_stats", "headshots", "mp_weapon_wingman_n" )
+
+ //Shots hit for Grenadier and AT rather than headshots
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_epg", 25, "weapon_stats", "shotsHit", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_epg", 100, "weapon_stats", "shotsHit", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_epg", 250, "weapon_stats", "shotsHit", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_epg", 500, "weapon_stats", "shotsHit", "mp_weapon_epg" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_epg", 1000, "weapon_stats", "shotsHit", "mp_weapon_epg" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_softball", 20, "weapon_stats", "shotsHit", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_softball", 50, "weapon_stats", "shotsHit", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_softball", 100, "weapon_stats", "shotsHit", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_softball", 250, "weapon_stats", "shotsHit", "mp_weapon_softball" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_softball", 500, "weapon_stats", "shotsHit", "mp_weapon_softball" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_smr", 50, "weapon_stats", "shotsHit", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_smr", 250, "weapon_stats", "shotsHit", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_smr", 500, "weapon_stats", "shotsHit", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_smr", 1000, "weapon_stats", "shotsHit", "mp_weapon_smr" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_smr", 2500, "weapon_stats", "shotsHit", "mp_weapon_smr" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_pulse_lmg", 100, "weapon_stats", "shotsHit", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_pulse_lmg", 500, "weapon_stats", "shotsHit", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_pulse_lmg", 1000, "weapon_stats", "shotsHit", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_pulse_lmg", 2500, "weapon_stats", "shotsHit", "mp_weapon_pulse_lmg" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_pulse_lmg", 5000, "weapon_stats", "shotsHit", "mp_weapon_pulse_lmg" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_defender", 20, "weapon_stats", "shotsHit", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_defender", 50, "weapon_stats", "shotsHit", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_defender", 100, "weapon_stats", "shotsHit", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_defender", 250, "weapon_stats", "shotsHit", "mp_weapon_defender" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_defender", 500, "weapon_stats", "shotsHit", "mp_weapon_defender" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_mgl", 50, "weapon_stats", "shotsHit", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_mgl", 250, "weapon_stats", "shotsHit", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_mgl", 500, "weapon_stats", "shotsHit", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_mgl", 1000, "weapon_stats", "shotsHit", "mp_weapon_mgl" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_mgl", 2500, "weapon_stats", "shotsHit", "mp_weapon_mgl" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_arc_launcher", 20, "weapon_stats", "shotsHit", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_arc_launcher", 50, "weapon_stats", "shotsHit", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_arc_launcher", 100, "weapon_stats", "shotsHit", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_arc_launcher", 250, "weapon_stats", "shotsHit", "mp_weapon_arc_launcher" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_arc_launcher", 500, "weapon_stats", "shotsHit", "mp_weapon_arc_launcher" )
+
+ InitUnlockForStatInt( "camo_skin60", "mp_weapon_rocket_launcher", 10, "weapon_stats", "shotsHit", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin61", "mp_weapon_rocket_launcher", 25, "weapon_stats", "shotsHit", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin62", "mp_weapon_rocket_launcher", 50, "weapon_stats", "shotsHit", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin59", "mp_weapon_rocket_launcher", 100, "weapon_stats", "shotsHit", "mp_weapon_rocket_launcher" )
+ InitUnlockForStatInt( "camo_skin87", "mp_weapon_rocket_launcher", 250, "weapon_stats", "shotsHit", "mp_weapon_rocket_launcher" )
+
+// ////////////////// Titan CHALLENGES //////////////////
+
+ //Titan killing Titans
+ InitUnlockForStatInt( "titan_camo_skin67", "ion", 10, "titan_stats", "titansTotal", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin65", "ion", 50, "titan_stats", "titansTotal", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin66", "ion", 100, "titan_stats", "titansTotal", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin64", "ion", 250, "titan_stats", "titansTotal", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin63", "ion", 500, "titan_stats", "titansTotal", "ion" )
+
+ InitUnlockForStatInt( "titan_camo_skin67", "scorch", 10, "titan_stats", "titansTotal", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin65", "scorch", 50, "titan_stats", "titansTotal", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin66", "scorch", 100, "titan_stats", "titansTotal", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin64", "scorch", 250, "titan_stats", "titansTotal", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin63", "scorch", 500, "titan_stats", "titansTotal", "scorch" )
+
+ InitUnlockForStatInt( "titan_camo_skin67", "vanguard", 10, "titan_stats", "titansTotal", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin65", "vanguard", 50, "titan_stats", "titansTotal", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin66", "vanguard", 100, "titan_stats", "titansTotal", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin64", "vanguard", 250, "titan_stats", "titansTotal", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin63", "vanguard", 500, "titan_stats", "titansTotal", "vanguard" )
+
+ InitUnlockForStatInt( "titan_camo_skin67", "northstar", 10, "titan_stats", "titansTotal", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin65", "northstar", 50, "titan_stats", "titansTotal", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin66", "northstar", 100, "titan_stats", "titansTotal", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin64", "northstar", 250, "titan_stats", "titansTotal", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin63", "northstar", 500, "titan_stats", "titansTotal", "northstar" )
+
+ InitUnlockForStatInt( "titan_camo_skin67", "ronin", 10, "titan_stats", "titansTotal", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin65", "ronin", 50, "titan_stats", "titansTotal", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin66", "ronin", 100, "titan_stats", "titansTotal", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin64", "ronin", 250, "titan_stats", "titansTotal", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin63", "ronin", 500, "titan_stats", "titansTotal", "ronin" )
+
+ InitUnlockForStatInt( "titan_camo_skin67", "tone", 10, "titan_stats", "titansTotal", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin65", "tone", 50, "titan_stats", "titansTotal", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin66", "tone", 100, "titan_stats", "titansTotal", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin64", "tone", 250, "titan_stats", "titansTotal", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin63", "tone", 500, "titan_stats", "titansTotal", "tone" )
+
+ InitUnlockForStatInt( "titan_camo_skin67", "legion", 10, "titan_stats", "titansTotal", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin65", "legion", 50, "titan_stats", "titansTotal", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin66", "legion", 100, "titan_stats", "titansTotal", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin64", "legion", 250, "titan_stats", "titansTotal", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin63", "legion", 500, "titan_stats", "titansTotal", "legion" )
+
+ //Titan killing Pilots
+ InitUnlockForStatInt( "titan_camo_skin60", "ion", 20, "titan_stats", "pilots", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin61", "ion", 100, "titan_stats", "pilots", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin62", "ion", 200, "titan_stats", "pilots", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin59", "ion", 500, "titan_stats", "pilots", "ion" )
+
+ InitUnlockForStatInt( "titan_camo_skin60", "scorch", 20, "titan_stats", "pilots", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin61", "scorch", 100,"titan_stats", "pilots", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin62", "scorch", 200, "titan_stats", "pilots", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin59", "scorch", 500, "titan_stats", "pilots", "scorch" )
+
+ InitUnlockForStatInt( "titan_camo_skin60", "vanguard", 20, "titan_stats", "pilots", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin61", "vanguard", 100,"titan_stats", "pilots", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin62", "vanguard", 200, "titan_stats", "pilots", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin59", "vanguard", 500, "titan_stats", "pilots", "vanguard" )
+
+ InitUnlockForStatInt( "titan_camo_skin60", "northstar", 20, "titan_stats", "pilots", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin61", "northstar", 100,"titan_stats", "pilots", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin62", "northstar", 200, "titan_stats", "pilots", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin59", "northstar", 500, "titan_stats", "pilots", "northstar" )
+
+ InitUnlockForStatInt( "titan_camo_skin60", "ronin", 20, "titan_stats", "pilots", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin61", "ronin", 100,"titan_stats", "pilots", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin62", "ronin", 200, "titan_stats", "pilots", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin59", "ronin", 500, "titan_stats", "pilots", "ronin" )
+
+ InitUnlockForStatInt( "titan_camo_skin60", "tone", 20, "titan_stats", "pilots", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin61", "tone", 100,"titan_stats", "pilots", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin62", "tone", 200, "titan_stats", "pilots", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin59", "tone", 500, "titan_stats", "pilots", "tone" )
+
+ InitUnlockForStatInt( "titan_camo_skin60", "legion", 20, "titan_stats", "pilots", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin61", "legion", 100,"titan_stats", "pilots", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin62", "legion", 200, "titan_stats", "pilots", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin59", "legion", 500, "titan_stats", "pilots", "legion" )
+ //TITAN DMG
+ InitUnlockForStatInt( "titan_camo_skin56", "ion", 300000, "titan_stats", "titanDamage", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin58", "ion", 600000, "titan_stats", "titanDamage", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin55", "ion", 1500000, "titan_stats", "titanDamage", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin57", "ion", 3000000, "titan_stats", "titanDamage", "ion" )
+ InitUnlockForStatInt( "titan_camo_skin91", "ion", 5000000, "titan_stats", "titanDamage", "ion" )
+
+ InitUnlockForStatInt( "titan_camo_skin56", "scorch", 300000, "titan_stats", "titanDamage", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin58", "scorch", 600000, "titan_stats", "titanDamage", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin55", "scorch", 1500000, "titan_stats", "titanDamage", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin57", "scorch", 3000000, "titan_stats", "titanDamage", "scorch" )
+ InitUnlockForStatInt( "titan_camo_skin91", "scorch", 5000000, "titan_stats", "titanDamage", "scorch" )
+
+ InitUnlockForStatInt( "titan_camo_skin56", "vanguard", 300000, "titan_stats", "titanDamage", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin58", "vanguard", 600000, "titan_stats", "titanDamage", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin55", "vanguard", 1500000, "titan_stats", "titanDamage", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin57", "vanguard", 3000000, "titan_stats", "titanDamage", "vanguard" )
+ InitUnlockForStatInt( "titan_camo_skin91", "vanguard", 5000000, "titan_stats", "titanDamage", "vanguard" )
+
+ InitUnlockForStatInt( "titan_camo_skin56", "northstar", 300000, "titan_stats", "titanDamage", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin58", "northstar", 600000, "titan_stats", "titanDamage", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin55", "northstar", 1500000, "titan_stats", "titanDamage", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin57", "northstar", 3000000, "titan_stats", "titanDamage", "northstar" )
+ InitUnlockForStatInt( "titan_camo_skin91", "northstar", 5000000, "titan_stats", "titanDamage", "northstar" )
+
+ InitUnlockForStatInt( "titan_camo_skin56", "ronin", 300000, "titan_stats", "titanDamage", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin58", "ronin", 600000, "titan_stats", "titanDamage", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin55", "ronin", 1500000, "titan_stats", "titanDamage", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin57", "ronin", 3000000, "titan_stats", "titanDamage", "ronin" )
+ InitUnlockForStatInt( "titan_camo_skin91", "ronin", 5000000, "titan_stats", "titanDamage", "ronin" )
+
+ InitUnlockForStatInt( "titan_camo_skin56", "tone", 300000, "titan_stats", "titanDamage", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin58", "tone", 600000, "titan_stats", "titanDamage", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin55", "tone", 1500000, "titan_stats", "titanDamage", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin57", "tone", 3000000, "titan_stats", "titanDamage", "tone" )
+ InitUnlockForStatInt( "titan_camo_skin91", "tone", 5000000, "titan_stats", "titanDamage", "tone" )
+
+ InitUnlockForStatInt( "titan_camo_skin56", "legion", 600000, "titan_stats", "titanDamage", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin58", "legion", 1500000,"titan_stats", "titanDamage", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin55", "legion", 3000000, "titan_stats", "titanDamage", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin57", "legion", 5000000, "titan_stats", "titanDamage", "legion" )
+ InitUnlockForStatInt( "titan_camo_skin91", "legion", 7500000, "titan_stats", "titanDamage", "legion" )
+ //Titan DISTANCE
+ InitUnlockForStatFloat( "titan_camo_skin13", "ion", 15, "distance_stats", "asTitan_ion" )
+ InitUnlockForStatFloat( "titan_camo_skin07", "ion", 50, "distance_stats", "asTitan_ion" )
+ InitUnlockForStatFloat( "titan_camo_skin87", "ion", 150, "distance_stats", "asTitan_ion" )
+
+ InitUnlockForStatFloat( "titan_camo_skin13", "scorch", 15, "distance_stats", "asTitan_scorch" )
+ InitUnlockForStatFloat( "titan_camo_skin07", "scorch", 50, "distance_stats", "asTitan_scorch" )
+ InitUnlockForStatFloat( "titan_camo_skin87", "scorch", 150, "distance_stats", "asTitan_scorch" )
+
+ InitUnlockForStatFloat( "titan_camo_skin13", "vanguard", 15, "distance_stats", "asTitan_vanguard" )
+ InitUnlockForStatFloat( "titan_camo_skin07", "vanguard", 50, "distance_stats", "asTitan_vanguard" )
+ InitUnlockForStatFloat( "titan_camo_skin87", "vanguard", 150, "distance_stats", "asTitan_vanguard" )
+
+ InitUnlockForStatFloat( "titan_camo_skin13", "northstar", 15, "distance_stats", "asTitan_northstar" )
+ InitUnlockForStatFloat( "titan_camo_skin07", "northstar", 50, "distance_stats", "asTitan_northstar" )
+ InitUnlockForStatFloat( "titan_camo_skin87", "northstar", 150, "distance_stats", "asTitan_northstar" )
+
+ InitUnlockForStatFloat( "titan_camo_skin13", "ronin", 15, "distance_stats", "asTitan_ronin" )
+ InitUnlockForStatFloat( "titan_camo_skin07", "ronin", 50, "distance_stats", "asTitan_ronin" )
+ InitUnlockForStatFloat( "titan_camo_skin87", "ronin", 150, "distance_stats", "asTitan_ronin" )
+
+ InitUnlockForStatFloat( "titan_camo_skin13", "tone", 15, "distance_stats", "asTitan_tone" )
+ InitUnlockForStatFloat( "titan_camo_skin07", "tone", 50, "distance_stats", "asTitan_tone" )
+ InitUnlockForStatFloat( "titan_camo_skin87", "tone", 150, "distance_stats", "asTitan_tone" )
+
+ InitUnlockForStatFloat( "titan_camo_skin13", "legion", 15, "distance_stats", "asTitan_legion" )
+ InitUnlockForStatFloat( "titan_camo_skin07", "legion", 50, "distance_stats", "asTitan_legion" )
+ InitUnlockForStatFloat( "titan_camo_skin87", "legion", 150, "distance_stats", "asTitan_legion" )
+
+ //Titan Executions
+ InitUnlockForStatInt( "titan_camo_skin93", "ion", 3, "kills_stats", "titanExocutionIon" )
+ InitUnlockForStatInt( "titan_camo_skin94", "ion", 10, "kills_stats", "titanExocutionIon" )
+ InitUnlockForStatInt( "titan_camo_skin85", "ion", 25, "kills_stats", "titanExocutionIon" )
+
+ InitUnlockForStatInt( "titan_camo_skin93", "scorch", 3, "kills_stats", "titanExocutionScorch" )
+ InitUnlockForStatInt( "titan_camo_skin94", "scorch", 10, "kills_stats", "titanExocutionScorch" )
+ InitUnlockForStatInt( "titan_camo_skin85", "scorch", 25, "kills_stats", "titanExocutionScorch" )
+
+ InitUnlockForStatInt( "titan_camo_skin93", "vanguard", 3, "kills_stats", "titanExocutionVanguard" )
+ InitUnlockForStatInt( "titan_camo_skin94", "vanguard", 10, "kills_stats", "titanExocutionVanguard" )
+ InitUnlockForStatInt( "titan_camo_skin85", "vanguard", 25, "kills_stats", "titanExocutionVanguard" )
+
+ InitUnlockForStatInt( "titan_camo_skin93", "northstar", 3, "kills_stats", "titanExocutionNorthstar" )
+ InitUnlockForStatInt( "titan_camo_skin94", "northstar", 10, "kills_stats", "titanExocutionNorthstar" )
+ InitUnlockForStatInt( "titan_camo_skin85", "northstar", 25, "kills_stats", "titanExocutionNorthstar" )
+
+ InitUnlockForStatInt( "titan_camo_skin93", "ronin", 3, "kills_stats", "titanExocutionRonin" )
+ InitUnlockForStatInt( "titan_camo_skin94", "ronin", 10, "kills_stats", "titanExocutionRonin" )
+ InitUnlockForStatInt( "titan_camo_skin85", "ronin", 25, "kills_stats", "titanExocutionRonin" )
+
+ InitUnlockForStatInt( "titan_camo_skin93", "tone", 3, "kills_stats", "titanExocutionTone" )
+ InitUnlockForStatInt( "titan_camo_skin94", "tone", 10, "kills_stats", "titanExocutionTone" )
+ InitUnlockForStatInt( "titan_camo_skin85", "tone", 25, "kills_stats", "titanExocutionTone" )
+
+ InitUnlockForStatInt( "titan_camo_skin93", "legion", 3, "kills_stats", "titanExocutionLegion" )
+ InitUnlockForStatInt( "titan_camo_skin94", "legion", 10, "kills_stats", "titanExocutionLegion" )
+ InitUnlockForStatInt( "titan_camo_skin85", "legion", 25, "kills_stats", "titanExocutionLegion" )
+
+ //Titan Sprees for Warpaint
+ InitUnlockForStatInt( "ion_skin_01", "ion", 30, "kills_stats", "killingSpressAs_ion" )
+ InitUnlockForStatInt( "ion_skin_02", "ion", 100, "kills_stats", "killingSpressAs_ion" )
+
+ InitUnlockForStatInt( "scorch_skin_01", "scorch", 30, "kills_stats", "killingSpressAs_scorch" )
+ InitUnlockForStatInt( "scorch_skin_02", "scorch", 100, "kills_stats", "killingSpressAs_scorch" )
+
+ //InitUnlockForStatInt( "vanguard_skin_01", "vanguard", 30, "kills_stats", "killingSpressAs_vanguard" )
+ //InitUnlockForStatInt( "vanguard_skin_02", "vanguard", 100, "kills_stats", "killingSpressAs_vanguard" )
+ //InitUnlockForStatInt( "vanguard_skin_03", "vanguard", 100, "kills_stats", "killingSpressAs_vanguard" )
+
+ InitUnlockForStatInt( "northstar_skin_01", "northstar", 30, "kills_stats", "killingSpressAs_northstar" )
+ InitUnlockForStatInt( "northstar_skin_02", "northstar", 65, "kills_stats", "killingSpressAs_northstar" )
+ InitUnlockForStatInt( "northstar_skin_03", "northstar", 100, "kills_stats", "killingSpressAs_northstar" )
+
+ InitUnlockForStatInt( "ronin_skin_01", "ronin", 30, "kills_stats", "killingSpressAs_ronin" )
+ InitUnlockForStatInt( "ronin_skin_02", "ronin", 65, "kills_stats", "killingSpressAs_ronin" )
+ InitUnlockForStatInt( "ronin_skin_03", "ronin", 100, "kills_stats", "killingSpressAs_ronin" )
+
+ InitUnlockForStatInt( "tone_skin_01", "tone", 30, "kills_stats", "killingSpressAs_tone" )
+ InitUnlockForStatInt( "tone_skin_02", "tone", 65, "kills_stats", "killingSpressAs_tone" )
+ InitUnlockForStatInt( "tone_skin_03", "tone", 100, "kills_stats", "killingSpressAs_tone" )
+
+ InitUnlockForStatInt( "legion_skin_01", "legion", 30, "kills_stats", "killingSpressAs_legion" )
+ InitUnlockForStatInt( "legion_skin_02", "legion", 65, "kills_stats", "killingSpressAs_legion" )
+ InitUnlockForStatInt( "legion_skin_03", "legion", 100, "kills_stats", "killingSpressAs_legion" )
+
+
+// ////////////////// Titan Weapon CHALLENGES //////////////////
+
+ //Titan killing Titans for Weapon
+ InitUnlockForStatInt( "camo_skin67", "ion", 5, "weapon_kill_stats", "titansTotal", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin65", "ion", 15, "weapon_kill_stats", "titansTotal", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin66", "ion", 30, "weapon_kill_stats", "titansTotal", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin64", "ion", 75, "weapon_kill_stats", "titansTotal", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin63", "ion", 150, "weapon_kill_stats", "titansTotal", "mp_titanweapon_particle_accelerator" )
+
+ InitUnlockForStatInt( "camo_skin67", "scorch", 5, "weapon_kill_stats", "titansTotal", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin65", "scorch", 15, "weapon_kill_stats", "titansTotal", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin66", "scorch", 30, "weapon_kill_stats", "titansTotal", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin64", "scorch", 75, "weapon_kill_stats", "titansTotal", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin63", "scorch", 150, "weapon_kill_stats", "titansTotal", "mp_titanweapon_meteor" )
+
+ InitUnlockForStatInt( "camo_skin67", "vanguard", 5, "weapon_kill_stats", "titansTotal", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin65", "vanguard", 15, "weapon_kill_stats", "titansTotal", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin66", "vanguard", 30, "weapon_kill_stats", "titansTotal", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin64", "vanguard", 75, "weapon_kill_stats", "titansTotal", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin63", "vanguard", 150, "weapon_kill_stats", "titansTotal", "mp_titanweapon_xo16_vanguard" )
+
+ InitUnlockForStatInt( "camo_skin67", "northstar", 5, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin65", "northstar", 15, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin66", "northstar", 30, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin64", "northstar", 75, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin63", "northstar", 150, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sniper" )
+
+ InitUnlockForStatInt( "camo_skin67", "ronin", 5, "weapon_kill_stats", "titansTotal", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin65", "ronin", 15, "weapon_kill_stats", "titansTotal", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin66", "ronin", 30, "weapon_kill_stats", "titansTotal", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin64", "ronin", 75, "weapon_kill_stats", "titansTotal", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin63", "ronin", 150, "weapon_kill_stats", "titansTotal", "mp_titanweapon_leadwall" )
+
+ InitUnlockForStatInt( "camo_skin67", "tone", 5, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin65", "tone", 15, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin66", "tone", 30, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin64", "tone", 75, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin63", "tone", 150, "weapon_kill_stats", "titansTotal", "mp_titanweapon_sticky_40mm" )
+
+ InitUnlockForStatInt( "camo_skin67", "legion", 5, "weapon_kill_stats", "titansTotal", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin65", "legion", 15, "weapon_kill_stats", "titansTotal", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin66", "legion", 30, "weapon_kill_stats", "titansTotal", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin64", "legion", 75, "weapon_kill_stats", "titansTotal", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin63", "legion", 150, "weapon_kill_stats", "titansTotal", "mp_titanweapon_predator_cannon" )
+ //Titan Weapon killing Pilots
+ InitUnlockForStatInt( "camo_skin60", "ion", 10, "weapon_kill_stats", "pilots", "mp_titanweapon_particle_accelerator")
+ InitUnlockForStatInt( "camo_skin61", "ion", 25, "weapon_kill_stats", "pilots", "mp_titanweapon_particle_accelerator")
+ InitUnlockForStatInt( "camo_skin62", "ion", 50, "weapon_kill_stats", "pilots", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin59", "ion", 100, "weapon_kill_stats", "pilots", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin87", "ion", 250, "weapon_kill_stats", "pilots", "mp_titanweapon_particle_accelerator" )
+
+ InitUnlockForStatInt( "camo_skin60", "scorch", 10, "weapon_kill_stats", "pilots", "mp_titanweapon_meteor")
+ InitUnlockForStatInt( "camo_skin61", "scorch", 25, "weapon_kill_stats", "pilots", "mp_titanweapon_meteor")
+ InitUnlockForStatInt( "camo_skin62", "scorch", 50, "weapon_kill_stats", "pilots", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin59", "scorch", 100, "weapon_kill_stats", "pilots", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin87", "scorch", 250, "weapon_kill_stats", "pilots", "mp_titanweapon_meteor" )
+
+ InitUnlockForStatInt( "camo_skin60", "vanguard", 10, "weapon_kill_stats", "pilots", "mp_titanweapon_xo16_vanguard")
+ InitUnlockForStatInt( "camo_skin61", "vanguard", 25, "weapon_kill_stats", "pilots", "mp_titanweapon_xo16_vanguard")
+ InitUnlockForStatInt( "camo_skin62", "vanguard", 50, "weapon_kill_stats", "pilots", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin59", "vanguard", 100, "weapon_kill_stats", "pilots", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin87", "vanguard", 250, "weapon_kill_stats", "pilots", "mp_titanweapon_xo16_vanguard" )
+
+ InitUnlockForStatInt( "camo_skin60", "northstar", 10, "weapon_kill_stats", "pilots", "mp_titanweapon_sniper")
+ InitUnlockForStatInt( "camo_skin61", "northstar", 25, "weapon_kill_stats", "pilots", "mp_titanweapon_sniper")
+ InitUnlockForStatInt( "camo_skin62", "northstar", 50, "weapon_kill_stats", "pilots", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin59", "northstar", 100, "weapon_kill_stats", "pilots", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin87", "northstar", 250, "weapon_kill_stats", "pilots", "mp_titanweapon_sniper" )
+
+ InitUnlockForStatInt( "camo_skin60", "ronin", 10, "weapon_kill_stats", "pilots", "mp_titanweapon_leadwall")
+ InitUnlockForStatInt( "camo_skin61", "ronin", 25, "weapon_kill_stats", "pilots", "mp_titanweapon_leadwall")
+ InitUnlockForStatInt( "camo_skin62", "ronin", 50, "weapon_kill_stats", "pilots", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin59", "ronin", 100, "weapon_kill_stats", "pilots", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin87", "ronin", 250, "weapon_kill_stats", "pilots", "mp_titanweapon_leadwall" )
+
+ InitUnlockForStatInt( "camo_skin60", "tone", 10, "weapon_kill_stats", "pilots", "mp_titanweapon_sticky_40mm")
+ InitUnlockForStatInt( "camo_skin61", "tone", 25, "weapon_kill_stats", "pilots", "mp_titanweapon_sticky_40mm")
+ InitUnlockForStatInt( "camo_skin62", "tone", 50, "weapon_kill_stats", "pilots", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin59", "tone", 100, "weapon_kill_stats", "pilots", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin87", "tone", 250, "weapon_kill_stats", "pilots", "mp_titanweapon_sticky_40mm" )
+
+ InitUnlockForStatInt( "camo_skin60", "legion", 10, "weapon_kill_stats", "pilots", "mp_titanweapon_predator_cannon")
+ InitUnlockForStatInt( "camo_skin61", "legion", 25, "weapon_kill_stats", "pilots", "mp_titanweapon_predator_cannon")
+ InitUnlockForStatInt( "camo_skin62", "legion", 50, "weapon_kill_stats", "pilots", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin59", "legion", 100, "weapon_kill_stats", "pilots", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin87", "legion", 250, "weapon_kill_stats", "pilots", "mp_titanweapon_predator_cannon" )
+ //Titan assists Titans for Weapon
+ InitUnlockForStatInt( "camo_skin56", "ion", 5, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin58", "ion", 15, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin55", "ion", 30, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin57", "ion", 75, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin91", "ion", 150, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_particle_accelerator" )
+
+ InitUnlockForStatInt( "camo_skin56", "scorch", 5, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin58", "scorch", 15, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin55", "scorch", 30, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin57", "scorch", 75, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin91", "scorch", 150, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_meteor" )
+
+ InitUnlockForStatInt( "camo_skin56", "vanguard", 5, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin58", "vanguard", 15, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin55", "vanguard", 30, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin57", "vanguard", 75, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin91", "vanguard", 150, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_xo16_vanguard" )
+
+ InitUnlockForStatInt( "camo_skin56", "northstar", 5, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin58", "northstar", 15, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin55", "northstar", 30, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin57", "northstar", 75, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin91", "northstar", 150, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sniper" )
+
+ InitUnlockForStatInt( "camo_skin56", "ronin", 5, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin58", "ronin", 15, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin55", "ronin", 30, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin57", "ronin", 75, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin91", "ronin", 150, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_leadwall" )
+
+ InitUnlockForStatInt( "camo_skin56", "tone", 5, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin58", "tone", 15, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin55", "tone", 30, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin57", "tone", 75, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin91", "tone", 150, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_sticky_40mm" )
+
+ InitUnlockForStatInt( "camo_skin56", "legion", 5, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin58", "legion", 15, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin55", "legion", 30, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin57", "legion", 75, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin91", "legion", 150, "weapon_kill_stats", "assistsTotal", "mp_titanweapon_predator_cannon" )
+
+ //Titan damage for weapon
+ InitUnlockForStatInt( "camo_skin93", "ion", 50000, "weapon_stats", "titanDamage", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin94", "ion", 100000, "weapon_stats", "titanDamage", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin13", "ion", 250000, "weapon_stats", "titanDamage", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin07", "ion", 500000, "weapon_stats", "titanDamage", "mp_titanweapon_particle_accelerator" )
+ InitUnlockForStatInt( "camo_skin85", "ion", 1000000, "weapon_stats", "titanDamage", "mp_titanweapon_particle_accelerator" )
+
+ InitUnlockForStatInt( "camo_skin93", "scorch", 50000, "weapon_stats", "titanDamage", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin94", "scorch", 100000,"weapon_stats", "titanDamage", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin13", "scorch", 250000, "weapon_stats", "titanDamage", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin07", "scorch", 500000, "weapon_stats", "titanDamage", "mp_titanweapon_meteor" )
+ InitUnlockForStatInt( "camo_skin85", "scorch", 1000000, "weapon_stats", "titanDamage", "mp_titanweapon_meteor" )
+
+ InitUnlockForStatInt( "camo_skin93", "vanguard", 50000, "weapon_stats", "titanDamage", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin94", "vanguard", 100000,"weapon_stats", "titanDamage", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin13", "vanguard", 250000, "weapon_stats", "titanDamage", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin07", "vanguard", 500000, "weapon_stats", "titanDamage", "mp_titanweapon_xo16_vanguard" )
+ InitUnlockForStatInt( "camo_skin85", "vanguard", 1000000, "weapon_stats", "titanDamage", "mp_titanweapon_xo16_vanguard" )
+
+ InitUnlockForStatInt( "camo_skin93", "northstar", 50000, "weapon_stats", "titanDamage", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin94", "northstar", 100000,"weapon_stats", "titanDamage", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin13", "northstar", 250000, "weapon_stats", "titanDamage", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin07", "northstar", 500000, "weapon_stats", "titanDamage", "mp_titanweapon_sniper" )
+ InitUnlockForStatInt( "camo_skin85", "northstar", 1000000, "weapon_stats", "titanDamage", "mp_titanweapon_sniper" )
+
+ InitUnlockForStatInt( "camo_skin93", "ronin", 50000, "weapon_stats", "titanDamage", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin94", "ronin", 100000,"weapon_stats", "titanDamage", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin13", "ronin", 250000, "weapon_stats", "titanDamage", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin07", "ronin", 500000, "weapon_stats", "titanDamage", "mp_titanweapon_leadwall" )
+ InitUnlockForStatInt( "camo_skin85", "ronin", 1000000, "weapon_stats", "titanDamage", "mp_titanweapon_leadwall" )
+
+ InitUnlockForStatInt( "camo_skin93", "tone", 50000, "weapon_stats", "titanDamage", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin94", "tone", 100000,"weapon_stats", "titanDamage", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin13", "tone", 250000, "weapon_stats", "titanDamage", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin07", "tone", 500000, "weapon_stats", "titanDamage", "mp_titanweapon_sticky_40mm" )
+ InitUnlockForStatInt( "camo_skin85", "tone", 1000000, "weapon_stats", "titanDamage", "mp_titanweapon_sticky_40mm" )
+
+ InitUnlockForStatInt( "camo_skin93", "legion", 100000, "weapon_stats", "titanDamage", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin94", "legion", 200000,"weapon_stats", "titanDamage", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin13", "legion", 500000, "weapon_stats", "titanDamage", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin07", "legion", 1000000, "weapon_stats", "titanDamage", "mp_titanweapon_predator_cannon" )
+ InitUnlockForStatInt( "camo_skin85", "legion", 2000000, "weapon_stats", "titanDamage", "mp_titanweapon_predator_cannon" )
+
+ //////////////////////////
+ // DELUXE ENTITLEMENTS
+ //////////////////////////
+ InitUnlockAsEntitlement( "ion_skin_04", "ion", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "scorch_skin_04", "scorch", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "northstar_skin_04", "northstar", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "tone_skin_04", "tone", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "ronin_skin_04", "ronin", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "legion_skin_04", "legion", ET_DELUXE_EDITION )
+
+ InitUnlockAsEntitlement( "ion_prime", "", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "scorch_prime", "", ET_DELUXE_EDITION )
+
+ InitUnlockAsEntitlement( "ion_nose_art_07", "ion", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "scorch_nose_art_07", "scorch", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "northstar_nose_art_07", "northstar", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "tone_nose_art_10", "tone", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "ronin_nose_art_07", "ronin", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "legion_nose_art_07", "legion", ET_DELUXE_EDITION )
+
+ for ( int i = 0; i < titanClassEnumCount; i++ )
+ {
+ string titanClass = PersistenceGetEnumItemNameForIndex( "titanClasses", i )
+ if ( titanClass != "" )
+ {
+ InitUnlockAsEntitlement( "titan_camo_skin10", titanClass, ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "camo_skin10", titanClass, ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "titan_camo_skin92", titanClass, ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "camo_skin92", titanClass, ET_DELUXE_EDITION )
+ }
+ }
+
+ InitUnlockAsEntitlement( "pilot_camo_skin10", "", ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "pilot_camo_skin92", "", ET_DELUXE_EDITION )
+
+ foreach ( weaponClassName in pilotWeaponRefs )
+ {
+ InitUnlockAsEntitlement( "camo_skin10", weaponClassName, ET_DELUXE_EDITION )
+ InitUnlockAsEntitlement( "camo_skin92", weaponClassName, ET_DELUXE_EDITION )
+ }
+
+ InitUnlockAsEntitlement( "callsign_14_col_gold", "", ET_DELUXE_EDITION )
+
+ //////////////////////////
+ // PREORDER ENTITLEMENTS
+ //////////////////////////
+ InitUnlockAsEntitlement( "mp_angel_city", "", ET_PREORDER )
+ InitUnlockAsEntitlement( "angel_city_247", "", ET_PREORDER )
+ InitUnlockAsEntitlement( "scorch_skin_03", "scorch", ET_PREORDER )
+ InitUnlockAsEntitlement( "scorch_nose_art_06", "scorch", ET_PREORDER )
+ InitUnlockAsEntitlement( "callsign_71_col_gold", "", ET_PREORDER )
+
+ //////////////////////////
+ // BF1
+ //////////////////////////
+ InitUnlockAsEntitlement( "ion_skin_06", "ion", ET_BF1 )
+
+ //////////////////////////
+ // DLC1
+ //////////////////////////
+ InitUnlockAsEntitlement( "ion_prime", "", ET_DLC1_PRIME_ION )
+ InitUnlockAsEntitlement( "scorch_prime", "", ET_DLC1_PRIME_SCORCH )
+ InitUnlockAsEntitlement( "vanguard_prime", "", ET_DLC5_PRIME_TONE ) // TODO: Entitlement is incorrect here
+
+ InitUnlockAsEntitlement( "ion_nose_art_17", "ion", ET_DLC1_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_18", "ion", ET_DLC1_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_19", "ion", ET_DLC1_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_20", "ion", ET_DLC1_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_21", "ion", ET_DLC1_ION )
+ InitUnlockAsEntitlement( "ion_skin_10", "ion", ET_DLC1_ION, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "scorch_nose_art_15", "scorch", ET_DLC1_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_16", "scorch", ET_DLC1_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_17", "scorch", ET_DLC1_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_18", "scorch", ET_DLC1_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_19", "scorch", ET_DLC1_SCORCH )
+ InitUnlockAsEntitlement( "scorch_skin_07", "scorch", ET_DLC1_SCORCH, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "ronin_nose_art_16", "ronin", ET_DLC1_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_17", "ronin", ET_DLC1_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_18", "ronin", ET_DLC1_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_19", "ronin", ET_DLC1_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_20", "ronin", ET_DLC1_RONIN )
+ InitUnlockAsEntitlement( "ronin_skin_10", "ronin", ET_DLC1_RONIN, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "tone_nose_art_17", "tone", ET_DLC1_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_18", "tone", ET_DLC1_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_19", "tone", ET_DLC1_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_20", "tone", ET_DLC1_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_21", "tone", ET_DLC1_TONE )
+ InitUnlockAsEntitlement( "tone_skin_06", "tone", ET_DLC1_TONE, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "northstar_nose_art_18", "northstar", ET_DLC1_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_19", "northstar", ET_DLC1_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_20", "northstar", ET_DLC1_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_21", "northstar", ET_DLC1_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_22", "northstar", ET_DLC1_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_skin_10", "northstar", ET_DLC1_NORTHSTAR, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "legion_nose_art_17", "legion", ET_DLC1_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_18", "legion", ET_DLC1_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_19", "legion", ET_DLC1_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_20", "legion", ET_DLC1_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_21", "legion", ET_DLC1_LEGION )
+ InitUnlockAsEntitlement( "legion_skin_07", "legion", ET_DLC1_LEGION, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "callsign_106_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_107_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_108_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_109_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_110_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_111_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_112_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_113_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_114_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_115_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_116_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_117_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_118_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_119_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_120_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_121_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_122_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_123_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_124_col", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_125_col", "", ET_DLC1_CALLSIGN )
+
+ InitUnlockAsEntitlement( "gc_icon_64", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_aces", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_alien", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_apex", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_ares", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_controller", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_drone", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_heartbreaker", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_hexes", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_kodai", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_lastimosa", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_lawai", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_mcor", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_phoenix", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_pilot", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_robot", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_sentry", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_super_spectre", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_vinson", "", ET_DLC1_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_wonyeon", "", ET_DLC1_CALLSIGN )
+
+
+ for ( int i = 101; i <= 120; i++ )
+ {
+ for ( int j = 0; j < titanClassEnumCount; j++ )
+ {
+ string titanClass = PersistenceGetEnumItemNameForIndex( "titanClasses", j )
+ if ( titanClass != "" )
+ {
+ InitUnlockAsEntitlement( "titan_camo_skin" + i, titanClass, ET_DLC1_CAMO )
+ InitUnlockAsEntitlement( "camo_skin" + i, titanClass, ET_DLC1_CAMO )
+ }
+ }
+
+ InitUnlockAsEntitlement( "pilot_camo_skin" + i, "", ET_DLC1_CAMO )
+
+ foreach ( weaponClassName in pilotWeaponRefs )
+ {
+ InitUnlockAsEntitlement( "camo_skin" + i, weaponClassName, ET_DLC1_CAMO )
+ }
+ }
+
+ InitFrontierDefenseUnlocks()
+
+ //////////////////////////
+ // DLC3
+ //////////////////////////
+ InitUnlockAsEntitlement( "legion_prime", "", ET_DLC3_PRIME_LEGION )
+ InitUnlockAsEntitlement( "northstar_prime", "", ET_DLC3_PRIME_NORTHSTAR )
+
+ InitUnlockAsEntitlement( "ion_nose_art_22", "ion", ET_DLC3_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_23", "ion", ET_DLC3_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_24", "ion", ET_DLC3_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_25", "ion", ET_DLC3_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_26", "ion", ET_DLC3_ION )
+ InitUnlockAsEntitlement( "ion_skin_11", "ion", ET_DLC3_ION, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "scorch_nose_art_20", "scorch", ET_DLC3_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_21", "scorch", ET_DLC3_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_22", "scorch", ET_DLC3_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_23", "scorch", ET_DLC3_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_24", "scorch", ET_DLC3_SCORCH )
+ InitUnlockAsEntitlement( "scorch_skin_08", "scorch", ET_DLC3_SCORCH, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "ronin_nose_art_21", "ronin", ET_DLC3_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_22", "ronin", ET_DLC3_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_23", "ronin", ET_DLC3_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_24", "ronin", ET_DLC3_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_25", "ronin", ET_DLC3_RONIN )
+ InitUnlockAsEntitlement( "ronin_skin_11", "ronin", ET_DLC3_RONIN, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "tone_nose_art_22", "tone", ET_DLC3_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_23", "tone", ET_DLC3_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_24", "tone", ET_DLC3_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_25", "tone", ET_DLC3_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_26", "tone", ET_DLC3_TONE )
+ InitUnlockAsEntitlement( "tone_skin_07", "tone", ET_DLC3_TONE, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "northstar_nose_art_23", "northstar", ET_DLC3_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_24", "northstar", ET_DLC3_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_25", "northstar", ET_DLC3_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_26", "northstar", ET_DLC3_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_27", "northstar", ET_DLC3_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_skin_11", "northstar", ET_DLC3_NORTHSTAR, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "legion_nose_art_22", "legion", ET_DLC3_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_23", "legion", ET_DLC3_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_24", "legion", ET_DLC3_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_25", "legion", ET_DLC3_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_26", "legion", ET_DLC3_LEGION )
+ InitUnlockAsEntitlement( "legion_skin_08", "legion", ET_DLC3_LEGION, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "gc_icon_balance", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_boot", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_bt_eye", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_buzzsaw", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_crossed_lighting", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_flying_bullet", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_hammer2", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_keyboard", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_lightbulb", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_narwhal", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_peace", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_pilot2", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_robot_eye", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_srs", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_starline", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_taco", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_thumbdown", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_thumbup", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_treble", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_vanguard", "", ET_DLC3_CALLSIGN )
+
+ for ( int i = 121; i <= 140; i++ )
+ {
+ for ( int j = 0; j < titanClassEnumCount; j++ )
+ {
+ string titanClass = PersistenceGetEnumItemNameForIndex( "titanClasses", j )
+ if ( titanClass != "" )
+ {
+ InitUnlockAsEntitlement( "titan_camo_skin" + i, titanClass, ET_DLC3_CAMO )
+ InitUnlockAsEntitlement( "camo_skin" + i, titanClass, ET_DLC3_CAMO )
+ }
+ }
+
+ InitUnlockAsEntitlement( "pilot_camo_skin" + i, "", ET_DLC3_CAMO )
+
+ foreach ( weaponClassName in pilotWeaponRefs )
+ {
+ InitUnlockAsEntitlement( "camo_skin" + i, weaponClassName, ET_DLC3_CAMO )
+ }
+ }
+
+ InitUnlockAsEntitlement( "callsign_143_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_144_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_145_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_146_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_147_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_148_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_149_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_150_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_151_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_152_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_153_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_154_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_155_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_156_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_157_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_158_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_159_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_160_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_161_col", "", ET_DLC3_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_162_col", "", ET_DLC3_CALLSIGN )
+
+ //////////////////////////
+ // DLC5
+ //////////////////////////
+ InitUnlockAsEntitlement( "tone_prime", "", ET_DLC5_PRIME_TONE )
+ InitUnlockAsEntitlement( "ronin_prime", "", ET_DLC5_PRIME_RONIN )
+
+ InitUnlockAsEntitlement( "ion_nose_art_27", "ion", ET_DLC5_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_28", "ion", ET_DLC5_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_29", "ion", ET_DLC5_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_30", "ion", ET_DLC5_ION )
+ InitUnlockAsEntitlement( "ion_nose_art_31", "ion", ET_DLC5_ION )
+ InitUnlockAsEntitlement( "ion_skin_07", "ion", ET_DLC5_ION, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "scorch_nose_art_25", "scorch", ET_DLC5_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_26", "scorch", ET_DLC5_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_27", "scorch", ET_DLC5_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_28", "scorch", ET_DLC5_SCORCH )
+ InitUnlockAsEntitlement( "scorch_nose_art_29", "scorch", ET_DLC5_SCORCH )
+ InitUnlockAsEntitlement( "scorch_skin_06", "scorch", ET_DLC5_SCORCH, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "ronin_nose_art_26", "ronin", ET_DLC5_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_27", "ronin", ET_DLC5_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_28", "ronin", ET_DLC5_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_29", "ronin", ET_DLC5_RONIN )
+ InitUnlockAsEntitlement( "ronin_nose_art_30", "ronin", ET_DLC5_RONIN )
+ InitUnlockAsEntitlement( "ronin_skin_07", "ronin", ET_DLC5_RONIN, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "tone_nose_art_27", "tone", ET_DLC5_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_28", "tone", ET_DLC5_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_29", "tone", ET_DLC5_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_30", "tone", ET_DLC5_TONE )
+ InitUnlockAsEntitlement( "tone_nose_art_31", "tone", ET_DLC5_TONE )
+ InitUnlockAsEntitlement( "tone_skin_08", "tone", ET_DLC5_TONE, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "northstar_nose_art_28", "northstar", ET_DLC5_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_29", "northstar", ET_DLC5_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_30", "northstar", ET_DLC5_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_31", "northstar", ET_DLC5_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_nose_art_32", "northstar", ET_DLC5_NORTHSTAR )
+ InitUnlockAsEntitlement( "northstar_skin_06", "northstar", ET_DLC5_NORTHSTAR, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "legion_nose_art_27", "legion", ET_DLC5_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_28", "legion", ET_DLC5_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_29", "legion", ET_DLC5_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_30", "legion", ET_DLC5_LEGION )
+ InitUnlockAsEntitlement( "legion_nose_art_31", "legion", ET_DLC5_LEGION )
+ InitUnlockAsEntitlement( "legion_skin_09", "legion", ET_DLC5_LEGION, "StoreMenu_Customization" )
+
+ InitUnlockAsEntitlement( "gc_icon_monarch_dlc5", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_militia", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_militia_alt", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_imc", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_hammond", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_tri_chevron", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_pilot_circle", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_x", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_nessie", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_spicy", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_crown", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_pawn", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_excite", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_duck", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_sock", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_rabbit", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_peanut", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_clock", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_shamrock", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "gc_icon_trident", "", ET_DLC5_CALLSIGN )
+
+ for ( int i = 141; i <= 160; i++ )
+ {
+ for ( int j = 0; j < titanClassEnumCount; j++ )
+ {
+ string titanClass = PersistenceGetEnumItemNameForIndex( "titanClasses", j )
+ if ( titanClass != "" )
+ {
+ InitUnlockAsEntitlement( "titan_camo_skin" + i, titanClass, ET_DLC5_CAMO )
+ InitUnlockAsEntitlement( "camo_skin" + i, titanClass, ET_DLC5_CAMO )
+ }
+ }
+
+ InitUnlockAsEntitlement( "pilot_camo_skin" + i, "", ET_DLC5_CAMO )
+
+ foreach ( weaponClassName in pilotWeaponRefs )
+ {
+ InitUnlockAsEntitlement( "camo_skin" + i, weaponClassName, ET_DLC5_CAMO )
+ }
+ }
+
+ InitUnlockAsEntitlement( "callsign_166_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_167_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_168_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_169_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_170_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_171_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_172_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_173_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_174_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_175_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_176_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_177_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_178_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_179_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_180_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_181_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_182_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_183_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_184_col", "", ET_DLC5_CALLSIGN )
+ InitUnlockAsEntitlement( "callsign_185_col", "", ET_DLC5_CALLSIGN )
+
+ InitUnlockAsEntitlement( "skin_rspn101_wasteland", "mp_weapon_rspn101", ET_DLC7_R201_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_g2_masterwork", "mp_weapon_g2", ET_DLC7_G2A5_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_vinson_blue_fade", "mp_weapon_vinson", ET_DLC7_FLATLINE_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_car_crimson_fury", "mp_weapon_car", ET_DLC7_CAR_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_alternator_patriot", "mp_weapon_alternator_smg", ET_DLC7_ALTERNATOR_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_shotgun_badlands", "mp_weapon_shotgun", ET_DLC7_EVA8_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_wingman_aqua_fade", "mp_weapon_wingman", ET_DLC7_WINGMAN_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_rocket_launcher_psych_spectre", "mp_weapon_rocket_launcher", ET_DLC7_ARCHER_WARPAINT, "StoreMenu_WeaponSkins" )
+
+ InitUnlockAsEntitlement( "ion_skin_fd", "ion", ET_DLC7_ION_WARPAINT )
+ InitUnlockAsEntitlement( "scorch_skin_fd", "scorch", ET_DLC7_SCORCH_WARPAINT )
+ InitUnlockAsEntitlement( "northstar_skin_fd", "northstar", ET_DLC7_NORTHSTAR_WARPAINT )
+ InitUnlockAsEntitlement( "ronin_skin_fd", "ronin", ET_DLC7_RONIN_WARPAINT )
+ InitUnlockAsEntitlement( "tone_skin_fd", "tone", ET_DLC7_TONE_WARPAINT )
+ InitUnlockAsEntitlement( "legion_skin_fd", "legion", ET_DLC7_LEGION_WARPAINT )
+ InitUnlockAsEntitlement( "monarch_skin_fd", "vanguard", ET_DLC7_MONARCH_WARPAINT )
+
+ InitUnlockAsEntitlement( "callsign_fd_ion_dynamic", "", ET_DLC7_ION_WARPAINT )
+ InitUnlockAsEntitlement( "callsign_fd_scorch_dynamic", "", ET_DLC7_SCORCH_WARPAINT )
+ InitUnlockAsEntitlement( "callsign_fd_northstar_dynamic", "", ET_DLC7_NORTHSTAR_WARPAINT )
+ InitUnlockAsEntitlement( "callsign_fd_ronin_dynamic", "", ET_DLC7_RONIN_WARPAINT )
+ InitUnlockAsEntitlement( "callsign_fd_tone_dynamic", "", ET_DLC7_TONE_WARPAINT )
+ InitUnlockAsEntitlement( "callsign_fd_legion_dynamic", "", ET_DLC7_LEGION_WARPAINT )
+ InitUnlockAsEntitlement( "callsign_fd_monarch_dynamic", "", ET_DLC7_MONARCH_WARPAINT )
+
+ InitUnlock( "callsign_fd_ion_hard", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_ion_master", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_ion_insane", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_tone_hard", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_tone_master", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_tone_insane", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_scorch_hard", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_scorch_master", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_scorch_insane", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_legion_hard", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_legion_master", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_legion_insane", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_ronin_hard", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_ronin_master", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_ronin_insane", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_northstar_hard", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_northstar_master", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_northstar_insane", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_monarch_hard", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_monarch_master", "", eUnlockType.PERSISTENT_ITEM, 0 )
+ InitUnlock( "callsign_fd_monarch_insane", "", eUnlockType.PERSISTENT_ITEM, 0 )
+
+ InitUnlockForStatInt( "classic_music", "", 10, "game_stats", "mode_won", "fd" )
+
+ InitUnlockForStatInt( "burnmeter_at_turret_weapon_infinite", "", 2, "fd_stats", "arcMinesPlaced" )
+ InitUnlockForStatInt( "burnmeter_ap_turret_weapon_infinite", "", 2, "fd_stats", "arcMinesPlaced" )
+ InitUnlockForStatInt( "burnmeter_rodeo_grenade", "", 3, "fd_stats", "rodeos" )
+ InitUnlockForStatInt( "burnmeter_harvester_shield", "", 3, "fd_stats", "wavesComplete" )
+
+ InitUnlockAsEntitlement( "skin_rspn101_patriot", "mp_weapon_rspn101", ET_DLC8_R201_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_hemlok_mochi", "mp_weapon_hemlok", ET_DLC8_HEMLOK_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_r97_purple_fade", "mp_weapon_r97", ET_DLC8_R97_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_kraber_masterwork", "mp_weapon_sniper", ET_DLC8_KRABER_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_spitfire_lead_farmer", "mp_weapon_lmg", ET_DLC8_SPITFIRE_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_devotion_rspn_customs", "mp_weapon_esaw", ET_DLC8_DEVOTION_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_mozambique_crimson_fury", "mp_weapon_shotgun_pistol", ET_DLC8_MOZAMBIQUE_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_thunderbolt_8bit", "mp_weapon_arc_launcher", ET_DLC8_THUNDERBOLT_WARPAINT, "StoreMenu_WeaponSkins" )
+
+ InitUnlockAsEntitlement( "skin_lstar_heatsink", "mp_weapon_lstar", ET_DLC9_LSTAR_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_mastiff_crimson_fury", "mp_weapon_mastiff", ET_DLC9_MASTIFF_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_sidewinder_masterwork", "mp_weapon_smr", ET_DLC9_SIDEWINDER_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_rspn101_halloween", "mp_weapon_rspn101", ET_DLC9_R201_WARPAINT )
+ InitUnlockAsEntitlement( "skin_car_halloween", "mp_weapon_car", ET_DLC9_CAR_WARPAINT )
+ InitUnlockAsEntitlement( "skin_spitfire_halloween", "mp_weapon_lmg", ET_DLC9_SPITFIRE_WARPAINT )
+
+ InitUnlockAsEntitlement( "skin_rspn101_og_blue_fade", "mp_weapon_rspn101_og", ET_DLC10_R101_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_vinson_badlands", "mp_weapon_vinson", ET_DLC10_FLATLINE_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_volt_heatsink", "mp_weapon_hemlok_smg", ET_DLC10_VOLT_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_alternator_headhunter", "mp_weapon_alternator_smg", ET_DLC10_ALTERNATOR_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_softball_masterwork", "mp_weapon_softball", ET_DLC10_SOFTBALL_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_epg_mrvn", "mp_weapon_epg", ET_DLC10_EPG1_WARPAINT, "StoreMenu_WeaponSkins" )
+
+ InitUnlockAsEntitlement( "skin_dmr_phantom", "mp_weapon_dmr", ET_DLC11_DMR_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_doubletake_masterwork", "mp_weapon_doubletake", ET_DLC11_DOUBLETAKE_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_g2_purple_fade", "mp_weapon_g2", ET_DLC11_G2A5_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_coldwar_heatsink", "mp_weapon_pulse_lmg", ET_DLC11_COLDWAR_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_r97_sky", "mp_weapon_r97", ET_DLC11_R97_WARPAINT, "StoreMenu_WeaponSkins" )
+ InitUnlockAsEntitlement( "skin_rspn101_crimson_fury", "mp_weapon_rspn101", ET_DLC11_R101_WARPAINT, "StoreMenu_WeaponSkins" )
+
+ array<ItemData> burnMeterRewards = GetAllItemsOfType( eItemTypes.BURN_METER_REWARD )
+ foreach ( ItemData item in burnMeterRewards )
+ {
+ if ( !IsUnlockValid( item.ref ) )
+ InitUnlock( item.ref, "", eUnlockType.PLAYER_LEVEL, 1 )
+ }
+
+ #if DEV && SERVER && DEVSCRIPTS
+ array<string> ignoreList = [ "titanos_ronin",
+ "mp_titanweapon_vortex_shield",
+ "mp_titanweapon_rocketeer_rocketstream",
+ "melee_pilot_arena",
+ "mp_titanweapon_shoulder_rockets",
+ "mp_titancore_dash_core",
+ "mp_titanability_smoke",
+ "melee_pilot_sword",
+ "mp_titanweapon_salvo_rockets",
+ "mp_titancore_amp_core",
+ "advocate_gift",
+ "random",
+ "default",
+ "mp_titanability_rocketeer_ammo_swap",
+ "titanos_scorch",
+ "double_xp",
+ "titanos_ion",
+ "fnf",
+ "melee_pilot_emptyhanded",
+ "mp_titanweapon_homing_rockets",
+ "private_match",
+ "credit_award_5x",
+ "titanos_bt",
+ "mp_titanweapon_xo16_shorty",
+ "titanos_northstar",
+ "titanos_tone",
+ "titanos_legion",
+ "titanos_vanguard",
+ "varietypack",
+ "mp_titanweapon_stun_laser",
+ "mp_titanability_rearm",
+ "mp_titancore_upgrade",
+ "ronin.pas_vanguard_core8",
+ "ronin.pas_vanguard_core9",
+ "ronin.pas_vanguard_core2",
+ "ronin.pas_vanguard_core5",
+ "ronin.pas_vanguard_core3",
+ "ronin.pas_vanguard_core6",
+ "ion.pas_vanguard_core8",
+ "ion.pas_vanguard_core6",
+ "ion.pas_vanguard_core9",
+ "ion.pas_vanguard_core2",
+ "ion.pas_vanguard_core5",
+ "ion.pas_vanguard_core3",
+ "legion.pas_vanguard_core8",
+ "legion.pas_vanguard_core9",
+ "legion.pas_vanguard_core2",
+ "legion.pas_vanguard_core5",
+ "legion.pas_vanguard_core6",
+ "legion.pas_vanguard_core3",
+ "scorch.pas_vanguard_core8",
+ "scorch.pas_vanguard_core6",
+ "scorch.pas_vanguard_core9",
+ "scorch.pas_vanguard_core2",
+ "scorch.pas_vanguard_core5",
+ "scorch.pas_vanguard_core3",
+ "tone.pas_vanguard_core8",
+ "tone.pas_vanguard_core9",
+ "tone.pas_vanguard_core2",
+ "tone.pas_vanguard_core5",
+ "tone.pas_vanguard_core6",
+ "tone.pas_vanguard_core3",
+ "northstar.pas_vanguard_core8",
+ "northstar.pas_vanguard_core9",
+ "northstar.pas_vanguard_core2",
+ "northstar.pas_vanguard_core5",
+ "northstar.pas_vanguard_core3",
+ "northstar.pas_vanguard_core6", ]
+
+ foreach ( item in file.itemData )
+ {
+ if ( ignoreList.contains( item.ref ) )
+ continue
+
+ if ( IsSubItemType( GetItemType( item.ref ) ) )
+ continue
+
+ if ( item.ref in file.entitlementUnlocks )
+ continue
+
+ if ( IsDisabledRef( item.ref ) )
+ continue
+
+ if ( ( item.ref in file.unlocks ) || IsItemInRandomUnlocks( item.ref ) )
+ {
+ foreach ( subItem in item.subitems )
+ {
+ if ( subItem.ref in file.unlocks[ item.ref ].child || IsItemInRandomUnlocks( subItem.ref, item.ref ) || IsItemInEntitlementUnlock( subItem.ref, item.ref ) )
+ continue
+
+ if ( ignoreList.contains( item.ref + "." + subItem.ref ) )
+ continue
+
+ CodeWarning( "Not in unlocks " + item.ref + "." + subItem.ref )
+ }
+ }
+ else
+ {
+ CodeWarning( "Not in unlocks " + item.ref )
+ }
+ }
+ #endif
+}
+
+#if SERVER
+void function UnlockTarget( entity player )
+{
+ int titanClassEnumCount = PersistenceGetEnumCount( "titanClasses" )
+ array<string> pilotWeaponRefs = GetAllItemRefsOfType( eItemTypes.PILOT_PRIMARY )
+ pilotWeaponRefs.extend( GetAllItemRefsOfType( eItemTypes.PILOT_SECONDARY ) )
+
+ //////////////////////////
+ // TARGET
+ //////////////////////////
+ for ( int i = 0; i < titanClassEnumCount; i++ )
+ {
+ string titanClass = PersistenceGetEnumItemNameForIndex( "titanClasses", i )
+ if ( titanClass != "" )
+ {
+ SetItemOwned( player, "titan_camo_skin08", titanClass, true )
+ SetItemOwned( player, "camo_skin08", titanClass, true )
+ }
+ }
+
+ SetItemOwned( player, "pilot_camo_skin08", "", true )
+
+ foreach ( weaponClassName in pilotWeaponRefs )
+ {
+ SetItemOwned( player, "camo_skin08", weaponClassName, true )
+ }
+}
+
+void function ClearTargetNew( entity player )
+{
+ // early out if we don't own target skins
+ if ( !IsItemOwned( player, "pilot_camo_skin08" ) )
+ return
+
+ int titanClassEnumCount = PersistenceGetEnumCount( "titanClasses" )
+ array<string> pilotWeaponRefs = GetAllItemRefsOfType( eItemTypes.PILOT_PRIMARY )
+ pilotWeaponRefs.extend( GetAllItemRefsOfType( eItemTypes.PILOT_SECONDARY ) )
+
+ for ( int i = 0; i < titanClassEnumCount; i++ )
+ {
+ string titanClass = PersistenceGetEnumItemNameForIndex( "titanClasses", i )
+ if ( titanClass != "" )
+ {
+ if ( IsItemLocked( player, titanClass ) )
+ {
+ SetItemNewStatus( player, "titan_camo_skin08", titanClass, false )
+ SetItemNewStatus( player, "camo_skin08", titanClass, false )
+ }
+ }
+ }
+
+ foreach ( weaponClassName in pilotWeaponRefs )
+ {
+ if ( IsItemLocked( player, weaponClassName ) )
+ SetItemNewStatus( player, "camo_skin08", weaponClassName, false )
+ }
+}
+
+void function FixupLevelCamosForRegen( entity player )
+{
+ if ( player.GetGen() <= 1 )
+ return
+
+ int maxPlayerLevel = GetMaxPlayerLevel()
+
+ array<ItemData> camoSkins = GetAllItemsOfType( eItemTypes.CAMO_SKIN_PILOT )
+ foreach ( ItemData camoData in camoSkins )
+ {
+ if ( IsItemInEntitlementUnlock( camoData.ref ) )
+ continue
+
+ if ( IsItemInRandomUnlocks( camoData.ref ) )
+ continue
+
+ if ( GetItemUnlockType( camoData.ref ) != eUnlockType.PLAYER_LEVEL )
+ continue
+
+ if ( GetUnlockLevelReq( camoData.ref ) > maxPlayerLevel )
+ continue
+
+ SetItemOwned( player, camoData.ref, "", false )
+ }
+}
+
+void function UnlockBWW( entity player )
+{
+ //////////////////////////
+ // BWW
+ //////////////////////////
+ SetItemOwned( player, "ion_nose_art_05", "ion", true )
+}
+
+void function UnlockDEW( entity player )
+{
+ int titanClassEnumCount = PersistenceGetEnumCount( "titanClasses" )
+ array<string> pilotWeaponRefs = GetAllItemRefsOfType( eItemTypes.PILOT_PRIMARY )
+ pilotWeaponRefs.extend( GetAllItemRefsOfType( eItemTypes.PILOT_SECONDARY ) )
+
+ //////////////////////////
+ // Mountain Dew
+ //////////////////////////
+ SetItemOwned( player, "execution_face_stab", "", true )
+ SetItemOwned( player, "ion_skin_03", "ion", true )
+ SetItemOwned( player, "callsign_70_col_gold", "", true )
+
+ for ( int i = 0; i < titanClassEnumCount; i++ )
+ {
+ string titanClass = PersistenceGetEnumItemNameForIndex( "titanClasses", i )
+ if ( titanClass != "" )
+ {
+ SetItemOwned( player, "titan_camo_skin09", titanClass, true )
+ SetItemOwned( player, "camo_skin09", titanClass, true )
+ }
+ }
+
+ SetItemOwned( player, "pilot_camo_skin09", "", true )
+
+ foreach ( weaponClassName in pilotWeaponRefs )
+ {
+ SetItemOwned( player, "camo_skin09", weaponClassName, true )
+ }
+}
+#endif
+
+void function InitTitanWeaponDataMP()
+{
+ ////////////////////
+ //TITAN WEAPON DATA
+ ////////////////////
+
+ var dataTable = GetDataTable( $"datatable/titan_primary_weapons.rpak" )
+ int numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, TITAN_PRIMARY_COLUMN )
+ bool hidden = GetDataTableBool( dataTable, i, TITAN_PRIMARY_HIDDEN_COLUMN )
+
+ if ( IsDisabledRef( itemRef ) )
+ continue
+
+ CreateWeaponData( i, eItemTypes.TITAN_PRIMARY, hidden, itemRef, true, 0 )
+ }
+
+ dataTable = GetDataTable( $"datatable/titan_abilities.rpak" )
+ numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ string itemRef = GetDataTableString( dataTable, i, TITAN_ABILITY_COLUMN )
+ int itemType = eItemTypes[ GetDataTableString( dataTable, i, TITAN_ABILITY_TYPE_COLUMN ) ]
+ bool isDamageSource = GetDataTableBool( dataTable, i, TITAN_ABILITY_DAMAGESOURCE_COLUMN )
+ bool hidden = GetDataTableBool( dataTable, i, TITAN_ABILITY_HIDDEN_COLUMN )
+
+ if ( IsDisabledRef( itemRef ) )
+ continue
+
+ CreateWeaponData( i, itemType, hidden, itemRef, isDamageSource, 0 )
+ }
+}
+
+
+void function InitTitanWeaponDataSP()
+{
+ ////////////////////
+ //TITAN WEAPON DATA
+ ////////////////////
+
+ array<TitanLoadoutDef> loadouts = GetAllowedTitanLoadouts()
+
+ var dataTable = GetDataTable( $"datatable/titan_abilities.rpak" )
+ int abilityColumn = GetDataTableColumnByName( dataTable, "itemRef" )
+ int abilityTypeColumn = GetDataTableColumnByName( dataTable, "type" )
+ int isDamageSourceColumn = GetDataTableColumnByName( dataTable, "damageSource" )
+
+ table<string, bool> loaded
+
+ foreach ( loadoutIndex, loadout in loadouts )
+ {
+ string itemRef = loadout.primary
+ if ( !(itemRef in loaded) )
+ {
+ loaded[ itemRef ] <- true
+ CreateWeaponData( loadoutIndex, eItemTypes.TITAN_PRIMARY, false, itemRef, true )
+ }
+
+ string ability
+ int row
+ int itemType
+ bool isDamageSource
+
+ ability = loadout.coreAbility
+ if ( !(ability in loaded) )
+ {
+ loaded[ ability ] <- true
+ row = GetDataTableRowMatchingStringValue( dataTable, abilityColumn, ability )
+ itemType = eItemTypes[ GetDataTableString( dataTable, row, abilityTypeColumn ) ]
+ isDamageSource = GetDataTableBool( dataTable, row, isDamageSourceColumn )
+ CreateWeaponData( row, itemType, false, ability, isDamageSource )
+ }
+
+ ability = loadout.special
+ if ( !(ability in loaded) )
+ {
+ loaded[ ability ] <- true
+ row = GetDataTableRowMatchingStringValue( dataTable, abilityColumn, ability )
+ itemType = eItemTypes[ GetDataTableString( dataTable, row, abilityTypeColumn ) ]
+ isDamageSource = GetDataTableBool( dataTable, row, isDamageSourceColumn )
+ CreateWeaponData( row, itemType, false, ability, isDamageSource )
+ }
+
+ ability = loadout.antirodeo
+ if ( !(ability in loaded) )
+ {
+ loaded[ ability ] <- true
+ row = GetDataTableRowMatchingStringValue( dataTable, abilityColumn, ability )
+ itemType = eItemTypes[ GetDataTableString( dataTable, row, abilityTypeColumn ) ]
+ isDamageSource = GetDataTableBool( dataTable, row, isDamageSourceColumn )
+ CreateWeaponData( row, itemType, false, ability, isDamageSource )
+ }
+
+ ability = loadout.ordnance
+ if ( !(ability in loaded) )
+ {
+ loaded[ ability ] <- true
+ row = GetDataTableRowMatchingStringValue( dataTable, abilityColumn, ability )
+ itemType = eItemTypes[ GetDataTableString( dataTable, row, abilityTypeColumn ) ]
+ isDamageSource = GetDataTableBool( dataTable, row, isDamageSourceColumn )
+ CreateWeaponData( row, itemType, false, ability, isDamageSource )
+ }
+ }
+}
+
+array<string> function SplitAndStripUnlockField( string unlockField )
+{
+ array<string> unlockArray = split( unlockField, "," )
+
+ foreach ( i, unlock in unlockArray )
+ {
+ unlockArray[ i ] = strip( unlock )
+ }
+
+ return unlockArray
+}
+
+void function InitUnlock( string ref, string parentRef, int unlockType, int unlockLevel, int cost = 0, string additionalRef = "" )
+{
+ if ( ref == "random" )
+ {
+ if ( unlockType == eUnlockType.FACTION_LEVEL )
+ AppendRandomUnlock( unlockType, unlockLevel, additionalRef )
+ else
+ AppendRandomUnlock( unlockType, unlockLevel, parentRef )
+ return
+ }
+
+ if ( IsDisabledRef( ref ) || IsDisabledRef( parentRef ) )
+ return
+
+ ItemData itemData = GetItemData( ref )
+
+ if ( parentRef == "" )
+ {
+ Assert( !(ref in file.unlocks), "Duplicate unlock entry " + ref )
+ Assert( unlockType == eUnlockType.PLAYER_LEVEL || unlockType == eUnlockType.DISABLED || unlockType == eUnlockType.ENTITLEMENT || unlockType == eUnlockType.PERSISTENT_ITEM || unlockType == eUnlockType.FACTION_LEVEL || unlockType == eUnlockType.FD_UNLOCK_POINTS, "Cannot specify a parentRef for an item that unlocks with player level" )
+
+ Unlock unlock
+ unlock.unlockType = unlockType
+ unlock.unlockLevel = unlockLevel
+ unlock.cost = cost
+ unlock.additionalRef = additionalRef
+
+ file.unlocks[ ref ] <- unlock
+ }
+ else if ( IsSubItemType( itemData.itemType ) )
+ {
+ Assert( HasSubitem( parentRef, ref ), "Item " + parentRef + " does not have a " + ref + " subitem" )
+ ChildUnlock childUnlock
+ childUnlock.unlockType = unlockType
+ childUnlock.unlockLevel = unlockLevel
+ childUnlock.cost = cost
+ childUnlock.additionalRef = additionalRef
+
+ // Assert( !(ref in file.unlocks[parentRef].child) )
+ if ( !(parentRef in file.unlocks) )
+ {
+ //CodeWarning( "Unassigned parent reference: " + parentRef + " for child " + ref )
+ Unlock unlock
+ unlock.unlockType = eUnlockType.PLAYER_LEVEL
+ unlock.unlockLevel = 1
+
+ file.unlocks[ parentRef ] <- unlock
+ }
+
+ #if DEV
+ if ( ref in file.unlocks[ parentRef ].child )
+ CodeWarning( "Duplicate unlock entry " + parentRef + "." + ref )
+ //Assert( !(ref in file.unlocks[ parentRef ].child), "Duplicate unlock entry " + ref )
+ #endif
+
+ file.unlocks[ parentRef ].child[ ref ] <- childUnlock
+ }
+ else
+ {
+ Assert( !HasSubitem( parentRef, ref ), "Item " + parentRef + " uses " + ref + " as a subitem" )
+
+ Unlock unlock
+ unlock.unlockType = unlockType
+ unlock.unlockLevel = unlockLevel
+ unlock.cost = cost
+ unlock.parentRef = parentRef
+ unlock.additionalRef = additionalRef
+
+ file.unlocks[ ref ] <- unlock
+ }
+}
+
+//int function GetPlayerStatInt( entity player, string category, string alias, string subAlias = "" )
+
+void function InitUnlockForStatInt( string ref, string parentRef, int statValue, string statCategory, string statAlias, string statSubAlias = "" )
+{
+ Assert ( GetStatVarType( statCategory, statAlias, statSubAlias ) == ePlayerStatType.INT )
+
+ if ( IsDisabledRef( ref ) || IsDisabledRef( parentRef ) )
+ return
+
+ if ( parentRef != "" )
+ {
+ Assert( HasSubitem( parentRef, ref ), "Item " + parentRef + " does not have a " + ref + " subitem" )
+
+ ChildUnlock childUnlock
+ childUnlock.unlockType = eUnlockType.STAT
+ childUnlock.unlockLevel = 0
+ childUnlock.cost = 0
+ childUnlock.unlockIntVal = statValue
+ childUnlock.unlockFloatVal = -1
+ childUnlock.additionalRef = GetStatVar( statCategory, statAlias, statSubAlias )
+ childUnlock.additionalData.statCategory <- statCategory
+ childUnlock.additionalData.statAlias <- statAlias
+ childUnlock.additionalData.statSubAlias <- statSubAlias
+ childUnlock.additionalData.statVar <- GetStatVar( statCategory, statAlias, statSubAlias )
+ childUnlock.additionalData.statType <- GetStatVarType( statCategory, statAlias, statSubAlias )
+ childUnlock.additionalData.statUnlockValue <- statValue
+
+ Assert( parentRef in file.unlocks )
+
+ #if DEV
+ if ( ref in file.unlocks[ parentRef ].child )
+ CodeWarning( "Duplicate unlock entry " + parentRef + "." + ref )
+ #endif
+
+ #if SERVER
+ AddStatCallback( statCategory, statAlias, statSubAlias, StatsCallback_SubItemUnlockUpdate, ref + "," + parentRef )
+ #endif
+
+ file.unlocks[ parentRef ].child[ ref ] <- childUnlock
+ }
+ else
+ {
+ Unlock unlock
+ unlock.unlockType = eUnlockType.STAT
+ unlock.parentRef = parentRef
+ unlock.unlockLevel = 0
+ unlock.cost = 0
+ unlock.unlockIntVal = statValue
+ unlock.unlockFloatVal = -1
+ unlock.additionalRef = GetStatVar( statCategory, statAlias, statSubAlias )
+ unlock.additionalData.statCategory <- statCategory
+ unlock.additionalData.statAlias <- statAlias
+ unlock.additionalData.statSubAlias <- statSubAlias
+ unlock.additionalData.statVar <- GetStatVar( statCategory, statAlias, statSubAlias )
+ unlock.additionalData.statType <- GetStatVarType( statCategory, statAlias, statSubAlias )
+ unlock.additionalData.statUnlockValue <- statValue
+
+ #if SERVER
+ AddStatCallback( statCategory, statAlias, statSubAlias, StatsCallback_ItemUnlockUpdate, ref )
+ #endif
+
+ file.unlocks[ ref ] <- unlock
+ }
+}
+
+void function InitUnlockForStatFloat( string ref, string parentRef, float statValue, string statCategory, string statAlias, string statSubAlias = "" )
+{
+ Assert ( GetStatVarType( statCategory, statAlias, statSubAlias ) == ePlayerStatType.FLOAT )
+
+ if ( IsDisabledRef( ref ) || IsDisabledRef( parentRef ) )
+ return
+
+ if ( parentRef != "" )
+ {
+ Assert( HasSubitem( parentRef, ref ), "Item " + parentRef + " does not have a " + ref + " subitem" )
+
+ ChildUnlock childUnlock
+ childUnlock.unlockType = eUnlockType.STAT
+ childUnlock.unlockLevel = 0
+ childUnlock.cost = 0
+ childUnlock.unlockIntVal = -1
+ childUnlock.unlockFloatVal = statValue
+ childUnlock.additionalRef = GetStatVar( statCategory, statAlias, statSubAlias )
+ childUnlock.additionalData.statCategory <- statCategory
+ childUnlock.additionalData.statAlias <- statAlias
+ childUnlock.additionalData.statSubAlias <- statSubAlias
+ childUnlock.additionalData.statVar <- GetStatVar( statCategory, statAlias, statSubAlias )
+ childUnlock.additionalData.statType <- GetStatVarType( statCategory, statAlias, statSubAlias )
+ childUnlock.additionalData.statUnlockValue <- statValue
+
+ Assert( parentRef in file.unlocks )
+
+ #if DEV
+ if ( ref in file.unlocks[ parentRef ].child )
+ CodeWarning( "Duplicate unlock entry " + parentRef + "." + ref )
+ #endif
+
+ #if SERVER
+ AddStatCallback( statCategory, statAlias, statSubAlias, StatsCallback_SubItemUnlockUpdate, ref + "," + parentRef )
+ #endif
+
+ file.unlocks[ parentRef ].child[ ref ] <- childUnlock
+ }
+ else
+ {
+ Unlock unlock
+ unlock.unlockType = eUnlockType.STAT
+ unlock.parentRef = parentRef
+ unlock.unlockLevel = 0
+ unlock.cost = 0
+ unlock.unlockIntVal = -1
+ unlock.unlockFloatVal = statValue
+ unlock.additionalRef = GetStatVar( statCategory, statAlias, statSubAlias )
+ unlock.additionalData.statCategory <- statCategory
+ unlock.additionalData.statAlias <- statAlias
+ unlock.additionalData.statSubAlias <- statSubAlias
+ unlock.additionalData.statVar <- GetStatVar( statCategory, statAlias, statSubAlias )
+ unlock.additionalData.statType <- GetStatVarType( statCategory, statAlias, statSubAlias )
+ unlock.additionalData.statUnlockValue <- statValue
+
+ #if SERVER
+ AddStatCallback( statCategory, statAlias, statSubAlias, StatsCallback_ItemUnlockUpdate, ref )
+ #endif
+
+ file.unlocks[ ref ] <- unlock
+ }
+}
+
+ItemData function CreateBaseItemData( int itemType, string ref, bool hidden )
+{
+ Assert( ref == ref.tolower() )
+ Assert( !(ref in file.itemData), "Already defined item ref " + ref )
+
+ GlobalItemRef globalItemRef
+ globalItemRef.ref = ref
+ globalItemRef.itemType = itemType
+ globalItemRef.hidden = hidden
+ globalItemRef.guid = StringHash( ref )
+ file.allItems.append( globalItemRef )
+ file.itemRefToGuid[ref] <- globalItemRef.guid
+ Assert( !(globalItemRef.guid in file.guidToItemRef), "duplicate hash for refs " + file.guidToItemRef[globalItemRef.guid] + " and " + ref )
+ file.guidToItemRef[globalItemRef.guid] <- ref
+
+ ItemData item
+ item.itemType = itemType
+ item.ref = ref
+ item.hidden = hidden
+
+ file.itemData[ref] <- item
+ file.itemsOfType[ itemType ].append( ref )
+
+ file.globalItemRefsOfType[ itemType ].append( globalItemRef )
+
+ return item
+}
+
+void function CreatePrimeTitanData( int itemType, string ref, string nonPrimeRef, bool hidden )
+{
+ ItemData item = CreateBaseItemData( itemType, ref, hidden )
+ item.persistenceStruct = GetItemPersistenceStruct( nonPrimeRef )
+ item.persistenceId = GetItemPersistenceId( nonPrimeRef )
+}
+
+void function CreateWeaponData( int dataTableIndex, int itemType, bool hidden, string ref, bool isDamageSource, int cost = 0 )
+{
+ #if !UI
+ #if SERVER || CLIENT
+ PrecacheWeapon( ref )
+ #endif
+ PROTO_PrecacheTrapFX( ref )
+ #endif
+
+ ItemData item = CreateBaseItemData( itemType, ref, hidden )
+ item.name = expect string( GetWeaponInfoFileKeyField_GlobalNotNull( ref, "shortprintname" ) )
+ item.longname = expect string( GetWeaponInfoFileKeyField_GlobalNotNull( ref, "printname" ) )
+ item.desc = expect string( GetWeaponInfoFileKeyField_GlobalNotNull( ref, "description" ) )
+ item.longdesc = expect string( GetWeaponInfoFileKeyField_GlobalNotNull( ref, "longdesc" ) )
+ item.cost = cost
+
+ asset image = GetWeaponInfoFileKeyFieldAsset_Global( ref, "menu_icon" )
+ if ( image == $"" )
+ image = $"ui/temp"
+
+ item.image = image
+
+ switch ( item.itemType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ string stringVal = GetWeaponInfoFileKeyField_GlobalString( ref, "menu_category" )
+ item.i.menuCategory <- MenuCategoryStringToEnumValue( stringVal )
+
+ stringVal = GetWeaponInfoFileKeyField_GlobalString( ref, "menu_anim_class" )
+ item.i.menuAnimClass <- MenuAnimClassStringToEnumValue( stringVal )
+
+ item.persistenceStruct = "pilotWeapons[" + dataTableIndex + "]"
+ break
+
+ case eItemTypes.PILOT_ORDNANCE:
+ item.persistenceStruct = "pilotOffhands[" + dataTableIndex + "]"
+ break
+ case eItemTypes.PILOT_SPECIAL:
+ item.imageAtlas = IMAGE_ATLAS_HUD
+ item.persistenceStruct = "pilotOffhands[" + dataTableIndex + "]"
+ break
+
+ case eItemTypes.TITAN_PRIMARY:
+ item.persistenceStruct = "titanWeapons[" + dataTableIndex + "]"
+ break
+
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ANTIRODEO:
+ case eItemTypes.TITAN_ORDNANCE:
+ case eItemTypes.TITAN_CORE_ABILITY:
+ item.imageAtlas = IMAGE_ATLAS_HUD
+ item.persistenceStruct = "titanOffhands[" + dataTableIndex + "]"
+ break
+ }
+
+ item.persistenceId = dataTableIndex
+
+ // some weapons are really abilities and don't have these values
+ item.i.statDamage <- int( GetWeaponInfoFileKeyField_GlobalFloat( ref, "stat_damage" ) ) // TODO: Code makes these float though everywhere expects int
+ item.i.statRange <- int( GetWeaponInfoFileKeyField_GlobalFloat( ref, "stat_range" ) )
+ item.i.statAccuracy <- int( GetWeaponInfoFileKeyField_GlobalFloat( ref, "stat_accuracy" ) )
+ item.i.statFireRate <- int( GetWeaponInfoFileKeyField_GlobalFloat( ref, "stat_rof" ) )
+ item.i.statClipSize <- GetWeaponInfoFileKeyField_GlobalInt( ref, "ammo_clip_size" )
+
+ if ( itemType != eItemTypes.NOT_LOADOUT )
+ {
+ //UpdateChallengeRewardItems( ref, null, itemType, challengeReq, challengeTier )
+
+ // Register the item itemType so the "bot_loadout" console command auto-complete
+ // knows about it. Client only. If this auto-complete breaks then the item
+ // itemType enum may be desynced between .nut and C++ source code. See Glenn.
+ //#if CLIENT
+ // RegisterItemType( itemType, ref )
+ //#endif
+
+ #if SERVER || CLIENT
+ if ( isDamageSource )
+ RegisterWeaponDamageSourceName( ref, expect string( GetWeaponInfoFileKeyField_GlobalNotNull( ref, "shortprintname" ) ) )
+ #endif
+ }
+}
+
+void function CreatePilotSuitData( int datatableIndex, int itemType, string ref, asset image, int cost = 0 )
+{
+ ItemData item = CreateBaseItemData( itemType, ref, false )
+ item.image = image
+ item.persistenceId = datatableIndex
+ item.cost = cost
+
+ #if SERVER || CLIENT
+ string setFile
+ setFile = GetSuitAndGenderBasedSetFile( ref, "race_human_male" )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( setFile, "bodymodel" ) )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( setFile, "armsmodel" ) )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( setFile, "cockpitmodel" ) )
+
+ setFile = GetSuitAndGenderBasedSetFile( ref, "race_human_female" )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( setFile, "bodymodel" ) )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( setFile, "armsmodel" ) )
+ PrecacheModel( GetPlayerSettingsAssetForClassName( setFile, "cockpitmodel" ) )
+ #endif
+}
+
+
+#if !UI
+void function PROTO_PrecacheTrapFX( ref )
+{
+ asset trapWarningFriendlyFX = GetWeaponInfoFileKeyFieldAsset_Global( ref, "trap_warning_friendly_fx" )
+ if ( trapWarningFriendlyFX != $"" )
+ PrecacheParticleSystem( trapWarningFriendlyFX )
+
+ asset trapWarningEnemyFX = GetWeaponInfoFileKeyFieldAsset_Global( ref, "trap_warning_enemy_fx" )
+ if ( trapWarningEnemyFX != $"" )
+ PrecacheParticleSystem( trapWarningEnemyFX )
+
+ var trapWarningOwnerFX = GetWeaponInfoFileKeyFieldAsset_Global( ref, "trap_warning_owner_fx" )
+ if ( trapWarningOwnerFX != $"" )
+ PrecacheParticleSystem( trapWarningOwnerFX )
+}
+#endif
+
+int function GetUnlockLevelReq( string ref )
+{
+ if ( ref in file.unlocks )
+ return file.unlocks[ ref ].unlockLevel
+
+ return 0
+}
+
+int function GetUnlockLevelReqWithParent( string ref, string parentRef = "" )
+{
+ if ( parentRef in file.unlocks )
+ {
+ if ( ref in file.unlocks[ parentRef ].child )
+ return file.unlocks[ parentRef ].child[ ref ].unlockLevel
+ }
+
+ return 0
+}
+
+bool function ItemDefined( string ref )
+{
+ return ref in file.itemData
+}
+
+ItemData function GetItemData( string ref )
+{
+ return file.itemData[ref]
+}
+
+int function GetItemType( string ref )
+{
+ return file.itemData[ref].itemType
+}
+
+int function GetItemMenuAnimClass( string ref )
+{
+ return expect int ( file.itemData[ref].i.menuAnimClass )
+}
+
+int function GetItemId( string ref )
+{
+ return file.itemRefToGuid[ref]
+}
+
+string function GetItemName( string ref )
+{
+ return file.itemData[ref].name
+}
+
+string function GetItemLongName( string ref )
+{
+ return file.itemData[ref].longname
+}
+
+string function GetItemDescription( string ref )
+{
+ return file.itemData[ref].desc
+}
+
+string function GetItemLongDescription( string ref )
+{
+ return file.itemData[ref].longdesc
+}
+
+bool function IsItemPurchasableEntitlement( string ref, string parentRef = "" )
+{
+ if ( !IsItemInEntitlementUnlock( ref, parentRef ) )
+ return false
+
+ string fullRef = GetFullRef( ref, parentRef )
+ Assert( fullRef in file.entitlementUnlocks )
+
+ if ( file.entitlementUnlocks[fullRef].purchaseData.purchaseMenu != "" )
+ return true
+
+ return false
+}
+
+float function GetStatUnlockStatVal( string ref, string parentRef = "" )
+{
+ int statType
+ string statVar
+ string statCategory
+ string statAlias
+ string statSubAlias
+ float statVal
+
+ if ( parentRef != "" )
+ {
+ ChildUnlock unlock = file.unlocks[ parentRef ].child[ref]
+ statType = expect int( unlock.additionalData.statType )
+ statVar = expect string( unlock.additionalData.statVar )
+ statCategory = expect string( unlock.additionalData.statCategory )
+ statAlias = expect string( unlock.additionalData.statAlias )
+ statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ statVal = float( unlock.unlockIntVal )
+ else
+ statVal = unlock.unlockFloatVal
+ }
+ else
+ {
+ Unlock unlock = file.unlocks[ ref ]
+ statType = expect int( unlock.additionalData.statType )
+ statVar = expect string( unlock.additionalData.statVar )
+ statCategory = expect string( unlock.additionalData.statCategory )
+ statAlias = expect string( unlock.additionalData.statAlias )
+ statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ statVal = float( unlock.unlockIntVal )
+ else
+ statVal = unlock.unlockFloatVal
+ }
+
+ return statVal
+}
+
+#if UI
+
+string function GetPurchasableEntitlementMenu( string ref, string parentRef )
+{
+ Assert ( IsItemInEntitlementUnlock( ref, parentRef ) )
+
+ string fullRef = GetFullRef( ref, parentRef )
+ Assert( fullRef in file.entitlementUnlocks )
+
+ return file.entitlementUnlocks[fullRef].purchaseData.purchaseMenu
+}
+
+string function GetItemUnlockReqText( string ref, string parentRef = "", bool alwaysShow = false )
+{
+ entity player = GetUIPlayer()
+ if ( !IsValid( player ) )
+ return ""
+
+ if ( IsItemInRandomUnlocks( ref, parentRef ) )
+ return "#UNLOCK_RANDOM"
+
+ string unlockReq = ""
+
+ int itemType = GetItemType( ref )
+ int unlockType
+ int unlockLevel
+ bool isUnlocked
+
+ if ( IsSubItemType( itemType ) )
+ {
+ isUnlocked = !IsSubItemLocked( player, ref, parentRef )
+ if ( !IsSubItemLocked( player, ref, parentRef ) && !alwaysShow )
+ return ""
+
+ if ( IsItemInEntitlementUnlock( ref, parentRef ) )
+ {
+ //if ( !isUnlocked && !DevEverythingUnlocked() )
+ // CodeWarning( ref + " needs to be hidden since it's an entitlement unlock" )
+ if ( IsItemPurchasableEntitlement( ref, parentRef ) )
+ return "#ITEM_TYPE_STORE_PURCHASE"
+ else
+ return ""
+ }
+
+ unlockType = GetSubItemUnlockType( ref, parentRef )
+ unlockLevel = GetUnlockLevelReqWithParent( ref, parentRef )
+ }
+ else
+ {
+ isUnlocked = !IsItemLocked( player, ref )
+ if ( !IsItemLocked( player, ref ) && !alwaysShow )
+ return ""
+
+ if ( IsItemInEntitlementUnlock( ref ) )
+ {
+ //if ( !isUnlocked && !DevEverythingUnlocked() )
+ //CodeWarning( ref + " needs to be hidden since it's an entitlement unlock" )
+ if ( IsItemPurchasableEntitlement( ref ) )
+ return "#ITEM_TYPE_STORE_PURCHASE"
+ else
+ return ""
+ }
+
+ unlockType = GetItemUnlockType( ref )
+ unlockLevel = GetUnlockLevelReq( ref )
+ }
+
+ switch ( unlockType )
+ {
+ case eUnlockType.PLAYER_LEVEL:
+ int gen = player.GetGen()
+ string level = PlayerXPDisplayGenAndLevelForRawLevel( unlockLevel )
+ if ( gen <= 1 && unlockLevel > GetMaxPlayerLevel() )
+ {
+ unlockReq = Localize( "#UNLOCK_PLAYER_LEVEL_REGEN" )
+ }
+ else
+ {
+ if ( isUnlocked )
+ unlockReq = Localize( "#UNLOCKED_PLAYER_LEVEL", level )
+ else
+ unlockReq = Localize( "#UNLOCK_PLAYER_LEVEL", level )
+ }
+ break
+
+ case eUnlockType.TITAN_LEVEL:
+ if ( parentRef == "" )
+ {
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ ref ].parentRef != "" )
+ parentRef = file.unlocks[ ref ].parentRef
+ }
+
+ string level = TitanGetDisplayGenAndLevelForRawLevel( unlockLevel )
+ if ( TitanGetGen( player, parentRef ) <= 1 && unlockLevel > TitanGetMaxLevel( parentRef ) )
+ {
+ unlockReq = Localize( "#UNLOCK_TITAN_LEVEL_REGEN", Localize( GetItemName( parentRef ) ) )
+ }
+ else
+ {
+ if ( isUnlocked )
+ unlockReq = Localize( "#UNLOCKED_TITAN_LEVEL", Localize( GetItemName( parentRef ) ), level )
+ else
+ unlockReq = Localize( "#UNLOCK_TITAN_LEVEL", Localize( GetItemName( parentRef ) ), level )
+ }
+
+ break
+
+ case eUnlockType.FD_UNLOCK_POINTS:
+ if ( parentRef == "" )
+ {
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ ref ].parentRef != "" )
+ parentRef = file.unlocks[ ref ].parentRef
+ }
+
+ if ( isUnlocked )
+ unlockReq = Localize( "#UNLOCKED_FD_LEVEL", Localize( GetItemName( parentRef ) ), unlockLevel )
+ else
+ unlockReq = Localize( "#UNLOCK_FD_LEVEL", Localize( GetItemName( parentRef ) ), unlockLevel )
+ break
+
+
+ case eUnlockType.WEAPON_LEVEL:
+ if ( parentRef == "" )
+ {
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ ref ].parentRef != "" )
+ parentRef = file.unlocks[ ref ].parentRef
+ }
+
+ string level = WeaponGetDisplayGenAndLevelForRawLevel( unlockLevel )
+ if ( WeaponGetGen( player, parentRef ) <= 1 && unlockLevel > WeaponGetMaxLevel( parentRef ) )
+ {
+ unlockReq = Localize( "#UNLOCK_WEAPON_LEVEL_REGEN", Localize( GetItemName( parentRef ) ) )
+ }
+ else
+ {
+ if ( isUnlocked )
+ unlockReq = Localize( "#UNLOCKED_WEAPON_LEVEL", Localize( GetItemName( parentRef ) ), level )
+ else
+ unlockReq = Localize( "#UNLOCK_WEAPON_LEVEL", Localize( GetItemName( parentRef ) ), level )
+ }
+ break
+
+ case eUnlockType.FACTION_LEVEL:
+ string level = FactionGetDisplayGenAndLevelForRawLevel( unlockLevel )
+
+ string factionRef
+ string factionName
+ if ( IsSubItemType( itemType ) )
+ factionRef = file.unlocks[ parentRef ].child[ ref ].additionalRef
+ else
+ factionRef = file.unlocks[ ref ].additionalRef
+
+ factionName = Localize( file.itemData[factionRef].name )
+ if ( FactionGetGen( player, factionRef ) <= 1 && unlockLevel > FactionGetMaxLevel( factionRef ) )
+ {
+ unlockReq = Localize( "#UNLOCK_FACTION_LEVEL_REGEN", factionName )
+ }
+ else
+ {
+ if ( isUnlocked )
+ unlockReq = Localize( "#UNLOCKED_FACTION_LEVEL", factionName, level )
+ else
+ unlockReq = Localize( "#UNLOCK_FACTION_LEVEL", factionName, level )
+ }
+ break
+
+ case eUnlockType.STAT:
+ unlockReq = GetStatUnlockReq( ref, parentRef )
+ break
+ }
+
+ return unlockReq
+}
+
+string function GetUnlockProgressText( string ref, string parentRef = "" )
+{
+ entity player = GetUIPlayer()
+ if ( !IsValid( player ) )
+ return ""
+
+ if ( IsItemInRandomUnlocks( ref, parentRef ) )
+ return ""
+
+ int itemType = GetItemType( ref )
+ int unlockType
+ int unlockLevel
+
+ if ( IsSubItemType( itemType ) )
+ {
+ if ( !IsSubItemLocked( player, ref, parentRef ) )
+ return ""
+
+ if ( IsItemInEntitlementUnlock( ref, parentRef ) )
+ return ""
+
+ unlockType = GetSubItemUnlockType( ref, parentRef )
+ unlockLevel = GetUnlockLevelReqWithParent( ref, parentRef )
+ }
+ else
+ {
+ if ( !IsItemLocked( player, ref ) )
+ return ""
+
+ if ( IsItemInEntitlementUnlock( ref ) )
+ return ""
+
+ unlockType = GetItemUnlockType( ref )
+ unlockLevel = GetUnlockLevelReq( ref )
+ }
+
+ switch ( unlockType )
+ {
+ case eUnlockType.PLAYER_LEVEL:
+ case eUnlockType.TITAN_LEVEL:
+ case eUnlockType.WEAPON_LEVEL:
+ case eUnlockType.FACTION_LEVEL:
+ return ""
+
+ case eUnlockType.STAT:
+ return GetStatUnlockProgress( ref, parentRef )
+ }
+
+ return ""
+}
+
+float function GetUnlockProgressFrac( string ref, string parentRef = "" )
+{
+ entity player = GetUIPlayer()
+ if ( !IsValid( player ) )
+ return 0.0
+
+ if ( IsItemInRandomUnlocks( ref, parentRef ) )
+ return 0.0
+
+ int itemType = GetItemType( ref )
+ int unlockType
+ int unlockLevel
+
+ if ( IsSubItemType( itemType ) )
+ {
+ if ( !IsSubItemLocked( player, ref, parentRef ) )
+ return 0.0
+
+ if ( IsItemInEntitlementUnlock( ref, parentRef ) )
+ return 0.0
+
+ unlockType = GetSubItemUnlockType( ref, parentRef )
+ unlockLevel = GetUnlockLevelReqWithParent( ref, parentRef )
+ }
+ else
+ {
+ if ( !IsItemLocked( player, ref ) )
+ return 0.0
+
+ if ( IsItemInEntitlementUnlock( ref ) )
+ return 0.0
+
+ unlockType = GetItemUnlockType( ref )
+ unlockLevel = GetUnlockLevelReq( ref )
+ }
+
+ switch ( unlockType )
+ {
+ case eUnlockType.PLAYER_LEVEL:
+ case eUnlockType.TITAN_LEVEL:
+ case eUnlockType.WEAPON_LEVEL:
+ case eUnlockType.FACTION_LEVEL:
+ return 0.0
+
+ case eUnlockType.STAT:
+ return GetStatUnlockProgressFrac( ref, parentRef )
+ }
+
+ return 0.0
+}
+
+string function GetStatUnlockProgress( string ref, string parentRef = "" )
+{
+ int statType
+ string statVar
+ string statCategory
+ string statAlias
+ string statSubAlias
+ string statValString
+ string statCurString
+
+ entity player = GetUIPlayer()
+ if ( !player )
+ return ""
+
+ if ( parentRef != "" )
+ {
+ ChildUnlock unlock = file.unlocks[ parentRef ].child[ref]
+ statType = expect int( unlock.additionalData.statType )
+ statVar = expect string( unlock.additionalData.statVar )
+ statCategory = expect string( unlock.additionalData.statCategory )
+ statAlias = expect string( unlock.additionalData.statAlias )
+ statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ {
+ statCurString = string( GetPlayerStatInt( player, statCategory, statAlias, statSubAlias ) )
+ statValString = string( unlock.unlockIntVal )
+ }
+ else
+ {
+ statCurString = format( "%.2f", GetPlayerStatFloat( player, statCategory, statAlias, statSubAlias ) )
+ statValString = string( unlock.unlockFloatVal )
+ }
+ }
+ else
+ {
+ Unlock unlock = file.unlocks[ ref ]
+ statType = expect int( unlock.additionalData.statType )
+ statVar = expect string( unlock.additionalData.statVar )
+ statCategory = expect string( unlock.additionalData.statCategory )
+ statAlias = expect string( unlock.additionalData.statAlias )
+ statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ {
+ statCurString = string( GetPlayerStatInt( player, statCategory, statAlias, statSubAlias ) )
+ statValString = string( unlock.unlockIntVal )
+ }
+ else
+ {
+ statCurString = format( "%.2f", GetPlayerStatFloat( player, statCategory, statAlias, statSubAlias ) )
+ statValString = string( unlock.unlockFloatVal )
+ }
+ }
+
+ return statCurString + " / " + statValString
+}
+
+float function GetStatUnlockProgressFrac( string ref, string parentRef = "" )
+{
+ int statType
+ string statVar
+ string statCategory
+ string statAlias
+ string statSubAlias
+
+ float statVal
+ float statCur
+
+ entity player = GetUIPlayer()
+ if ( !player )
+ return 0.0
+
+ if ( parentRef != "" )
+ {
+ ChildUnlock unlock = file.unlocks[ parentRef ].child[ref]
+ statType = expect int( unlock.additionalData.statType )
+ statVar = expect string( unlock.additionalData.statVar )
+ statCategory = expect string( unlock.additionalData.statCategory )
+ statAlias = expect string( unlock.additionalData.statAlias )
+ statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ {
+ statCur = float( GetPlayerStatInt( player, statCategory, statAlias, statSubAlias ) )
+ statVal = float( unlock.unlockIntVal )
+ }
+ else
+ {
+ statCur = GetPlayerStatFloat( player, statCategory, statAlias, statSubAlias )
+ statVal = unlock.unlockFloatVal
+ }
+ }
+ else
+ {
+ Unlock unlock = file.unlocks[ ref ]
+ statType = expect int( unlock.additionalData.statType )
+ statVar = expect string( unlock.additionalData.statVar )
+ statCategory = expect string( unlock.additionalData.statCategory )
+ statAlias = expect string( unlock.additionalData.statAlias )
+ statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ {
+ statCur = float( GetPlayerStatInt( player, statCategory, statAlias, statSubAlias ) )
+ statVal = float( unlock.unlockIntVal )
+ }
+ else
+ {
+ statCur = GetPlayerStatFloat( player, statCategory, statAlias, statSubAlias )
+ statVal = unlock.unlockFloatVal
+ }
+ }
+
+ return statCur / statVal
+}
+
+#endif
+
+#if UI || CLIENT
+string function GetStatUnlockReq( string ref, string parentRef = "" )
+{
+ int statType
+ string statVar
+ string statCategory
+ string statAlias
+ string statSubAlias
+ string statValString
+
+ if ( parentRef != "" )
+ {
+ ChildUnlock unlock = file.unlocks[ parentRef ].child[ref]
+ statType = expect int( unlock.additionalData.statType )
+ statVar = expect string( unlock.additionalData.statVar )
+ statCategory = expect string( unlock.additionalData.statCategory )
+ statAlias = expect string( unlock.additionalData.statAlias )
+ statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ statValString = string( unlock.unlockIntVal )
+ else
+ statValString = string( unlock.unlockFloatVal )
+ }
+ else
+ {
+ Unlock unlock = file.unlocks[ ref ]
+ statType = expect int( unlock.additionalData.statType )
+ statVar = expect string( unlock.additionalData.statVar )
+ statCategory = expect string( unlock.additionalData.statCategory )
+ statAlias = expect string( unlock.additionalData.statAlias )
+ statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ statValString = string( unlock.unlockIntVal )
+ else
+ statValString = string( unlock.unlockFloatVal )
+ }
+
+ string localizedUnlockBase = GetStatVarLocalizedUnlock( statCategory, statAlias, statSubAlias )
+
+ string unlockReq
+ if ( statSubAlias != "" )
+ {
+ ItemData itemData = GetItemData( statSubAlias )
+ unlockReq = Localize( localizedUnlockBase, statValString, Localize( itemData.name ) )
+ }
+ else
+ {
+ string subString
+ if ( parentRef != "" )
+ {
+ ItemData itemData = GetItemData( parentRef )
+ subString = Localize( itemData.name )
+ }
+
+ unlockReq = Localize( localizedUnlockBase, statValString, subString )
+ }
+
+ return unlockReq
+}
+#endif
+
+asset function GetItemImage( string ref )
+{
+ return file.itemData[ref].image
+}
+
+vector function GetItemImageAspect( string ref )
+{
+ vector aspectRatio = <1, 1, 0>
+
+ switch ( GetItemType( ref ) )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ case eItemTypes.PILOT_SUIT:
+ case eItemTypes.TITAN_PRIMARY:
+ case eItemTypes.BURN_METER_REWARD:
+ aspectRatio = <2, 1, 0>
+ break
+ case eItemTypes.CALLSIGN_ICON:
+ aspectRatio = <0.64, 1, 0>
+ break
+ case eItemTypes.CALLING_CARD:
+ aspectRatio = <2.25, 1, 0>
+ break
+ case eItemTypes.FEATURE:
+ if ( ref == "coliseum" ) // JFS
+ aspectRatio = <2, 1, 0>
+ else if ( "isPlaylist" in GetItemData( ref ).i ) // JFS
+ aspectRatio = <2, 1, 0>
+
+ break
+ }
+
+ return aspectRatio
+}
+
+int function GetItemCost( string ref )
+{
+ return file.itemData[ref].cost
+}
+
+int function GetItemStat( string ref, int statType )
+{
+ Assert( ref in file.itemData )
+
+ int statValue = 0
+
+ switch ( statType )
+ {
+ case eWeaponStatType.DAMAGE:
+ statValue = expect int( file.itemData[ref].i.statDamage )
+ break
+
+ case eWeaponStatType.ACCURACY:
+ statValue = expect int( file.itemData[ref].i.statAccuracy )
+ break
+
+ case eWeaponStatType.RANGE:
+ statValue = expect int( file.itemData[ref].i.statRange )
+ break
+
+ case eWeaponStatType.FIRE_RATE:
+ statValue = expect int( file.itemData[ref].i.statFireRate )
+ break
+
+ case eWeaponStatType.CAPACITY:
+ statValue = expect int( file.itemData[ref].i.statClipSize )
+ break
+ }
+
+ return statValue
+}
+
+int function GetModdedItemStat( string parentRef, string childRef, int statType )
+{
+ int defaultValue = GetItemStat( parentRef, statType )
+ if ( childRef == "none" )
+ return defaultValue
+
+ int modValue = GetSubitemStat( parentRef, childRef, statType )
+ return defaultValue + modValue
+}
+
+int function GetSubitemStat( string parentRef, string childRef, int statType )
+{
+ Assert( parentRef in file.itemData )
+
+ int statValue = 0
+
+ Assert( childRef == "none" || childRef in file.itemData[parentRef].subitems )
+ if ( !(childRef in file.itemData[parentRef].subitems) )
+ return statValue
+
+ SubItemData subItem = file.itemData[parentRef].subitems[childRef]
+
+ switch ( statType )
+ {
+ case eWeaponStatType.DAMAGE:
+ statValue = expect int( subItem.i.statDamage )
+ break
+
+ case eWeaponStatType.ACCURACY:
+ statValue = expect int( subItem.i.statAccuracy )
+ break
+
+ case eWeaponStatType.RANGE:
+ statValue = expect int( subItem.i.statRange )
+ break
+
+ case eWeaponStatType.FIRE_RATE:
+ statValue = expect int( subItem.i.statFireRate )
+ break
+
+ case eWeaponStatType.CAPACITY:
+ statValue = expect int( subItem.i.statClipSize )
+ break
+ }
+
+ return statValue
+}
+
+int function GetTitanStat( string ref, int statType )
+{
+ int statValue = 0
+
+ switch ( statType )
+ {
+ case eTitanStatType.SPEED:
+ statValue = expect int( file.itemData[ref].i.statSpeed )
+ break
+
+ case eTitanStatType.DAMAGE:
+ statValue = expect int( file.itemData[ref].i.statDamage )
+ break
+
+ case eTitanStatType.HEALTH:
+ statValue = expect int( file.itemData[ref].i.statHealth )
+ break
+
+ case eTitanStatType.DASHES:
+ statValue = expect int( file.itemData[ref].i.statDash )
+ break
+ }
+
+ return statValue
+}
+
+int function GetSubItemClipSizeStat( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ if ( !(childRef in file.itemData[parentRef].subitems) )
+ return 0
+
+ SubItemData subItem = file.itemData[parentRef].subitems[childRef]
+
+ return expect int ( subItem.i.statClipSize )
+}
+
+string function GetRefFromItem( item )
+{
+ return expect string( item.ref )
+}
+
+function SubitemDefined( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+ return (childRef in file.itemData[parentRef].subitems)
+}
+
+ItemDisplayData function GetSubitemDisplayData( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ return GetItemDisplayData( childRef, parentRef )
+}
+
+int function GetSubitemType( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ return GetItemData( parentRef ).subitems[childRef].itemType
+}
+
+int function GetSubitemId( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ return file.itemRefToGuid[childRef]
+}
+
+string function GetSubitemName( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ return GetItemData( childRef ).name
+}
+
+bool function HasSubitem( string parentRef, string childRef )
+{
+ return (childRef in file.itemData[parentRef].subitems)
+}
+
+string function GetSubitemDescription( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ return GetItemData( childRef ).desc
+}
+
+string function GetSubitemLongDescription( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ return GetItemData( childRef ).longdesc
+}
+
+asset function GetSubitemImage( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ return GetItemData( childRef ).image
+}
+
+int function GetSubitemCost( string parentRef, string childRef )
+{
+ Assert( parentRef in file.itemData )
+
+ if ( childRef == "none" )
+ return GetItemCost( parentRef )
+
+ return GetItemData( parentRef ).subitems[childRef].cost
+}
+
+array<ItemData> function GetAllItemsOfType( int itemType )
+{
+ Assert( itemType >= 0 && itemType < eItemTypes.COUNT, "Unknown item itemType " + itemType )
+
+ array<ItemData> items = []
+
+ if ( file.globalItemRefsOfType[ itemType ].len() )
+ {
+ array<GlobalItemRef> genericItemData = file.globalItemRefsOfType[ itemType ]
+ foreach ( itemData in genericItemData )
+ items.append( file.itemData[ itemData.ref ] )
+
+ return items
+ }
+
+ foreach ( ref in file.itemsOfType[ itemType ] )
+ items.append( file.itemData[ ref ] )
+
+ return items
+}
+
+array<SubItemData> function GetAllSubItemsOfType( string parentRef, int itemType )
+{
+ Assert( itemType >= 0 && itemType < eItemTypes.COUNT, "Unknown item itemType " + itemType )
+
+ array<SubItemData> items = []
+
+ ItemData parentItem = GetItemData( parentRef )
+
+ foreach ( subitem in parentItem.subitems )
+ {
+ if ( GetSubitemType( parentRef, subitem.ref ) != itemType )
+ continue
+
+ items.append( subitem )
+ }
+
+ return items
+}
+
+
+array<string> function GetAllItemRefsOfType( int itemType )
+{
+ Assert( itemType >= 0 && itemType < eItemTypes.COUNT, "Unknown item itemType " + itemType )
+ //Assert( !(itemType == eItemTypes.PILOT_PRIMARY_MOD) )
+ //Assert( !(itemType == eItemTypes.PILOT_SECONDARY_MOD) )
+ //Assert( !(itemType == eItemTypes.PILOT_PRIMARY_ATTACHMENT) )
+
+ array<string> refs = []
+
+ if ( file.globalItemRefsOfType[ itemType ].len() )
+ {
+ array<GlobalItemRef> genericItemData = file.globalItemRefsOfType[ itemType ]
+ foreach ( itemData in genericItemData )
+ refs.append( itemData.ref )
+
+ return refs
+ }
+
+ foreach ( ref in file.itemsOfType[ itemType ] )
+ refs.append( ref )
+
+ return refs
+}
+
+array<ItemDisplayData> function GetVisibleItemsOfType( int itemType, string parentRef = "", bool doSort = true )
+{
+ Assert( itemType >= 0 && itemType < eItemTypes.COUNT, "Unknown item itemType " + itemType )
+ Assert( !IsSubItemType( itemType ) || parentRef != "" )
+
+ array<ItemDisplayData> items = []
+
+ if ( file.globalItemRefsOfType[ itemType ].len() )
+ {
+ array<GlobalItemRef> genericItemData = file.globalItemRefsOfType[ itemType ]
+ foreach ( itemData in genericItemData )
+ {
+ if ( itemData.hidden )
+ continue
+
+ if ( IsSubItemType( itemType ) && !HasSubitem( parentRef, itemData.ref ) )
+ continue
+
+ items.append( GetItemDisplayData( itemData.ref, parentRef ) )
+ }
+ }
+
+ if ( doSort )
+ items.sort( SortByUnlockLevelUntyped )
+
+ return items
+}
+
+array<ItemDisplayData> function GetVisibleItemsOfTypeWithoutEntitlements( entity player, int itemType, string parentRef = "" )
+{
+ array<ItemDisplayData> items = GetVisibleItemsOfType( itemType, parentRef )
+ array<ItemDisplayData> finalItems = []
+
+ // in case the player is gone (disconnected)
+ if ( player == null )
+ {
+ return items
+ }
+
+ foreach ( item in items )
+ {
+ bool isEntitlement = IsItemInEntitlementUnlock( item.ref, item.parentRef )
+ bool locked
+ int unlockType
+
+ if ( IsItemInRandomUnlocks( item.ref, item.parentRef ) )
+ {
+ finalItems.append( item )
+ continue
+ }
+
+ if ( IsSubItemType( itemType ) )
+ {
+ locked = IsSubItemLocked( player, item.ref, item.parentRef )
+
+ if ( isEntitlement && locked && !IsItemPurchasableEntitlement( item.ref, item.parentRef ) )
+ continue
+ else if ( isEntitlement )
+ unlockType = 0 // just a whatever number
+ else
+ unlockType = GetSubItemUnlockType( item.ref, item.parentRef )
+ }
+ else
+ {
+ locked = IsItemLocked( player, item.ref )
+
+ if ( isEntitlement && locked && !IsItemPurchasableEntitlement( item.ref ) )
+ continue
+ else if ( isEntitlement )
+ unlockType = 0 // just a whatever number
+ else
+ unlockType = GetItemUnlockType( item.ref )
+ }
+
+ if ( unlockType == eUnlockType.PERSISTENT_ITEM && locked )
+ continue
+
+ finalItems.append( item )
+ }
+
+ return finalItems
+}
+
+array<ItemDisplayData> function GetVisibleItemsOfTypeForCategory( int itemType, int category )
+{
+ array<ItemDisplayData> items = GetVisibleItemsOfType( itemType )
+ array<ItemDisplayData> filteredItems
+
+ foreach ( item in items )
+ {
+ if ( item.i.menuCategory == category )
+ filteredItems.append( item )
+ }
+
+ return filteredItems
+}
+
+array<ItemDisplayData> function GetVisibleItemsOfTypeMatchingEntitlementID( int itemType, int entitlementID, string parentRef = "" )
+{
+ array<ItemDisplayData> items = GetVisibleItemsOfType( itemType, parentRef )
+ array<ItemDisplayData> filteredItems
+
+ foreach ( item in items )
+ {
+ array<int> ids = GetEntitlementIds( item.ref, parentRef )
+
+ foreach ( id in ids )
+ {
+ if ( id == entitlementID )
+ filteredItems.append( item )
+ }
+ }
+
+ return filteredItems
+}
+
+int function GetIndexForUnlockItem( int itemType, string ref )
+{
+ Assert( itemType >= 0 && itemType < eItemTypes.COUNT, "Unknown item itemType " + itemType )
+
+ array<ItemDisplayData> items = GetVisibleItemsOfType( itemType )
+ for ( int i = 0; i < items.len(); i++ )
+ {
+ if ( items[i].ref == ref )
+ return i
+ }
+
+ Assert( 0, "GetIndexForUnlockItem() failed to find ref " + ref )
+ unreachable
+}
+
+array<string> function GetAllRefsOfType( int itemType )
+{
+ return file.itemsOfType[itemType]
+}
+
+array<GlobalItemRef> function GetAllItemRefs()
+{
+ return file.allItems
+}
+
+array<string> function GetAllSubitemRefs( string parentRef )
+{
+ array<string> childRefs = []
+
+ foreach ( childRef, subItem in file.itemData[ parentRef ].subitems )
+ {
+ childRefs.append( childRef )
+ }
+
+ return childRefs
+}
+
+string function GetItemRefOfTypeByIndex( int itemType, int index )
+{
+ array<string> typeArray = file.itemsOfType[itemType]
+
+ Assert( index >= 0 && index < typeArray.len() )
+
+ return typeArray[index]
+}
+
+string function GetRandomItemRefOfType( int itemType )
+{
+ Assert( itemType >= 0 && itemType < eItemTypes.COUNT, "Unknown item itemType " + itemType )
+
+ array<string> items = GetAllRefsOfType( itemType )
+
+ return items[ rand() % items.len() ]
+}
+
+int function GetItemIndexOfTypeByRef( int itemType, string itemRef )
+{
+ int count = 0
+ foreach ( ref in file.itemsOfType[ itemType ] )
+ {
+ if ( ref == itemRef )
+ return count
+ else
+ count++
+ }
+ Assert( false, "itemRef not found in ItemType" )
+ return 0
+}
+
+
+void function CreateModData( int itemType, string parentRef, string modRef, int cost = 0, int statDamage = 0, int statAccuracy = 0, int statRange = 0, int statFireRate = 0, int statClipSize = 0 )
+{
+ Assert( parentRef in file.itemData )
+ Assert( modRef in file.itemData )
+
+ if ( itemType == eItemTypes.PILOT_PRIMARY_ATTACHMENT )
+ Assert( ItemTypeSupportsAttachments( GetItemType( parentRef ) ), "Item type was " + GetItemType( parentRef ) )
+ else
+ Assert( ItemTypeSupportsMods( GetItemType( parentRef ) ), "Item type was " + GetItemType( parentRef ) )
+ Assert( !(modRef in file.itemData[parentRef].subitems), "childRef " + modRef + " being redefined!" )
+
+ ItemData modData = GetItemData( modRef )
+
+ SubItemData subItemRef
+ subItemRef.itemType = itemType
+ subItemRef.ref = modRef
+ subItemRef.parentRef = parentRef
+ subItemRef.cost = cost
+
+ subItemRef.i.statDamage <- statDamage
+ subItemRef.i.statRange <- statRange
+ subItemRef.i.statAccuracy <- statAccuracy
+ subItemRef.i.statFireRate <- statFireRate
+ subItemRef.i.statClipSize <- statClipSize
+
+ ItemData parentItem = GetItemData( parentRef )
+ Assert( !(modRef in parentItem.subitems) )
+ parentItem.subitems[modRef] <- subItemRef
+}
+
+
+
+void function CreateGenericSubItemData( int itemType, string parentRef, string itemRef, int cost = 0, table t = {} )
+{
+ Assert( IsSubItemType( itemType ) )
+ Assert( parentRef in file.itemData )
+ Assert( itemRef in file.itemData )
+
+ ItemData baseData = GetItemData( itemRef )
+
+ SubItemData subItemRef
+ subItemRef.itemType = itemType
+ subItemRef.ref = itemRef
+ subItemRef.parentRef = parentRef
+ subItemRef.cost = cost
+ subItemRef.i = clone t
+
+ ItemData parentItem = GetItemData( parentRef )
+ Assert( !(itemRef in parentItem.subitems), "childRef " + itemRef + " being redefined!" )
+ parentItem.subitems[itemRef] <- subItemRef
+}
+
+
+ItemData function CreateGenericItem( int dataTableIndex, int itemType, string ref, string name, string desc, string longdesc, asset image, int cost, bool isHidden )
+{
+ ItemData item = CreateBaseItemData( itemType, ref, isHidden )
+ item.name = name
+ item.desc = desc
+ item.longdesc = longdesc
+ item.image = image
+ item.imageAtlas = IMAGE_ATLAS_MENU
+ item.persistenceId = dataTableIndex
+ item.cost = cost
+
+ return item
+}
+
+
+array<ItemDisplayData> function GetDisplaySubItemsOfType( string parentRef, int itemType )
+{
+ array<ItemDisplayData> subitems = []
+
+ foreach ( subItemRef, subItemData in file.itemData[ parentRef ].subitems )
+ {
+ if ( subItemData.itemType == itemType )
+ subitems.append( GetItemDisplayData( subItemRef, parentRef ) )
+ }
+
+ subitems.sort( SortByUnlockLevelUntyped ) // TODO
+
+ return subitems
+}
+
+bool function ItemSupportsAttachments( string ref )
+{
+ return (GetItemType( ref ) == eItemTypes.PILOT_PRIMARY)
+}
+
+bool function ItemSupportsAttachment( string itemRef, string childRef )
+{
+ ItemData item = GetItemData( itemRef )
+ if ( !(childRef in item.subitems ) )
+ return false
+
+ ItemData childItem = GetItemData( childRef )
+ return childItem.itemType == eItemTypes.PILOT_PRIMARY_ATTACHMENT
+}
+
+bool function ItemSupportsMods( string ref )
+{
+ local itemType = GetItemType( ref )
+
+ return (itemType == eItemTypes.PILOT_PRIMARY || itemType == eItemTypes.PILOT_SECONDARY || itemType == eItemTypes.TITAN_PRIMARY)
+}
+
+void function CreateTitanData( int dataTableIndex, string titanRef, int cost, asset image, asset coreIcon )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titanRef )
+ string setFile = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "setFile" ) )
+
+ string name = expect string( GetPlayerSettingsFieldForClassName( setFile, "printname" ) )
+ string desc = expect string( GetPlayerSettingsFieldForClassName( setFile, "description" ) )
+
+ ItemData item = CreateBaseItemData( eItemTypes.TITAN, titanRef, false )
+ item.name = name
+ item.desc = desc
+ item.longdesc = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "desc" ) )
+ item.image = image
+ item.imageAtlas = IMAGE_ATLAS_HUD
+ item.cost = cost
+
+ item.i.coreIcon <- coreIcon
+
+ item.i.statSpeed <- GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "speedDisplay" ) )
+ item.i.statHealth <- GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "healthDisplay" ) )
+ item.i.statDamage <- GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "damageDisplay" ) )
+ item.i.statDash <- GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "dashDisplay" ) )
+
+ item.i.passive1Type <- GetTitanLoadoutPropertyPassiveType( setFile, "passive1" )
+ item.i.passive2Type <- GetTitanLoadoutPropertyPassiveType( setFile, "passive2" )
+ item.i.passive3Type <- GetTitanLoadoutPropertyPassiveType( setFile, "passive3" )
+ item.i.passive4Type <- GetTitanLoadoutPropertyPassiveType( setFile, "passive4" )
+ item.i.passive5Type <- GetTitanLoadoutPropertyPassiveType( setFile, "passive5" )
+ item.i.passive6Type <- GetTitanLoadoutPropertyPassiveType( setFile, "passive6" )
+ item.i.titanExecution <- GetTitanLoadoutPropertyExecutionType( setFile, "titanExecution" )
+
+ item.persistenceStruct = "titanChassis[" + dataTableIndex + "]"
+ item.persistenceId = dataTableIndex
+}
+
+asset function GetIconForTitanClass( string titanClass )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int loadoutIconCol = GetDataTableColumnByName( dataTable, "loadoutIcon" )
+ int titanCol = GetDataTableColumnByName( dataTable, "titanRef" )
+
+ int row = GetDataTableRowMatchingStringValue( dataTable, titanCol, titanClass )
+ asset icon = GetDataTableAsset( dataTable, row, loadoutIconCol )
+
+ return icon
+}
+
+
+array<ItemDisplayData> function FD_GetUpgradesForTitanClass( string titanClass )
+{
+ array<ItemData> allUpgradeItems = GetAllItemsOfType( eItemTypes.TITAN_FD_UPGRADE )
+
+ array<ItemData> titanUpgrades
+ foreach ( ItemData item in allUpgradeItems )
+ {
+ if ( item.parentRef != titanClass )
+ continue
+
+ titanUpgrades.append( item )
+ }
+
+ titanUpgrades.sort( SortItemDataByUnlockLevel )
+
+ array<ItemDisplayData> displayUpgrades
+ foreach ( ItemData item in titanUpgrades )
+ {
+ displayUpgrades.append( GetItemDisplayData( item.ref, item.parentRef ) )
+ }
+
+ return displayUpgrades
+}
+
+
+int function SortItemDataByUnlockLevel( ItemData a, ItemData b )
+{
+ const int SORT_SAME = 0
+ const int SORT_AFTER = 1
+ const int SORT_BEFORE = -1
+
+ int aLevel = GetUnlockLevelReqWithParent( a.ref, a.parentRef )
+ int bLevel = GetUnlockLevelReqWithParent( b.ref, b.parentRef )
+
+ if ( aLevel > bLevel )
+ return SORT_AFTER
+ else if ( aLevel < bLevel )
+ return SORT_BEFORE
+ else
+ return SORT_SAME
+
+ unreachable
+}
+
+
+void function SetupFrontierDefenseItems()
+{
+ {
+ var dataTable = GetDataTable( $"datatable/titan_fd_upgrades.rpak" )
+ var numRows = GetDatatableRowCount( dataTable )
+ for ( int i = 0; i < numRows; i++ )
+ {
+ bool hidden = false
+
+ string ref = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "ref" ) )
+ string parentRef = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "parentref" ) )
+ //int itemType = eItemTypes[ GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "type" ) ) ]
+ string upgradeType = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "upgradeType" ) )
+ string name = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "name" ) )
+ string description = GetDataTableString( dataTable, i, GetDataTableColumnByName( dataTable, "description" ) )
+ asset image = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "image" ) )
+ asset lockedImage = GetDataTableAsset( dataTable, i, GetDataTableColumnByName( dataTable, "lockedImage" ) )
+ int slot = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "slot" ) )
+ int cost = GetDataTableInt( dataTable, i, GetDataTableColumnByName( dataTable, "cost" ) )
+
+ if ( IsDisabledRef( ref ) )
+ continue
+
+ CreateFDTitanUpgradeData( i, upgradeType, hidden, ref, parentRef, name, description, image, lockedImage, slot, cost )
+ //InitUnlock( ref, parentRef, eUnlockType.FD_UNLOCK_POINTS, unlockLevel )
+ }
+ }
+}
+
+void function InitFrontierDefenseUnlocks()
+{
+ {
+ var dataTable = GetDataTable( $"datatable/unlocks_fd_titan_level.rpak" )
+ int numRows = GetDatatableRowCount( dataTable )
+ int column = 1
+ while ( true )
+ {
+ string titanRef = GetDataTableString( dataTable, 0, column )
+ if ( titanRef == "END" )
+ break
+
+ if ( IsDisabledRef( titanRef ) )
+ {
+ column++
+ continue
+ }
+
+ for ( int row = 1; row < numRows; row++ )
+ {
+ string unlockField = GetDataTableString( dataTable, row, column )
+
+ array<string> unlockArray = SplitAndStripUnlockField( unlockField )
+
+ foreach ( unlock in unlockArray )
+ {
+ if ( unlock != "" )
+ InitUnlock( unlock, titanRef, eUnlockType.FD_UNLOCK_POINTS, row )
+ }
+ }
+
+ column++
+ }
+ }
+}
+
+
+void function CreateFDTitanUpgradeData( int dataTableIndex, string upgradeType, bool hidden, string ref, string parentRef, string name, string desc, asset image, asset lockedImage, int slot, int cost = 0 )
+{
+ Assert( parentRef in file.itemData )
+
+ ItemData item = CreateBaseItemData( eItemTypes.TITAN_FD_UPGRADE, ref, hidden )
+ item.name = name
+ item.longname = name
+ item.desc = desc
+ item.image = image
+ item.persistenceId = dataTableIndex
+ item.cost = cost
+ item.slot = slot
+ item.parentRef = parentRef
+ item.imageAtlas = IMAGE_ATLAS_MENU
+
+ string upgradeTypeCategory
+ if ( upgradeType == "weapon" )
+ upgradeTypeCategory = "#FD_UPGRADE_ITEM_TYPE_WEAPON"
+ else if ( upgradeType == "utility" )
+ upgradeTypeCategory = "#FD_UPGRADE_ITEM_TYPE_UTILITY"
+ else if ( upgradeType == "defensive" )
+ upgradeTypeCategory = "#FD_UPGRADE_ITEM_TYPE_DEFENSE"
+ else if ( upgradeType == "ultimate" )
+ upgradeTypeCategory = "#FD_UPGRADE_ITEM_TYPE_ULTIMATE"
+ else
+ upgradeTypeCategory = "!!FD_UPGRADE_ITEM_TYPE UNKNOWN!!"
+
+ item.i.upgradeType <- upgradeType
+ item.i.upgradeTypeCategory <- upgradeTypeCategory
+ item.i.lockedImage <- lockedImage
+
+ SubItemData subItemRef
+ subItemRef.itemType = eItemTypes.TITAN_FD_UPGRADE
+ subItemRef.ref = ref
+ subItemRef.parentRef = parentRef
+ subItemRef.cost = cost
+ subItemRef.slot = slot
+ subItemRef.i = {}
+ subItemRef.i.upgradeType <- upgradeType
+ subItemRef.i.upgradeTypeCategory <- upgradeTypeCategory
+ subItemRef.i.lockedImage <- lockedImage
+
+ ItemData parentItem = GetItemData( parentRef )
+ Assert( !(ref in parentItem.subitems), "childRef " + ref + " being redefined!" )
+ parentItem.subitems[ref] <- subItemRef
+}
+
+void function CreateTitanExecutionData( int dataTableIndex, int itemType, bool hidden, string ref, string name, string desc, string longdesc, asset image, int cost = 0, bool reqPrime = false )
+{
+ ItemData item = CreateBaseItemData( itemType, ref, hidden )
+ item.name = name
+ item.longname = name
+ item.desc = desc
+ item.longdesc = longdesc
+ item.image = image
+ item.persistenceId = dataTableIndex
+ item.cost = cost
+ item.imageAtlas = IMAGE_ATLAS_MENU
+ item.reqPrime = reqPrime
+}
+
+void function CreatePassiveData( int dataTableIndex, int itemType, bool hidden, string ref, string name, string desc, string longdesc, asset image, int cost = 0 )
+{
+ ItemData item = CreateBaseItemData( itemType, ref, hidden )
+ item.name = name
+ item.longname = name
+ item.desc = desc
+ item.longdesc = longdesc
+ item.image = image
+ item.persistenceId = dataTableIndex
+ item.cost = cost
+ item.imageAtlas = IMAGE_ATLAS_MENU
+}
+
+void function CreateNoseArtData( int dataTableIndex, int itemType, bool hidden, string ref, string name, asset image, int decalIndex )
+{
+ ItemData item = CreateBaseItemData( itemType, ref, hidden )
+ item.name = name
+ item.image = image
+ item.imageAtlas = IMAGE_ATLAS_CAMO
+
+ item.i.decalIndex <- decalIndex
+
+ item.persistenceId = dataTableIndex
+}
+
+void function CreateSkinData( int dataTableIndex, int itemType, bool hidden, string ref, string name, asset image, int skinIndex )
+{
+ ItemData item = CreateBaseItemData( itemType, ref, hidden )
+ item.name = name
+ item.image = image
+ item.imageAtlas = IMAGE_ATLAS_CAMO
+
+ item.i.skinIndex <- skinIndex
+
+ item.persistenceId = dataTableIndex
+}
+
+
+void function CreateWeaponSkinData( int dataTableIndex, int itemType, bool hidden, string ref, string weaponRef, string name, asset image, int skinIndex, int skinType )
+{
+ ItemData item = CreateBaseItemData( itemType, ref, hidden )
+ item.name = name
+ item.image = image
+ item.imageAtlas = IMAGE_ATLAS_MENU
+ item.parentRef = weaponRef
+
+ item.i.skinIndex <- skinIndex
+ item.i.skinType <- skinType
+
+ item.persistenceId = dataTableIndex
+}
+
+function ItemTypeSupportsMods( iType )
+{
+ if ( iType == eItemTypes.PILOT_PRIMARY ||
+ iType == eItemTypes.PILOT_SECONDARY ||
+ iType == eItemTypes.TITAN_PRIMARY )
+ return true
+
+ return false
+}
+
+function ItemTypeSupportsAttachments( itemType )
+{
+ if ( itemType == eItemTypes.PILOT_PRIMARY )
+ return true
+
+ return false
+}
+
+bool function IsItemTypeMod( int itemType )
+{
+ if ( itemType == eItemTypes.PILOT_PRIMARY_MOD ||
+ itemType == eItemTypes.PILOT_SECONDARY_MOD ||
+ itemType == eItemTypes.TITAN_PRIMARY_MOD )
+ return true
+
+ return false
+}
+
+bool function IsItemTypeAttachment( int itemType )
+{
+ if ( itemType == eItemTypes.PILOT_PRIMARY_ATTACHMENT )
+ return true
+
+ return false
+}
+
+bool function IsRefValid( string ref )
+{
+ if ( ItemDefined( ref ) )
+ return true
+
+ if ( ref in file.unlocks )
+ return true
+
+ if ( ref in shGlobalMP.challengeData )
+ return true
+
+ foreach ( itemType in file.itemsOfType )
+ {
+ foreach ( itemRef in itemType )
+ {
+ if ( itemRef == ref )
+ return true
+ }
+ }
+
+ return false
+}
+
+bool function IsUnlockValid( string ref, string parentRef = "" )
+{
+ if ( !IsRefValid( ref ) )
+ return false
+
+ if ( parentRef == "" )
+ {
+ if ( !( ref in file.unlocks ) )
+ return false
+ }
+ else
+ {
+ if ( !IsRefValid( parentRef ) )
+ return false
+
+ if ( !(parentRef in file.unlocks ) )
+ return false
+
+ if ( !(ref in file.unlocks[parentRef].child ) )
+ return false
+ }
+
+ return true
+}
+
+
+bool function IsSubItemLocked( entity player, string ref, string parentRef )
+{
+ if ( DevEverythingUnlocked() )
+ return false
+
+ if ( IsItemInEntitlementUnlock( ref, parentRef ) )
+ {
+ if (!IsItemLockedForEntitlement( player, ref, parentRef ) )
+ return false
+
+ return !IsSubItemOwned( player, ref, parentRef )
+ }
+
+ if ( IsItemInRandomUnlocks( ref, parentRef ) )
+ return !IsSubItemOwned( player, ref, parentRef )
+
+ Assert( IsValid( player ) )
+ Assert( !(ref in file.unlocks) )
+ Assert( parentRef in file.unlocks )
+
+ int parentRefType = GetItemType( parentRef )
+ int refType = GetSubitemType( parentRef, ref )
+
+ Assert( !IsSubItemType( parentRefType ) )
+ Assert( IsSubItemType( refType ) )
+
+ if ( IsItemLocked( player, parentRef ) )
+ return true
+
+ if ( GetSubItemUnlockType( ref, parentRef ) == eUnlockType.STAT )
+ {
+ if ( !IsSubItemLockedForStat( player, ref, parentRef) )
+ return false
+
+ return !IsSubItemOwned( player, ref, parentRef )
+ }
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ case eItemTypes.WEAPON_FEATURE:
+ if ( !IsItemLockedForWeapon( player, ref, parentRef ) )
+ return false
+
+ return !IsSubItemOwned( player, ref, parentRef )
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ if ( !IsItemLockedForTitan( player, ref, parentRef ) )
+ return false
+
+ return !IsSubItemOwned( player, ref, parentRef )
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ case eItemTypes.TITAN_WARPAINT:
+ case eItemTypes.CAMO_SKIN:
+ switch ( parentRefType )
+ {
+ case eItemTypes.TITAN:
+ if ( GetSubItemUnlockType( ref, parentRef ) == eUnlockType.TITAN_LEVEL && !IsItemLockedForTitan( player, ref, parentRef ) )
+ return false
+
+ if ( GetSubItemUnlockType( ref, parentRef ) == eUnlockType.FACTION_LEVEL && !IsItemLockedForFaction( player, ref, parentRef ) )
+ return false
+
+ return !IsSubItemOwned( player, ref, parentRef )
+
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ if ( GetSubItemUnlockType( ref, parentRef ) == eUnlockType.WEAPON_LEVEL && !IsItemLockedForWeapon( player, ref, parentRef ) )
+ return false
+
+ if ( GetSubItemUnlockType( ref, parentRef ) == eUnlockType.FACTION_LEVEL && !IsItemLockedForFaction( player, ref, parentRef ) )
+ return false
+
+ return !IsSubItemOwned( player, ref, parentRef )
+ }
+
+ case eItemTypes.TITAN_NOSE_ART:
+ if ( GetSubItemUnlockType( ref, parentRef ) == eUnlockType.TITAN_LEVEL && !IsItemLockedForTitan( player, ref, parentRef ) )
+ return false
+
+ if ( GetSubItemUnlockType( ref, parentRef ) == eUnlockType.FACTION_LEVEL && !IsItemLockedForFaction( player, ref, parentRef ) )
+ return false
+
+ return !IsSubItemOwned( player, ref, parentRef )
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ if ( GetSubItemUnlockType( ref, parentRef ) == eUnlockType.FD_UNLOCK_POINTS && !IsItemLockedForFrontierDefense( player, ref, parentRef ) )
+ return false
+
+ return !IsSubItemOwned( player, ref, parentRef )
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ unreachable //Show have been caught IsItemInEntitlementUnlock() check earlier
+
+ default:
+ CodeWarning( "Unhandled unlock type (subitem): " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref + " " + parentRef )
+ }
+
+ return false
+}
+
+
+bool function IsItemLocked( entity player, string ref )
+{
+ if ( DevEverythingUnlocked() )
+ return false
+
+ if ( IsItemInEntitlementUnlock( ref ) )
+ {
+ if ( !IsItemLockedForEntitlement( player, ref ) )
+ return false
+
+ return !IsItemOwned( player, ref )
+ }
+
+ if ( IsItemInRandomUnlocks( ref ) )
+ return !IsItemOwned( player, ref )
+
+ Assert( IsValid( player ) )
+ Assert( ref in file.unlocks, "ref not found: " + ref )
+
+ if ( !ItemDefined( ref ) )
+ {
+ CodeWarning( "undefined item? " + ref )
+ return false
+ }
+
+ ItemData itemData = GetItemData( ref )
+ Assert( !IsSubItemType( itemData.itemType ) )
+
+ switch ( file.unlocks[ref].unlockType )
+ {
+ case eUnlockType.PLAYER_LEVEL:
+ if ( !IsItemLockedForPlayer( player, ref ) )
+ return false
+ break
+
+ case eUnlockType.WEAPON_LEVEL:
+ Assert( file.unlocks[ref].parentRef != "" )
+ if ( !IsItemLockedForWeapon( player, ref, file.unlocks[ref].parentRef ) )
+ return false
+ break
+
+ case eUnlockType.TITAN_LEVEL:
+ if ( !IsItemLockedForTitan( player, ref, file.unlocks[ref].parentRef ) )
+ return false
+ break
+
+ case eUnlockType.FACTION_LEVEL:
+ if ( !IsItemLockedForFaction( player, ref, file.unlocks[ref].parentRef ) )
+ return false
+ break
+
+ case eUnlockType.STAT:
+ if ( !IsItemLockedForStat( player, ref ) )
+ return false
+ break
+
+ case eUnlockType.FD_UNLOCK_POINTS:
+ if ( !IsItemLockedForFrontierDefense( player, ref, file.unlocks[ref].parentRef ) )
+ return false
+ break
+ }
+ //Assert( file.unlocks[ref].unlockType == eUnlockType.PLAYER_LEVEL, "Non subitem types must be unlocked via player level." )
+
+
+ return !IsItemOwned( player, ref )
+}
+
+
+bool function IsItemLockedForEntitlement( entity player, string ref, string parentRef = "" )
+{
+ string fullRef = GetFullRef( ref, parentRef )
+
+ foreach ( int entitlementId in file.entitlementUnlocks[fullRef].entitlementIds )
+ {
+ //printt( "entitlement check", fullRef, entitlementId )
+ #if SERVER
+ if ( player.HasEntitlement( entitlementId ) )
+ return false
+ #else
+ if ( LocalPlayerHasEntitlement( entitlementId ) )
+ return false
+ #endif
+ }
+
+ return true
+}
+
+
+
+bool function IsSubItemOwned( entity player, string ref, string parentRef )
+{
+ if ( DevEverythingUnlocked() )
+ return false
+
+ Assert( IsValid( player ) )
+
+ if ( !ItemDefined( ref ) )
+ {
+ CodeWarning( "undefined item? " + ref )
+ return false
+ }
+
+ int parentRefType = GetItemType( parentRef )
+ int refType = GetSubitemType( parentRef, ref )
+
+ Assert( !IsSubItemType( parentRefType ) )
+ Assert( IsSubItemType( refType ) )
+
+ int bitIndex = GetItemPersistenceId( ref, parentRef )
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedMods", bitIndex )
+
+ case eItemTypes.WEAPON_FEATURE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedFeatures", bitIndex )
+
+ case eItemTypes.WEAPON_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedPrimeWeaponSkins", bitIndex )
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedPassives", bitIndex )
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedSkins", bitIndex )
+
+ case eItemTypes.TITAN_WARPAINT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedPrimeSkins", bitIndex )
+
+ case eItemTypes.CAMO_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedWeaponSkins", bitIndex )
+
+ case eItemTypes.TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedTitanDecals", bitIndex )
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedPrimeTitanDecals", bitIndex )
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsPersistenceBitSet( player, parentStruct + ".unlockedFDUpgrades", bitIndex )
+
+ default:
+ CodeWarning( "Unhandled owned type (subitem): " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref + " " + parentRef )
+ }
+
+ return false
+}
+
+
+bool function IsItemOwned( entity player, string ref )
+{
+ if ( DevEverythingUnlocked() )
+ return false
+
+ Assert( IsValid( player ) )
+
+ if ( !ItemDefined( ref ) )
+ {
+ CodeWarning( "undefined item? " + ref )
+ return false
+ }
+
+ ItemData itemData = GetItemData( ref )
+ Assert( !IsSubItemType( itemData.itemType ) )
+
+ int refType = GetItemType( ref )
+ int bitIndex = GetItemPersistenceId( ref )
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ return IsPersistenceBitSet( player, "unlockedPilotWeapons", bitIndex )
+
+ case eItemTypes.PILOT_SPECIAL:
+ case eItemTypes.PILOT_ORDNANCE:
+ return IsPersistenceBitSet( player, "unlockedPilotOffhands", bitIndex )
+
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ return IsPersistenceBitSet( player, "unlockedPilotPassives", bitIndex )
+
+ case eItemTypes.PILOT_SUIT:
+ return IsPersistenceBitSet( player, "unlockedPilotSuits", bitIndex )
+
+ case eItemTypes.PILOT_EXECUTION:
+ return IsPersistenceBitSet( player, "unlockedPilotExecutions", bitIndex )
+
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ return IsPersistenceBitSet( player, "unlockedTitanExecutions", bitIndex )
+
+ case eItemTypes.TITAN_PRIMARY:
+ return IsPersistenceBitSet( player, "unlockedTitanWeapons", bitIndex )
+
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ORDNANCE:
+ case eItemTypes.TITAN_ANTIRODEO:
+ return IsPersistenceBitSet( player, "unlockedTitanOffhands", bitIndex )
+
+ case eItemTypes.TITAN:
+ return IsPersistenceBitSet( player, "unlockedTitanChassis", bitIndex )
+
+ case eItemTypes.PRIME_TITAN:
+ return IsPersistenceBitSet( player, "unlockedPrimeTitans", bitIndex )
+
+ case eItemTypes.FEATURE:
+ return IsPersistenceBitSet( player, "unlockedFeatures", bitIndex )
+
+ case eItemTypes.CAMO_SKIN_PILOT:
+ return IsPersistenceBitSet( player, "unlockedPilotSkins", bitIndex )
+
+ case eItemTypes.BURN_METER_REWARD:
+ return IsPersistenceBitSet( player, "unlockedBoosts", bitIndex )
+
+ case eItemTypes.FACTION:
+ return IsPersistenceBitSet( player, "unlockedFactions", bitIndex )
+
+ case eItemTypes.CALLING_CARD:
+ return IsPersistenceBitSet( player, "unlockedCallingCards", bitIndex )
+
+ case eItemTypes.CALLSIGN_ICON:
+ return IsPersistenceBitSet( player, "unlockedCallsignIcons", bitIndex )
+
+ case eItemTypes.COMMS_ICON:
+ return IsPersistenceBitSet( player, "unlockedCommsIcons", bitIndex )
+
+ default:
+ CodeWarning( "Unhandled owned type: " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref )
+ }
+
+ return false
+}
+
+int function GetItemUnlockType( string ref )
+{
+ Assert( ref in file.unlocks )
+
+ return file.unlocks[ ref ].unlockType
+}
+
+int function GetSubItemUnlockType( string ref, string parentRef )
+{
+ Assert( parentRef in file.unlocks )
+ Assert( ref in file.unlocks[ parentRef ].child )
+
+ return file.unlocks[ parentRef ].child[ ref ].unlockType
+}
+
+bool function IsItemLockedForTitanLevel( int titanLevel, string ref, string parentRef = "" )
+{
+ Assert( parentRef in file.unlocks )
+
+ if ( IsSubItemType( GetItemType( ref ) ) )
+ {
+ Assert( ref in file.unlocks[ parentRef ].child )
+ Assert( file.unlocks[ parentRef ].child[ ref ].unlockType == eUnlockType.TITAN_LEVEL )
+
+ return titanLevel < file.unlocks[ parentRef ].child[ ref ].unlockLevel
+ }
+ else
+ {
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ref].parentRef == parentRef )
+ Assert( file.unlocks[ ref ].unlockType == eUnlockType.TITAN_LEVEL )
+
+ return titanLevel < file.unlocks[ ref ].unlockLevel
+ }
+
+ unreachable
+}
+
+
+bool function IsItemLockedForWeaponLevel( int weaponLevel, string ref, string parentRef = "" )
+{
+ Assert( parentRef in file.unlocks )
+
+ if ( IsSubItemType( GetItemType( ref ) ) )
+ {
+ Assert( ref in file.unlocks[ parentRef ].child )
+ Assert( file.unlocks[ parentRef ].child[ ref ].unlockType == eUnlockType.WEAPON_LEVEL )
+
+ return weaponLevel < file.unlocks[ parentRef ].child[ ref ].unlockLevel
+ }
+ else
+ {
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ref].parentRef == parentRef )
+ Assert( file.unlocks[ ref ].unlockType == eUnlockType.WEAPON_LEVEL )
+
+ return weaponLevel < file.unlocks[ ref ].unlockLevel
+ }
+
+ unreachable
+}
+
+bool function IsItemLockedForFDTitanLevel( int titanLevel, string ref, string parentRef = "" )
+{
+ Assert( parentRef in file.unlocks )
+
+ if ( IsSubItemType( GetItemType( ref ) ) )
+ {
+ Assert( ref in file.unlocks[ parentRef ].child )
+ Assert( file.unlocks[ parentRef ].child[ ref ].unlockType == eUnlockType.FD_UNLOCK_POINTS )
+
+ return titanLevel < file.unlocks[ parentRef ].child[ ref ].unlockLevel
+ }
+ else
+ {
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ref].parentRef == parentRef )
+ Assert( file.unlocks[ ref ].unlockType == eUnlockType.FD_UNLOCK_POINTS )
+
+ return titanLevel < file.unlocks[ ref ].unlockLevel
+ }
+
+ unreachable
+}
+
+
+bool function IsItemLockedForFactionLevel( int factionLevel, string faction, string ref, string parentRef = "" )
+{
+ if ( IsSubItemType( GetItemType( ref ) ) )
+ {
+ Assert( ref in file.unlocks[ parentRef ].child )
+ Assert( file.unlocks[ parentRef ].child[ ref ].unlockType == eUnlockType.FACTION_LEVEL )
+
+ if ( file.unlocks[ parentRef ].child[ ref ].additionalRef != faction )
+ return false
+
+ return factionLevel < file.unlocks[ parentRef ].child[ ref ].unlockLevel
+ }
+ else
+ {
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ref].parentRef == parentRef )
+ Assert( file.unlocks[ ref ].unlockType == eUnlockType.FACTION_LEVEL )
+
+ if ( file.unlocks[ ref ].additionalRef != faction )
+ return false
+
+ return factionLevel < file.unlocks[ ref ].unlockLevel
+ }
+
+ unreachable
+}
+
+bool function IsItemLockedForPlayerLevel( int playerLevel, string ref )
+{
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ ref ].unlockType == eUnlockType.PLAYER_LEVEL )
+
+ return (playerLevel < file.unlocks[ ref ].unlockLevel)
+}
+
+bool function IsItemLockedForFrontierDefense( entity player, string ref, string parentRef )
+{
+ return IsItemLockedForFDTitanLevel( FD_TitanGetRawLevel( player, parentRef ), ref, parentRef )
+}
+
+bool function IsItemLockedForTitan( entity player, string ref, string parentRef )
+{
+ return IsItemLockedForTitanLevel( TitanGetRawLevel( player, parentRef ), ref, parentRef )
+}
+
+
+bool function IsItemLockedForWeapon( entity player, string ref, string parentRef )
+{
+ return IsItemLockedForWeaponLevel( WeaponGetRawLevel( player, parentRef ), ref, parentRef )
+}
+
+bool function IsItemLockedForFaction( entity player, string ref, string parentRef )
+{
+ int enumCount = PersistenceGetEnumCount( "faction" )
+ for ( int i = 0; i < enumCount; i++ )
+ {
+ string faction = PersistenceGetEnumItemNameForIndex( "faction", i )
+ if ( faction == "" )
+ continue
+
+ if ( IsItemLockedForFactionLevel( FactionGetRawLevel( player, faction ), faction, ref, parentRef ) )
+ return true
+ }
+
+ return false
+}
+
+bool function IsItemLockedForPlayer( entity player, string ref )
+{
+ int rawLevel = GetUnlockLevelReq( ref )
+
+ if ( rawLevel > GetMaxPlayerLevel() || ItemLockedShouldUseRawLevel( ref ) )
+ {
+ int playerGen = player.GetGen()
+ int rawPlayerLevel = (playerGen - 1) * GetMaxPlayerLevel() + player.GetLevel()
+ return IsItemLockedForPlayerLevel( rawPlayerLevel, ref )
+ }
+ else
+ {
+ return IsItemLockedForPlayerLevel( player.GetLevel(), ref )
+ }
+
+ unreachable
+}
+
+bool function ItemLockedShouldUseRawLevel( string ref )
+{
+ int refType = GetItemType( ref )
+
+ bool shouldUseRawLevel = true
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ case eItemTypes.PILOT_SPECIAL:
+ case eItemTypes.PILOT_ORDNANCE:
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ case eItemTypes.TITAN_PRIMARY:
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ANTIRODEO:
+ case eItemTypes.TITAN_ORDNANCE:
+ case eItemTypes.TITAN_PRIMARY_MOD:
+ case eItemTypes.TITAN_OS:
+ case eItemTypes.RACE:
+ case eItemTypes.NOT_LOADOUT:
+ case eItemTypes.PILOT_SUIT:
+ case eItemTypes.TITAN_CORE_ABILITY:
+ case eItemTypes.BURN_METER_REWARD:
+ case eItemTypes.PILOT_MELEE:
+ case eItemTypes.TITAN:
+ case eItemTypes.PRIME_TITAN:
+ case eItemTypes.FEATURE:
+ case eItemTypes.WEAPON_FEATURE:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ case eItemTypes.FACTION:
+ case eItemTypes.PILOT_EXECUTION:
+ case eItemTypes.TITAN_FD_UPGRADE:
+ shouldUseRawLevel = false
+ }
+
+ return shouldUseRawLevel
+}
+
+bool function IsItemLockedForStat( entity player, string ref )
+{
+ Assert( ref in file.unlocks )
+ Assert( file.unlocks[ ref ].unlockType == eUnlockType.STAT )
+
+ Unlock unlock = file.unlocks[ ref ]
+ int statType = expect int( unlock.additionalData.statType )
+ string statCategory = expect string( unlock.additionalData.statCategory )
+ string statAlias = expect string( unlock.additionalData.statAlias )
+ string statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ return ( GetPlayerStatInt( player, statCategory, statAlias, statSubAlias ) < unlock.unlockIntVal )
+ else
+ return ( GetPlayerStatFloat( player, statCategory, statAlias, statSubAlias ) < unlock.unlockFloatVal )
+
+ unreachable
+}
+
+
+bool function IsSubItemLockedForStat( entity player, string ref, string parentRef )
+{
+ Assert( parentRef in file.unlocks )
+ Assert( ref in file.unlocks[parentRef].child )
+ Assert( file.unlocks[ parentRef ].child[ref].unlockType == eUnlockType.STAT )
+
+ ChildUnlock unlock = file.unlocks[ parentRef ].child[ref]
+ int statType = expect int( unlock.additionalData.statType )
+ string statCategory = expect string( unlock.additionalData.statCategory )
+ string statAlias = expect string( unlock.additionalData.statAlias )
+ string statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ return ( GetPlayerStatInt( player, statCategory, statAlias, statSubAlias ) < unlock.unlockIntVal )
+ else
+ return ( GetPlayerStatFloat( player, statCategory, statAlias, statSubAlias ) < unlock.unlockFloatVal )
+
+ unreachable
+}
+
+
+
+int function GetItemPersistenceId( string ref, string parentRef = "" )
+{
+ Assert( ref in file.itemData )
+ return file.itemData[ref].persistenceId
+}
+
+
+string function GetItemPersistenceStruct( string ref )
+{
+ Assert( ref in file.itemData )
+ return file.itemData[ref].persistenceStruct
+}
+
+ItemData ornull function GetItemFromPersistenceStruct( string persistenceStruct )
+{
+ if ( !( persistenceStruct in file.itemsWithPersistenceStruct ) )
+ return null // arrays in persistence may be bigger than the data loaded so persistenceStruct may not exist
+
+ return file.itemsWithPersistenceStruct[ persistenceStruct ]
+}
+
+bool function IsItemNew( entity player, string ref, string parentRef = "" )
+{
+ Assert( IsValid( player ) )
+
+ ItemData itemData = GetItemData( ref )
+ int refType = itemData.itemType
+
+ if ( !IsSubItemType( refType ) )
+ {
+ int bitIndex = GetItemPersistenceId( ref )
+ string persistenceVar
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ persistenceVar = "newPilotWeapons"
+ break
+
+ case eItemTypes.PILOT_SPECIAL:
+ case eItemTypes.PILOT_ORDNANCE:
+ persistenceVar = "newPilotOffhands"
+ break
+
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ persistenceVar = "newPilotPassives"
+ break
+
+ case eItemTypes.PILOT_SUIT:
+ persistenceVar = "newPilotSuits"
+ break
+
+ case eItemTypes.PILOT_EXECUTION:
+ persistenceVar = "newPilotExecutions"
+ break
+
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ persistenceVar = "newTitanExecutions"
+ break
+
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ORDNANCE:
+ case eItemTypes.TITAN_ANTIRODEO:
+ persistenceVar = "newTitanOffhands"
+ break
+
+ case eItemTypes.TITAN:
+ persistenceVar = "newTitanChassis"
+ break
+
+ case eItemTypes.PRIME_TITAN:
+ persistenceVar = "newPrimeTitans"
+ break
+
+ case eItemTypes.FEATURE:
+ persistenceVar = "newFeatures"
+ break
+
+ case eItemTypes.CAMO_SKIN_PILOT:
+ persistenceVar = "newPilotSkins"
+ break
+
+ case eItemTypes.BURN_METER_REWARD:
+ persistenceVar = "newBoosts"
+ break
+
+ case eItemTypes.FACTION:
+ persistenceVar = "newFactions"
+ break
+
+ case eItemTypes.CALLING_CARD:
+ persistenceVar = "newCallingCards"
+ break
+
+ case eItemTypes.CALLSIGN_ICON:
+ persistenceVar = "newCallsignIcons"
+ break
+
+ case eItemTypes.COMMS_ICON:
+ persistenceVar = "newCommsIcons"
+ break
+
+ default:
+ CodeWarning( "Unhandled new type: " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref )
+ }
+
+ if ( persistenceVar != "" )
+ {
+ #if UI
+ return IsCachedPersistenceBitSet( persistenceVar, bitIndex )
+ #endif
+ return IsPersistenceBitSet( player, persistenceVar, bitIndex )
+ }
+ }
+ else
+ {
+ if ( IsItemLocked( player, parentRef ) )
+ return false
+
+ int bitIndex = GetItemPersistenceId( ref, parentRef )
+ string persistenceVar
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newMods"
+ break
+
+ case eItemTypes.WEAPON_FEATURE:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newFeatures"
+ break
+
+ case eItemTypes.WEAPON_SKIN:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newPrimeWeaponSkins"
+ break
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newPassives"
+ break
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newSkins"
+ break
+
+ case eItemTypes.TITAN_WARPAINT:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newPrimeSkins" //TODO: This is actually warpaints. Rename next game
+ break
+
+ case eItemTypes.CAMO_SKIN:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newWeaponSkins"
+ break
+
+ case eItemTypes.TITAN_NOSE_ART:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newTitanDecals"
+ break
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newPrimeTitanDecals"
+ break
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ persistenceVar = GetItemPersistenceStruct( parentRef ) + ".newFDUpgrades"
+ break
+
+ default:
+ CodeWarning( "Unhandled new type (subitem) 1: " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref + " " + parentRef )
+ }
+
+ #if UI
+ return IsCachedPersistenceBitSet( persistenceVar, bitIndex )
+ #endif
+ return IsPersistenceBitSet( player, persistenceVar, bitIndex )
+ }
+
+ unreachable
+}
+
+#if UI
+void function UpdateCachedNewItems()
+{
+ if ( !uiGlobal.updateCachedNewItems )
+ {
+ uiGlobal.updateCachedNewItems = true
+ return
+ }
+
+ file.cachedNewItems.clear()
+
+ UpdateCachedNewItemsStruct( "pilotWeapons", "newMods" )
+ UpdateCachedNewItemsStruct( "pilotWeapons", "newWeaponSkins" )
+ UpdateCachedNewItemsStruct( "pilotWeapons", "newPrimeWeaponSkins" )
+ UpdateCachedNewItemsStruct( "pilotWeapons", "newFeatures" )
+ UpdateCachedNewItemsStruct( "titanChassis", "newPassives" )
+ UpdateCachedNewItemsStruct( "titanChassis", "newSkins" )
+ UpdateCachedNewItemsStruct( "titanChassis", "newPrimeSkins" ) //TODO: This is actually WarPaint, rename next game.
+ UpdateCachedNewItemsStruct( "titanChassis", "newWeaponSkins" )
+ UpdateCachedNewItemsStruct( "titanChassis", "newTitanDecals" )
+ UpdateCachedNewItemsStruct( "titanChassis", "newPrimeTitanDecals" )
+ UpdateCachedNewItemsStruct( "titanChassis", "newFDUpgrades" )
+ UpdateCachedNewItemsArray( "newPilotSkins" )
+ UpdateCachedNewItemsArray( "newPilotWeapons" )
+ UpdateCachedNewItemsArray( "newPilotOffhands" )
+ UpdateCachedNewItemsArray( "newPilotPassives" )
+ UpdateCachedNewItemsArray( "newTitanOffhands" )
+ UpdateCachedNewItemsArray( "newTitanPassives" )
+ UpdateCachedNewItemsArray( "newTitanChassis" )
+ UpdateCachedNewItemsArray( "newPrimeTitans" )
+ UpdateCachedNewItemsArray( "newPilotSuits" )
+ UpdateCachedNewItemsArray( "newPilotExecutions" )
+ UpdateCachedNewItemsArray( "newTitanExecutions" )
+ UpdateCachedNewItemsArray( "newFeatures" )
+ UpdateCachedNewItemsArray( "newBoosts" )
+ UpdateCachedNewItemsArray( "newFactions" )
+ UpdateCachedNewItemsArray( "newCallingCards" )
+ UpdateCachedNewItemsArray( "newCallsignIcons" )
+ UpdateCachedNewItemsArray( "newCommsIcons" )
+}
+
+int function GetCachedNewItemsVar( string persistenceVar )
+{
+ return file.cachedNewItems[ persistenceVar ]
+}
+
+void function SetCachedPersistenceBitfield( string persistenceVar, int bitIndex, int value )
+{
+ Assert( value == 0 || value == 1 )
+
+ int arrayIndex = bitIndex / 32;
+ int bitOffset = bitIndex % 32;
+
+ int decimalValue = 1 << bitOffset
+
+ persistenceVar = persistenceVar + "[" + arrayIndex + "]"
+
+ int currentVal = file.cachedNewItems[ persistenceVar ]
+ if ( value == 0 )
+ file.cachedNewItems[ persistenceVar ] = currentVal & ~decimalValue
+ else
+ file.cachedNewItems[ persistenceVar ] = currentVal | decimalValue
+
+ //printt( "file.cachedNewItems[ " + persistenceVar + " ] bitIndex:" + bitIndex + " val:" + value )
+}
+
+bool function IsCachedPersistenceBitSet( string persistenceVar, int bitIndex )
+{
+ int arrayIndex = bitIndex / 32;
+ int bitOffset = bitIndex % 32;
+
+ int decimalValue = 1 << bitOffset
+
+ persistenceVar = persistenceVar + "[" + arrayIndex + "]"
+
+ //printt( "IsCachedPersistenceBitSet( " + persistenceVar + ", " + bitIndex + " ) " + ( ( file.cachedNewItems[ persistenceVar ] & decimalValue ) != 0 ) )
+
+ Assert( arrayIndex < PersistenceGetArrayCount( persistenceVar ), "Need to increase the array size of the persistenceVar " + persistenceVar )
+
+ return ( ( file.cachedNewItems[ persistenceVar ] & decimalValue ) != 0 )
+}
+
+void function UpdateCachedNewItemsArray( string arrayVar )
+{
+ int arrayCount = PersistenceGetArrayCount( arrayVar )
+ for ( int i = 0; i < arrayCount; i++ )
+ {
+ string persistenceVar = arrayVar + "[" + i + "]"
+ file.cachedNewItems[ persistenceVar ] <- GetPersistentVarAsInt( persistenceVar )
+ }
+}
+
+void function UpdateCachedNewItemsStruct( string newStruct, string structVar )
+{
+ int newStructArrayCount = PersistenceGetArrayCount( newStruct )
+ for ( int i = 0; i < newStructArrayCount; i++ )
+ {
+ string arrayVar = newStruct + "[" + i + "]." + structVar
+
+ int structVarArrayCount = PersistenceGetArrayCount( arrayVar )
+ for ( int j = 0; j < structVarArrayCount; j++ )
+ {
+ string persistenceVar = arrayVar + "[" + j + "]"
+ file.cachedNewItems[ persistenceVar ] <- GetPersistentVarAsInt( persistenceVar )
+ }
+ }
+}
+
+void function ClearNewStatus( var button, string ref, string parentRef = "" )
+{
+ if ( ref == "" || ref == "none" )
+ return
+
+ Assert( parentRef == "" || ( parentRef != "" && IsSubItemType( GetItemType( ref ) ) ) )
+
+ if ( button != null )
+ Hud_SetNew( button, false )
+
+ ItemData itemData = GetItemData( ref )
+ int refType = itemData.itemType
+
+ if ( !IsSubItemType( refType ) )
+ {
+ int bitIndex = GetItemPersistenceId( ref )
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ SetCachedPersistenceBitfield( "newPilotWeapons", bitIndex, 0 )
+ break
+
+ case eItemTypes.PILOT_SPECIAL:
+ case eItemTypes.PILOT_ORDNANCE:
+ SetCachedPersistenceBitfield( "newPilotOffhands", bitIndex, 0 )
+ break
+
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ SetCachedPersistenceBitfield( "newPilotPassives", bitIndex, 0 )
+ break
+
+ case eItemTypes.PILOT_SUIT:
+ SetCachedPersistenceBitfield( "newPilotSuits", bitIndex, 0 )
+ break
+
+ case eItemTypes.PILOT_EXECUTION:
+ SetCachedPersistenceBitfield( "newPilotExecutions", bitIndex, 0 )
+ break
+
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ SetCachedPersistenceBitfield( "newTitanExecutions", bitIndex, 0 )
+ break
+
+
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ORDNANCE:
+ SetCachedPersistenceBitfield( "newTitanOffhands", bitIndex, 0 )
+ break
+
+ case eItemTypes.TITAN:
+ SetCachedPersistenceBitfield( "newTitanChassis", bitIndex, 0 )
+ break
+
+ case eItemTypes.PRIME_TITAN:
+ SetCachedPersistenceBitfield( "newPrimeTitans", bitIndex, 0 )
+ break
+
+ case eItemTypes.FEATURE:
+ SetCachedPersistenceBitfield( "newFeatures", bitIndex, 0 )
+ break
+
+ case eItemTypes.CAMO_SKIN_PILOT:
+ SetCachedPersistenceBitfield( "newPilotSkins", bitIndex, 0 )
+ break
+
+ case eItemTypes.BURN_METER_REWARD:
+ SetCachedPersistenceBitfield( "newBoosts", bitIndex, 0 )
+ break
+
+ case eItemTypes.FACTION:
+ SetCachedPersistenceBitfield( "newFactions", bitIndex, 0 )
+ break
+
+ case eItemTypes.CALLING_CARD:
+ SetCachedPersistenceBitfield( "newCallingCards", bitIndex, 0 )
+ break
+
+ case eItemTypes.CALLSIGN_ICON:
+ SetCachedPersistenceBitfield( "newCallsignIcons", bitIndex, 0 )
+ break
+
+ case eItemTypes.COMMS_ICON:
+ SetCachedPersistenceBitfield( "newCommsIcons", bitIndex, 0 )
+ break
+
+ default:
+ CodeWarning( "Unhandled ClearNewStatus type: " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref )
+ }
+ }
+ else
+ {
+ int bitIndex = GetItemPersistenceId( ref, parentRef )
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newMods", bitIndex, 0 )
+ break
+
+ case eItemTypes.WEAPON_FEATURE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newFeatures", bitIndex, 0 )
+ break
+
+ case eItemTypes.WEAPON_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newPrimeWeaponSkins", bitIndex, 0 )
+ break
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newPassives", bitIndex, 0 )
+ break
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newSkins", bitIndex, 0 )
+ break
+
+ case eItemTypes.TITAN_WARPAINT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newPrimeSkins", bitIndex, 0 ) //TODO: This is actually WarPaint, rename next game.
+ break
+
+ case eItemTypes.CAMO_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newWeaponSkins", bitIndex, 0 )
+ break
+
+ case eItemTypes.TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newTitanDecals", bitIndex, 0 )
+ break
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newPrimeTitanDecals", bitIndex, 0 )
+ break
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetCachedPersistenceBitfield( parentStruct + ".newFDUpgrades", bitIndex, 0 )
+ break
+
+ default:
+ CodeWarning( "Unhandled ClearNewStatus type (subitem): " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref + " " + parentRef )
+ }
+ }
+
+ ClientCommand( "ClearNewStatus " + ref + " " + parentRef )
+}
+
+bool function HasAnyNewPilotLoadout( entity player )
+{
+ for ( int i = 1; i <= 10; i++ )
+ {
+ if ( IsItemNew( player, "pilot_loadout_" + i ) )
+ return true
+
+ PilotLoadoutDef loadout = GetCachedPilotLoadout( i - 1 )
+ if ( loadout.primary != "" && RefHasAnyNewSubitem( player, loadout.primary ) )
+ return true
+
+ if ( loadout.secondary != "" && RefHasAnyNewSubitem( player, loadout.secondary ) )
+ return true
+
+ if ( loadout.weapon3 != "" && RefHasAnyNewSubitem( player, loadout.weapon3 ) )
+ return true
+ }
+
+ return false
+}
+
+bool function HasAnyNewPilotItems( entity player )
+{
+ if ( HasAnyNewItemOfType( player, eItemTypes.PILOT_PRIMARY ) ||
+ HasAnyNewItemOfType( player, eItemTypes.PILOT_SECONDARY ) ||
+ HasAnyNewItemOfType( player, eItemTypes.PILOT_ORDNANCE ) ||
+ HasAnyNewItemOfType( player, eItemTypes.PILOT_PASSIVE1 ) ||
+ HasAnyNewItemOfType( player, eItemTypes.PILOT_PASSIVE2 ) ||
+ HasAnyNewItemOfType( player, eItemTypes.PILOT_SUIT ) ||
+ HasAnyNewItemOfType( player, eItemTypes.PILOT_EXECUTION ) ||
+ HasAnyNewItemOfType( player, eItemTypes.CAMO_SKIN_PILOT ) ||
+ HasAnyNewPilotLoadout( player ) )
+ return true
+
+ return false
+}
+
+bool function HasAnyNewTitanItems( entity player )
+{
+ if ( HasAnyNewItemOfType( player, eItemTypes.TITAN ) ||
+ HasAnyNewItemOfType( player, eItemTypes.PRIME_TITAN ) )
+ return true
+
+ return false
+}
+
+bool function HasAnyNewDpadCommsIcons( entity player )
+{
+ return HasAnyNewItemOfType( player, eItemTypes.COMMS_ICON )
+}
+
+bool function HasAnyNewBoosts( entity player )
+{
+ return HasAnyNewItemOfType( player, eItemTypes.BURN_METER_REWARD )
+}
+
+bool function HasAnyNewFactions( entity player )
+{
+ return HasAnyNewItemOfType( player, eItemTypes.FACTION )
+}
+
+bool function HasAnyNewCallsignBanners( entity player )
+{
+ return HasAnyNewItemOfType( player, eItemTypes.CALLING_CARD )
+}
+
+bool function HasAnyNewCallsignPatches( entity player )
+{
+ return HasAnyNewItemOfType( player, eItemTypes.CALLSIGN_ICON )
+}
+
+bool function HasAnyNewArmoryItems( entity player )
+{
+ if ( HasAnyNewItemOfType( player, eItemTypes.BURN_METER_REWARD ) ||
+ HasAnyNewItemOfType( player, eItemTypes.FACTION ) ||
+ HasAnyNewItemOfType( player, eItemTypes.CALLING_CARD ) ||
+ HasAnyNewItemOfType( player, eItemTypes.CALLSIGN_ICON ) )
+ return true
+
+ return false
+}
+
+bool function ButtonShouldShowNew( int itemType, string ref = "", string parentRef = "" )
+{
+ entity player = GetUIPlayer()
+ if ( !IsValid( player ) )
+ return false
+
+ string menu = expect string( uiGlobal.activeMenu._name )
+
+ switch ( itemType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ if ( menu == "EditPilotLoadoutsMenu" )
+ return HasAnyNewItemOfType( player, itemType, -1, ref ) || RefHasAnyNewSubitem( player, ref, eItemTypes.CAMO_SKIN ) || RefHasAnyNewSubitem( player, ref, eItemTypes.WEAPON_SKIN )
+ else if ( menu == "EditPilotLoadoutMenu" ||
+ menu == "EditTitanLoadoutsMenu" || menu == "EditTitanLoadoutMenu" ||
+ menu == "PilotLoadoutsMenu" || menu == "TitanLoadoutsMenu" )
+ return HasAnyNewItemOfType( player, itemType, -1, ref )
+ else
+ return ( IsItemNew( player, ref ) ||
+ RefHasAnyNewSubitem( player, ref, eItemTypes.PILOT_PRIMARY_ATTACHMENT ) ||
+ RefHasAnyNewSubitem( player, ref, eItemTypes.PILOT_PRIMARY_MOD ) ||
+ RefHasAnyNewSubitem( player, ref, eItemTypes.PILOT_SECONDARY_MOD ) ||
+ RefHasAnyNewSubitem( player, ref, eItemTypes.PILOT_WEAPON_MOD3 ) ||
+ RefHasAnyNewSubitem( player, ref, eItemTypes.SUB_PILOT_WEAPON_MOD ) ||
+ RefHasAnyNewSubitem( player, ref, eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT ) )
+
+ case eItemTypes.PILOT_SPECIAL:
+ case eItemTypes.PILOT_ORDNANCE:
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ case eItemTypes.PILOT_SUIT:
+ case eItemTypes.PILOT_EXECUTION:
+ case eItemTypes.CAMO_SKIN_PILOT:
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ORDNANCE:
+ case eItemTypes.TITAN_ANTIRODEO:
+ case eItemTypes.BURN_METER_REWARD:
+ case eItemTypes.FACTION:
+ case eItemTypes.CALLING_CARD:
+ case eItemTypes.CALLSIGN_ICON:
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ if ( menu == "EditPilotLoadoutsMenu" || menu == "EditPilotLoadoutMenu" ||
+ menu == "EditTitanLoadoutsMenu" || menu == "EditTitanLoadoutMenu" ||
+ menu == "PilotLoadoutsMenu" || menu == "TitanLoadoutsMenu" ||
+ menu == "ArmoryMenu" )
+ return HasAnyNewItemOfType( player, itemType )
+ else
+ return IsItemNew( player, ref )
+
+ case eItemTypes.FEATURE:
+ case eItemTypes.COMMS_ICON:
+ return IsItemNew( player, ref )
+
+ case eItemTypes.TITAN:
+ case eItemTypes.PRIME_TITAN:
+ return IsItemNew( player, ref ) || RefHasAnyNewSubitem( player, ref )
+
+ case eItemTypes.CAMO_SKIN:
+ case eItemTypes.WEAPON_SKIN:
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ case eItemTypes.CAMO_SKIN_TITAN:
+ case eItemTypes.TITAN_WARPAINT:
+ case eItemTypes.TITAN_NOSE_ART:
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ Assert( parentRef != "" )
+ if ( menu == "EditPilotLoadoutsMenu" || menu == "EditPilotLoadoutMenu" ||
+ menu == "EditTitanLoadoutsMenu" || menu == "EditTitanLoadoutMenu" ||
+ menu == "PilotLoadoutsMenu" || menu == "TitanLoadoutsMenu" )
+ return RefHasAnyNewSubitem( player, parentRef, itemType )
+ else
+ return IsItemNew( player, ref, parentRef )
+
+ case eItemTypes.WEAPON_FEATURE:
+ return IsItemNew( player, ref, parentRef )
+
+ case eItemTypes.RACE:
+ case eItemTypes.PILOT_MELEE:
+ case eItemTypes.TITAN_FD_UPGRADE:
+ return false
+ }
+
+ unreachable
+}
+
+bool function RefHasAnyNewSubitem( entity player, string ref, int subitemType = -1 )
+{
+ if ( IsItemLocked( player, ref ) )
+ return false
+
+ int refType = GetItemType( ref )
+ bool isPrimeTitanRef = ( refType == eItemTypes.TITAN && IsTitanClassPrime( player, ref ) )
+
+ ItemData itemData = GetItemData( ref )
+ foreach ( subitem in itemData.subitems )
+ {
+ if ( subitemType != -1 && GetSubitemType( ref, subitem.ref ) != subitemType )
+ continue
+
+ if ( isPrimeTitanRef && subitem.itemType == eItemTypes.TITAN_WARPAINT )
+ continue
+
+ if ( IsItemNew( player, subitem.ref, ref ) )
+ return true
+ }
+
+ return false
+}
+
+bool function HasAnyNewItemOfCategory( entity player, int refType, int categoryIndex )
+{
+ array<ItemData> items = GetAllItemsOfType( refType )
+ foreach ( item in items )
+ {
+ if ( item.i.menuCategory != categoryIndex )
+ continue
+
+ if ( IsItemNew( player, item.ref ) )
+ return true
+
+ //if ( RefHasAnyNewSubitem( player, item.ref ) )
+ // return true
+ }
+
+ return false
+}
+
+bool function HasAnyNewSubItemOfType( entity player, string parentRef, int refType )
+{
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newMods" )
+
+ case eItemTypes.WEAPON_FEATURE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newFeatures" )
+
+ case eItemTypes.WEAPON_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newPrimeWeaponSkins" )
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newPassives" )
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newSkins" )
+
+ case eItemTypes.TITAN_WARPAINT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newPrimeSkins" ) //TODO: This is actually WarPaint, rename next game.
+
+ case eItemTypes.CAMO_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newWeaponSkins" )
+
+ case eItemTypes.TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newTitanDecals" )
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newPrimeTitanDecals" )
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ return IsAnyPersistenceBitSet( player, parentStruct + ".newFDUpgrades" )
+
+ default:
+ CodeWarning( "Unhandled HasAnyNewSubItemOfType type (subitem): " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + parentRef )
+ }
+
+ return false
+}
+
+bool function HasAnyNewItemOfType( entity player, int refType, int parentRefType = -1, string refToExclude = "" )
+{
+ if ( !IsSubItemType( refType ) )
+ {
+ array<ItemData> items = GetAllItemsOfType( refType )
+ foreach ( item in items )
+ {
+ if ( item.ref == refToExclude )
+ continue
+
+ if ( IsItemLocked( player, item.ref ) )
+ continue
+
+ if ( IsItemNew( player, item.ref ) )
+ return true
+
+ table<int, bool> checkedSubItemTypes = {}
+
+ if ( refType == eItemTypes.PILOT_PRIMARY || refType == eItemTypes.PILOT_SECONDARY )
+ continue
+
+ bool isPrimeTitanRef = ( refType == eItemTypes.TITAN && IsTitanClassPrime( player, item.ref ) )
+
+ foreach ( subItem in item.subitems )
+ {
+ if ( isPrimeTitanRef && subItem.itemType == eItemTypes.TITAN_WARPAINT )
+ continue
+
+ if ( subItem.itemType in checkedSubItemTypes )
+ continue
+
+ if ( HasAnyNewSubItemOfType( player, item.ref, subItem.itemType ) )
+ return true
+
+ checkedSubItemTypes[subItem.itemType] <- true
+ }
+ }
+ }
+ else
+ {
+ string persistenceArray
+ string persistenceVar
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ persistenceArray = "pilotWeapons"
+ persistenceVar = "newMods"
+ break
+
+ case eItemTypes.WEAPON_FEATURE:
+ persistenceArray = "pilotWeapons"
+ persistenceVar = "newFeatures"
+ break
+
+ case eItemTypes.WEAPON_SKIN:
+ persistenceArray = "pilotWeapons"
+ persistenceVar = "newPrimeWeaponSkins"
+ break
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ persistenceArray = "titanChassis"
+ persistenceVar = "newPassives"
+ break
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ persistenceArray = "titanChassis"
+ persistenceVar = "newSkins"
+ break
+
+ case eItemTypes.TITAN_WARPAINT:
+ persistenceArray = "titanChassis"
+ persistenceVar = "newPrimeSkins" //TODO: This is actually WarPaint, rename next game.
+ break
+
+ case eItemTypes.CAMO_SKIN:
+ if ( parentRefType == eItemTypes.PILOT_PRIMARY || parentRefType == eItemTypes.PILOT_SECONDARY )
+ persistenceArray = "pilotWeapons"
+ else
+ persistenceArray = "titanChassis"
+
+ persistenceVar = "newWeaponSkins"
+ break
+
+ case eItemTypes.TITAN_NOSE_ART:
+ persistenceArray = "titanChassis"
+ persistenceVar = "newTitanDecals"
+ break
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ persistenceArray = "titanChassis"
+ persistenceVar = "newPrimeTitanDecals"
+ break
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ persistenceArray = "titanChassis"
+ persistenceVar = "newFDUpgrades"
+ break
+
+ default:
+ CodeWarning( "Unhandled new type (subitem): " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) )
+ }
+
+ int arrayCount = PersistenceGetArrayCount( persistenceArray )
+ for ( int i = 0; i < arrayCount; i++ )
+ {
+ string persistenceStruct = persistenceArray + "[" + i + "]"
+
+ ItemData ornull parentItem = GetItemFromPersistenceStruct( persistenceStruct )
+ if ( parentItem == null )
+ continue
+ expect ItemData( parentItem )
+
+ if ( IsItemLocked( player, parentItem.ref ) )
+ continue
+
+ if ( parentRefType == -1 || GetItemType( parentItem.ref ) == parentRefType )
+ {
+ if ( IsAnyPersistenceBitSet( player, persistenceStruct + "." + persistenceVar ) )
+ return true
+ }
+ }
+ }
+
+ return false
+}
+
+#endif //UI
+
+#if SERVER
+void function UnlockUltimateEdition( entity player )
+{
+ printt( "!!!!!!!!!!! UnlockUltimateEdition() running" )
+
+ if ( player.GetPersistentVarAsInt( "ultimateEdition" ) > 0 )
+ {
+ printt( "!!!!!!!!!!! Returned because player.GetPersistentVarAsInt( \"ultimateEdition\" ) > 0" )
+ return
+ }
+
+ if ( !player.HasEntitlement( ET_JUMPSTARTERKIT ) )
+ {
+ printt( "!!!!!!!!!!! Returned because !player.HasEntitlement( ET_JUMPSTARTERKIT )" )
+ return
+ }
+
+ Player_GiveCredits( player, 500 )
+ Player_GiveDoubleXP( player, 10 )
+
+ array<ItemDisplayData> suits = GetVisibleItemsOfType( eItemTypes.PILOT_SUIT )
+ foreach ( suitData in suits )
+ {
+ string tacticalRef = GetSuitBasedTactical( suitData.ref )
+ SetItemOwned( player, suitData.ref, "", IsItemLocked( player, suitData.ref ) )
+ SetItemOwned( player, tacticalRef, "", false )
+ }
+
+ array<ItemDisplayData> titans = GetVisibleItemsOfType( eItemTypes.TITAN )
+ foreach ( titanData in titans )
+ {
+ SetItemOwned( player, titanData.ref, "", IsItemLocked( player, titanData.ref ) )
+ }
+
+ player.SetPersistentVar( "ultimateEdition", true )
+}
+
+
+void function SetItemOwnedStatus( entity player, string ref, string parentRef, bool unlocked )
+{
+ int unlockBitVal = unlocked ? 1 : 0
+
+ ItemData itemData = GetItemData( ref )
+ int refType = itemData.itemType
+
+ if ( !IsSubItemType( refType ) )
+ {
+ int bitIndex = GetItemPersistenceId( ref )
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ SetPersistenceBitfield( player, "unlockedPilotWeapons", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.PILOT_SPECIAL:
+ case eItemTypes.PILOT_ORDNANCE:
+ SetPersistenceBitfield( player, "unlockedPilotOffhands", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ SetPersistenceBitfield( player, "unlockedPilotPassives", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.PILOT_SUIT:
+ SetPersistenceBitfield( player, "unlockedPilotSuits", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.PILOT_EXECUTION:
+ SetPersistenceBitfield( player, "unlockedPilotExecutions", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ SetPersistenceBitfield( player, "unlockedTitanExecutions", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ORDNANCE:
+ SetPersistenceBitfield( player, "unlockedTitanOffhands", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.TITAN:
+ SetPersistenceBitfield( player, "unlockedTitanChassis", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.PRIME_TITAN:
+ SetPersistenceBitfield( player, "unlockedPrimeTitans", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.FEATURE:
+ SetPersistenceBitfield( player, "unlockedFeatures", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.CAMO_SKIN_PILOT:
+ SetPersistenceBitfield( player, "unlockedPilotSkins", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.BURN_METER_REWARD:
+ SetPersistenceBitfield( player, "unlockedBoosts", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.FACTION:
+ SetPersistenceBitfield( player, "unlockedFactions", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.CALLING_CARD:
+ SetPersistenceBitfield( player, "unlockedCallingCards", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.CALLSIGN_ICON:
+ SetPersistenceBitfield( player, "unlockedCallsignIcons", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.COMMS_ICON:
+ SetPersistenceBitfield( player, "unlockedCommsIcons", bitIndex, unlockBitVal )
+ return
+
+ default:
+ CodeWarning( "Unhandled unlock type: " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref )
+ }
+ }
+ else
+ {
+ int bitIndex = GetItemPersistenceId( ref, parentRef )
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedMods", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.WEAPON_FEATURE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedFeatures", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.WEAPON_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedPrimeWeaponSkins", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedPassives", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedSkins", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.TITAN_WARPAINT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedPrimeSkins", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.CAMO_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedWeaponSkins", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedTitanDecals", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedPrimeTitanDecals", bitIndex, unlockBitVal )
+ return
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".unlockedFDUpgrades", bitIndex, unlockBitVal )
+ return
+
+ default:
+ CodeWarning( "Unhandled unlock type (subitem): " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref + " " + parentRef )
+ }
+ }
+}
+
+void function SetItemNewStatus( entity player, string ref, string parentRef, bool setNew )
+{
+ int newBitVal = setNew ? 1 : 0
+
+ ItemData itemData = GetItemData( ref )
+ int refType = itemData.itemType
+
+ if ( !IsSubItemType( refType ) )
+ {
+ int bitIndex = GetItemPersistenceId( ref )
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ SetPersistenceBitfield( player, "newPilotWeapons", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.PILOT_SPECIAL:
+ case eItemTypes.PILOT_ORDNANCE:
+ SetPersistenceBitfield( player, "newPilotOffhands", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ SetPersistenceBitfield( player, "newPilotPassives", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.PILOT_SUIT:
+ SetPersistenceBitfield( player, "newPilotSuits", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.PILOT_EXECUTION:
+ SetPersistenceBitfield( player, "newPilotExecutions", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ SetPersistenceBitfield( player, "newTitanExecutions", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ORDNANCE:
+ SetPersistenceBitfield( player, "newTitanOffhands", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.TITAN:
+ SetPersistenceBitfield( player, "newTitanChassis", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.PRIME_TITAN:
+ SetPersistenceBitfield( player, "newPrimeTitans", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.FEATURE:
+ SetPersistenceBitfield( player, "newFeatures", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.CAMO_SKIN_PILOT:
+ SetPersistenceBitfield( player, "newPilotSkins", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.WEAPON_SKIN:
+ SetPersistenceBitfield( player, "newPrimeWeaponSkins", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.BURN_METER_REWARD:
+ SetPersistenceBitfield( player, "newBoosts", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.FACTION:
+ SetPersistenceBitfield( player, "newFactions", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.CALLING_CARD:
+ SetPersistenceBitfield( player, "newCallingCards", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.CALLSIGN_ICON:
+ SetPersistenceBitfield( player, "newCallsignIcons", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.COMMS_ICON:
+ SetPersistenceBitfield( player, "newCommsIcons", bitIndex, newBitVal )
+ return
+
+ default:
+ CodeWarning( "Unhandled unlock type: " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref )
+ }
+ }
+ else
+ {
+ int bitIndex = GetItemPersistenceId( ref, parentRef )
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newMods", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.WEAPON_FEATURE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newFeatures", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.WEAPON_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newPrimeWeaponSkins", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newPassives", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newSkins", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.TITAN_WARPAINT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newPrimeSkins", bitIndex, newBitVal ) //TODO: This is actually WarPaint, rename next game.
+ return
+
+ case eItemTypes.CAMO_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newWeaponSkins", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newTitanDecals", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newPrimeTitanDecals", bitIndex, newBitVal )
+ return
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newFDUpgrades", bitIndex, newBitVal )
+ return
+
+ default:
+ CodeWarning( "Unhandled unlock type (subitem): " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref + " " + parentRef )
+ }
+ }
+}
+
+bool function ClientCommand_ClearNewStatus( entity player, array<string> args )
+{
+ if ( args.len() == 0 )
+ return false
+
+ string ref = args[0]
+
+ if ( !ItemDefined( ref ) )
+ {
+ if ( args.len() != 2 )
+ return false
+
+ string parentRef = args[1]
+
+ if ( !SubitemDefined( parentRef, ref ) )
+ return false
+ }
+
+ ItemData itemData = GetItemData( ref )
+ int refType = itemData.itemType
+
+ if ( !IsSubItemType( refType ) )
+ {
+ int bitIndex = GetItemPersistenceId( ref )
+
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ SetPersistenceBitfield( player, "newPilotWeapons", bitIndex, 0 )
+ return true
+
+ case eItemTypes.PILOT_SPECIAL:
+ case eItemTypes.PILOT_ORDNANCE:
+ SetPersistenceBitfield( player, "newPilotOffhands", bitIndex, 0 )
+ return true
+
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ SetPersistenceBitfield( player, "newPilotPassives", bitIndex, 0 )
+ return true
+
+ case eItemTypes.PILOT_SUIT:
+ SetPersistenceBitfield( player, "newPilotSuits", bitIndex, 0 )
+ return true
+
+ case eItemTypes.PILOT_EXECUTION:
+ SetPersistenceBitfield( player, "newPilotExecutions", bitIndex, 0 )
+ return true
+
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ SetPersistenceBitfield( player, "newTitanExecutions", bitIndex, 0 )
+ return true
+
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ORDNANCE:
+ SetPersistenceBitfield( player, "newTitanOffhands", bitIndex, 0 )
+ return true
+
+ case eItemTypes.TITAN:
+ SetPersistenceBitfield( player, "newTitanChassis", bitIndex, 0 )
+ return true
+
+ case eItemTypes.PRIME_TITAN:
+ SetPersistenceBitfield( player, "newPrimeTitans", bitIndex, 0 )
+ return true
+
+ case eItemTypes.FEATURE:
+ SetPersistenceBitfield( player, "newFeatures", bitIndex, 0 )
+ return true
+
+ case eItemTypes.CAMO_SKIN_PILOT:
+ SetPersistenceBitfield( player, "newPilotSkins", bitIndex, 0 )
+ return true
+
+ case eItemTypes.BURN_METER_REWARD:
+ SetPersistenceBitfield( player, "newBoosts", bitIndex, 0 )
+ return true
+
+ case eItemTypes.FACTION:
+ SetPersistenceBitfield( player, "newFactions", bitIndex, 0 )
+ return true
+
+ case eItemTypes.CALLING_CARD:
+ SetPersistenceBitfield( player, "newCallingCards", bitIndex, 0 )
+ return true
+
+ case eItemTypes.CALLSIGN_ICON:
+ SetPersistenceBitfield( player, "newCallsignIcons", bitIndex, 0 )
+ return true
+
+ case eItemTypes.COMMS_ICON:
+ SetPersistenceBitfield( player, "newCommsIcons", bitIndex, 0 )
+ return true
+
+ default:
+ CodeWarning( "Unhandled ClearNewStatus type: " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref )
+ }
+ }
+ else
+ {
+ string parentRef = args[1]
+
+ int bitIndex = GetItemPersistenceId( ref, parentRef )
+ switch ( refType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newMods", bitIndex, 0 )
+ return true
+
+ case eItemTypes.WEAPON_FEATURE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newFeatures", bitIndex, 0 )
+ return true
+
+ case eItemTypes.WEAPON_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newPrimeWeaponSkins", bitIndex, 0 )
+ return true
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newPassives", bitIndex, 0 )
+ return true
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newSkins", bitIndex, 0 )
+ return true
+
+ case eItemTypes.TITAN_WARPAINT:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newPrimeSkins", bitIndex, 0 ) //TODO: This is actually WarPaint, rename next game.
+ return true
+
+ case eItemTypes.CAMO_SKIN:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newWeaponSkins", bitIndex, 0 )
+ return true
+
+ case eItemTypes.TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newTitanDecals", bitIndex, 0 )
+ return true
+
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newPrimeTitanDecals", bitIndex, 0 )
+ return true
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ string parentStruct = GetItemPersistenceStruct( parentRef )
+ SetPersistenceBitfield( player, parentStruct + ".newFDUpgrades", bitIndex, 0 )
+ return true
+
+ default:
+ CodeWarning( "Unhandled ClearNewStatus type (subitem): " + DEV_GetEnumStringFromIndex( "eItemTypes", refType ) + " " + ref + " " + parentRef )
+ }
+ }
+
+ return true
+}
+
+void function SetItemOwned( entity player, string ref, string parentRef = "", bool setNew = true )
+{
+ SetItemOwnedStatus( player, ref, parentRef, true )
+ SetItemNewStatus( player, ref, parentRef, setNew )
+}
+
+void function ClearItemOwned( entity player, string ref, string parentRef = "" )
+{
+ SetItemOwnedStatus( player, ref, parentRef, false )
+}
+
+bool function ClientCommand_DEV_GiveFDUnlockPoint( entity player, array<string> args )
+{
+ if ( args.len() == 0 )
+ return false
+
+ if ( !IsValid( player ) )
+ return false
+
+ string parentRef = args[0]
+ printt( "GIVE PLAYER UNLOCK POINT ", parentRef )
+ Player_GiveFDUnlockPoints( player, 1 )
+ return true
+}
+
+bool function ClientCommand_DEV_ResetTitanProgression( entity player, array<string> args )
+{
+ if ( args.len() == 0 )
+ return false
+
+ if ( !IsValid( player ) )
+ return false
+
+ string titanRef = args[0]
+ printt( "RESET PLAYER TITAN PROGRESSION ", titanRef )
+ SetAvailableFDUnlockPoints( player, titanRef, 0 )
+
+ array<ItemData> fdUpgrades = GetAllItemsOfType( eItemTypes.TITAN_FD_UPGRADE )
+ foreach ( upgrade in fdUpgrades )
+ {
+ if ( upgrade.parentRef == titanRef )
+ {
+ ClearItemOwned( player, upgrade.ref, upgrade.parentRef )
+ }
+ }
+ return true
+}
+
+bool function ClientCommand_BuyItem( entity player, array<string> args )
+{
+ if ( args.len() == 0 )
+ return false
+
+ string ref = args[0]
+
+ if ( !ItemDefined( ref ) )
+ {
+ if ( args.len() != 2 )
+ return false
+
+ string parentRef = args[1]
+
+ if ( !SubitemDefined( parentRef, ref ) )
+ return false
+ }
+
+ if ( !IsValid( player ) )
+ return false
+
+ string parentRef
+
+ int cost
+
+ string fullItemName = ref
+
+ if ( args.len() > 1 )
+ {
+ parentRef = args[ 1 ]
+ cost = GetSubitemCost( parentRef, ref )
+
+ for ( int i = 1; i < args.len(); i++ )
+ fullItemName += " " + args[i]
+ }
+ else
+ {
+ cost = GetItemCost( ref )
+ }
+
+ if ( cost <= 0 )
+ return false
+
+ int creditsAvailable
+ bool isFDUpgrade = GetItemType( ref ) == eItemTypes.TITAN_FD_UPGRADE
+ if ( isFDUpgrade )
+ {
+ creditsAvailable = GetAvailableFDUnlockPoints( player, parentRef )
+ }
+ else
+ {
+ creditsAvailable = GetAvailableCredits( player )
+ }
+
+ if ( cost > creditsAvailable )
+ return false
+
+ SetItemOwned( player, ref, parentRef, false )
+
+ if ( isFDUpgrade )
+ {
+ SetAvailableFDUnlockPoints( player, parentRef, creditsAvailable - cost )
+ }
+ else
+ {
+ SetAvailableCredits( player, creditsAvailable - cost )
+ PIN_BuyItem( player, false, fullItemName, cost )
+ }
+
+ return true
+}
+
+bool function ClientCommand_BuyTicket( entity player, array<string> args )
+{
+ if ( !IsValid( player ) )
+ return true
+
+ ItemDisplayData displayData = GetItemDisplayData( "coliseum_ticket" )
+ string itemName = GetItemName( "coliseum_ticket" )
+ string ref = displayData.ref
+
+
+ int numTickets = 1
+ if ( args.len() > 0 )
+ numTickets = int( args[0] )
+
+ int cost = GetItemCost( ref ) * numTickets
+
+ int creditsAvailable = GetAvailableCredits( player )
+
+ if ( cost > creditsAvailable )
+ return true
+
+ Player_GiveColiseumTickets( player, numTickets )
+ SetAvailableCredits( player, creditsAvailable - cost )
+
+ PIN_BuyItem( player, true, ref, cost )
+
+ return true
+}
+
+void function CodeCallback_GivePersistentItem( entity player, string itemName, int count )
+{
+ printt( "CodeCallback_GivePersistentItem", player, itemName, count )
+ bool consumable = false
+ switch ( itemName )
+ {
+ case "double_xp":
+ case "burncard_doublexp":
+ if ( count )
+ {
+ Player_GiveDoubleXP( player, count )
+ ItemDisplayData displayData = GetItemDisplayData( "double_xp" )
+ Player_AddRecentUnlock( player, displayData, count )
+ PIN_GiveItem( player, true, itemName, count )
+ }
+ break
+
+ case "coliseum_ticket":
+ if ( count )
+ {
+ Player_GiveColiseumTickets( player, count )
+ ItemDisplayData displayData = GetItemDisplayData( "coliseum_ticket" )
+ Player_AddRecentUnlock( player, displayData, count )
+ PIN_GiveItem( player, true, itemName, count )
+ }
+ break
+
+ case "credit_award":
+ if ( count )
+ {
+ Player_GiveCredits( player, count )
+ ItemDisplayData displayData = GetItemDisplayData( "credit_award" )
+ Player_AddRecentUnlock( player, displayData, count )
+ }
+ break
+
+ case "unlock_dew":
+ UnlockDEW( player )
+ PIN_GiveItem( player, false, itemName, count )
+ break
+
+ case "unlock_target":
+ UnlockTarget( player )
+ PIN_GiveItem( player, false, itemName, count )
+ break
+
+ case "unlock_bww":
+ UnlockBWW( player )
+ PIN_GiveItem( player, false, itemName, count )
+ break
+
+ default:
+ array<string> tokens = split( itemName, " " )
+ if ( tokens.len() == 1 )
+ {
+ if ( !GivePersistentItem( player, tokens[0] ) )
+ CodeWarning( itemName )
+ }
+ else if ( tokens.len() == 2 )
+ {
+ if ( !GivePersistentSubItem( player, tokens[0], tokens[1] ) )
+ CodeWarning( itemName )
+ }
+ PIN_GiveItem( player, false, itemName, count )
+ //
+ //
+ //string itemRef = itemName
+ //if ( ItemDefined( itemRef ) )
+ //{
+ // ItemData itemData = GetItemData( itemRef )
+ // int refType = itemData.itemType
+ //
+ // if ( !IsSubItemType( refType ) )
+ // {
+ //
+ // }
+ //
+ //}
+ //break
+ }
+}
+
+bool function GivePersistentItem( entity player, string itemRef )
+{
+ if ( !ItemDefined( itemRef ) )
+ {
+ CodeWarning( "Tried to give undefined item: " + itemRef )
+ return false
+ }
+
+ ItemData itemData = GetItemData( itemRef )
+ int refType = itemData.itemType
+
+ if ( IsSubItemType( refType ) )
+ {
+ CodeWarning( "Tried to give sub-item " + itemRef + " without specifying a parent" )
+ return false
+ }
+
+ SetItemOwned( player, itemRef, "", true )
+ Player_AddRecentUnlock( player, GetItemDisplayData( itemRef ) )
+
+ return true
+}
+
+bool function GivePersistentSubItem( entity player, string itemRef, string parentRef )
+{
+ if ( !ItemDefined( itemRef ) )
+ {
+ CodeWarning( "Tried to give undefined item: " + itemRef )
+ return false
+ }
+
+ if ( !ItemDefined( parentRef ) )
+ {
+ CodeWarning( "Tried to give item " + itemRef + " to undefined parent: " + parentRef )
+ return false
+ }
+
+ ItemData itemData = GetItemData( itemRef )
+ int itemRefType = itemData.itemType
+
+ if ( !IsSubItemType( itemRefType ) )
+ {
+ CodeWarning( "Tried to give item " + itemRef + " to parent " + parentRef + ", but it isn't a sub-item type" )
+ return false
+ }
+
+ ItemData parentData = GetItemData( parentRef )
+ int parentRefType = parentData.itemType
+
+ if ( !HasSubitem( parentRef, itemRef ) )
+ {
+ CodeWarning( "Tried to give item " + itemRef + " to a parent " + parentRef + " it is not a child of" )
+ return false
+ }
+
+ SetItemOwned( player, itemRef, parentRef, true )
+ Player_AddRecentUnlock( player, GetItemDisplayData( itemRef, parentRef ) )
+
+ return true
+}
+
+#endif //SERVER
+
+array<string> function GetUnlockItemsForPlayerLevels( int startLevel, int endLevel )
+{
+ array<string> unlockedItems
+
+ for ( int currentLevel = startLevel; currentLevel <= endLevel; currentLevel++ )
+ {
+ unlockedItems.extend( GetUnlockItemsForPlayerLevel( currentLevel ) )
+ }
+
+ return unlockedItems
+}
+
+array<string> function GetUnlockItemsForPlayerLevel( int newLevel )
+{
+ array<string> unlockedItems
+ array<string> genUnlockItems
+ if ( newLevel > GetMaxPlayerLevel() )
+ {
+ foreach ( ref, ul in file.unlocks )
+ {
+ if ( ul.unlockType == eUnlockType.PLAYER_LEVEL )
+ {
+ if ( ul.unlockLevel == newLevel )
+ genUnlockItems.append( ref )
+ }
+ }
+
+ genUnlockItems.sort( UnlockItemSort )
+ }
+
+ array<string> levelUnlockItems
+ foreach ( ref, ul in file.unlocks )
+ {
+ if ( ul.unlockType == eUnlockType.PLAYER_LEVEL )
+ {
+ if ( ItemLockedShouldUseRawLevel( ref ) )
+ {
+ if ( ul.unlockLevel == newLevel && !genUnlockItems.contains( ref ) )
+ levelUnlockItems.append( ref )
+ }
+ else
+ {
+ if ( ul.unlockLevel == ((newLevel - 1) % GetMaxPlayerLevel() + 1) )
+ levelUnlockItems.append( ref )
+ }
+ }
+ }
+
+ levelUnlockItems.sort( UnlockItemSort )
+
+ unlockedItems.extend( genUnlockItems )
+ unlockedItems.extend( levelUnlockItems )
+
+ if ( unlockedItems.len() == 0 )
+ unlockedItems.append( "credit_award_5x" )
+
+ return unlockedItems
+}
+
+
+
+array<string> function GetUnlockItemsForPlayerRawLevel( int newLevel )
+{
+ array<string> unlockedItems
+ foreach ( ref, ul in file.unlocks )
+ {
+ if ( ul.unlockType == eUnlockType.PLAYER_LEVEL )
+ {
+ if ( ul.unlockLevel == newLevel )
+ unlockedItems.append( ref )
+ }
+ }
+
+ unlockedItems.sort( UnlockItemSort )
+
+ return unlockedItems
+}
+
+
+string function GetWeaponForTitan( string titanClass )
+{
+ var titanPropertiesDataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int propertyRow = GetDataTableRowMatchingStringValue( titanPropertiesDataTable, GetDataTableColumnByName( titanPropertiesDataTable, "titanRef" ), titanClass )
+ return GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "primary" ) )
+}
+
+string function GetTitanForWeapon( string weaponRef )
+{
+ var titanPropertiesDataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int propertyRow = GetDataTableRowMatchingStringValue( titanPropertiesDataTable, GetDataTableColumnByName( titanPropertiesDataTable, "primary" ), weaponRef )
+ return GetDataTableString( titanPropertiesDataTable, propertyRow, GetDataTableColumnByName( titanPropertiesDataTable, "titanRef" ) )
+}
+
+#if SERVER
+void function AwardCredits( entity player, string award )
+{
+ switch ( award )
+ {
+ case "credit_award":
+ Player_GiveCredits( player, 1 )
+ break
+
+ case "credit_award_5x":
+ Player_GiveCredits( player, 5 )
+ break
+ }
+}
+
+void function Player_GiveCredits( entity player, int count )
+{
+ int currentCredits = GetAvailableCredits( player )
+ SetAvailableCredits( player, currentCredits + count )
+ PIN_GiveCredits( player, count )
+}
+
+void function Player_GiveColiseumTickets( entity player, int count )
+{
+ int currentTickets = Player_GetColiseumTicketCount( player )
+ int newTicketCount = maxint( 0, (currentTickets + count) )
+ Player_SetColiseumTicketCount( player, newTicketCount )
+}
+
+void function Player_GiveFDUnlockPoints( entity player, int count )
+{
+ TitanLoadoutDef loadout = GetTitanLoadoutForPlayer( player )
+
+ int currentPoints = GetAvailableFDUnlockPoints( player, loadout.titanClass )
+ SetAvailableFDUnlockPoints( player, loadout.titanClass, currentPoints + count )
+}
+#endif
+
+int function Player_GetColiseumTicketCount( entity player )
+{
+ return player.GetPersistentVarAsInt( "coliseumTickets" )
+}
+
+void function Player_SetColiseumTicketCount( entity player, int newCount )
+{
+ player.SetPersistentVar( "coliseumTickets", newCount )
+}
+
+#if SERVER
+void function Player_GiveDoubleXP( entity player, int count )
+{
+ int currentDoubleXP = Player_GetDoubleXPCount( player )
+ Player_SetDoubleXPCount( player, currentDoubleXP + count )
+}
+
+bool function ClientCommand_UseDoubleXP( entity player, array<string> args )
+{
+ if ( IsPrivateMatch() )
+ return true
+
+ if ( GetGameState() > eGameState.Prematch )
+ return true
+
+ if ( Player_GetDoubleXPCount( player ) < 1 )
+ return true
+
+ if ( player.GetPlayerNetInt( "xpMultiplier" ) )
+ return true
+
+ int currentDoubleXP = Player_GetDoubleXPCount( player )
+ Player_SetDoubleXPCount( player, currentDoubleXP - 1 )
+ Player_ActivateDoubleXP( player )
+
+ PIN_ConsumeItem( player, "double_xp" )
+
+ // ?
+
+ return true
+}
+
+void function Player_ActivateDoubleXP( entity player )
+{
+ player.SetPlayerNetInt( "xpMultiplier", 2 )
+
+ Remote_CallFunction_UI( player, "SCB_SetDoubleXPStatus", 2 )
+}
+#endif
+
+int function Player_GetDoubleXPCount( entity player )
+{
+ return player.GetPersistentVarAsInt( "doubleXP" )
+}
+
+#if SERVER
+void function Player_SetDoubleXPCount( entity player, int newCount )
+{
+ player.SetPersistentVar( "doubleXP", newCount )
+}
+#endif
+
+ItemDisplayData ornull function Player_GetRecentUnlock( entity player, int index )
+{
+ int refGuid = player.GetPersistentVarAsInt( "recentUnlocks[" + index + "].refGuid" )
+ int parentRefGuid = player.GetPersistentVarAsInt( "recentUnlocks[" + index + "].parentRefGuid" )
+
+ if ( refGuid == 0 )
+ return null
+
+ return GetItemDisplayDataFromGuid( refGuid, parentRefGuid )
+}
+
+int function Player_GetRecentUnlockCount( entity player, int index )
+{
+ return player.GetPersistentVarAsInt( "recentUnlocks[" + index + "].count" )
+}
+
+#if SERVER
+void function Player_AddRecentUnlock( entity player, ItemDisplayData itemData, int count = 1 )
+{
+ array<RecentUnlock> recentUnlocks
+
+ RecentUnlock mostRecentUnlock
+ mostRecentUnlock.refGuid = file.itemRefToGuid[itemData.ref]
+ mostRecentUnlock.count = count
+ if ( itemData.parentRef != "" )
+ mostRecentUnlock.parentRefGuid = file.itemRefToGuid[itemData.parentRef]
+
+ recentUnlocks.append( mostRecentUnlock )
+
+ int maxRecentUnlockCount = PersistenceGetArrayCount( "recentUnlocks" )
+ for ( int index = 0; index < maxRecentUnlockCount; index++ )
+ {
+ RecentUnlock recentUnlock
+ recentUnlock.refGuid = player.GetPersistentVarAsInt( "recentUnlocks[" + index + "].refGuid" )
+ recentUnlock.parentRefGuid = player.GetPersistentVarAsInt( "recentUnlocks[" + index + "].parentRefGuid" )
+ recentUnlock.count = player.GetPersistentVarAsInt( "recentUnlocks[" + index + "].count" )
+
+ recentUnlocks.append( recentUnlock )
+ }
+
+ for ( int index = 0; index < maxRecentUnlockCount; index++ )
+ {
+ player.SetPersistentVar( "recentUnlocks[" + index + "].refGuid", recentUnlocks[index].refGuid )
+ player.SetPersistentVar( "recentUnlocks[" + index + "].parentRefGuid", recentUnlocks[index].parentRefGuid )
+ player.SetPersistentVar( "recentUnlocks[" + index + "].count", recentUnlocks[index].count )
+ }
+}
+
+#endif
+
+int function UnlockItemSort( string itemRefA, string itemRefB )
+{
+ int priority = 0
+ table<int, int> itemPriority
+ itemPriority[eItemTypes.PILOT_PRIMARY] <- priority++
+ itemPriority[eItemTypes.PILOT_SECONDARY] <- priority++
+ itemPriority[eItemTypes.PILOT_SPECIAL] <- priority++
+ itemPriority[eItemTypes.PILOT_ORDNANCE] <- priority++
+ itemPriority[eItemTypes.PILOT_PRIMARY_ATTACHMENT] <- priority++
+ itemPriority[eItemTypes.PILOT_PRIMARY_MOD] <- priority++
+ itemPriority[eItemTypes.PILOT_SECONDARY_MOD] <- priority++
+ itemPriority[eItemTypes.PILOT_PASSIVE1] <- priority++
+ itemPriority[eItemTypes.PILOT_PASSIVE2] <- priority++
+ itemPriority[eItemTypes.TITAN_PRIMARY] <- priority++
+ itemPriority[eItemTypes.PILOT_SUIT] <- priority++
+ itemPriority[eItemTypes.TITAN_SPECIAL] <- priority++
+ itemPriority[eItemTypes.TITAN_ANTIRODEO] <- priority++
+ itemPriority[eItemTypes.TITAN_ORDNANCE] <- priority++
+ itemPriority[eItemTypes.TITAN_PRIMARY_MOD] <- priority++
+ itemPriority[eItemTypes.TITAN_OS] <- priority++
+ itemPriority[eItemTypes.TITAN_NOSE_ART] <- priority++
+ itemPriority[eItemTypes.PRIME_TITAN_NOSE_ART] <- priority++
+ itemPriority[eItemTypes.TITAN_CORE_ABILITY] <- priority++
+ itemPriority[eItemTypes.BURN_METER_REWARD] <- priority++
+ itemPriority[eItemTypes.PILOT_MELEE] <- priority++
+ itemPriority[eItemTypes.TITAN] <- priority++
+ itemPriority[eItemTypes.PILOT_EXECUTION] <- priority++
+ itemPriority[eItemTypes.TITAN_RONIN_EXECUTION] <- priority++
+ itemPriority[eItemTypes.TITAN_NORTHSTAR_EXECUTION] <- priority++
+ itemPriority[eItemTypes.TITAN_ION_EXECUTION] <- priority++
+ itemPriority[eItemTypes.TITAN_TONE_EXECUTION] <- priority++
+ itemPriority[eItemTypes.TITAN_SCORCH_EXECUTION] <- priority++
+ itemPriority[eItemTypes.TITAN_LEGION_EXECUTION] <- priority++
+ itemPriority[eItemTypes.TITAN_VANGUARD_EXECUTION] <- priority++
+ itemPriority[eItemTypes.FACTION] <- priority++
+ itemPriority[eItemTypes.CALLING_CARD] <- priority++
+ itemPriority[eItemTypes.CALLSIGN_ICON] <- priority++
+ itemPriority[eItemTypes.CAMO_SKIN] <- priority++
+ itemPriority[eItemTypes.CAMO_SKIN_PILOT] <- priority++
+ itemPriority[eItemTypes.CAMO_SKIN_TITAN] <- priority++
+ itemPriority[eItemTypes.TITAN_WARPAINT] <- priority++
+ itemPriority[eItemTypes.TITAN_GENERAL_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_TITANFALL_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_RONIN_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_NORTHSTAR_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_ION_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_TONE_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_SCORCH_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_LEGION_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_VANGUARD_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_UPGRADE1_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_UPGRADE2_PASSIVE] <- priority++
+ itemPriority[eItemTypes.TITAN_UPGRADE3_PASSIVE] <- priority++
+ itemPriority[eItemTypes.FEATURE] <- priority++
+ itemPriority[eItemTypes.RACE] <- priority++
+ itemPriority[eItemTypes.NOT_LOADOUT] <- priority++
+ itemPriority[eItemTypes.SUB_PILOT_WEAPON_MOD] <- priority++
+ itemPriority[eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT] <- priority++
+ itemPriority[eItemTypes.GAME_MODE] <- priority++
+ itemPriority[eItemTypes.COMMS_ICON] <- priority++
+
+ int itemRefAType = GetItemType( itemRefA )
+ int itemRefBType = GetItemType( itemRefB )
+
+ if ( itemPriority[itemRefAType] < itemPriority[itemRefBType] )
+ return -1
+
+ if ( itemPriority[itemRefAType] > itemPriority[itemRefBType] )
+ return 1
+
+ return 0
+}
+
+
+array<string> function GetUnlockItemsForTitanLevels( string titanRef, int startLevel, int endLevel )
+{
+ array<string> unlockedItems
+
+ for ( int currentLevel = startLevel; currentLevel <= endLevel; currentLevel++ )
+ {
+ unlockedItems.extend( GetUnlockItemsForTitanLevel( titanRef, currentLevel ) )
+ }
+
+ return unlockedItems
+}
+
+string function GetNextUnlockForTitanLevel( entity player, string titanRef, int startLevel )
+{
+ array<string> unlockedItems
+
+ int endLevel = TitanGetMaxRawLevel( titanRef )
+
+ for ( int currentLevel = startLevel; currentLevel <= endLevel; currentLevel++ )
+ {
+ unlockedItems = GetUnlockItemsForTitanLevel( titanRef, currentLevel )
+
+ if ( unlockedItems.len() == 0 )
+ {
+ if ( TitanLevelHasRandomUnlock( currentLevel, titanRef ) )
+ return "random"
+ }
+
+ if ( unlockedItems.len() > 0 )
+ {
+ for ( int i = 0; i < unlockedItems.len(); i++ )
+ {
+ if ( IsSubItemType( GetItemType( unlockedItems[ i ] ) ) )
+ {
+ if ( IsSubItemLocked( player, unlockedItems[ i ], titanRef ) )
+ return unlockedItems[ i ]
+ }
+ else
+ {
+ if ( IsItemLocked( player, unlockedItems[ i ] ) )
+ return unlockedItems[ i ]
+ }
+ }
+ }
+ }
+
+ return ""
+}
+
+array<string> function GetUnlockItemsForTitanLevel( string titanRef, int newLevel )
+{
+ array<string> unlockedItems
+ Assert( titanRef in file.unlocks )
+
+ foreach ( ref, ul in file.unlocks )
+ {
+ if ( ul.unlockType == eUnlockType.TITAN_LEVEL && ul.unlockLevel == newLevel && ul.parentRef == titanRef )
+ {
+ unlockedItems.append( ref )
+ }
+ }
+
+ foreach ( childRef, ul in file.unlocks[ titanRef ].child )
+ {
+ if ( ul.unlockType == eUnlockType.TITAN_LEVEL && ul.unlockLevel == newLevel )
+ {
+ unlockedItems.append( childRef )
+ }
+ }
+
+ return unlockedItems
+}
+
+array<string> function GetUnlockItemsForWeaponLevels( string weaponRef, int startLevel, int endLevel )
+{
+ array<string> unlockedItems
+
+ for ( int currentLevel = startLevel; currentLevel <= endLevel; currentLevel++ )
+ {
+ unlockedItems.extend( GetUnlockItemsForWeaponLevel( weaponRef, currentLevel ) )
+ }
+
+ return unlockedItems
+}
+
+string function GetNextUnlockForWeaponLevel( entity player, string weaponRef, int startLevel )
+{
+ array<string> unlockedItems
+
+ int endLevel = WeaponGetMaxRawLevel( weaponRef )
+
+ for ( int currentLevel = startLevel; currentLevel <= endLevel; currentLevel++ )
+ {
+ unlockedItems.extend( GetUnlockItemsForWeaponLevel( weaponRef, currentLevel ) )
+
+ if ( unlockedItems.len() == 0 )
+ {
+ if ( WeaponLevelHasRandomUnlock( currentLevel, weaponRef ) )
+ return "random"
+ }
+
+ if ( unlockedItems.len() > 0 )
+ {
+ for ( int i = 0; i < unlockedItems.len(); i++ )
+ {
+ if ( IsSubItemType( GetItemType( unlockedItems[ i ] ) ) )
+ {
+ if ( IsSubItemLocked( player, unlockedItems[ i ], weaponRef ) )
+ return unlockedItems[ i ]
+ }
+ else
+ {
+ if ( !IsItemLocked( player, unlockedItems[ i ] ) )
+ return unlockedItems[ i ]
+ }
+ }
+ }
+ }
+
+ return ""
+}
+
+array<string> function GetUnlockItemsForWeaponLevel( string weaponRef, int newLevel )
+{
+ array<string> unlockedItems
+
+ foreach ( ref, ul in file.unlocks )
+ {
+ if ( ul.unlockType == eUnlockType.WEAPON_LEVEL && ul.unlockLevel == newLevel && ul.parentRef == weaponRef )
+ {
+ unlockedItems.append( ref )
+ }
+ }
+
+ foreach ( childRef, ul in file.unlocks[ weaponRef ].child )
+ {
+ if ( ul.unlockType == eUnlockType.WEAPON_LEVEL && ul.unlockLevel == newLevel )
+ {
+ unlockedItems.append( childRef )
+ }
+ }
+
+ return unlockedItems
+}
+
+array<ItemDisplayData> function GetUnlockItemsForFactionLevels( string factionRef, int startLevel, int endLevel )
+{
+ array<ItemDisplayData> unlockedItems
+
+ for ( int currentLevel = startLevel; currentLevel <= endLevel; currentLevel++ )
+ {
+ unlockedItems.extend( GetUnlockItemsForFactionLevel( factionRef, currentLevel ) )
+ }
+
+ return unlockedItems
+}
+
+array<ItemDisplayData> function GetUnlockItemsForFactionLevel( string factionRef, int newLevel )
+{
+ array<ItemDisplayData> unlockedItems
+
+ foreach ( ref, ul in file.unlocks )
+ {
+ if ( ul.unlockType == eUnlockType.FACTION_LEVEL && ul.unlockLevel == newLevel )
+ {
+ if ( ul.additionalRef == factionRef )
+ unlockedItems.append( GetItemDisplayData( ref ) )
+ }
+
+ foreach ( childRef, cul in ul.child )
+ {
+ if ( cul.unlockType == eUnlockType.FACTION_LEVEL && cul.unlockLevel == newLevel )
+ {
+ if ( cul.additionalRef == factionRef )
+ unlockedItems.append( GetItemDisplayData( childRef, ref ) )
+ }
+ }
+ }
+
+ return unlockedItems
+}
+
+
+array<string> function GetUnlockItemsForFDTitanLevels( string titanRef, int startLevel, int endLevel )
+{
+ array<string> unlockedItems
+
+ for ( int currentLevel = startLevel; currentLevel <= endLevel; currentLevel++ )
+ {
+ unlockedItems.extend( GetUnlockItemsForFDTitanLevel( titanRef, currentLevel ) )
+ }
+
+ return unlockedItems
+}
+
+string function GetNextUnlockForFDTitanLevel( entity player, string titanRef, int startLevel )
+{
+ array<string> unlockedItems
+
+ int endLevel = FD_TitanGetMaxRawLevel( titanRef )
+
+ for ( int currentLevel = startLevel; currentLevel <= endLevel; currentLevel++ )
+ {
+ unlockedItems = GetUnlockItemsForFDTitanLevel( titanRef, currentLevel )
+
+ //if ( unlockedItems.len() == 0 )
+ //{
+ // if ( FDTitanLevelHasRandomUnlock( currentLevel, titanRef ) )
+ // return "random"
+ //}
+
+ if ( unlockedItems.len() > 0 )
+ {
+ for ( int i = 0; i < unlockedItems.len(); i++ )
+ {
+ if ( IsSubItemType( GetItemType( unlockedItems[ i ] ) ) )
+ {
+ if ( IsSubItemLocked( player, unlockedItems[ i ], titanRef ) )
+ return unlockedItems[ i ]
+ }
+ else
+ {
+ if ( IsItemLocked( player, unlockedItems[ i ] ) )
+ return unlockedItems[ i ]
+ }
+ }
+ }
+ }
+
+ return ""
+}
+
+array<string> function GetUnlockItemsForFDTitanLevel( string titanRef, int newLevel )
+{
+ array<string> unlockedItems
+ Assert( titanRef in file.unlocks )
+
+ foreach ( ref, ul in file.unlocks )
+ {
+ if ( ul.unlockType == eUnlockType.FD_UNLOCK_POINTS && ul.unlockLevel == newLevel && ul.parentRef == titanRef )
+ {
+ unlockedItems.append( ref )
+ }
+ }
+
+ foreach ( childRef, ul in file.unlocks[ titanRef ].child )
+ {
+ if ( ul.unlockType == eUnlockType.FD_UNLOCK_POINTS && ul.unlockLevel == newLevel )
+ {
+ unlockedItems.append( childRef )
+ }
+ }
+
+ //if ( unlockedItems.len() == 0 )
+ {
+ if ( FDTitanLevelHasRandomUnlock( newLevel, titanRef ) )
+ unlockedItems.append( "random" )
+ }
+
+ return unlockedItems
+}
+
+bool function DidPlayerBuyItemFromBlackMarket( player, ref )
+{
+ bool doesRefExist = PersistenceEnumValueIsValid( "BlackMarketUnlocks", ref )
+ if ( doesRefExist == false )
+ return false
+
+ return expect bool( player.GetPersistentVar( "bm.blackMarketItemUnlocks[" + ref + "]" ) )
+}
+
+void function PrintItem( ItemData item, int indentLevel = 0 )
+{
+ print( TableIndent( indentLevel ) )
+
+ printt( "itemType =", item.itemType )
+ printt( "ref =", item.ref )
+
+ printt( "name =", item.name )
+ printt( "desc =", item.desc )
+ printt( "longdesc =", item.longdesc )
+ printt( "image =", item.image )
+
+ printt( "hidden =", item.hidden )
+
+ printt( "persistenceStruct =", item.persistenceStruct )
+ printt( "persistenceId =", item.persistenceId )
+
+ foreach ( itemRef, _ in item.subitems )
+ {
+ PrintItem( GetItemData( itemRef ), indentLevel + 1 )
+ }
+
+ PrintTable( item.i )
+}
+
+void function PrintItemData()
+{
+ foreach ( ItemData item in file.itemData )
+ {
+ PrintItem( item, 0 )
+ }
+}
+
+void function PrintItems()
+{
+ foreach ( itemType, refList in file.itemsOfType )
+ {
+ printt( itemType )
+ foreach ( ref in refList )
+ {
+ printt( " " + ref )
+ }
+ }
+}
+
+string function GetDisplayNameFromItemType( int itemType )
+{
+ string displayName
+
+ switch ( itemType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.TITAN_PRIMARY:
+ displayName = "#PILOT_PRIMARY"
+ break
+
+ case eItemTypes.PILOT_SECONDARY:
+ displayName = "#PILOT_SECONDARY"
+ break
+
+ case eItemTypes.PILOT_WEAPON3:
+ displayName = "#PILOT_WEAPON3"
+ break
+
+ case eItemTypes.PILOT_SPECIAL:
+ displayName = "#TACTICAL_ABILITY"
+ break
+
+ case eItemTypes.TITAN_SPECIAL:
+ displayName = "#DEFENSIVE_ABILITY"
+ break
+
+ case eItemTypes.TITAN_ANTIRODEO:
+ displayName = "#TACTICAL_ABILITY"
+ break
+
+ case eItemTypes.PILOT_ORDNANCE:
+ case eItemTypes.TITAN_ORDNANCE:
+ displayName = "#ORDNANCE"
+ break
+
+ case eItemTypes.PILOT_PASSIVE1:
+ displayName = "#PILOT_KIT1"
+ break
+
+ case eItemTypes.PILOT_PASSIVE2:
+ displayName = "#PILOT_KIT2"
+ break
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ displayName = "#TITAN_GENERAL_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ displayName = "#TITAN_TITANFALL_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ displayName = "#TITAN_RONIN_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ displayName = "#TITAN_NORTHSTAR_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_ION_PASSIVE:
+ displayName = "#TITAN_ION_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ displayName = "#TITAN_TONE_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ displayName = "#TITAN_SCORCH_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ displayName = "#TITAN_LEGION_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ displayName = "#TITAN_VANGUARD_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ displayName = "#TITAN_UPGRADE1_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ displayName = "#TITAN_UPGRADE2_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ displayName = "#TITAN_UPGRADE3_PASSIVE_TITLE"
+ break
+
+ case eItemTypes.TITAN_OS:
+ displayName = "#VOICE"
+ break
+
+ case eItemTypes.TITAN_NOSE_ART:
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ displayName = "#NOSE_ART"
+ break
+
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ displayName = "#ITEM_TYPE_WEAPON_ATTACHMENT"
+ break
+
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.TITAN_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ displayName = "#ITEM_TYPE_WEAPON_MOD"
+ break
+
+ case eItemTypes.TITAN:
+ displayName = "#CHASSIS"
+ break
+
+ case eItemTypes.RACE:
+ displayName = "#GENDER"
+ break
+
+ case eItemTypes.PILOT_MELEE:
+ displayName = "#MELEE"
+ break
+
+ case eItemTypes.PILOT_EXECUTION:
+ displayName = "#ITEM_TYPE_PILOT_EXECUTION"
+ break
+
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ displayName = "#ITEM_TYPE_TITAN_EXECUTION"
+ break
+
+ default:
+ Assert( false, "Invalid item itemType!" )
+ }
+
+ return displayName
+}
+
+int function GetStatUnlockSort( ItemDisplayData a, ItemDisplayData b )
+{
+ table aAdditionalData
+ table bAdditionalData
+
+ int itemType = GetItemType( a.ref )
+ if ( IsSubItemType( itemType ) )
+ {
+ aAdditionalData = file.unlocks[ a.parentRef ].child[ a.ref ].additionalData
+ bAdditionalData = file.unlocks[ b.parentRef ].child[ b.ref ].additionalData
+ }
+ else
+ {
+ aAdditionalData = file.unlocks[ a.ref ].additionalData
+ bAdditionalData = file.unlocks[ b.ref ].additionalData
+ }
+
+ string aStatCategory = expect string( aAdditionalData.statCategory )
+ string aStatAlias = expect string( aAdditionalData.statAlias )
+ string aStatSubAlias = expect string( aAdditionalData.statSubAlias )
+ var aUnlockValue = aAdditionalData.statUnlockValue
+
+ string bStatCategory = expect string( bAdditionalData.statCategory )
+ string bStatAlias = expect string( bAdditionalData.statAlias )
+ string bStatSubAlias = expect string( bAdditionalData.statSubAlias )
+ var bUnlockValue = bAdditionalData.statUnlockValue
+
+ if ( aStatCategory > bStatCategory )
+ return 1
+ else if ( aStatCategory < bStatCategory )
+ return -1
+
+ if ( aStatAlias > bStatAlias )
+ return 1
+ else if ( aStatAlias < bStatAlias )
+ return -1
+
+ if ( aUnlockValue > bUnlockValue )
+ return 1
+ else if ( aUnlockValue < bUnlockValue )
+ return -1
+
+ return 0
+}
+
+int function SortItemsAlphabetically( ItemDisplayData a, ItemDisplayData b )
+{
+ if ( a.name > b.name )
+ return 1
+
+ if ( a.name < b.name )
+ return -1
+
+ return 0
+}
+
+int function SortByUnlockLevelUntyped( ItemDisplayData a, ItemDisplayData b )
+{
+ if ( a.ref == b.ref )
+ return 0
+
+ int aUnlockLevel
+ int bUnlockLevel
+ int itemType = GetItemType( a.ref )
+ if ( IsSubItemType( itemType ) )
+ {
+ aUnlockLevel = GetUnlockLevelReqWithParent( a.ref, a.parentRef )
+ bUnlockLevel = GetUnlockLevelReqWithParent( b.ref, b.parentRef )
+ }
+ else
+ {
+ aUnlockLevel = GetUnlockLevelReq( a.ref )
+ bUnlockLevel = GetUnlockLevelReq( b.ref )
+ }
+
+ if ( aUnlockLevel == 0 && bUnlockLevel > 0 )
+ return 1
+ else if ( aUnlockLevel > 0 && bUnlockLevel == 0 )
+ return -1
+
+ if ( aUnlockLevel > bUnlockLevel )
+ return 1
+ else if ( aUnlockLevel < bUnlockLevel )
+ return -1
+
+ int aUnlockType = CheckItemUnlockType( a.ref, a.parentRef )
+ int bUnlockType = CheckItemUnlockType( b.ref, b.parentRef )
+
+ if ( aUnlockType > bUnlockType )
+ return 1
+ else if ( aUnlockType < bUnlockType )
+ return -1
+
+ if ( aUnlockType == bUnlockType && aUnlockType == eUnlockType.STAT )
+ return GetStatUnlockSort( a, b )
+
+ if ( a.persistenceId > b.persistenceId )
+ return 1
+ else
+ return -1
+
+ unreachable
+}
+
+int function SortByUnlockLevel( GlobalItemRef a, GlobalItemRef b )
+{
+ if ( a.ref == b.ref )
+ return 0
+
+ int aUnlockLevel = GetUnlockLevelReq( a.ref )
+ int bUnlockLevel = GetUnlockLevelReq( b.ref )
+
+ if ( aUnlockLevel > bUnlockLevel )
+ return 1
+ else if ( aUnlockLevel < bUnlockLevel )
+ return -1
+
+ if ( a.guid > b.guid )
+ return 1
+ else
+ return -1
+
+ unreachable
+}
+
+bool function IsTitanOSUnlocked( ref, player )
+{
+ return true
+}
+
+bool function IsDecalUnlocked( ref, player = null )
+{
+ Assert( ref == ref.tolower() )
+
+ local decalUnlockData = GetPlayerDecalUnlockData( player, ref )
+ return expect bool( decalUnlockData.unlocked )
+}
+
+function GetPlayerDecalUnlockData( player, ref )
+{
+ Assert( IsUI() || IsValid( player ) )
+
+ local data = {}
+ data.unlocked <- true
+ data.goal <- 0
+ data.progress <- 0
+ data.dlcGroup <- 0
+ data.unlockText <- ""
+
+ return data
+}
+
+// TODO: Default "pretend" attachments shouldn't be baked into weapons.
+// Because of this, we don't have real items for everything in order to make this work the right way.
+// Should be a real attachment as all others and we can flag it as default in some way.
+asset function GetStockAttachmentImage( string itemRef )
+{
+ Assert( GetItemType( itemRef ) == eItemTypes.PILOT_PRIMARY )
+
+ switch ( itemRef )
+ {
+ case "mp_weapon_dmr":
+ case "mp_weapon_sniper":
+ return $"r2_ui/menus/loadout_icons/attachments/stock_scope"
+
+ case "mp_weapon_doubletake":
+ return $"r2_ui/menus/loadout_icons/attachments/stock_doubletake_sight"
+
+ case "mp_weapon_rspn101_og":
+ return $"r2_ui/menus/loadout_icons/attachments/aog"
+ }
+
+ return $"r2_ui/menus/loadout_icons/attachments/iron_sights"
+}
+
+string function GetSuitAndGenderBasedSetFile( string suit, string gender )
+{
+ Assert( gender == "race_human_male" ||
+ gender == "race_human_female" )
+
+ bool isFemale = gender == RACE_HUMAN_FEMALE
+
+ string genderString
+ if ( isFemale )
+ genderString = "female"
+ else
+ genderString = "male"
+
+ // pilot_medium_male
+ // pilot_geist_male
+ // pilot_stalker_male
+ // pilot_light_male
+ // pilot_heavy_male
+ // pilot_grapple_male
+ // pilot_nomad_male
+ // pilot_medium_female
+ // pilot_geist_female
+ // pilot_stalker_female
+ // pilot_light_female
+ // pilot_heavy_female
+ // pilot_grapple_female
+ // pilot_nomad_female
+ return "pilot_" + suit + "_" + genderString
+}
+
+string function GetSuitBasedTactical( string suit )
+{
+ return GetTableValueForSuit( suit, "tactical" )
+}
+
+//string function GetSuitBasedDefaultPassive( string suit, string propertyName )
+//{
+// Assert( propertyName == "passive1" || propertyName == "passive2" )
+//
+// string value
+// if ( propertyName == "passive1" )
+// value = GetTableValueForSuit( suit, "defaultPassive1" )
+// else
+// value = GetTableValueForSuit( suit, "defaultPassive2" )
+//
+// return value
+//}
+
+string function GetTableValueForSuit( string suit, string columnName )
+{
+ var dataTable = GetDataTable( $"datatable/pilot_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "type" ), suit )
+ int column = GetDataTableColumnByName( dataTable, columnName )
+ string value = GetDataTableString( dataTable, row, column )
+
+ return value
+}
+
+int function GetTitanLoadoutPropertyPassiveType( string setFile, string loadoutProperty )
+{
+ Assert( loadoutProperty == "passive1" || loadoutProperty == "passive2" || loadoutProperty == "passive3" || loadoutProperty == "passive4" || loadoutProperty == "passive5" || loadoutProperty == "passive6")
+
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "setFile" ), setFile )
+ int column = GetDataTableColumnByName( dataTable, loadoutProperty )
+ int itemType = eItemTypes[ GetDataTableString( dataTable, row, column ) ]
+
+ return itemType
+}
+
+int function GetTitanLoadoutPropertyExecutionType( string setFile, string loadoutProperty )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "setFile" ), setFile )
+ int column = GetDataTableColumnByName( dataTable, loadoutProperty )
+ int itemType = eItemTypes[ GetDataTableString( dataTable, row, column ) ]
+
+ return itemType
+}
+
+string function GetPrimeTitanSetFileFromNonPrimeSetFile( string nonPrimeSetFile ) //TODO: should just load titan_properties into memory instead of run-time lookup
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "setFile" ), nonPrimeSetFile )
+ int column = GetDataTableColumnByName( dataTable, "primeSetFile" )
+ return GetDataTableString( dataTable, row, column )
+}
+
+string function GetTitanProperty_SetFile( string titanRef )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titanRef )
+
+ return GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "setFile" ) )
+}
+
+int function GetTitanProperty_Passive1Type( string titanRef )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titanRef )
+
+ return eItemTypes[ GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "passive1" ) ) ]
+}
+
+int function GetTitanProperty_Passive2Type( string titanRef )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titanRef )
+
+ return eItemTypes[ GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "passive2" ) ) ]
+}
+
+int function GetTitanProperty_Passive3Type( string titanRef )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titanRef )
+
+ return eItemTypes[ GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "passive3" ) ) ]
+}
+
+int function GetTitanProperty_Passive4Type( string titanRef )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titanRef )
+
+ return eItemTypes[ GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "passive4" ) ) ]
+}
+
+int function GetTitanProperty_Passive5Type( string titanRef )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titanRef )
+
+ return eItemTypes[ GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "passive5" ) ) ]
+}
+
+int function GetTitanProperty_Passive6Type( string titanRef )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titanRef )
+
+ return eItemTypes[ GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "passive6" ) ) ]
+}
+
+asset function GetTitanCoreIcon( string titanRef )
+{
+ Assert( GetItemType( titanRef ) == eItemTypes.TITAN )
+ ItemData itemData = GetItemData( titanRef )
+
+ return expect asset( itemData.i.coreIcon )
+}
+
+
+string function GetWeaponBasedDefaultMod( string weapon, string propertyName )
+{
+ Assert( propertyName == "primaryAttachment" ||
+ propertyName == "primaryMod1" ||
+ propertyName == "primaryMod2" ||
+ propertyName == "primaryMod3" ||
+ propertyName == "secondaryMod1" ||
+ propertyName == "secondaryMod2" ||
+ propertyName == "secondaryMod3" ||
+ propertyName == "weapon3Mod1" ||
+ propertyName == "weapon3Mod2" ||
+ propertyName == "weapon3Mod3" )
+
+ string columnName
+ if ( propertyName == "primaryAttachment" )
+ columnName = "defaultAttachment"
+ else if ( propertyName == "primaryMod1" || propertyName == "secondaryMod1" || propertyName == "weapon3Mod1" )
+ columnName = "defaultMod1"
+ else if ( propertyName == "primaryMod2" || propertyName == "secondaryMod2" || propertyName == "weapon3Mod2" )
+ columnName = "defaultMod2"
+ else
+ columnName = "defaultMod3"
+
+ string value = GetTableValueForWeapon( weapon, columnName )
+
+ return value
+}
+
+string function GetTableValueForWeapon( string weapon, string columnName )
+{
+ var dataTable = GetDataTable( $"datatable/pilot_weapons.rpak" )
+ int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "itemRef" ), weapon )
+ int column = GetDataTableColumnByName( dataTable, columnName )
+ string value = GetDataTableString( dataTable, row, column )
+
+ return value
+}
+
+void function CheckEverythingUnlockedAchievement( entity player )
+{
+ Assert( IsServer() )
+
+ //if ( !IsValid( player ) || !player.IsPlayer() )
+ // return
+ //if ( player.IsBot() )
+ // return
+ //
+ //if ( player.GetPersistentVar( "ach_unlockEverything" ) )
+ // return
+ //
+ //foreach ( item in file.allItems )
+ //{
+ // if ( item.Type == eItemTypes.TITAN_NOSE_ART )
+ // continue
+ //
+ // if ( IsParentItemLocked( item.ref, item.childRef, player ) )
+ // return
+ //}
+ //
+ //player.SetPersistentVar( "ach_unlockEverything", true )
+}
+
+ItemData ornull function DevFindItemByName( int itemType, string itemName )
+{
+ array<ItemData> items = GetAllItemsOfType( itemType )
+ foreach ( item in items )
+ {
+ if ( item.ref == itemName )
+ {
+ return item
+ }
+ }
+
+ return null
+}
+
+int function MenuCategoryStringToEnumValue( string stringVal )
+{
+ int enumVal = -1
+
+ switch ( stringVal )
+ {
+ case "ar":
+ enumVal = ePrimaryWeaponCategory.AR
+ break
+
+ case "smg":
+ enumVal = ePrimaryWeaponCategory.SMG
+ break
+
+ case "lmg":
+ enumVal = ePrimaryWeaponCategory.LMG
+ break
+
+ case "sniper":
+ enumVal = ePrimaryWeaponCategory.SNIPER
+ break
+
+ case "shotgun":
+ enumVal = ePrimaryWeaponCategory.SHOTGUN
+ break
+
+ case "handgun":
+ enumVal = ePrimaryWeaponCategory.HANDGUN
+ break
+
+ case "special":
+ enumVal = ePrimaryWeaponCategory.SPECIAL
+ break
+
+ case "at":
+ enumVal = eSecondaryWeaponCategory.AT
+ break
+
+ case "pistol":
+ enumVal = eSecondaryWeaponCategory.PISTOL
+ break
+
+ default:
+ Assert( 0, "Unknown stringVal: " + stringVal )
+ }
+
+ return enumVal
+}
+
+int function MenuAnimClassStringToEnumValue( string stringVal )
+{
+ int enumVal = -1
+
+ switch ( stringVal )
+ {
+ case "small":
+ enumVal = eMenuAnimClass.SMALL
+ break
+
+ case "medium":
+ enumVal = eMenuAnimClass.MEDIUM
+ break
+
+ case "large":
+ enumVal = eMenuAnimClass.LARGE
+ break
+
+ case "custom":
+ enumVal = eMenuAnimClass.CUSTOM
+ break
+
+ default:
+ Assert( 0, "Unknown stringVal: " + stringVal )
+ }
+
+ return enumVal
+}
+
+asset function GetImage( int itemType, string itemRef, string childRef = "" )
+{
+ asset image
+
+ if ( itemRef == "" )
+ return image
+
+ switch ( itemType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ if ( childRef == "none" || childRef == "" )
+ {
+ if ( itemType == eItemTypes.PILOT_PRIMARY_ATTACHMENT )
+ image = GetStockAttachmentImage( itemRef )
+ else
+ image = MOD_ICON_NONE
+ }
+ else
+ {
+ image = GetSubitemImage( itemRef, childRef )
+ }
+ break
+
+ case eItemTypes.RACE:
+ Assert( itemRef == "race_human_male" || itemRef == "race_human_female" )
+ if ( itemRef == "race_human_male" )
+ image = $"rui/menu/common/gender_button_male"
+ else
+ image = $"rui/menu/common/gender_button_female"
+ break
+
+ default:
+ image = GetItemImage( itemRef )
+ }
+
+ return image
+}
+
+array<string> function GetAllWeaponsByType( array<int> weaponTypes )
+{
+ array<string> weapons
+ foreach ( weaponType in weaponTypes )
+ {
+ foreach ( weapon in GetAllItemRefsOfType( weaponType ) )
+ {
+ // mp puts weapons into its list multiple times
+ if ( weapons.contains( weapon ) )
+ continue
+ weapons.append( weapon )
+ }
+ }
+ return weapons
+}
+
+string function GetItemRefTypeName( string itemRef, string parentItemRef = "" )
+{
+ int itemType = GetItemType( itemRef )
+ int parentItemType = parentItemRef != "" ? GetItemType( parentItemRef ) : -1
+
+ if ( itemType == eItemTypes.FEATURE )
+ {
+ ItemData featureItem = GetItemData( itemRef )
+ return expect string( featureItem.i.specificType )
+ }
+ else if ( itemType == eItemTypes.TITAN_FD_UPGRADE )
+ {
+ ItemData item = GetItemData( itemRef )
+ return expect string( item.i.upgradeTypeCategory )
+ }
+
+ return GetItemTypeName( itemType, parentItemType )
+}
+
+string function GetItemTypeName( int itemType, int parentItemType = -1 )
+{
+ switch ( itemType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ return "#ITEM_TYPE_PILOT_PRIMARY"
+
+ case eItemTypes.TITAN_PRIMARY:
+ return "#ITEM_TYPE_TITAN_PRIMARY"
+
+ case eItemTypes.PILOT_SECONDARY:
+ return "#ITEM_TYPE_PILOT_SECONDARY"
+
+ case eItemTypes.PILOT_SPECIAL:
+ return "#ITEM_TYPE_PILOT_SPECIAL"
+
+ case eItemTypes.TITAN_SPECIAL:
+ return "#ITEM_TYPE_TITAN_SPECIAL"
+
+ case eItemTypes.PILOT_ORDNANCE:
+ return "#ITEM_TYPE_PILOT_ORDNANCE"
+
+ case eItemTypes.TITAN_ORDNANCE:
+ return "#ITEM_TYPE_TITAN_ORDNANCE"
+
+ case eItemTypes.TITAN_ANTIRODEO:
+ return "#ITEM_TYPE_TITAN_ANTIRODEO"
+
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ if ( parentItemType != -1 )
+ return "#ITEM_TYPE_WEAPON_SPECIFIC_ATTACHMENT"
+ else
+ return "#ITEM_TYPE_WEAPON_GENERIC_ATTACHMENT"
+
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.TITAN_PRIMARY_MOD:
+ if ( parentItemType != -1 )
+ return "#ITEM_TYPE_WEAPON_SPECIFIC_MOD"
+ else
+ return "#ITEM_TYPE_WEAPON_GENERIC_MOD"
+
+ case eItemTypes.CALLING_CARD:
+ return "#ITEM_TYPE_CALLING_CARD"
+
+ case eItemTypes.CAMO_SKIN_PILOT:
+ return "#ITEM_TYPE_CAMO_SKIN_PILOT"
+
+ case eItemTypes.CAMO_SKIN_TITAN:
+ if ( parentItemType != -1 )
+ return "#ITEM_TYPE_SPECIFIC_CAMO"
+ else
+ return "#ITEM_TYPE_CAMO_SKIN_TITAN"
+
+ case eItemTypes.TITAN_WARPAINT:
+ return "#ITEM_TYPE_TITAN_WARPAINT"
+
+ case eItemTypes.CAMO_SKIN:
+ if ( parentItemType != -1 )
+ {
+ if ( parentItemType == eItemTypes.TITAN )
+ return "#ITEM_TYPE_SPECIFIC_WEAPON_CAMO"
+ else
+ return "#ITEM_TYPE_SPECIFIC_CAMO"
+ }
+ else
+ return "#ITEM_TYPE_CAMO_SKIN"
+
+ case eItemTypes.CALLSIGN_ICON:
+ return "#ITEM_TYPE_CALLSIGN_ICON"
+
+ case eItemTypes.BURN_METER_REWARD:
+ return "#ITEM_TYPE_BURN_METER_REWARD"
+
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ if ( parentItemType != -1 )
+ return "#ITEM_TYPE_TITAN_SPECIFIC_KIT"
+ else
+ return "#ITEM_TYPE_TITAN_GENERIC_KIT"
+
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ return "#ITEM_TYPE_UPGRADE1"
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ return "#ITEM_TYPE_UPGRADE2"
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ return "#ITEM_TYPE_UPGRADE3"
+
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ return "#ITEM_TYPE_TITAN_GENERAL_PASSIVE"
+
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ return "#ITEM_TYPE_TITAN_TITANFALL_PASSIVE"
+
+ case eItemTypes.TITAN:
+ return "#ITEM_TYPE_TITAN"
+
+ case eItemTypes.RACE:
+ return "#GENDER"
+
+ case eItemTypes.TITAN_NOSE_ART:
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ return "#ITEM_TYPE_TITAN_NOSE_ART"
+
+ case eItemTypes.PILOT_EXECUTION:
+ return "#ITEM_TYPE_PILOT_EXECUTION"
+
+ case eItemTypes.TITAN_ION_EXECUTION:
+ case eItemTypes.TITAN_SCORCH_EXECUTION:
+ case eItemTypes.TITAN_RONIN_EXECUTION:
+ case eItemTypes.TITAN_LEGION_EXECUTION:
+ case eItemTypes.TITAN_VANGUARD_EXECUTION:
+ case eItemTypes.TITAN_TONE_EXECUTION:
+ case eItemTypes.TITAN_NORTHSTAR_EXECUTION:
+ if ( parentItemType != -1 )
+ return "#ITEM_TYPE_TITAN_SPECIFIC_EXECUTION"
+ else
+ return "#ITEM_TYPE_TITAN_EXECUTION"
+
+ case eItemTypes.PILOT_PASSIVE1:
+ case eItemTypes.PILOT_PASSIVE2:
+ return "#ITEM_TYPE_PILOT_PASSIVE"
+
+ case eItemTypes.FACTION:
+ return "#ITEM_TYPE_FACTION"
+
+ case eItemTypes.FEATURE:
+ return "#ITEM_TYPE_FEATURE"
+
+ case eItemTypes.WEAPON_FEATURE:
+ return "#ITEM_TYPE_WEAPON_FEATURE"
+
+ case eItemTypes.PILOT_SUIT:
+ return "#ITEM_TYPE_PILOT_SPECIAL"
+
+ case eItemTypes.COMMS_ICON:
+ return "#ITEM_TYPE_COMMS_ICON"
+
+ case eItemTypes.TITAN_FD_UPGRADE:
+ return "#ITEM_TYPE_FD_UPGRADES"
+
+ default:
+ #if DEV
+ Assert( false, "Invalid item type: " + DEV_GetEnumStringFromIndex( "eItemTypes", itemType) )
+ #endif
+ }
+
+ return "UNDEFINED"
+}
+
+/*
+ PILOT_PRIMARY,
+ PILOT_SECONDARY,
+ PILOT_SPECIAL,
+ PILOT_ORDNANCE,
+ PILOT_PRIMARY_ATTACHMENT,
+ PILOT_PRIMARY_MOD,
+ PILOT_SECONDARY_MOD,
+ PILOT_PASSIVE1,
+ PILOT_PASSIVE2,
+ TITAN_PRIMARY,
+ TITAN_SPECIAL,
+ TITAN_ANTIRODEO,
+ TITAN_ORDNANCE,
+ TITAN_PRIMARY_MOD,
+ TITAN_OS,
+ RACE,
+ NOT_LOADOUT,
+ TITAN_NOSE_ART,
+ PILOT_SUIT,
+ TITAN_CORE_ABILITY,
+ BURN_METER_REWARD,
+ PILOT_MELEE,
+ TITAN,
+ FEATURE,
+ CALLING_CARD,
+ CALLSIGN_ICON,
+ CAMO_SKIN,
+ CAMO_SKIN_PILOT,
+ CAMO_SKIN_TITAN,
+ SUB_PILOT_WEAPON_MOD,
+ SUB_PILOT_WEAPON_ATTACHMENT,
+ FACTION,
+ PILOT_EXECUTION,
+ TITAN_GENERAL_PASSIVE,
+ TITAN_TITANFALL_PASSIVE,
+ TITAN_RONIN_PASSIVE,
+ TITAN_NORTHSTAR_PASSIVE,
+ TITAN_ION_PASSIVE,
+ TITAN_TONE_PASSIVE,
+ TITAN_SCORCH_PASSIVE,
+ TITAN_LEGION_PASSIVE,
+*/
+
+void function ItemReport()
+{
+ table itemTypesEnum = expect table( getconsttable().eItemTypes )
+
+ array<string> itemTypeIndexToName
+ itemTypeIndexToName.resize( itemTypesEnum.len(), "UNDEFINED" )
+ foreach ( name, index in itemTypesEnum )
+ {
+ expect int( index )
+ itemTypeIndexToName[index] = string( name )
+ }
+
+ array<GlobalItemRef> allItemsRefData = GetAllItemRefs()
+
+ table<string, int> subItemRefs
+
+ printt( "ITEM REPORT:" )
+ foreach ( typeIndex, typeName in itemTypeIndexToName )
+ {
+ if ( typeName == "COUNT" )
+ continue
+
+ printt( typeName )
+ array<string> itemRefs = GetAllItemRefsOfType( typeIndex )
+ foreach ( itemRef in itemRefs )
+ {
+ ItemData itemData = GetItemData( itemRef )
+ if ( itemRef in subItemRefs )
+ {
+ printt( itemRef, itemData.persistenceId, "use count: ", subItemRefs[itemRef] )
+ Assert( !(itemRef in file.unlocks) )
+ }
+ else
+ printt( itemRef, itemData.persistenceId, itemData.persistenceStruct )
+
+ foreach ( subItemRef, subItemData in itemData.subitems )
+ {
+ printt( "\t", subItemRef )
+ if ( !(subItemRef in subItemRefs) )
+ {
+ subItemRefs[subItemRef] <- 0
+ }
+
+ subItemRefs[subItemRef]++
+ }
+ }
+
+ printt( "\n" )
+ }
+}
+
+
+void function UnlockReport()
+{
+ table itemTypesEnum = expect table( getconsttable().eItemTypes )
+ table unlockTypesEnum = expect table( getconsttable().eUnlockType )
+
+ array<string> unlockIndexToName
+ unlockIndexToName.resize( unlockTypesEnum.len(), "UNDEFINED" )
+ foreach ( name, index in unlockTypesEnum )
+ {
+ expect int( index )
+ unlockIndexToName[index] = string( name )
+ }
+
+ array<string> itemTypeIndexToName
+ itemTypeIndexToName.resize( itemTypesEnum.len(), "UNDEFINED" )
+ foreach ( name, index in itemTypesEnum )
+ {
+ expect int( index )
+ itemTypeIndexToName[index] = string( name )
+ }
+
+ array<GlobalItemRef> allItemsRefData = GetAllItemRefs()
+
+ foreach ( typeIndex, typeName in itemTypeIndexToName )
+ {
+ if ( typeName == "COUNT" )
+ continue
+
+ printt( typeName )
+
+ switch ( typeIndex )
+ {
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ANTIRODEO:
+ case eItemTypes.TITAN_ORDNANCE:
+ continue
+ }
+
+ array<string> itemRefs = GetAllItemRefsOfType( typeIndex )
+ foreach ( itemRef in itemRefs )
+ {
+ ItemData itemData = GetItemData( itemRef )
+ if ( itemRef in file.unlocks )
+ {
+ printt( "\t", itemRef, unlockIndexToName[file.unlocks[itemRef].unlockType] )
+
+ foreach ( subItemRef, subItemData in itemData.subitems )
+ {
+ if ( !(subItemRef in file.unlocks[itemRef].child ) )
+ {
+ CodeWarning( typeName + " " + itemRef + " contains subitem " + subItemRef + " but does not unlock it." )
+ }
+ }
+ }
+ else
+ {
+ bool found = false
+ foreach ( ref, unlockData in file.unlocks )
+ {
+ if ( !ItemDefined( ref ) )
+ continue
+
+ if ( itemRef in unlockData.child )
+ {
+ found = true
+ printt( "\t", itemRef, ref, unlockIndexToName[unlockData.child[itemRef].unlockType] )
+ break
+ }
+ }
+
+ if ( !found )
+ printt( "\t", itemRef, "***" )
+ }
+ }
+ printt( "\n" )
+ }
+/*
+ foreach ( ref, unlockData in file.unlocks )
+ {
+ if ( !ItemDefined( ref ) )
+ {
+ printt( "bogus unlock ref:", ref )
+ continue
+ }
+
+ ItemData itemData = GetItemData( ref )
+ }
+
+ foreach ( ref, unlockData in file.unlocks )
+ {
+ if ( !ItemDefined( ref ) )
+ {
+ printt( "bogus unlock ref:", ref )
+ printt( "\t", itemRef, unlockIndexToName[file.unlocks[itemRef].unlockType] )
+ }
+ }
+ */
+}
+
+
+
+void function UnlockDump()
+{
+ table itemTypesEnum = expect table( getconsttable().eItemTypes )
+ table unlockTypesEnum = expect table( getconsttable().eUnlockType )
+
+ array<string> unlockIndexToName
+ unlockIndexToName.resize( unlockTypesEnum.len(), "UNDEFINED" )
+ foreach ( name, index in unlockTypesEnum )
+ {
+ expect int( index )
+ unlockIndexToName[index] = string( name )
+ }
+
+ array<string> itemTypeIndexToName
+ itemTypeIndexToName.resize( itemTypesEnum.len(), "UNDEFINED" )
+ foreach ( name, index in itemTypesEnum )
+ {
+ expect int( index )
+ itemTypeIndexToName[index] = string( name )
+ }
+
+ foreach ( ref, unlock in file.unlocks )
+ {
+ printt( ref, DEV_GetEnumStringFromIndex( "eUnlockType", unlock.unlockType ), unlock.unlockLevel )
+
+ foreach ( childRef, child in unlock.child )
+ {
+ printt( "\t", childRef, DEV_GetEnumStringFromIndex( "eUnlockType", child.unlockType ), child.unlockLevel )
+ }
+ }
+/*
+
+ switch ( typeIndex )
+ {
+ case eItemTypes.TITAN_SPECIAL:
+ case eItemTypes.TITAN_ANTIRODEO:
+ case eItemTypes.TITAN_ORDNANCE:
+ continue
+ }
+
+ array<string> itemRefs = GetAllItemRefsOfType( typeIndex )
+ foreach ( itemRef in itemRefs )
+ {
+ ItemData itemData = GetItemData( itemRef )
+ if ( itemRef in file.unlocks )
+ {
+ printt( "\t", itemRef, unlockIndexToName[file.unlocks[itemRef].unlockType] )
+ }
+ else
+ {
+ bool found = false
+ foreach ( ref, unlockData in file.unlocks )
+ {
+ if ( !ItemDefined( ref ) )
+ continue
+
+ if ( itemRef in unlockData.child )
+ {
+ found = true
+ printt( "\t", itemRef, ref, unlockIndexToName[unlockData.child[itemRef].unlockType] )
+ break
+ }
+ }
+
+ if ( !found )
+ printt( "\t", itemRef, "***" )
+ }
+ }
+ printt( "\n" )
+ }
+ */
+}
+
+bool function IsSubItemType( int itemType )
+{
+ switch ( itemType )
+ {
+ case eItemTypes.PILOT_PRIMARY_ATTACHMENT:
+ case eItemTypes.PILOT_PRIMARY_MOD:
+ case eItemTypes.PILOT_SECONDARY_MOD:
+ case eItemTypes.PILOT_WEAPON_MOD3:
+ case eItemTypes.TITAN_GENERAL_PASSIVE:
+ case eItemTypes.TITAN_TITANFALL_PASSIVE:
+ case eItemTypes.TITAN_RONIN_PASSIVE:
+ case eItemTypes.TITAN_NORTHSTAR_PASSIVE:
+ case eItemTypes.TITAN_ION_PASSIVE:
+ case eItemTypes.TITAN_TONE_PASSIVE:
+ case eItemTypes.TITAN_SCORCH_PASSIVE:
+ case eItemTypes.TITAN_LEGION_PASSIVE:
+ case eItemTypes.TITAN_VANGUARD_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE1_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE2_PASSIVE:
+ case eItemTypes.TITAN_UPGRADE3_PASSIVE:
+ case eItemTypes.TITAN_NOSE_ART:
+ case eItemTypes.PRIME_TITAN_NOSE_ART:
+ case eItemTypes.SUB_PILOT_WEAPON_ATTACHMENT:
+ case eItemTypes.SUB_PILOT_WEAPON_MOD:
+ case eItemTypes.CAMO_SKIN:
+ case eItemTypes.CAMO_SKIN_TITAN:
+ case eItemTypes.TITAN_WARPAINT:
+ case eItemTypes.WEAPON_FEATURE:
+ case eItemTypes.TITAN_FD_UPGRADE:
+ case eItemTypes.WEAPON_SKIN:
+ return true
+ }
+
+ return false
+}
+
+ItemDisplayData function GetItemDisplayData( string itemRef, string parentRef = "" )
+{
+ if ( (parentRef + itemRef) in file.displayDataCache )
+ return file.displayDataCache[parentRef + itemRef]
+
+ ItemData itemData = GetItemData( itemRef )
+ ItemDisplayData displayData
+
+ if ( parentRef != "" && !IsItemRandom( itemRef ) )
+ {
+ Assert( IsSubItemType( itemData.itemType ) )
+ ItemData parentItem = GetItemData( parentRef )
+
+ displayData.itemType = parentItem.subitems[itemRef].itemType
+ displayData.i = clone parentItem.subitems[itemRef].i
+ }
+ else
+ {
+ Assert( !IsSubItemType( itemData.itemType ) )
+ displayData.itemType = itemData.itemType
+ displayData.i = clone itemData.i
+ }
+
+ displayData.name = itemData.name
+ displayData.desc = itemData.desc
+ displayData.longdesc = itemData.longdesc
+ displayData.image = itemData.image
+ displayData.hidden = itemData.hidden
+ displayData.ref = itemRef
+ displayData.parentRef = parentRef
+ displayData.imageAtlas = itemData.imageAtlas
+ displayData.persistenceId = itemData.persistenceId
+
+ file.displayDataCache[parentRef + itemRef] <- displayData
+
+ return displayData
+}
+
+
+bool function IsItemRandom( string itemRef )
+{
+ if ( itemRef == "random" )
+ return true
+
+ if ( itemRef == "advocate_gift" )
+ return true
+
+ return false
+}
+
+string function DEV_GetEnumStringFromIndex( string enumName, int enumIndex )
+{
+ table enumTable = expect table( getconsttable()[enumName] )
+
+ foreach ( name, index in enumTable )
+ {
+ if ( index == enumIndex )
+ return string( name )
+ }
+
+ return "not found"
+}
+
+ItemDisplayData function GetItemDisplayDataFromGuid( int refGuid, int parentRefGuid = 0 )
+{
+ string itemRef
+ string parentItemRef
+
+ for( int index = 0; index < file.allItems.len(); index++ )
+ {
+ GlobalItemRef globalItemRef = file.allItems[index]
+
+ if ( itemRef == "" && globalItemRef.guid == refGuid )
+ {
+ itemRef = globalItemRef.ref
+ if ( parentRefGuid == 0 || parentItemRef != "" )
+ break
+ }
+ else if ( parentItemRef == "" && parentRefGuid != 0 && globalItemRef.guid == parentRefGuid )
+ {
+ parentItemRef = globalItemRef.ref
+ if ( itemRef != "" )
+ break
+ }
+ }
+
+ Assert( itemRef != "" )
+ Assert( (parentRefGuid == 0 && parentItemRef == "") || parentItemRef != "" )
+
+ return GetItemDisplayData( itemRef, parentItemRef )
+}
+
+
+int function StringHash( string str )
+{
+ int res = 0
+ int length = str.len()
+ for ( int i = 0; i < length; i++ )
+ {
+ res *= 31
+ res += expect int( str[i] )
+ }
+ return res
+}
+
+
+string function GetFullRef( string itemRef, string parentRef = "" )
+{
+ if ( parentRef != "" )
+ return parentRef + "." + itemRef
+ else
+ return itemRef
+
+ unreachable
+}
+
+bool function IsItemInEntitlementUnlock( string itemRef, string parentRef = "" )
+{
+ string fullRef = GetFullRef( itemRef, parentRef )
+
+ return fullRef in file.entitlementUnlocks
+}
+
+
+void function InitUnlockAsEntitlement( string itemRef, string parentRef, int entitlementId, string purchaseMenu = "" )
+{
+ if ( IsDisabledRef( itemRef ) || IsDisabledRef( parentRef ) )
+ return
+
+#if DEV
+ if ( parentRef == "" )
+ {
+ Assert( ItemDefined( itemRef ), itemRef + " does not exist but is being initialized as an entitlement" )
+
+ if ( itemRef in file.unlocks )
+ CodeWarning( parentRef + "." + itemRef + " already exists in Unlocks but is being initialized as an entitlement" )
+ }
+ else
+ {
+ Assert( SubitemDefined( parentRef, itemRef ), parentRef + "." + itemRef + " does not exist but is being initialized as an entitlement" )
+
+ if ( parentRef in file.unlocks && itemRef in file.unlocks[ parentRef ].child )
+ CodeWarning( parentRef + "." + itemRef + " already exists in Unlocks but is being initialized as an entitlement" )
+ }
+
+ if ( IsItemInRandomUnlocks( itemRef, parentRef ) )
+ CodeWarning( parentRef + "." + itemRef + " already exists in Random Unlocks but is being initialized as an entitlement" )
+
+#endif
+ string fullRef = GetFullRef( itemRef, parentRef )
+ Unlock unlock
+
+ if ( !(fullRef in file.entitlementUnlocks) )
+ {
+ unlock.unlockType = eUnlockType.ENTITLEMENT
+ file.entitlementUnlocks[fullRef] <- unlock
+ unlock.purchaseData.purchaseMenu = purchaseMenu
+ }
+ else
+ {
+ unlock = file.entitlementUnlocks[fullRef]
+ }
+
+ unlock.entitlementIds.append( entitlementId )
+}
+
+array<int> function GetEntitlementIds( string itemRef, string parentRef = "" )
+{
+ string fullRef = GetFullRef( itemRef, parentRef )
+
+ Assert( fullRef in file.entitlementUnlocks )
+
+ return clone file.entitlementUnlocks[fullRef].entitlementIds
+}
+
+int function GetSortedIndex( string menuName, int elemNum )
+{
+ if ( menuName in file.sortedElems )
+ return file.sortedElems[menuName][elemNum]
+
+ return elemNum
+}
+
+void function RefreshSortedElems( entity player, string menuName, int maxElems, ItemDisplayData functionref(int) getFunc )
+{
+ if (!( menuName in file.sortedElems ))
+ {
+ file.sortedElems[menuName] <- []
+ }
+
+ file.sortedElems[menuName].clear()
+ array<int> new = []
+ array<int> locked = []
+ array<int> unlocked = []
+ for( int i=0; i<maxElems; i++ )
+ {
+ ItemDisplayData item = getFunc( i )
+ string ref = item.ref
+ if ( IsItemLocked( player, ref ) )
+ locked.append( i )
+ else if ( IsItemNew( player, ref, item.parentRef ) )
+ new.append( i )
+ else
+ unlocked.append( i )
+ }
+ file.sortedElems[menuName].extend( new )
+ file.sortedElems[menuName].extend( unlocked )
+ file.sortedElems[menuName].extend( locked )
+}
+#if SERVER
+
+void function StatsCallback_ItemUnlockUpdate( entity player, float changeInValue, string itemRef )
+{
+ Unlock unlock = file.unlocks[ itemRef ]
+ int statType = expect int( unlock.additionalData.statType )
+ string statVar = expect string( unlock.additionalData.statVar )
+ string statCategory = expect string( unlock.additionalData.statCategory )
+ string statAlias = expect string( unlock.additionalData.statAlias )
+ string statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ thread Stats_SaveStatDelayed( player, statCategory, statAlias, statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ {
+ int oldStatVal = GetPlayerStatInt( player, statCategory, statAlias, statSubAlias )
+ int deltaStatVal = PlayerStat_GetCurrentInt( player, statCategory, statAlias, statSubAlias )
+
+ if ( oldStatVal >= unlock.unlockIntVal )
+ return
+
+ if ( oldStatVal + deltaStatVal < unlock.unlockIntVal )
+ return
+
+ StatUnlock_Unlocked( player, itemRef, "", statCategory, statAlias, statSubAlias )
+ }
+ else
+ {
+ float oldStatVal = GetPlayerStatFloat( player, statCategory, statAlias, statSubAlias )
+ float deltaStatVal = PlayerStat_GetCurrentFloat( player, statCategory, statAlias, statSubAlias )
+
+ if ( oldStatVal >= unlock.unlockFloatVal )
+ return
+
+ if ( oldStatVal + deltaStatVal < unlock.unlockFloatVal )
+ return
+
+ StatUnlock_Unlocked( player, itemRef, "", statCategory, statAlias, statSubAlias )
+ }
+}
+
+
+void function StatsCallback_SubItemUnlockUpdate( entity player, float changeInValue, string fullRef )
+{
+ array<string> splitArray = SplitAndStripUnlockField( fullRef )
+ string itemRef = splitArray[0]
+ string parentRef = splitArray[1]
+
+ ChildUnlock unlock = file.unlocks[ parentRef ].child[itemRef]
+ int statType = expect int( unlock.additionalData.statType )
+ string statVar = expect string( unlock.additionalData.statVar )
+ string statCategory = expect string( unlock.additionalData.statCategory )
+ string statAlias = expect string( unlock.additionalData.statAlias )
+ string statSubAlias = expect string( unlock.additionalData.statSubAlias )
+
+ thread Stats_SaveStatDelayed( player, statCategory, statAlias, statSubAlias )
+
+ if ( statType == ePlayerStatType.INT )
+ {
+ int oldStatVal = GetPlayerStatInt( player, statCategory, statAlias, statSubAlias )
+ int curStatVal = PlayerStat_GetCurrentInt( player, statCategory, statAlias, statSubAlias )
+
+ if ( oldStatVal >= unlock.unlockIntVal )
+ return
+
+ if ( oldStatVal + curStatVal < unlock.unlockIntVal )
+ return
+
+ StatUnlock_Unlocked( player, itemRef, parentRef, statCategory, statAlias, statSubAlias )
+ }
+ else
+ {
+ float oldStatVal = GetPlayerStatFloat( player, statCategory, statAlias, statSubAlias )
+ float curStatVal = PlayerStat_GetCurrentFloat( player, statCategory, statAlias, statSubAlias )
+
+ if ( oldStatVal >= unlock.unlockFloatVal )
+ return
+
+ if ( oldStatVal + curStatVal < unlock.unlockFloatVal )
+ return
+
+ StatUnlock_Unlocked( player, itemRef, parentRef, statCategory, statAlias, statSubAlias )
+ }
+}
+
+void function StatUnlock_Unlocked( entity player, string itemRef, string parentRef, string statCategory, string statAlias, string statSubAlias )
+{
+ // early out if we've already marked this as new
+ if ( IsItemNew( player, itemRef, parentRef ) )
+ return
+
+ int refGuid = file.itemRefToGuid[itemRef]
+ int parentRefGuid = parentRef == "" ? 0 : file.itemRefToGuid[parentRef]
+
+ if ( parentRef != "" )
+ {
+ int itemType = GetItemType( parentRef )
+ switch ( itemType )
+ {
+ case eItemTypes.PILOT_PRIMARY:
+ case eItemTypes.PILOT_SECONDARY:
+ int weaponIndex = shWeaponXP.weaponClassNames.find( parentRef )
+ Remote_CallFunction_NonReplay( player, "ServerCallback_WeaponChallengeCompleted", weaponIndex, refGuid, parentRefGuid )
+ break
+ case eItemTypes.TITAN_PRIMARY:
+ int titanIndex = shTitanXP.titanClasses.find( GetTitanForWeapon( parentRef ) )
+ Remote_CallFunction_NonReplay( player, "ServerCallback_TitanChallengeCompleted", titanIndex, refGuid, parentRefGuid )
+ break
+ case eItemTypes.TITAN:
+ int titanIndex = shTitanXP.titanClasses.find( parentRef )
+ Remote_CallFunction_NonReplay( player, "ServerCallback_TitanChallengeCompleted", titanIndex, refGuid, parentRefGuid )
+ break
+ default:
+ Remote_CallFunction_NonReplay( player, "ServerCallback_PlayerChallengeCompleted", refGuid, parentRefGuid )
+ break
+ }
+ }
+ else
+ {
+ int itemType = GetItemType( itemRef )
+ switch ( itemType )
+ {
+ case eItemTypes.TITAN:
+ int titanIndex = shTitanXP.titanClasses.find( parentRef )
+ Remote_CallFunction_NonReplay( player, "ServerCallback_TitanChallengeCompleted", titanIndex, refGuid, parentRefGuid )
+ break
+ default:
+ Remote_CallFunction_NonReplay( player, "ServerCallback_PlayerChallengeCompleted", refGuid, parentRefGuid )
+ break
+ }
+ }
+
+ if ( player.p.challengeUnlocks.len() < 6 )
+ {
+ RecentUnlock challengeUnlock
+ challengeUnlock.refGuid = refGuid
+ challengeUnlock.parentRefGuid = parentRefGuid
+
+ player.p.challengeUnlocks.append( challengeUnlock )
+ }
+
+ SetItemNewStatus( player, itemRef, parentRef, true )
+}
+#endif
+
+int function CheckItemUnlockType( string ref, string parentRef = "" )
+{
+ if ( IsItemInRandomUnlocks( ref, parentRef ) )
+ return eUnlockType.RANDOM
+
+ if ( IsItemInEntitlementUnlock( ref, parentRef ) )
+ return eUnlockType.ENTITLEMENT
+
+ if ( parentRef != "" )
+ return file.unlocks[parentRef].child[ref].unlockType
+ else
+ return file.unlocks[ref].unlockType
+
+ unreachable
+}
+
+#if SERVER
+void function PersistenceCleanup( entity player )
+{
+ ClearTargetNew( player )
+ FixupLevelCamosForRegen( player )
+}
+
+string function GetNoseArtRefFromTitanClassAndPersistenceValue( string titanClass, int persistenceValue ) //TODO: Replace NoseArtIndexToRef() with this eventually
+{
+ if ( !( titanClass in file.titanClassAndPersistenceValueToNoseArtRefTable ) )
+ return INVALID_REF
+
+ if ( !( persistenceValue in file.titanClassAndPersistenceValueToNoseArtRefTable[ titanClass ] ) )
+ return INVALID_REF
+
+ return file.titanClassAndPersistenceValueToNoseArtRefTable[ titanClass ][ persistenceValue ]
+}
+
+string function GetSkinRefFromTitanClassAndPersistenceValue( string titanClass, int persistenceValue )
+{
+ if ( !( titanClass in file.titanClassAndPersistenceValueToSkinRefTable ) )
+ return INVALID_REF
+
+ if ( !( persistenceValue in file.titanClassAndPersistenceValueToSkinRefTable[ titanClass ] ) )
+ return INVALID_REF
+
+ return file.titanClassAndPersistenceValueToSkinRefTable[ titanClass ][ persistenceValue ]
+}
+#endif // SERVER
+
+string function GetSkinRefFromWeaponRefAndPersistenceValue( string weaponRef, int persistenceValue )
+{
+ if ( !( weaponRef in file.weaponRefAndPersistenceValueToSkinRefTable ) )
+ return INVALID_REF
+
+ if ( !( persistenceValue in file.weaponRefAndPersistenceValueToSkinRefTable[ weaponRef ] ) )
+ return INVALID_REF
+
+ return file.weaponRefAndPersistenceValueToSkinRefTable[ weaponRef ][ persistenceValue ]
+}
+
+const array<string> liveDisabledRefs = [ "vanguard_skin_01", "vanguard_skin_02", "vanguard_skin_03", "vanguard_skin_07", "vanguard_skin_08" ]
+const array<string> disabledRefs = [ "mp_ability_pathchooser" ]
+
+bool function IsDisabledRef( string ref )
+{
+ if ( liveDisabledRefs.contains( ref ) )
+ return true
+
+ #if DEVSCRIPTS
+ return false
+ #endif
+
+ return ( disabledRefs.contains( ref ) )
+}
+
+#if DEV
+void function GenerateAllValidateDataTableCRCCheckText()
+{
+ GenerateValidateDataTableCRCText( $"datatable/burn_meter_rewards.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/calling_cards.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/callsign_icons.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/camo_skins.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/faction_leaders.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/features_mp.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/pilot_abilities.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/pilot_executions.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/pilot_passives.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/pilot_properties.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/pilot_weapon_features.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/pilot_weapon_mods.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/pilot_weapon_mods_common.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/pilot_weapons.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/playlist_items.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/titan_nose_art.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/titan_passives.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/titan_primary_mods.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/titan_primary_mods_common.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/titan_properties.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/titan_skins.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/titan_voices.rpak" )
+ GenerateValidateDataTableCRCText( $"datatable/titans_mp.rpak" )
+}
+
+string function GenerateValidateDataTableCRCText( asset dataTableAsset )
+{
+ var dataTable = GetDataTable( dataTableAsset )
+ int numRows = GetDatatableRowCount( dataTable )
+
+ int dataTableCRC = 0
+
+ for( int index = 0; index < numRows; index++ )
+ {
+ string ref = GetDataTableString( dataTable, index, 0 )
+
+ dataTableCRC = dataTableCRC ^ StringHash( ref )
+ dataTableCRC = (dataTableCRC << 13) ^ (dataTableCRC >> 17)
+ }
+
+ string resultString = ( "ValidateDataTableCRC( " + dataTableAsset + ", " + numRows + ", " + dataTableCRC + ")" )
+
+ printt( resultString )
+
+ return resultString
+}
+
+
+void function ValidateDataTableCRC( asset dataTableAsset, int numRows, int generatedCRC )
+{
+ var dataTable = GetDataTable( dataTableAsset )
+
+ int dataTableCRC = 0
+
+ for( int index = 0; index < numRows; index++ )
+ {
+ string ref = GetDataTableString( dataTable, index, 0 )
+
+ dataTableCRC = dataTableCRC ^ StringHash( ref )
+ dataTableCRC = (dataTableCRC << 13) ^ (dataTableCRC >> 17)
+ }
+
+ if( dataTableCRC != generatedCRC )
+ {
+ printt( "DataTableCRC mismatch:", dataTableAsset )
+ Assert( dataTableCRC == generatedCRC )
+ }
+}
+#endif
+
+bool function GetItemRequiresPrime( string ref, string parentRef = "" )
+{
+ Assert( ref in file.itemData )
+ return file.itemData[ref].reqPrime
+}
+
+void function SetupWeaponSkinData()
+{
+ var dataTable = GetDataTable( $"datatable/weapon_skins.rpak" )
+ for ( int row = 0; row < GetDatatableRowCount( dataTable ); row++ )
+ {
+ string weaponRef = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "weaponRef" ) )
+ string ref = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "ref" ) )
+ asset image = GetDataTableAsset( dataTable, row, GetDataTableColumnByName( dataTable, "image" ) )
+ string name = GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "name" ) )
+ int skinIndex = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "skinIndex" ) )
+ int skinType = GetDataTableInt( dataTable, row, GetDataTableColumnByName( dataTable, "skinType" ) )
+ int datatableIndex = row
+
+ if ( IsDisabledRef( weaponRef ) )
+ continue
+
+ CreateWeaponSkinData( datatableIndex, eItemTypes.WEAPON_SKIN, false, ref, weaponRef, name, image, skinIndex, skinType )
+ CreateGenericSubItemData( eItemTypes.WEAPON_SKIN, weaponRef, ref, 0, { skinIndex = skinIndex } )
+
+ if ( !( weaponRef in file.weaponRefAndPersistenceValueToSkinRefTable ) )
+ file.weaponRefAndPersistenceValueToSkinRefTable[ weaponRef ] <- {}
+
+ file.weaponRefAndPersistenceValueToSkinRefTable[ weaponRef ][ skinIndex ] <- ref
+ }
+}
+
+bool function ItemsInSameMenuCategory( string itemRef1, string itemRef2 )
+{
+ int category1 = expect int( GetItemDisplayData( itemRef1 ).i.menuCategory )
+ int category2 = expect int( GetItemDisplayData( itemRef2 ).i.menuCategory )
+
+ if ( category1 == category2 )
+ return true
+
+ return false
+}
+
+asset function GetTitanLoadoutIconFD( string titanRef )
+{
+ var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
+ int loadoutIconCol = GetDataTableColumnByName( dataTable, "loadoutIconFD" )
+ int titanCol = GetDataTableColumnByName( dataTable, "titanRef" )
+
+ int row = GetDataTableRowMatchingStringValue( dataTable, titanCol, titanRef )
+
+ return GetDataTableAsset( dataTable, row, loadoutIconCol )
+}
+
+array<string> function GetOwnedEliteWeaponSkins( entity player )
+{
+ array<ItemData> allWeaponSkins = GetAllItemsOfType( eItemTypes.WEAPON_SKIN )
+
+ array<string> ownedWeaponSkinRefs
+ foreach ( weaponSkinItem in allWeaponSkins )
+ {
+ string parentRef = weaponSkinItem.parentRef
+
+ if ( !IsSubItemLocked( player, weaponSkinItem.ref, weaponSkinItem.parentRef ) && expect int( weaponSkinItem.i.skinType ) == 1 )
+ ownedWeaponSkinRefs.append( weaponSkinItem.ref )
+ }
+
+ return ownedWeaponSkinRefs
+}
+
+asset function GetTitanPrimeBg( string titanClass )
+{
+ switch ( titanClass )
+ {
+ case "ion":
+ return $"rui/menu/store/prime_ion_bg"
+ case "scorch":
+ return $"rui/menu/store/prime_scorch_bg"
+ case "northstar":
+ return $"rui/menu/store/prime_northstar_bg"
+ case "ronin":
+ return $"rui/menu/store/prime_ronin_bg"
+ case "tone":
+ return $"rui/menu/store/prime_tone_bg"
+ case "legion":
+ return $"rui/menu/store/prime_legion_bg"
+ case "monarch":
+ return $"rui/menu/store/prime_legion_bg"
+ }
+
+ return $""
+}
+
+struct FullRefWithEntitlements
+{
+ string fullRef
+ array<int> entitlementIds
+}
+
+array<string> function GetItemRefsForEntitlements( array<int> entitlements )
+{
+ array<int> filteredEntitlements
+
+ foreach ( entitlement in entitlements )
+ {
+ if ( HasChildEntitlements( entitlement ) )
+ {
+ array<int> childEntitlements = GetChildEntitlements( entitlement )
+ foreach ( childEntitlement in childEntitlements )
+ {
+ if ( !filteredEntitlements.contains( childEntitlement ) )
+ filteredEntitlements.append( childEntitlement )
+ }
+ }
+ else
+ {
+ if ( !filteredEntitlements.contains( entitlement ) )
+ filteredEntitlements.append( entitlement )
+ }
+ }
+
+ array<FullRefWithEntitlements> unlocks
+ foreach ( key, val in file.entitlementUnlocks )
+ {
+ foreach ( entitlement in filteredEntitlements )
+ {
+ if ( val.entitlementIds.contains( entitlement ) )
+ {
+ //printt( "key:", key, "entitlement:", entitlement )
+ FullRefWithEntitlements record
+ record.fullRef = key
+ record.entitlementIds = val.entitlementIds
+ unlocks.append( record )
+ }
+ }
+ }
+
+ // Sort to match original entitlement order as best we can avoiding dupes.
+ // We diverge from this order whenever mulitple entitlements are associated with an unlock.
+ array<FullRefWithEntitlements> sortedUnlocks
+ foreach ( entitlement in filteredEntitlements )
+ {
+ foreach ( unlock in unlocks )
+ {
+ if ( unlock.entitlementIds.contains( entitlement ) && !sortedUnlocks.contains( unlock ) )
+ {
+ //printt( "unlock.fullRef:", unlock.fullRef, "entitlement:", entitlement )
+ sortedUnlocks.append( unlock )
+ }
+ }
+ }
+
+ array<string> sortedRefs
+ foreach ( unlock in sortedUnlocks )
+ {
+ string fullRef = unlock.fullRef
+ array<string> tokens = split( fullRef, "." )
+
+ if ( tokens.len() == 2 )
+ sortedRefs.append( tokens[1] )
+ else
+ sortedRefs.append( fullRef )
+ }
+
+ return sortedRefs
+}
+
+ItemDisplayData function WeaponWarpaint_GetByIndex( int skinIndex, string parentRef )
+{
+ array<SubItemData> subItems = GetAllSubItemsOfType( parentRef, eItemTypes.WEAPON_SKIN )
+ foreach ( subItem in subItems )
+ {
+ if ( subItem.i.skinIndex != skinIndex )
+ continue
+
+ return GetSubitemDisplayData( parentRef, subItem.ref )
+ }
+
+ unreachable
+} \ No newline at end of file
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_menu_callbacks.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_menu_callbacks.gnut
index d0820dd6..edb8d79d 100644
--- a/Northstar.CustomServers/mod/scripts/vscripts/_menu_callbacks.gnut
+++ b/Northstar.CustomServers/mod/scripts/vscripts/_menu_callbacks.gnut
@@ -15,10 +15,10 @@ void function WritePersistenceAndLeave( entity player )
{
// write player persistence before we leave, since leaving player might load local lobby before server writes persistence, so they won't get newest
// not super essential, but a nice qol thing
- NSEarlyWritePlayerPersistenceForLeave( player )
+ NSEarlyWritePlayerIndexPersistenceForLeave( player.GetPlayerIndex() )
while ( NSIsWritingPlayerPersistence() )
WaitFrame()
// this is a custom concommand which can be called on clients, it causes them to leave and doesn't have issues if they're host
- ClientCommand( player, "ns_leave_to_lobby" )
+ ClientCommand( player, "ns_start_reauth_and_leave_to_lobby" )
} \ No newline at end of file