Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AITakeItemFromArsenal.c
Go to the documentation of this file.
2{
4
6 {
7 return m_ItemEntity;
8 }
9
10 override protected void OnComplete()
11 {
12 RplId itemId = GetItem();
13 RplComponent rplComp = RplComponent.Cast(Replication.FindItem(itemId));
14 if (rplComp)
15 m_ItemEntity = rplComp.GetEntity();
16 }
17}
18
19class SCR_AITakeItemFromArsenal : AITaskScripted
20{
21 // Inputs
22 protected static const string PORT_PREFAB_RESOURCE_NAME = "PrefabResourceName";
23 protected static const string PORT_ARSENAL_ENTITY = "ArsenalEntity";
24
25 // Outputs
26 protected static const string PORT_ITEM_ENTITY = "ItemEntity";
27 protected static const string PORT_COUNT_ITEMS_TAKEN = "CountItemsTaken";
28
29 [Attribute("1", UIWidgets.EditBox, desc: "Max amount of items we will try to take")]
30 protected int m_iMaxItemsToTake;
31
32 //------------------------------------------------------------------------------------------------------
33 override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
34 {
35 // Read inputs
36 ResourceName prefabResourceName;
37 IEntity arsenalEntity;
38
39 GetVariableIn(PORT_PREFAB_RESOURCE_NAME, prefabResourceName);
40 GetVariableIn(PORT_ARSENAL_ENTITY, arsenalEntity);
41
42 if (prefabResourceName.IsEmpty() || !arsenalEntity)
43 return ENodeResult.FAIL;
44
45 // Verify arsenal, verify that arsenal has item
46 SCR_ArsenalInventoryStorageManagerComponent arsenalComp =
47 SCR_ArsenalInventoryStorageManagerComponent.Cast(arsenalEntity.FindComponent(SCR_ArsenalInventoryStorageManagerComponent));
48
49 if (!arsenalComp)
50 return ENodeResult.FAIL;
51
52 if (!arsenalComp.IsPrefabInArsenalStorage(prefabResourceName))
53 return ENodeResult.FAIL;
54
55 // Verify own inventory
56 IEntity myEntity = owner.GetControlledEntity();
57 if (!myEntity)
58 return ENodeResult.FAIL;
60 if (!myInvComp)
61 return ENodeResult.FAIL;
62
63 int nItemsTaken = 0;
64 IEntity lastTakenItem = null;
66
67 //~ Get item cost
68 float resourceCost = 0;
69 SCR_ResourceComponent resourceComponent = SCR_ResourceComponent.Cast(arsenalEntity.FindComponent(SCR_ResourceComponent));
70 SCR_ResourceConsumer consumer = null;
71 SCR_EntityCatalogManagerComponent entityCatalogManager = SCR_EntityCatalogManagerComponent.GetInstance();
72 if (entityCatalogManager)
73 {
74 //~ Get Supply cost only if arsenal has supplies enabled
75 SCR_ArsenalComponent arsenalComponent = SCR_ArsenalComponent.FindArsenalComponent(arsenalEntity);
76 if (!arsenalComponent || arsenalComponent.IsArsenalUsingSupplies())
77 {
78 SCR_Faction faction;
79 if (arsenalComponent)
80 faction = arsenalComponent.GetAssignedFaction();
81
83
84 if (faction)
85 entry = entityCatalogManager.GetEntryWithPrefabFromFactionCatalog(EEntityCatalogType.ITEM, prefabResourceName, faction);
86 else
87 entry = entityCatalogManager.GetEntryWithPrefabFromCatalog(EEntityCatalogType.ITEM, prefabResourceName);
88
89 if (entry)
90 {
92 if (data)
93 {
94 if (arsenalComponent)
95 resourceCost = data.GetSupplyCost(arsenalComponent.GetSupplyCostType());
96 else
97 resourceCost = data.GetSupplyCost(SCR_EArsenalSupplyCostType.DEFAULT);
98 }
99
100 }
101 }
102
103 if (resourceCost > 0)
104 {
105 if (!resourceComponent)
106 return ENodeResult.FAIL;
107
108 consumer = resourceComponent.GetConsumer(EResourceGeneratorID.DEFAULT, EResourceType.SUPPLIES);
109 if (!consumer)
110 return ENodeResult.FAIL;
111
112 resourceCost *= consumer.GetBuyMultiplier();
113 }
114 }
115
116 while (true)
117 {
118 if (consumer)
119 {
120 SCR_ResourceConsumtionResponse response = consumer.RequestAvailability(resourceCost);
121 if (response.GetReason() != EResourceReason.SUFFICIENT)
122 break; // Not enough supplies anymore to get another item
123 }
124
125 bool success = myInvComp.TrySpawnPrefabToStorage(prefabResourceName, purpose: EStoragePurpose.PURPOSE_DEPOSIT, cb: invCallback);
126 IEntity itemEntity = invCallback.GetEntity();
127
128 if (!success || !itemEntity)
129 break;
130
131 nItemsTaken++;
132 lastTakenItem = itemEntity;
133
134 // Successful taking to inventory, there was enough space, so now actually consume the supplies.
135 if (consumer)
136 consumer.RequestConsumtion(resourceCost);
137
138 if (m_iMaxItemsToTake != -1 && nItemsTaken == m_iMaxItemsToTake)
139 break;
140 }
141
142 if (nItemsTaken == 0)
143 return ENodeResult.FAIL;
144
145 SetVariableOut(PORT_ITEM_ENTITY, lastTakenItem);
146 SetVariableOut(PORT_COUNT_ITEMS_TAKEN, nItemsTaken);
147
148 return ENodeResult.SUCCESS;
149 }
150
151 //------------------------------------------------------------------------------------------------------
152 protected ref TStringArray s_aVarsIn = { PORT_ARSENAL_ENTITY, PORT_PREFAB_RESOURCE_NAME };
153 override TStringArray GetVariablesIn() { return s_aVarsIn; }
154
155 protected ref TStringArray s_aVarsOut = { PORT_ITEM_ENTITY, PORT_COUNT_ITEMS_TAKEN };
156 override TStringArray GetVariablesOut() { return s_aVarsOut; }
157
158 override static bool VisibleInPalette() { return true; }
159
160 override static string GetOnHoverDescription() { return "Takes item from arsenal and transfers it to own inventory. Returns success if at least one item was taken"; }
161}
EEntityCatalogType
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
SCR_AITakeItemFromArsenal_InventoryCallback PORT_PREFAB_RESOURCE_NAME
int m_iMaxItemsToTake
Get all prefabs that have the spawner data
void SCR_ResourceConsumtionResponse(float availableResource=0, float resourceMultiplier=0, float range=0, EResourceReason reasonCode=EResourceReason.UNAVAILABLE)
EResourceGeneratorID
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
proto external Managed FindComponent(typename typeName)
proto void SetVariableOut(string name, void val)
TStringArray GetVariablesIn()
Definition Node.c:27
proto bool GetVariableIn(string name, out void val)
bool VisibleInPalette()
string GetOnHoverDescription()
Definition Node.c:30
TStringArray GetVariablesOut()
Definition Node.c:28
Main replication API.
Definition Replication.c:14
Replication item identifier.
Definition RplId.c:14
static SCR_ArsenalComponent FindArsenalComponent(notnull IEntity entity, bool getFromSlotted=true)
SCR_EArsenalSupplyCostType GetSupplyCostType()
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)
ENodeResult
Definition ENodeResult.c:13
SCR_FieldOfViewSettings Attribute
EStoragePurpose
array< string > TStringArray
Definition Types.c:385