Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ResourcePlayerControllerInventoryComponent.c
Go to the documentation of this file.
8
9void ScriptInvoker_ResourceOnPlayerInteraction(EResourcePlayerInteractionType interactionType, PlayerController playerController, SCR_ResourceComponent resourceComponentFrom, SCR_ResourceComponent resourceComponentTo, EResourceType resourceType, float resourceValue);
11typedef ScriptInvokerBase<ScriptInvokerActiveWidgetInteractionFunc> ScriptInvokerResourceOnPlayerInteraction;
12
13void OnArsenalItemRequestedMethod(SCR_ResourceComponent resourceComponent, ResourceName resourceName, IEntity requesterEntity, BaseInventoryStorageComponent inventoryStorageComponent, EResourceType resourceType, int resourceValue);
15typedef ScriptInvokerBase<OnArsenalItemRequestedMethod> OnArsenalItemRequestedInvoker;
16
17[ComponentEditorProps(category: "GameScripted/Resources", description: "")]
18class SCR_ResourcePlayerControllerInventoryComponentClass : ScriptComponentClass
19{
20}
21
22typedef SCR_ResourceSystemSubscriptionHandle<SCR_ResourcePlayerControllerInventoryComponent> SCR_SCR_ResourcePlayerControllerInventoryComponentSubscriptionHandle;
23
25{
29
30 protected const float VERTICAL_SPAWN_OFFSET = 10;
31 protected const float HORIZONTAL_SPAWN_OFFSET = 2.5;
33 protected const int MAX_REFUNDING_DISTANCE_SQ = 900;
34
35 //------------------------------------------------------------------------------------------------
44
45 //------------------------------------------------------------------------------------------------
54
55 //------------------------------------------------------------------------------------------------
63
64 //------------------------------------------------------------------------------------------------
65 protected SCR_ResourceActor TryGetGenerationActor(notnull SCR_ResourceComponent resourceComponent, EResourceType resourceType, out float currentResourceValue, out float maxResourceValue)
66 {
67 SCR_ResourceContainer containerFrom = resourceComponent.GetContainer(resourceType);
68
69 if (containerFrom)
70 {
71 currentResourceValue = containerFrom.GetResourceValue();
72 maxResourceValue = containerFrom.GetMaxResourceValue();
73
74 return containerFrom;
75 }
76
77 SCR_ResourceGenerator generator = resourceComponent.GetGenerator(EResourceGeneratorID.DEFAULT_STORAGE, resourceType);
78
79 if (generator)
80 {
81 currentResourceValue = generator.GetAggregatedResourceValue();
82 maxResourceValue = generator.GetAggregatedMaxResourceValue();
83
84 return generator;
85 }
86
87 generator = resourceComponent.GetGenerator(EResourceGeneratorID.VEHICLE_UNLOAD, resourceType);
88
89 if (generator)
90 {
91 currentResourceValue = generator.GetAggregatedResourceValue();
92 maxResourceValue = generator.GetAggregatedMaxResourceValue();
93
94 return generator;
95 }
96
97 return null;
98 }
99
100 //------------------------------------------------------------------------------------------------
101 protected SCR_ResourceActor TryGetConsumptionActor(notnull SCR_ResourceComponent resourceComponent, EResourceType resourceType, out float currentResourceValue, out float maxResourceValue)
102 {
103 SCR_ResourceContainer containerFrom = resourceComponent.GetContainer(resourceType);
104
105 if (containerFrom)
106 {
107 currentResourceValue = containerFrom.GetResourceValue();
108 maxResourceValue = containerFrom.GetMaxResourceValue();
109
110 return containerFrom;
111 }
112
113 SCR_ResourceConsumer consumer = resourceComponent.GetConsumer(EResourceGeneratorID.DEFAULT_STORAGE, resourceType);
114
115 if (consumer)
116 {
117 currentResourceValue = consumer.GetAggregatedResourceValue();
118 maxResourceValue = consumer.GetAggregatedMaxResourceValue();
119
120 return consumer;
121 }
122
123 consumer = resourceComponent.GetConsumer(EResourceGeneratorID.VEHICLE_UNLOAD, resourceType);
124
125 if (consumer)
126 {
127 currentResourceValue = consumer.GetAggregatedResourceValue();
128 maxResourceValue = consumer.GetAggregatedMaxResourceValue();
129
130 return consumer;
131 }
132
133 return null;
134 }
135
136 //------------------------------------------------------------------------------------------------
140 protected bool CheckResourceConsumptionAvailability(notnull SCR_ResourceActor actor, float resourceValue)
141 {
142 SCR_ResourceContainer container = SCR_ResourceContainer.Cast(actor);
143
144 if (container)
145 return container.GetResourceValue() >= resourceValue;
146
147 SCR_ResourceConsumer consumer = SCR_ResourceConsumer.Cast(actor);
148
149 if (consumer)
150 return consumer.RequestAvailability(resourceValue).GetReason() == EResourceReason.SUFFICIENT;
151
152 return false;
153 }
154
155 //------------------------------------------------------------------------------------------------
159 protected bool CheckResourceGenerationAvailability(notnull SCR_ResourceActor actor, float resourceValue)
160 {
161 SCR_ResourceContainer container = SCR_ResourceContainer.Cast(actor);
162
163 if (container)
164 return container.ComputeResourceDifference() >= resourceValue;
165
166 SCR_ResourceGenerator generator = SCR_ResourceGenerator.Cast(actor);
167
168 if (generator)
169 return generator.RequestAvailability(resourceValue).GetReason() == EResourceReason.SUFFICIENT;
170
171 return false;
172 }
173
174 //------------------------------------------------------------------------------------------------
179 protected bool TryPerformResourceConsumption(notnull SCR_ResourceActor actor, float resourceValue, bool ignoreOnEmptyBehavior = false)
180 {
181 SCR_ResourceContainer container = SCR_ResourceContainer.Cast(actor);
182
183 if (container)
184 {
185 EResourceContainerOnEmptyBehavior emptyBehavior = container.GetOnEmptyBehavior();
186
187 if (ignoreOnEmptyBehavior)
189
190 if (!container.DecreaseResourceValue(resourceValue))
191 return false;
192
193 container.SetOnEmptyBehavior(emptyBehavior);
194
195 return true;
196 }
197
198 SCR_ResourceConsumer consumer = SCR_ResourceConsumer.Cast(actor);
199
200 if (consumer)
201 return consumer.RequestConsumtion(resourceValue).GetReason() == EResourceReason.SUFFICIENT;
202
203 return false;
204 }
205
206 //------------------------------------------------------------------------------------------------
210 protected bool TryPerformResourceGeneration(notnull SCR_ResourceActor actor, float resourceValue)
211 {
212 SCR_ResourceContainer container = SCR_ResourceContainer.Cast(actor);
213
214 if (container)
215 return container.IncreaseResourceValue(resourceValue);
216
217 SCR_ResourceGenerator generator = SCR_ResourceGenerator.Cast(actor);
218
219 if (generator)
220 return generator.RequestGeneration(resourceValue).GetReason() == EResourceReason.SUFFICIENT;
221
222 return false;
223 }
224
225 //------------------------------------------------------------------------------------------------
231 void RequestSubscription(RplId resourceComponentRplId, typename interactorType, EResourceType resourceType, EResourceGeneratorID resourceIdentifier)
232 {
233 Rpc(RpcAsk_RequestSubscription, resourceComponentRplId, interactorType.ToString(), resourceType, resourceIdentifier);
234 }
235
236 //------------------------------------------------------------------------------------------------
242 void RequestUnsubscription(RplId resourceComponentRplId, typename interactorType, EResourceType resourceType, EResourceGeneratorID resourceIdentifier)
243 {
244 Rpc(RpcAsk_RequestUnsubscription, resourceComponentRplId, interactorType.ToString(), resourceType, resourceIdentifier);
245 }
246
247 //------------------------------------------------------------------------------------------------
253 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
254 void RpcAsk_RequestSubscription(RplId resourceComponentRplId, string interactorType, EResourceType resourceType, EResourceGeneratorID resourceIdentifier)
255 {
256 if (!resourceComponentRplId.IsValid())
257 return;
258
259 const typename interactorTypename = interactorType.ToType();
260
261 if (!interactorTypename)
262 return;
263
264 SCR_ResourceComponent resourceComponent = SCR_ResourceComponent.Cast(Replication.FindItem(resourceComponentRplId));
265
266 if (!resourceComponent)
267 return;
268
269 SCR_ResourceInteractor interactor;
270
271 if (interactorTypename.IsInherited(SCR_ResourceGenerator))
272 interactor = resourceComponent.GetGenerator(resourceIdentifier, resourceType);
273 else if (interactorTypename.IsInherited(SCR_ResourceConsumer))
274 interactor = resourceComponent.GetConsumer(resourceIdentifier, resourceType);
275 else
276 return;
277
278 if (!interactor)
279 {
280 IEntity resourceOwner = resourceComponent.GetOwner();
281 string prefab;
283 if (resourceOwner)
284 data = resourceOwner.GetPrefabData();
285 else
286 prefab = string.Format("(%1 doesnt have owner!)", resourceComponent);
287
288 if (data)
289 prefab = FilePath.StripPath(data.GetPrefabName().GetPath());
290 else
291 prefab = string.Format("(%1 doesnt have prefab data!)", resourceOwner);
292
293 string identifierValueName = typename.EnumToString(EResourceGeneratorID, resourceIdentifier);
294 string resourceValueName = typename.EnumToString(EResourceType, resourceType);
295 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_RequestSubscription: %1 failed to provide interactor of type %2 when asked about EResourceGeneratorID=%3, and EResourceType=%4", prefab, interactorType, identifierValueName, resourceValueName, level:LogLevel.ERROR);
296 return;
297 }
298
299 GetGame().GetResourceSystemSubscriptionManager().SubscribeListener(Replication.FindItemId(this), interactor);
300 }
301
302 //------------------------------------------------------------------------------------------------
308 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
309 void RpcAsk_RequestUnsubscription(RplId resourceComponentRplId, string interactorType, EResourceType resourceType, EResourceGeneratorID resourceIdentifier)
310 {
311 if (!resourceComponentRplId.IsValid())
312 return;
313
314 const typename interactorTypename = interactorType.ToType();
315
316 if (!interactorTypename)
317 return;
318
319 SCR_ResourceComponent resourceComponent = SCR_ResourceComponent.Cast(Replication.FindItem(resourceComponentRplId));
320
321 if (!resourceComponent)
322 return;
323
324 SCR_ResourceInteractor interactor;
325
326 if (interactorTypename.IsInherited(SCR_ResourceGenerator))
327 interactor = resourceComponent.GetGenerator(resourceIdentifier, resourceType);
328 else if (interactorTypename.IsInherited(SCR_ResourceConsumer))
329 interactor = resourceComponent.GetConsumer(resourceIdentifier, resourceType);
330 else
331 return;
332
333 if (!interactor)
334 {
335 IEntity resourceOwner = resourceComponent.GetOwner();
336 string prefab;
338 if (resourceOwner)
339 data = resourceOwner.GetPrefabData();
340 else
341 prefab = string.Format("(%1 doesnt have owner!)", resourceComponent);
342
343 if (data)
344 prefab = FilePath.StripPath(data.GetPrefabName().GetPath());
345 else
346 prefab = string.Format("(%1 doesnt have prefab data!)", resourceOwner);
347
348 string identifierValueName = typename.EnumToString(EResourceGeneratorID, resourceIdentifier);
349 string resourceValueName = typename.EnumToString(EResourceType, resourceType);
350 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_RequestSubscription: %1 failed to provide interactor of type %2 when asked about EResourceGeneratorID=%3, and EResourceType=%4", prefab, interactorType, identifierValueName, resourceValueName, level:LogLevel.ERROR);
351 return;
352 }
353
354 GetGame().GetResourceSystemSubscriptionManager().UnsubscribeListener(Replication.FindItemId(this), interactor);
355 }
356
357 //------------------------------------------------------------------------------------------------
364 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
365 void RpcAsk_OnPlayerInteraction(EResourcePlayerInteractionType interactionType, RplId rplIdResourceComponentFrom, RplId rplIdResourceComponentTo, EResourceType resourceType, float resourceValue)
366 {
367 if (!rplIdResourceComponentFrom.IsValid())
368 return;
369
370 PlayerController playerController = PlayerController.Cast(GetOwner());
371
372 if (!playerController)
373 return;
374
375 SCR_ResourceComponent resourceComponentFrom = SCR_ResourceComponent.Cast(Replication.FindItem(rplIdResourceComponentFrom));
376
377 if (!resourceComponentFrom)
378 return;
379
380 SCR_ResourceComponent resourceComponentTo = SCR_ResourceComponent.Cast(Replication.FindItem(rplIdResourceComponentTo));
381
382 OnPlayerInteraction(interactionType, resourceComponentFrom, resourceComponentTo, resourceType, resourceValue, false);
383 }
384
385 //------------------------------------------------------------------------------------------------
390 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
391 protected void RpcAsk_ArsenalRequestItem_(RplId resourceComponentRplId, RplId storageComponentRplId, ResourceName resourceNameItem, EResourceType resourceType)
392 {
394 SCR_ChimeraCharacter buyer = SCR_ChimeraCharacter.Cast(controller.GetControlledEntity());
395 if (!buyer)
396 return; // you cannot interact with the arsenal if you dont exist
397
398 SCR_InventoryStorageManagerComponent inventoryManagerComponent = SCR_InventoryStorageManagerComponent.Cast(buyer.GetCharacterController().GetInventoryStorageManager());
399 if (!inventoryManagerComponent)
400 return;
401
402 if (!storageComponentRplId.IsValid())
403 return;
404
405 BaseInventoryStorageComponent storageComponent = BaseInventoryStorageComponent.Cast(Replication.FindItem(storageComponentRplId));
406 if (!storageComponent)
407 return;
408
409 IEntity storageParent = storageComponent.GetOwner();
410 vector storagePosition = storageParent.GetOrigin();
411 while (storageParent)
412 {
413 if (ChimeraCharacter.Cast(storageParent))
414 {
415 if (storageParent != buyer)
416 {
417 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRequestItem: Player %1 tried to buy an item to a storage container which belongs to a different character.", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), level: LogLevel.WARNING);
418 return; // we dont want you to request items to be placed into someone else inventory
419 }
420
421 break; // now we know that storageParent == buyer
422 }
423
424 storageParent = storageParent.GetParent(); // meanwhile in this case if we dont find characters in hierarchy, then storageParent == null
425 }
426
427 // check the distance only when storage doesnt belong to the character who is requesting this item
428 if (!storageParent && vector.DistanceSq(buyer.GetOrigin(), storagePosition) > MAX_REFUNDING_DISTANCE_SQ)
429 {
430 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRequestItem: Player %1 tried to buy an item to a storage container which is over %2m away from his character.", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), MAX_REFUNDING_DISTANCE_SQ, level: LogLevel.WARNING);
431 return;
432 }
433
434 if (!resourceComponentRplId.IsValid())
435 return;
436
437 SCR_ResourceComponent resourceComponent = SCR_ResourceComponent.Cast(Replication.FindItem(resourceComponentRplId));
438 if (!resourceComponent)
439 return;
440
441 SCR_ResourceConsumer consumer = resourceComponent.GetConsumer(EResourceGeneratorID.DEFAULT, resourceType);
442 if (!consumer)
443 return;
444
445 SCR_EntityCatalogManagerComponent entityCatalogManager = SCR_EntityCatalogManagerComponent.GetInstance();
446 if (!entityCatalogManager)
447 return;
448
449 IEntity resourcesOwner = resourceComponent.GetOwner();
450 if (!resourcesOwner)
451 return;
452
453 if (vector.DistanceSq(resourcesOwner.GetOrigin(), storagePosition) > MAX_REFUNDING_DISTANCE_SQ)
454 {
455 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRequestItem: Player %1 tried to buy an item from the arsenal which is over %2m away from the target storage.", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), MAX_REFUNDING_DISTANCE_SQ, level: LogLevel.WARNING);
456 return;
457 }
458
459 // Spatial validation check to see if player can interact with this arsenal
460 if (!inventoryManagerComponent.ValidateStorageRequest(resourcesOwner))
461 return;
462
463 //~ Get Supply cost only if arsenal has supplies enabled
464 SCR_ArsenalComponent arsenalComponent = SCR_ArsenalComponent.FindArsenalComponent(resourcesOwner);
465 if (!arsenalComponent)
466 return;
467
468 SCR_Faction faction = arsenalComponent.GetAssignedFaction();
469
471
472 if (faction)
473 entry = entityCatalogManager.GetEntryWithPrefabFromFactionCatalog(EEntityCatalogType.ITEM, resourceNameItem, faction);
474 else
475 entry = entityCatalogManager.GetEntryWithPrefabFromCatalog(EEntityCatalogType.ITEM, resourceNameItem);
476
477 float resourceCost;
478 bool isArsenalUsingSupplies = arsenalComponent.IsArsenalUsingSupplies();
479 if (!entry)
480 {
481 array<SCR_ArsenalItem> filteredArsenalItems = {};
482 arsenalComponent.GetFilteredOverwriteArsenalItems(filteredArsenalItems);
483
484 bool containedInOverride;
485
486 SCR_ArsenalItemStandalone standaloneItem;
487 foreach (SCR_ArsenalItem item : filteredArsenalItems)
488 {
489 standaloneItem = SCR_ArsenalItemStandalone.Cast(item);
490 if (!standaloneItem)
491 continue;
492
493 if (standaloneItem.GetItemResourceName() != resourceNameItem)
494 continue;
495
496 containedInOverride = true;
497 if (isArsenalUsingSupplies)
498 resourceCost = standaloneItem.GetSupplyCost(arsenalComponent.GetSupplyCostType());
499
500 break;
501 }
502
503 if (!containedInOverride)
504 {
505 string keyInfo;
506 if (faction)
507 keyInfo = " | Arsenal faction key=" + faction.GetFactionKey();
508
509 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRequestItem: Player %1 tried to buy an item which is not avialable in the arsenal that he used. Item=%2%3", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), FilePath.StripPath(resourceNameItem.GetPath()), keyInfo, level: LogLevel.WARNING);
510 return;
511 }
512 }
513 else if (isArsenalUsingSupplies)
514 {
516 if (!data)
517 return;
518
519 resourceCost = data.GetSupplyCost(arsenalComponent.GetSupplyCostType());
520 }
521
522 int personalResourceCost;
523 SCR_ArsenalManagerComponent arsenalManager;
524 if (SCR_ArsenalManagerComponent.GetArsenalManager(arsenalManager))
525 personalResourceCost = arsenalManager.GetItemMilitarySupplyAllocationCost(resourceNameItem, arsenalComponent, true);
526
527 //~ If Military Supply Allocation is enabled, check if player has enough Available Allocated Supplies
528 SCR_PlayerSupplyAllocationComponent playerSupplyAllocationComponent = SCR_PlayerSupplyAllocationComponent.Cast(controller.FindComponent(SCR_PlayerSupplyAllocationComponent));
529 if (playerSupplyAllocationComponent && faction && personalResourceCost > 0)
530 {
531 SCR_Faction playerFaction = SCR_Faction.Cast(buyer.GetFaction());
532 if (playerFaction && playerFaction == faction && !playerSupplyAllocationComponent.HasPlayerEnoughAvailableAllocatedSupplies(personalResourceCost))
533 return;
534 }
535
536 resourceCost *= consumer.GetBuyMultiplier();
537 if (!TryPerformResourceConsumption(consumer, resourceCost))
538 return;
539
540 if (inventoryManagerComponent.TrySpawnPrefabToStorage(resourceNameItem, storageComponent, cb: new SCR_PrefabSpawnCallback(storageComponent)) && s_OnArsenalItemRequested)
541 s_OnArsenalItemRequested.Invoke(resourceComponent, resourceNameItem, controller, storageComponent, resourceType, resourceCost);
542 }
543
544 //------------------------------------------------------------------------------------------------
549 void RpcAsk_ArsenalRequestItem(RplId resourceComponentRplId, RplId storageComponentRplId, ResourceName resourceNameItem, EResourceType resourceType)
550 {
551 Rpc(RpcAsk_ArsenalRequestItem_, resourceComponentRplId, storageComponentRplId, resourceNameItem, resourceType);
552 }
553
554 //------------------------------------------------------------------------------------------------
558 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
559 protected void RpcAsk_ArsenalRefundItem_(RplId resourceComponentRplId, RplId inventoryItemRplId, EResourceType resourceType)
560 {
562 SCR_ChimeraCharacter seller = SCR_ChimeraCharacter.Cast(controller.GetControlledEntity());
563 if (!seller)
564 return; // you cannot interact with the arsenal if you dont exist
565
566 if (!inventoryItemRplId.IsValid())
567 return;
568
569 InventoryItemComponent inventoryItemComponent = InventoryItemComponent.Cast(Replication.FindItem(inventoryItemRplId));
570 if (!inventoryItemComponent)
571 return;
572
573 IEntity inventoryItemEntity = inventoryItemComponent.GetOwner();
574 if (!inventoryItemEntity)
575 return;
576
577 SCR_ItemAttributeCollection attributes = SCR_ItemAttributeCollection.Cast(inventoryItemComponent.GetAttributes());
578 if (!attributes || !attributes.IsRefundable())
579 {
580 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRefundItem: Player %1 tried to sell an item which is not meant to be refunded. Item=%2", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), FilePath.StripPath(inventoryItemEntity.GetPrefabData().GetPrefabName().GetPath()), level: LogLevel.WARNING);
581 return; // if its not meant to be refunded in the arsenal then stop here
582 }
583
584 IEntity itemParent = inventoryItemEntity; // check the item itself to ensure that someone is not trying to sell the chracter itself
585 while (itemParent)
586 {
587 if (ChimeraCharacter.Cast(itemParent))
588 {
589 if (itemParent != seller)
590 {
591 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRefundItem: Player %1 tried to sell an item which is in the inventory of a different character.", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), level: LogLevel.WARNING);
592 return; // we dont want you to request items to be sold from someone else storage
593 }
594
595 break; // now we know that itemParent == seller
596 }
597
598 itemParent = itemParent.GetParent(); // meanwhile in this case if we dont find character in hierarchy, then itemParent will be null, f.e. a vehicle or ground, which is reasonable
599 }
600
601 vector itemPosition = inventoryItemEntity.GetOrigin();
602 // check the distance only when storage doesnt belong to the character who is requesting this item
603 if (!itemParent && vector.DistanceSq(seller.GetOrigin(), itemPosition) > MAX_REFUNDING_DISTANCE_SQ)
604 {
605 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRefundItem: Player %1 tried to sell an item which is over %2m away from his character.", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), MAX_REFUNDING_DISTANCE_SQ, level: LogLevel.WARNING);
606 return;
607 }
608
609 if (!resourceComponentRplId.IsValid())
610 return;
611
612 SCR_ResourceComponent resourceComponent = SCR_ResourceComponent.Cast(Replication.FindItem(resourceComponentRplId));
613 if (!resourceComponent)
614 return;
615
616 SCR_ResourceGenerator generator = resourceComponent.GetGenerator(EResourceGeneratorID.DEFAULT, resourceType);
617 if (!generator)
618 return;
619
620 IEntity resourcesOwner = resourceComponent.GetOwner();
621 if (!resourcesOwner)
622 return;
623
624 InventoryStorageManagerComponent sellerInventoryManagerComponent = seller.GetCharacterController().GetInventoryStorageManager();
625 if (!sellerInventoryManagerComponent || !sellerInventoryManagerComponent.ValidateStorageRequest(resourcesOwner))
626 {
627 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRefundItem: Player %1 tried to sell an item in the arsenal which too far away from him.", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), level: LogLevel.WARNING);
628 return;
629 }
630
631 if (vector.DistanceSq(resourcesOwner.GetOrigin(), itemPosition) > MAX_REFUNDING_DISTANCE_SQ)
632 {
633 PrintFormat("SCR_ResourcePlayerControllerInventoryComponent.RpcAsk_ArsenalRefundItem: Player %1 tried to sell an item in the arsenal which is over %2m away from the item.", SCR_PlayerIdentityUtils.GetPlayerLogInfo(controller.GetPlayerId()), MAX_REFUNDING_DISTANCE_SQ, level: LogLevel.WARNING);
634 return;
635 }
636
637 SCR_ArsenalComponent arsenalComponent = SCR_ArsenalComponent.FindArsenalComponent(resourcesOwner);
638 if (!arsenalComponent)
639 return; // this is an arsenal request, thus we require an arsenal to be present for this
640
641 //~ Get resource cost (cap at 0 minimum as function can return -1)
642 float resourceCost = Math.Clamp(SCR_ArsenalManagerComponent.GetItemRefundAmount(inventoryItemEntity, arsenalComponent, false), 0, float.MAX);
643
644 //~ Check if it can refund if resource cost is greater than 0
645 if (resourceCost > 0 && !TryPerformResourceGeneration(generator, resourceCost))
646 return;
647
648 int personalResourceCost;
649
650 SCR_Faction arsenalFaction = arsenalComponent.GetAssignedFaction();
651 SCR_ArsenalManagerComponent arsenalManager;
652 if (arsenalFaction && arsenalFaction == seller.GetFaction() && SCR_ArsenalManagerComponent.GetArsenalManager(arsenalManager) && arsenalManager.IsMilitarySupplyAllocationEnabled())
653 personalResourceCost = arsenalManager.GetItemMilitarySupplyAllocationRefundAmount(inventoryItemEntity, arsenalComponent);
654
655 //~ On item refunded just before the item is deleted
656 SCR_ArsenalManagerComponent.OnItemRefunded_S(inventoryItemEntity, PlayerController.Cast(GetOwner()), arsenalComponent);
657
658 IEntity parentEntity = inventoryItemEntity.GetParent();
659 SCR_InventoryStorageManagerComponent inventoryManagerComponent;
660 if (parentEntity)
661 inventoryManagerComponent = SCR_InventoryStorageManagerComponent.Cast(parentEntity.FindComponent(SCR_InventoryStorageManagerComponent));
662
663 if (inventoryManagerComponent && !inventoryManagerComponent.TryDeleteItem(inventoryItemEntity))
664 return;
665 else if (!inventoryManagerComponent)
666 RplComponent.DeleteRplEntity(inventoryItemEntity, false);
667
668 if (personalResourceCost == 0)
669 return;
670
671 //~ Add refund cost to player's Available Allocated Supplies
672 SCR_PlayerSupplyAllocationComponent playerSupplyAllocationComponent = SCR_PlayerSupplyAllocationComponent.Cast(GetOwner().FindComponent(SCR_PlayerSupplyAllocationComponent));
673 if (playerSupplyAllocationComponent)
674 playerSupplyAllocationComponent.AddPlayerAvailableAllocatedSupplies(personalResourceCost);
675 }
676
677 //------------------------------------------------------------------------------------------------
681 void RpcAsk_ArsenalRefundItem(RplId resourceComponentRplId, RplId inventoryItemRplId, EResourceType resourceType)
682 {
683 Rpc(RpcAsk_ArsenalRefundItem_, resourceComponentRplId, inventoryItemRplId, resourceType);
684 }
685
686 //------------------------------------------------------------------------------------------------
691 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
692 void RpcAsk_MergeContainerWithContainer(RplId rplIdFrom, RplId rplIdTo, EResourceType resourceType)
693 {
694 if (!rplIdFrom.IsValid() || !rplIdTo.IsValid())
695 return;
696
697 SCR_ResourceComponent componentFrom = SCR_ResourceComponent.Cast(Replication.FindItem(rplIdFrom));
698
699 if (!componentFrom)
700 return;
701
702 SCR_PlayerController playerController = SCR_PlayerController.Cast(GetOwner());
703 SCR_ChimeraCharacter user = SCR_ChimeraCharacter.Cast(playerController.GetControlledEntity());
704 CharacterControllerComponent characterController = user.GetCharacterController();
705 if (!user || !characterController || characterController.GetLifeState() != ECharacterLifeState.ALIVE)
706 return;
707
708 if (!componentFrom.CanBeUsedByCharacter(user))
709 return;
710
711 SCR_ResourceComponent componentTo = SCR_ResourceComponent.Cast(Replication.FindItem(rplIdTo));
712
713 if (!componentTo)
714 return;
715
716 float resourceValueCurrentFrom, resourceValueMaxFrom;
717 SCR_ResourceActor actorFrom = TryGetConsumptionActor(componentFrom, resourceType, resourceValueCurrentFrom, resourceValueMaxFrom);
718
719 float resourceValueCurrentTo, resourceValueMaxTo;
720 SCR_ResourceActor actorTo = TryGetGenerationActor(componentTo, resourceType, resourceValueCurrentTo, resourceValueMaxTo);
721
722 float resourceUsed = Math.Min(resourceValueCurrentFrom, resourceValueMaxTo - resourceValueCurrentTo);
723
724 if (CheckResourceConsumptionAvailability(actorFrom, resourceUsed) && CheckResourceGenerationAvailability(actorTo, resourceUsed))
725 {
726 OnBeforePlayerInteraction(EResourcePlayerInteractionType.INVENTORY_SPLIT, componentFrom, componentTo, resourceType, resourceUsed);
727 TryPerformResourceConsumption(actorFrom, resourceUsed);
728 TryPerformResourceGeneration(actorTo, resourceUsed);
729 OnPlayerInteraction(EResourcePlayerInteractionType.INVENTORY_SPLIT, componentFrom, componentTo, resourceType, resourceUsed);
730 }
731 }
732
733 //------------------------------------------------------------------------------------------------
739 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
740 protected void RpcAsk_MergeContainerWithContainerPartial_(RplId rplIdFrom, RplId rplIdTo, EResourceType resourceType, float requestedResources)
741 {
742 if (!rplIdFrom.IsValid() || !rplIdTo.IsValid())
743 return;
744
745 SCR_ResourceComponent componentFrom = SCR_ResourceComponent.Cast(Replication.FindItem(rplIdFrom));
746
747 if (!componentFrom)
748 return;
749
750 SCR_PlayerController playerController = SCR_PlayerController.Cast(GetOwner());
751 SCR_ChimeraCharacter user = SCR_ChimeraCharacter.Cast(playerController.GetControlledEntity());
752 CharacterControllerComponent characterController = user.GetCharacterController();
753 if (!user || !characterController || characterController.GetLifeState() != ECharacterLifeState.ALIVE)
754 return;
755
756 if (!componentFrom.CanBeUsedByCharacter(user))
757 return;
758
759 SCR_ResourceComponent componentTo = SCR_ResourceComponent.Cast(Replication.FindItem(rplIdTo));
760
761 if (!componentTo)
762 return;
763
764 float resourceValueCurrentFrom, resourceValueMaxFrom;
765 SCR_ResourceActor actorFrom = TryGetConsumptionActor(componentFrom, resourceType, resourceValueCurrentFrom, resourceValueMaxFrom);
766
767 float resourceValueCurrentTo, resourceValueMaxTo;
768 SCR_ResourceActor actorTo = TryGetGenerationActor(componentTo, resourceType, resourceValueCurrentTo, resourceValueMaxTo);
769
770 float resourceUsed = Math.Min(Math.Min(resourceValueCurrentFrom, resourceValueMaxTo - resourceValueCurrentTo), requestedResources);
771
772 if (CheckResourceConsumptionAvailability(actorFrom, resourceUsed) && CheckResourceGenerationAvailability(actorTo, resourceUsed))
773 {
774 OnBeforePlayerInteraction(EResourcePlayerInteractionType.INVENTORY_SPLIT, componentFrom, componentTo, resourceType, resourceUsed);
775 TryPerformResourceConsumption(actorFrom, resourceUsed);
776 TryPerformResourceGeneration(actorTo, resourceUsed);
777 OnPlayerInteraction(EResourcePlayerInteractionType.INVENTORY_SPLIT, componentFrom, componentTo, resourceType, resourceUsed);
778 }
779 }
780
781 //------------------------------------------------------------------------------------------------
787 void RpcAsk_MergeContainerWithContainerPartial(RplId rplIdFrom, RplId rplIdTo, EResourceType resourceType, float requestedResources)
788 {
789 Rpc(RpcAsk_MergeContainerWithContainerPartial_, rplIdFrom, rplIdTo, resourceType, requestedResources);
790 }
791
792
793 //------------------------------------------------------------------------------------------------
800 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
801 protected void RpcAsk_CreatePhysicalContainerWithContainer_(RplId resourceComponentRplId, RplId inventoryManagerRplId, RplId storageComponentRplId, EResourceType resourceType, float requestedResources)
802 {
803 if (!resourceComponentRplId.IsValid())
804 return;
805
806 SCR_ResourceComponent resourceComponentFrom = SCR_ResourceComponent.Cast(Replication.FindItem(resourceComponentRplId));
807
808 if (!resourceComponentFrom)
809 return;
810
811 SCR_PlayerController playerController = SCR_PlayerController.Cast(GetOwner());
812 SCR_ChimeraCharacter user = SCR_ChimeraCharacter.Cast(playerController.GetControlledEntity());
813 CharacterControllerComponent characterController = user.GetCharacterController();
814 if (!user || !characterController || characterController.GetLifeState() != ECharacterLifeState.ALIVE)
815 return;
816
817 if (!resourceComponentFrom.CanBeUsedByCharacter(user))
818 return;
819
820 float resourceValueCurrentFrom, resourceValueMaxFrom;
821 SCR_ResourceActor actorFrom = TryGetConsumptionActor(resourceComponentFrom, resourceType, resourceValueCurrentFrom, resourceValueMaxFrom);
822
823 if (!CheckResourceConsumptionAvailability(actorFrom, requestedResources))
824 return;
825
826 float resourceValueCurrentTo, resourceValueMaxTo;
827 SCR_ResourceActor actorConsumptionTo, actorGenerationTo;
828
829 if (!inventoryManagerRplId.IsValid())
830 {
831 SCR_EntityCatalog resourceContainerCatalog = SCR_EntityCatalogManagerComponent.GetInstance().GetEntityCatalogOfType(EEntityCatalogType.SUPPLY_CONTAINER_ITEM);
832 array<SCR_EntityCatalogEntry> entries = {};
833 array<SCR_BaseEntityCatalogData> data = {};
835 float resourceUsed;
836 int selectedEntryIdx;
837
838 resourceContainerCatalog.GetEntityListWithData(SCR_ResourceContainerItemData, entries, data);
839
840 for (selectedEntryIdx = data.Count() - 1; selectedEntryIdx >= 0; --selectedEntryIdx)
841 {
842 datum = SCR_ResourceContainerItemData.Cast(data[selectedEntryIdx]);
843 resourceUsed = datum.GetMaxResourceValue();
844
845 if (resourceUsed >= requestedResources)
846 break;
847 }
848
849 if (selectedEntryIdx < 0)
850 selectedEntryIdx = 0;
851
852 resourceUsed = Math.Min(resourceUsed, requestedResources);
853
854 if (!TryPerformResourceConsumption(actorFrom, resourceUsed))
855 return;
856
857 // WARNING: From now on resourceComponentFrom.GetOwner().IsDeleted() can be true!
858 // That happens, for example, when moving one last supply from player to supply truck.
859 // Due to a bug in Enfusion GenericEntity owner = resourceComponentFrom.GetOwner()
860 // will be NULL, so we always need to access the entity via resource component
861 // and shall from now on never assign it directly to GenericEntity.
862
863 vector position = resourceComponentFrom.GetOwner().GetOrigin();
865
866 EntitySpawnParams spawnParams = new EntitySpawnParams();
867 spawnParams.TransformMode = ETransformMode.WORLD;
868 spawnParams.Transform[3] = position;
869 IEntity newStorageEntity = GetGame().SpawnEntityPrefab(Resource.Load(entries[selectedEntryIdx].GetPrefab()), GetGame().GetWorld(), spawnParams);
870 SCR_ResourceComponent resourceComponentTo = SCR_ResourceComponent.FindResourceComponent(newStorageEntity);
871 actorConsumptionTo = TryGetConsumptionActor(resourceComponentTo, resourceType, resourceValueCurrentTo, resourceValueMaxTo);
872 actorGenerationTo = TryGetGenerationActor(resourceComponentTo, resourceType, resourceValueCurrentTo, resourceValueMaxTo);
873
874 TryPerformResourceConsumption(actorConsumptionTo, resourceValueCurrentTo, true);
875
876 if (TryPerformResourceGeneration(actorGenerationTo, resourceUsed))
877 {
878 OnPlayerInteraction(EResourcePlayerInteractionType.INVENTORY_SPLIT, resourceComponentFrom, resourceComponentTo, resourceType, resourceUsed);
879
880 return;
881 }
882
883 delete newStorageEntity;
884
885 return;
886 }
887
888 SCR_InventoryStorageManagerComponent inventoryManagerComponent = SCR_InventoryStorageManagerComponent.Cast(Replication.FindItem(inventoryManagerRplId));
889
890 if (!inventoryManagerComponent)
891 return;
892
893 if (!storageComponentRplId.IsValid())
894 return;
895
896 BaseInventoryStorageComponent storageComponent = BaseInventoryStorageComponent.Cast(Replication.FindItem(storageComponentRplId));
897
898 if (!storageComponent)
899 return;
900
901 IEntity resourcesOwner = resourceComponentFrom.GetOwner();
902 SCR_EntityCatalogEntry selectedEntry = null;
903 int selectedEntryIdx = -1;
904 SCR_EntityCatalog resourceContainerCatalog = SCR_EntityCatalogManagerComponent.GetInstance().GetEntityCatalogOfType(EEntityCatalogType.SUPPLY_CONTAINER_ITEM);
905 array<SCR_EntityCatalogEntry> entries = {};
906 array<SCR_BaseEntityCatalogData> data = {};
907
908 resourceContainerCatalog.GetEntityListWithData(SCR_ResourceContainerItemData, entries, data);
909
910 foreach (int idx, SCR_EntityCatalogEntry entry: entries)
911 {
912 if (inventoryManagerComponent.CanInsertResourceInStorage(entry.GetPrefab(), storageComponent))
913 {
914 selectedEntry = entry;
915 selectedEntryIdx = idx;
916
917 break;
918 }
919 }
920
921 if (!selectedEntry)
922 return;
923
925 float maxStoredResources = Math.Min(resourceValueCurrentFrom, datum.GetMaxResourceValue());
926 float resourceUsed = Math.Min(requestedResources, maxStoredResources);
927
928 if (!TryPerformResourceConsumption(actorFrom, resourceUsed))
929 return;
930
931 EntitySpawnParams spawnParams = new EntitySpawnParams();
932 spawnParams.TransformMode = ETransformMode.WORLD;
933
934 inventoryManagerComponent.GetOwner().GetTransform(spawnParams.Transform);
935
936 IEntity newStorageEntity = GetGame().SpawnEntityPrefab(Resource.Load(selectedEntry.GetPrefab()), GetGame().GetWorld(), spawnParams);
937
938 if (!newStorageEntity)
939 return;
940
941 SCR_ResourceComponent resourceComponentTo = SCR_ResourceComponent.FindResourceComponent(newStorageEntity);
942 actorConsumptionTo = TryGetConsumptionActor(resourceComponentTo, resourceType, resourceValueCurrentTo, resourceValueMaxTo);
943 actorGenerationTo = TryGetGenerationActor(resourceComponentTo, resourceType, resourceValueCurrentTo, resourceValueMaxTo);
944
945 TryPerformResourceConsumption(actorConsumptionTo, resourceValueCurrentTo, true);
946
947 if (!TryPerformResourceGeneration(actorGenerationTo, resourceUsed))
948 {
949 delete newStorageEntity;
950
951 return;
952 }
953
954 inventoryManagerComponent.TryInsertItemInStorage(newStorageEntity, storageComponent);
955 OnPlayerInteraction(EResourcePlayerInteractionType.INVENTORY_SPLIT, resourceComponentFrom, resourceComponentTo, resourceType, resourceUsed);
956 }
957
958 //------------------------------------------------------------------------------------------------
963 static void FindSuitablePosition(inout vector position, float maxHorizontalOffset, float maxVerticalOffset)
964 {
965 position = vector.Up * position[1] + SCR_Math2D.GenerateRandomPointInRadius(0, maxHorizontalOffset, position);
966
967 TraceParam param = new TraceParam();
968 param.Start = position + vector.Up * maxVerticalOffset;
969 param.End = position;
970 param.Flags = TraceFlags.WORLD | TraceFlags.ENTS;
971 param.LayerMask = EPhysicsLayerDefs.Projectile;
972
973 float distanceTraveled = GetGame().GetWorld().TraceMove(param, TraceFilter);
974 if (param.TraceEnt == null && distanceTraveled == 1)
975 { // If f.e. someone dropped supplies from a helo, then find the position on the ground, so they dont stay mid air
976 position[1] = GetGame().GetWorld().GetSurfaceY(param.End[0], param.End[2]);
977 param.End = position;
978 param.Start = param.End + vector.Up * maxVerticalOffset;
979 distanceTraveled = GetGame().GetWorld().TraceMove(param, TraceFilter);
980 }
981
982 if (distanceTraveled < 1)
983 position = (param.End - param.Start) * distanceTraveled + param.Start;
984 }
985
986 //------------------------------------------------------------------------------------------------
991 protected static bool TraceFilter(notnull IEntity e, vector start = vector.Zero, vector dir = vector.Zero)
992 {
993 if (BaseTree.Cast(e))
994 return false;//ignore trees and bushes
995
996 if (Vehicle.Cast(e) || Vehicle.Cast(e.GetRootParent()))
997 return false;//ignore vehicles and its parts
998
999 if (ChimeraCharacter.Cast(e))
1000 return false;//ignore characters
1001
1002 if (ChimeraCharacter.Cast(e.GetRootParent()))
1003 return false;//ignore character equipment
1004
1005 if (SCR_BaseDebrisSmallEntity.Cast(e))
1006 return false;//ignore debris
1007
1008 return true;
1009 }
1010
1011 //------------------------------------------------------------------------------------------------
1012 void RpcAsk_CreatePhysicalContainerWithContainer(RplId resourceComponentRplId, RplId inventoryManagerRplId, RplId storageComponentRplId, EResourceType resourceType, float requestedResources)
1013 {
1014 Rpc(RpcAsk_CreatePhysicalContainerWithContainer_, resourceComponentRplId, inventoryManagerRplId, storageComponentRplId, resourceType, requestedResources);
1015 }
1016
1017 //------------------------------------------------------------------------------------------------
1024 void OnPlayerInteraction(EResourcePlayerInteractionType interactionType, SCR_ResourceComponent resourceComponentFrom, SCR_ResourceComponent resourceComponentTo, EResourceType resourceType, float resourceValue, bool shouldBroadcast = true)
1025 {
1026 IEntity owner = GetOwner();
1027 PlayerController playerController = PlayerController.Cast(owner);
1028
1029 if (!playerController)
1030 return;
1031
1032 if (shouldBroadcast)
1033 {
1034 RplComponent replicationComponent = RplComponent.Cast(owner.FindComponent(RplComponent));
1035
1036 if (replicationComponent && !replicationComponent.IsProxy() && !replicationComponent.IsOwner())
1037 Rpc(RpcAsk_OnPlayerInteraction, interactionType, Replication.FindItemId(resourceComponentFrom), Replication.FindItemId(resourceComponentTo), resourceType, resourceValue);
1038
1039 ChimeraWorld world = GetGame().GetWorld();
1040 SCR_SupplySystem system = SCR_SupplySystem.Cast(world.FindSystem(SCR_SupplySystem));
1041 if (system)
1042 system.ActivateEffects(interactionType, resourceComponentFrom, resourceComponentTo, resourceType, resourceValue);
1043 }
1044
1045 GetOnPlayerInteraction().Invoke(interactionType, owner, resourceComponentFrom, resourceComponentTo, resourceType, resourceValue);
1046 }
1047
1048 //------------------------------------------------------------------------------------------------
1054 void OnBeforePlayerInteraction(EResourcePlayerInteractionType interactionType, SCR_ResourceComponent resourceComponentFrom, SCR_ResourceComponent resourceComponentTo, EResourceType resourceType, float resourceValue)
1055 {
1056 GetOnBeforePlayerInteraction().Invoke(interactionType, GetOwner(), resourceComponentFrom, resourceComponentTo, resourceType, resourceValue);
1057 }
1058
1059 //------------------------------------------------------------------------------------------------
1062 override event protected void OnDelete(IEntity owner)
1063 {
1064 super.OnDelete(owner);
1065
1066 GetGame().GetResourceSystemSubscriptionManager().UnsubscribeListenerCompletely(Replication.FindItemId(this));
1067 }
1068}
void SCR_BaseDebrisSmallEntity(IEntitySource src, IEntity parent)
EEntityCatalogType
ArmaReforgerScripted GetGame()
Definition game.c:1398
ResourceName resourceName
Definition SCR_AIGroup.c:66
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
vector position
Get all prefabs that have the spawner data
EResourceContainerOnEmptyBehavior
EResourceGeneratorID
ScriptInvokerBase< OnArsenalItemRequestedMethod > OnArsenalItemRequestedInvoker
ScriptInvokerBase< ScriptInvokerActiveWidgetInteractionFunc > ScriptInvokerResourceOnPlayerInteraction
typedef ScriptInvoker_ResourceOnPlayerInteraction
proto external GenericComponent FindComponent(typename typeName)
void Rpc(func method, void p0=NULL, void p1=NULL, void p2=NULL, void p3=NULL, void p4=NULL, void p5=NULL, void p6=NULL, void p7=NULL)
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
proto external EntityPrefabData GetPrefabData()
proto external IEntity GetParent()
Definition Math.c:13
Main replication API.
Definition Replication.c:14
Object holding reference to resource. In destructor release the resource.
Definition Resource.c:25
Replication item identifier.
Definition RplId.c:14
static SCR_ArsenalComponent FindArsenalComponent(notnull IEntity entity, bool getFromSlotted=true)
bool GetFilteredOverwriteArsenalItems(out notnull array< SCR_ArsenalItem > filteredArsenalItems, EArsenalItemDisplayType requiresDisplayType=-1)
SCR_EArsenalSupplyCostType GetSupplyCostType()
Arsenal Item to be added in the configs outside of The faction Catalog.
override ResourceName GetItemResourceName()
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)
Get Prefab data return Prefab data *ResourceName GetPrefab()
static vector GenerateRandomPointInRadius(float minRadius, float maxRadius, vector center, bool uniform=true)
Definition SCR_Math2D.c:392
SCR_CharacterControllerComponent GetCharacterController()
bool DecreaseResourceValue(float value, bool notifyChange=true)
void SetOnEmptyBehavior(EResourceContainerOnEmptyBehavior behavior)
EResourceContainerOnEmptyBehavior GetOnEmptyBehavior()
bool IncreaseResourceValue(float value, bool notifyChange=true)
Get max resource value of container Data obtained from if no max resource value found return max Resource value *int GetMaxResourceValue()
override float GetAggregatedResourceValue()
SCR_ResourceGenerationResponse RequestAvailability(float resourceAmount)
SCR_ResourceGenerationResponse RequestGeneration(float resourceAmount, SCR_ResourceGenerator generator=null)
override float GetAggregatedMaxResourceValue()
void RpcAsk_MergeContainerWithContainerPartial(RplId rplIdFrom, RplId rplIdTo, EResourceType resourceType, float requestedResources)
void OnPlayerInteraction(EResourcePlayerInteractionType interactionType, SCR_ResourceComponent resourceComponentFrom, SCR_ResourceComponent resourceComponentTo, EResourceType resourceType, float resourceValue, bool shouldBroadcast=true)
void RpcAsk_ArsenalRefundItem(RplId resourceComponentRplId, RplId inventoryItemRplId, EResourceType resourceType)
void RequestSubscription(RplId resourceComponentRplId, typename interactorType, EResourceType resourceType, EResourceGeneratorID resourceIdentifier)
bool CheckResourceConsumptionAvailability(notnull SCR_ResourceActor actor, float resourceValue)
bool TryPerformResourceGeneration(notnull SCR_ResourceActor actor, float resourceValue)
void RpcAsk_RequestUnsubscription(RplId resourceComponentRplId, string interactorType, EResourceType resourceType, EResourceGeneratorID resourceIdentifier)
void RpcAsk_MergeContainerWithContainer(RplId rplIdFrom, RplId rplIdTo, EResourceType resourceType)
void RpcAsk_ArsenalRefundItem_(RplId resourceComponentRplId, RplId inventoryItemRplId, EResourceType resourceType)
void RequestUnsubscription(RplId resourceComponentRplId, typename interactorType, EResourceType resourceType, EResourceGeneratorID resourceIdentifier)
const int MAX_REFUNDING_DISTANCE_SQ
30m to compensate for some large entities like Mi-8 which with arsenal truck can result in transactio...
void RpcAsk_CreatePhysicalContainerWithContainer_(RplId resourceComponentRplId, RplId inventoryManagerRplId, RplId storageComponentRplId, EResourceType resourceType, float requestedResources)
static bool TraceFilter(notnull IEntity e, vector start=vector.Zero, vector dir=vector.Zero)
void RpcAsk_ArsenalRequestItem(RplId resourceComponentRplId, RplId storageComponentRplId, ResourceName resourceNameItem, EResourceType resourceType)
static void FindSuitablePosition(inout vector position, float maxHorizontalOffset, float maxVerticalOffset)
void RpcAsk_MergeContainerWithContainerPartial_(RplId rplIdFrom, RplId rplIdTo, EResourceType resourceType, float requestedResources)
void RpcAsk_OnPlayerInteraction(EResourcePlayerInteractionType interactionType, RplId rplIdResourceComponentFrom, RplId rplIdResourceComponentTo, EResourceType resourceType, float resourceValue)
bool CheckResourceGenerationAvailability(notnull SCR_ResourceActor actor, float resourceValue)
SCR_ResourceActor TryGetGenerationActor(notnull SCR_ResourceComponent resourceComponent, EResourceType resourceType, out float currentResourceValue, out float maxResourceValue)
void RpcAsk_ArsenalRequestItem_(RplId resourceComponentRplId, RplId storageComponentRplId, ResourceName resourceNameItem, EResourceType resourceType)
void RpcAsk_CreatePhysicalContainerWithContainer(RplId resourceComponentRplId, RplId inventoryManagerRplId, RplId storageComponentRplId, EResourceType resourceType, float requestedResources)
bool TryPerformResourceConsumption(notnull SCR_ResourceActor actor, float resourceValue, bool ignoreOnEmptyBehavior=false)
SCR_ResourceActor TryGetConsumptionActor(notnull SCR_ResourceComponent resourceComponent, EResourceType resourceType, out float currentResourceValue, out float maxResourceValue)
void RpcAsk_RequestSubscription(RplId resourceComponentRplId, string interactorType, EResourceType resourceType, EResourceGeneratorID resourceIdentifier)
void OnBeforePlayerInteraction(EResourcePlayerInteractionType interactionType, SCR_ResourceComponent resourceComponentFrom, SCR_ResourceComponent resourceComponentTo, EResourceType resourceType, float resourceValue)
ref ScriptInvokerResourceOnPlayerInteraction m_OnBeforePlayerInteractionInvoker
void ActivateEffects(EResourcePlayerInteractionType interactionType, SCR_ResourceComponent resourceComponentFrom, SCR_ResourceComponent resourceComponentTo, EResourceType resourceType, float resourceValue)
proto external GenericEntity GetOwner()
Get owner entity.
enum EPhysicsLayerPresets Vehicle
Definition gameLib.c:24
void EntitySpawnParams()
Definition gameLib.c:130
ECharacterLifeState
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
proto void PrintFormat(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL, LogLevel level=LogLevel.NORMAL)
void RplRpc(RplChannel channel, RplRcver rcver, RplCondition condition=RplCondition.None, string customConditionName="")
Definition EnNetwork.c:95
RplRcver
Definition RplRcver.c:59
RplChannel
Communication channel. Reliable is guaranteed to be delivered. Unreliable not.
Definition RplChannel.c:14
TraceFlags
Definition TraceFlags.c:13