4 static const string ARSENALLOADOUT_FACTIONKEY_NONE =
"none";
5 static const string ARSENALLOADOUT_KEY =
"arsenalLoadout";
6 static const string ARSENALLOADOUT_FACTION_KEY =
"faction";
7 static ref array<typename> ARSENALLOADOUT_COMPONENTS_TO_CHECK;
10 override bool IsLoadoutAvailable(
int playerId)
12 SCR_ArsenalManagerComponent arsenalManager;
13 if (SCR_ArsenalManagerComponent.GetArsenalManager(arsenalManager))
16 return arsenalManager.GetPlayerArsenalLoadout(
SCR_PlayerIdentityUtils.GetPlayerIdentityId(playerId), arsenalLoadout);
22 override bool IsLoadoutAvailableClient()
24 SCR_ArsenalManagerComponent arsenalManager;
25 if (SCR_ArsenalManagerComponent.GetArsenalManager(arsenalManager))
26 return arsenalManager.GetLocalPlayerLoadoutAvailable();
34 static float GetLoadoutSuppliesCost(
string playerUID)
36 SCR_ArsenalManagerComponent arsenalManager;
37 if (SCR_ArsenalManagerComponent.GetArsenalManager(arsenalManager))
39 float supplyCostMulti = arsenalManager.GetCalculatedLoadoutSpawnSupplyCostMultiplier();
42 if (supplyCostMulti <= 0)
46 if (arsenalManager.GetPlayerArsenalLoadout(playerUID, arsenalLoadout))
47 return arsenalLoadout.suppliesCost * supplyCostMulti;
56 static float GetLoadoutSuppliesCost(
int playerID)
59 return GetLoadoutSuppliesCost(playerUID);
65 static float GetLoadoutMilitarySupplyAllocationCost(
string playerUID)
67 SCR_ArsenalManagerComponent arsenalManager;
68 if (SCR_ArsenalManagerComponent.GetArsenalManager(arsenalManager))
71 if (arsenalManager.GetPlayerArsenalLoadout(playerUID, arsenalLoadout))
72 return arsenalLoadout.m_fMilitarySupplyAllocationCost;
83 SCR_ArsenalManagerComponent arsenalManager;
84 if (!SCR_ArsenalManagerComponent.GetArsenalManager(arsenalManager))
85 return SCR_ECharacterRank.PRIVATE;
89 if (!arsenalManager.GetPlayerArsenalLoadout(playerUID, arsenalLoadout))
90 return SCR_ECharacterRank.PRIVATE;
92 return arsenalLoadout.m_eRequiredRank;
96 override void OnLoadoutSpawned(
GenericEntity pOwner,
int playerId)
98 super.OnLoadoutSpawned(pOwner, playerId);
99 SCR_ArsenalManagerComponent arsenalManager;
100 if (!SCR_ArsenalManagerComponent.GetArsenalManager(arsenalManager))
104 GameEntity playerEntity = GameEntity.Cast(pOwner);
106 if (!playerEntity || !arsenalManager.GetPlayerArsenalLoadout(playerUID, playerArsenalItems))
109 FactionAffiliationComponent factionComponent = FactionAffiliationComponent.Cast(playerEntity.FindComponent(FactionAffiliationComponent));
110 if (!factionComponent)
114 bool loadSuccess =
true;
115 loadSuccess &= context.LoadFromString(playerArsenalItems.loadout);
118 loadSuccess &= context.ReadValue(ARSENALLOADOUT_FACTION_KEY, factionKey) && factionKey != ARSENALLOADOUT_FACTIONKEY_NONE;
119 loadSuccess &= factionKey == factionComponent.GetAffiliatedFaction().GetFactionKey();
124 arsenalManager.SetPlayerArsenalLoadout(playerId, null, null, SCR_EArsenalSupplyCostType.RESPAWN_COST);
130 if (!context.StartObject(ARSENALLOADOUT_KEY))
139 return context.EndObject();
163 array<Managed> outComponents = {};
164 owner.
FindComponents(BaseInventoryStorageComponent, outComponents);
165 foreach (Managed component : outComponents)
167 BaseInventoryStorageComponent storage = BaseInventoryStorageComponent.Cast(component);
168 storages.Insert(storage);
176 array<GenericComponent> outComponents = {};
177 parentComponent.
FindComponents(BaseInventoryStorageComponent, outComponents);
180 BaseInventoryStorageComponent storage = BaseInventoryStorageComponent.Cast(component);
181 storages.Insert(storage);
189 foreach (
typename toCheck : ARSENALLOADOUT_COMPONENTS_TO_CHECK)
191 if (candidate.Type() == toCheck)
201 set<BaseInventoryStorageComponent> storageCandiates();
204 array<BaseInventoryStorageComponent> storages = {};
205 foreach (BaseInventoryStorageComponent candidate : storageCandiates)
208 storages.Insert(candidate);
211 int storageCount = storages.Count();
212 if (storageCount == 0)
215 context.StartArray(
"storages", storageCount);
216 foreach (BaseInventoryStorageComponent storage : storages)
218 context.StartObject();
220 const array<InventoryItemComponent> slotItems =
GetSlotItems(storage);
221 int slotCount = slotItems.Count();
222 context.StartMap(
"slots", slotCount);
225 context.WriteMapKey(item.GetParentSlot().GetID().ToString());
226 context.StartObject();
236 return context.EndArray();
242 protected static array<InventoryItemComponent>
GetSlotItems(
const BaseInventoryStorageComponent storage)
244 array<InventoryItemComponent> outItemsComponents = {};
245 storage.GetOwnedItems(outItemsComponents,
false);
249 const SCR_WeaponAttachmentsStorageComponent weaponAttachments = SCR_WeaponAttachmentsStorageComponent.Cast(storage);
250 if (weaponAttachments)
252 array<ref SCR_SortableItem<InventoryItemComponent>> sortSlots = {};
255 int numRequirements = 0;
257 if (obstructionAttributes)
260 SCR_SortableItem<InventoryItemComponent> sortable(item, numRequirements);
261 sortSlots.Insert(sortable);
264 outItemsComponents.Clear();
265 foreach (SCR_SortableItem<InventoryItemComponent> sortedSlot : sortSlots)
267 outItemsComponents.Insert(sortedSlot.m_Item);
271 return outItemsComponents;
280 int activeWeaponIdx = -1;
281 const BaseWeaponManagerComponent weaponManager = BaseWeaponManagerComponent.Cast(owner.
FindComponent(BaseWeaponManagerComponent));
286 activeWeaponIdx = currentSlot.GetWeaponSlotIndex();
288 return context.WriteDefault(activeWeaponIdx, -1);
294 const BaseContainer source = component.GetComponentSource(owner);
295 const string storeName = source.GetResourceName();
302 if (!context.StartObject(ARSENALLOADOUT_KEY))
312 return context.EndObject();
320 BaseInventoryStorageComponent parentStorage = null,
323 if (parentStorage && slotId != -1)
326 if (!context.Read(prefab))
330 if (prefab != currentPrefab)
332 if (owner && !manager.TryDeleteItem(owner))
335 if (!manager.TrySpawnPrefabToStorage(prefab, parentStorage, slotId))
338 owner = parentStorage.Get(slotId);
362 BaseInventoryStorageComponent parentStorage = null,
366 context.StartArray(
"storages", storageCount);
367 if (storageCount == 0)
370 set<BaseInventoryStorageComponent> storageCandiates();
373 for (
int nStorage = 0; nStorage < storageCount; ++nStorage)
375 if (!context.StartObject())
379 if (!context.Read(
id))
383 BaseInventoryStorageComponent storage;
384 foreach (BaseInventoryStorageComponent candidate : storageCandiates)
387 if (componentId ==
id)
398 array<InventoryItemComponent> outItemsComponents = {};
399 storage.GetOwnedItems(outItemsComponents,
false);
402 slottetItems.Insert(item.GetParentSlot().GetID(), item.GetOwner());
406 if (!context.StartMap(
"slots", slotCount))
409 for (
int i = 0; i < slotCount; ++i)
414 if (!context.ReadMapKey(i, idxStr))
417 const int childSlotId = idxStr.ToInt(-1);
418 if (childSlotId == -1)
422 slottetItems.Take(childSlotId, existing);
424 if (!context.StartObject(idxStr))
430 if (!context.EndObject())
433 if (!context.EndMap())
437 foreach (
int idx,
IEntity entity : slottetItems)
439 if (entity && !manager.TryDeleteItem(entity))
443 if (!context.EndObject())
447 return context.EndArray();
454 context.ReadDefault(activeWeaponIdx, -1);
455 const BaseWeaponManagerComponent weaponManager = BaseWeaponManagerComponent.Cast(owner.
FindComponent(BaseWeaponManagerComponent));
456 const CharacterControllerComponent charController = CharacterControllerComponent.Cast(owner.
FindComponent(CharacterControllerComponent));
457 if (!weaponManager || !charController)
460 if (activeWeaponIdx != -1)
462 array<WeaponSlotComponent> outSlots = {};
463 if (weaponManager.GetWeaponsSlots(outSlots))
468 const int slotIdx = slot.GetWeaponSlotIndex();
469 if (slotIdx == activeWeaponIdx)
475 if (!fallbackSlot && slotIdx < 3 && slot.GetWeaponEntity())
482 weaponEntity = desiredSlot.GetWeaponEntity();
484 else if (fallbackSlot)
486 weaponEntity = fallbackSlot.GetWeaponEntity();
489 charController.TryEquipRightHandItem(weaponEntity,
EEquipItemType.EEquipTypeWeapon,
true);
494 charController.TryEquipRightHandItem(null,
EEquipItemType.EEquipTypeUnarmedDeliberate,
true);
505 SCR_EArsenalSupplyCostType arsenalSupplyType,
509 if (!context.Read(prefab))
514 SCR_EntityCatalogManagerComponent entityCatalogManager = SCR_EntityCatalogManagerComponent.GetInstance();
515 if (entityCatalogManager)
523 const float cost =
data.GetSupplyCost(arsenalSupplyType);
524 playerLoadout.suppliesCost += cost;
525 playerLoadout.m_eRequiredRank =
Math.Max(playerLoadout.m_eRequiredRank,
data.GetRequiredRank());
526 if (
data.GetUseMilitarySupplyAllocation())
527 playerLoadout.m_fMilitarySupplyAllocationCost += cost;
534 context.StartArray(
"storages", storageCount);
535 if (storageCount == 0)
538 for (
int nStorage = 0; nStorage < storageCount; ++nStorage)
540 if (!context.StartObject())
544 if (!context.Read(
id))
548 context.StartMap(
"slots", slotCount);
549 for (
int i = 0; i < slotCount; ++i)
552 if (!context.ReadMapKey(i, idxStr))
555 const int childSlotId = idxStr.ToInt(-1);
556 if (childSlotId == -1)
559 context.StartObject(idxStr);
Container context loading JSON format.
Get prefab entity Data of type Ignores disabled Data s param dataType class of Data type you with to obtain return Entity Data of given type Null if not found *SCR_BaseEntityCatalogData GetEntityDataOfType(typename dataType)