Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_CampaignBuildingManagerComponent.c
Go to the documentation of this file.
1void ScriptInvokerEntitySpawnedByProviderMethod(int prefabID, SCR_EditableEntityComponent editableEntity, int playerId, SCR_CampaignBuildingProviderComponent provider);
3typedef ScriptInvokerBase<ScriptInvokerEntitySpawnedByProviderMethod> ScriptInvokerEntitySpawnedByProvider;
4
5void ScriptInvokerCompositionUnregisteredMethod(SCR_CampaignBuildingCompositionComponent composition);
7typedef ScriptInvokerBase<ScriptInvokerCompositionUnregisteredMethod> ScriptInvokerCompositionUnregistered;
8
9[ComponentEditorProps(category: "GameScripted/GameMode/Components", description: "Base for gamemode scripted component.")]
13
16class SCR_CampaignBuildingManagerComponent : SCR_BaseGameModeComponent
17{
18 [Attribute("", UIWidgets.ResourcePickerThumbnail, "Prefab of trigger spawned on server to activate a building mode when player enters its range.", "et")]
19 protected ResourceName m_sFreeRoamBuildingServerTrigger;
20
21 [Attribute("", UIWidgets.ResourcePickerThumbnail, "Prefab of trigger spawned only on clients, to visualize the building area and allow player build only within its radius.", "et")]
23
24 [Attribute("{58F07022C12D0CF5}Assets/Editor/PlacingPreview/Preview.emat", UIWidgets.ResourcePickerThumbnail, "Material used when for the preview of the compositions outside of the building mode.", category: "Preview", params: "emat")]
26
27 [Attribute("0", UIWidgets.ComboBox, "", enums: ParamEnumArray.FromEnum(EEditableEntityBudget))]
29
30 [Attribute("25", UIWidgets.EditBox, "Refund percentage", "")]
32
33 [Attribute("10", UIWidgets.EditBox, "How many times player has to perform build step to gain a XP reward", "")]
34 protected int m_iXpRewardTreshold;
35
36 [Attribute("1", UIWidgets.EditBox, "How many times player has to perform building step at the beginning of gradual reward process to gain his first XP reward.", params: "1 inf 1")]
38
39 [Attribute("0.2", UIWidgets.EditBox, "How steep curve of the gradual reward process will be.", params: "0 inf 0.001")]
40 protected float m_fRewardCurveIncrement;
41
43 [Attribute("0", UIWidgets.CheckBox, "If checked, only players of faction that match the owning faction of provider can disassemble composition")]
45
46 [Attribute("1", UIWidgets.CheckBox, "If checked, players from the opposing faction will only be able to disassemble composition when the base it belongs is being captured")]
48
49 [Attribute()]
51
52 [Attribute("", UIWidgets.ResourceNamePicker, desc: "Config with prefabs available to build. The config has to be the same as on Editor Mode - placing editor component..", params: "conf")]
54
55 [Attribute("", UIWidgets.ResourcePickerThumbnail, desc: "This prefab will be spawned when composition is disassembled but has no provider where to return supply.", params: "et")]
57
58 protected ref array<ResourceName> m_aPlaceablePrefabs = {};
60 protected ref array<SCR_CampaignBuildingCompositionComponent> m_aHQBuildingCompositions = {};
61
64 protected RplComponent m_RplComponent;
65 protected int m_iBuildingCycle;
66 protected float m_fRewardCurveProgress;
67
71
72 //------------------------------------------------------------------------------------------------
78
79 //------------------------------------------------------------------------------------------------
80 protected bool GetResourceComponent(IEntity owner, out SCR_ResourceComponent component)
81 {
82 if (!owner)
83 return false;
84
85 IEntity providerEntity;
86 SCR_CampaignBuildingCompositionComponent campaignCompositionComponent = SCR_CampaignBuildingCompositionComponent.Cast(owner.FindComponent(SCR_CampaignBuildingCompositionComponent));
87 if (campaignCompositionComponent)
88 providerEntity = campaignCompositionComponent.GetProviderEntity();
89
90 if (!providerEntity)
91 {
92 providerEntity = GetTemporaryProvider();
94 }
95
96 if (!providerEntity)
97 return false;
98
100
101 component = SCR_ResourceComponent.FindResourceComponent(providerEntity);
102
103 return component;
104 }
105
106 //------------------------------------------------------------------------------------------------
112
113 //------------------------------------------------------------------------------------------------
116 {
117 return m_sFreeRoamBuildingServerTrigger;
118 }
119
120 //------------------------------------------------------------------------------------------------
126
127 //------------------------------------------------------------------------------------------------
130 {
132 }
133
134 //------------------------------------------------------------------------------------------------
140
141 //------------------------------------------------------------------------------------------------
148
149 //------------------------------------------------------------------------------------------------
155
156 //------------------------------------------------------------------------------------------------
158 [Obsolete("SCR_CampaignBuildingManagerComponent.GetResourceComponent() should be used instead.")]
159 protected bool GetSupplyComponent(IEntity ownerEntity, out SCR_CampaignSuppliesComponent suppliesComponent)
160 {
161 SCR_CampaignBuildingCompositionComponent campaignCompositionComponent = SCR_CampaignBuildingCompositionComponent.Cast(ownerEntity.FindComponent(SCR_CampaignBuildingCompositionComponent));
162 if (!campaignCompositionComponent)
163 return false;
164
165 IEntity providerEntity;
166 providerEntity = campaignCompositionComponent.GetProviderEntity();
167 if (!providerEntity)
168 {
169 providerEntity = GetTemporaryProvider();
171 }
172 else
174
175 if (!providerEntity)
176 return false;
177
178 suppliesComponent = SCR_CampaignSuppliesComponent.Cast(providerEntity.FindComponent(SCR_CampaignSuppliesComponent));
179 return suppliesComponent != null;
180 }
181
182 //------------------------------------------------------------------------------------------------
185 {
187
189 if (m_iBuildingCycle < currentThreshold)
190 return;
191
193
196
197 PlayerController playerController = GetGame().GetPlayerController();
198 if (!playerController)
199 return;
200
201 SCR_CampaignBuildingNetworkComponent networkComponent = SCR_CampaignBuildingNetworkComponent.Cast(playerController.FindComponent(SCR_CampaignBuildingNetworkComponent));
202 if (!networkComponent)
203 return;
204
205 networkComponent.AddXPReward(playerController.GetPlayerId());
206 }
207
208 //------------------------------------------------------------------------------------------------
215
216 //------------------------------------------------------------------------------------------------
217 protected void OnEntityCoreBudgetUpdated(EEditableEntityBudget entityBudget, int originalBudgetValue, int budgetChange, int updatedBudgetValue, SCR_EditableEntityComponent entity)
218 {
219 if (IsProxy())
220 return;
221
222 if (entityBudget != m_BudgetType)
223 return;
224
225 // Continue with compositions placed in WB only when refund is about to happen.
226 if (entity.GetOwner().IsLoaded() && budgetChange > 0)
227 return;
228
229 //CampaignBuildingManagerComponent should not do anything if there is no campaign
230 const SCR_GameModeCampaign campaign = SCR_GameModeCampaign.GetInstance();
231 if (!campaign)
232 return;
233
234 // Do not react to changes during loading of session
236 return;
237
238 int propBudgetValue;
239 array<ref SCR_EntityBudgetValue> budgets = {};
240 entity.GetEntityAndChildrenBudgetCost(budgets);
241
242 //get props budget value
243 foreach (SCR_EntityBudgetValue budget : budgets)
244 {
245 if (budget.GetBudgetType() != EEditableEntityBudget.PROPS)
246 continue;
247
248 propBudgetValue = budget.GetBudgetValue();
249 break;
250 }
251
252 IEntity entityOwner = entity.GetOwnerScripted();
253 SCR_ResourceComponent resourceComponent;
254 bool wasContainerSpawned;
255
256 // If resource component was not found on deconstruction, spawn a custom one , find again the resource component at this spawned box and fill it with refund supply.
257 if (!GetResourceComponent(entityOwner, resourceComponent))
258 {
259 //Spawn a resource holder only when the refunded object is a composition.
260 SCR_CampaignBuildingCompositionComponent compositionComponent = SCR_CampaignBuildingCompositionComponent.Cast(entityOwner.FindComponent(SCR_CampaignBuildingCompositionComponent));
261 if (compositionComponent && budgetChange < 0)
262 {
263 SpawnCustomResourceHolder(entityOwner, resourceComponent);
264 wasContainerSpawned = true;
265 }
266 }
267
268 if (!resourceComponent)
269 return;
270
271 //~ Supplies not enabled so no need to remove any
272 if (!resourceComponent.IsResourceTypeEnabled())
273 return;
274
275 IEntity providerEntity = resourceComponent.GetOwner();
276
277 if (!providerEntity)
278 return;
279
280 SCR_CampaignBuildingProviderComponent providerComponent = SCR_CampaignBuildingProviderComponent.Cast(providerEntity.FindComponent(SCR_CampaignBuildingProviderComponent));
281
282 if (budgetChange < 0)
283 {
284 budgetChange = Math.Round(budgetChange * m_iCompositionRefundPercentage * 0.01);
285
286 if (providerComponent)
287 providerComponent.AddPropValue(-propBudgetValue);
288
289 if (wasContainerSpawned)
290 {
291 SCR_ResourceContainer container = resourceComponent.GetContainer(EResourceType.SUPPLIES);
292
293 if (container)
294 container.SetResourceValue(-budgetChange);
295 }
296 else
297 {
298 SCR_ResourceGenerator generator = resourceComponent.GetGenerator(EResourceGeneratorID.DEFAULT, EResourceType.SUPPLIES);
299
300 if (generator)
301 generator.RequestGeneration(-budgetChange);
302 }
303 }
304 else
305 {
306 if (providerComponent)
307 providerComponent.AddPropValue(propBudgetValue);
308
309 SCR_ResourceConsumer consumer = resourceComponent.GetConsumer(EResourceGeneratorID.DEFAULT, EResourceType.SUPPLIES);
310
311 if (consumer)
312 consumer.RequestConsumtion(budgetChange);
313 }
314 }
315
316 //------------------------------------------------------------------------------------------------
317 void SpawnCustomResourceHolder(IEntity entityOwner, out SCR_ResourceComponent component)
318 {
319 EntitySpawnParams spawnParams = new EntitySpawnParams();
320 spawnParams.TransformMode = ETransformMode.WORLD;
321 entityOwner.GetTransform(spawnParams.Transform);
322
324 if (!res.IsValid())
325 return;
326
327 IEntity resourceHolder = GetGame().SpawnEntityPrefab(res, GetGame().GetWorld(), spawnParams);
328 if (!resourceHolder)
329 return;
330
331 component = SCR_ResourceComponent.FindResourceComponent(resourceHolder);
332 }
333
334 //------------------------------------------------------------------------------------------------
335 override void EOnInit(IEntity owner)
336 {
338 m_RplComponent = RplComponent.Cast(owner.FindComponent(RplComponent));
339
341
342 if (!GetGameMode().IsMaster())
343 return;
344
345 // Supplies are disabled in this mode. No need for an event.
346 if (!SCR_ResourceSystemHelper.IsGlobalResourceTypeEnabled(EResourceType.SUPPLIES))
347 return;
348
349 m_EntityCore.Event_OnEntityBudgetUpdatedPerEntity.Insert(OnEntityCoreBudgetUpdated);
350 }
351
352 //------------------------------------------------------------------------------------------------
353 override void OnPostInit(IEntity owner)
354 {
356 return;
357
358 SetEventMask(owner, EntityEvent.INIT);
359 }
360
361 //------------------------------------------------------------------------------------------------
362 protected bool IsProxy()
363 {
364 return (m_RplComponent && m_RplComponent.IsProxy());
365 }
366
367 //------------------------------------------------------------------------------------------------
370 {
371 Resource configContainer = BaseContainerTools.LoadContainer(m_sPrefabsToBuildResource);
372 if (!configContainer || !configContainer.IsValid())
373 return;
374
375 SCR_PlaceableEntitiesRegistry registry = SCR_PlaceableEntitiesRegistry.Cast(BaseContainerTools.CreateInstanceFromContainer(configContainer.GetResource().ToBaseContainer()));
376 if (!registry)
377 return;
378
379 m_aPlaceablePrefabs = registry.GetPrefabs();
380 }
381
382 //------------------------------------------------------------------------------------------------
387 {
388 // the array doesn't exist or the index I'm searching for is out of the bounds, terminate.
389 if (!m_aPlaceablePrefabs || !m_aPlaceablePrefabs.IsIndexValid(prefabID))
390 return string.Empty;
391
392 return m_aPlaceablePrefabs[prefabID];
393 }
394
395 //------------------------------------------------------------------------------------------------
396 array<ResourceName> GetPlaceablePrefabs()
397 {
399 return null;
400
401 array<ResourceName> copy = {};
402 copy.Copy(m_aPlaceablePrefabs);
403 return copy;
404 }
405
406 //------------------------------------------------------------------------------------------------
411 {
412 return m_aPlaceablePrefabs.Find(resName);
413 }
414
415 //------------------------------------------------------------------------------------------------
421 void EnterEditorMode(int playerID, notnull IEntity provider, bool userActionActivationOnly = false, bool userActionUsed = false, bool useAllAvailableProviders = false)
422 {
423 SCR_EditorManagerEntity editorManager = GetEditorManagerEntity(playerID);
424 if (!editorManager)
425 return;
426
427 SCR_EditorModeEntity modeEntity = editorManager.FindModeEntity(EEditorMode.BUILDING);
428 if (!modeEntity)
429 modeEntity = editorManager.CreateEditorMode(EEditorMode.BUILDING, false);
430
431 if (!modeEntity)
432 return;
433
434 SetEditorMode(editorManager, modeEntity, playerID, provider, userActionActivationOnly, userActionUsed, useAllAvailableProviders);
435 }
436
437 //------------------------------------------------------------------------------------------------
445 protected void SetEditorMode(notnull SCR_EditorManagerEntity editorManager, notnull SCR_EditorModeEntity modeEntity, int playerID, notnull IEntity provider, bool userActionActivationOnly = false, bool userActionUsed = false, bool useAllAvailableProviders = false)
446 {
447 SCR_CampaignBuildingEditorComponent buildingComponent = SCR_CampaignBuildingEditorComponent.Cast(modeEntity.FindComponent(SCR_CampaignBuildingEditorComponent));
448 if (!buildingComponent)
449 return;
450
451 SCR_CampaignBuildingProviderComponent providerComponent = SCR_CampaignBuildingProviderComponent.Cast(provider.FindComponent(SCR_CampaignBuildingProviderComponent));
452 if (!providerComponent)
453 return;
454
455 if (useAllAvailableProviders)
456 providerComponent.SetUseAllAvailableProvidersByPlayer(IsCommander(playerID));
457
458 providerComponent.AddNewAvailableUser(playerID);
459 if (userActionUsed)
460 providerComponent.AddNewActiveUser(playerID);
461
462 buildingComponent.AddProviderEntityEditorComponent(providerComponent);
463
464 if (!editorManager.IsOpened())
465 editorManager.SetCurrentMode(EEditorMode.BUILDING);
466
467 if (userActionActivationOnly || userActionUsed)
468 ToggleEditorMode(editorManager);
469
470 // events
471 SCR_PlacingEditorComponent placingComponent = SCR_PlacingEditorComponent.Cast(modeEntity.FindComponent(SCR_PlacingEditorComponent));
472 placingComponent.GetOnPlaceEntityServer().Insert(EntitySpawnedByProvider);
473
475 if (gameMode)
477
478 SetOnPlayerDeathEvent(playerID);
480 providerComponent.SetCheckProviderMove();
481 }
482
483 //------------------------------------------------------------------------------------------------
487 protected bool IsCommander(int playerId)
488 {
489 PlayerController owner = GetGame().GetPlayerManager().GetPlayerController(playerId);
490 if (!owner)
491 return false;
492
494 if (!playerFaction)
495 return false;
496
497 SCR_Faction faction = SCR_Faction.Cast(playerFaction.GetAffiliatedFaction());
498 return faction && faction.IsPlayerCommander(owner.GetPlayerId());
499 }
500
501 //------------------------------------------------------------------------------------------------
506 void PlayerDisconnected(int playerId, KickCauseCode cause, int timeout)
507 {
509 if (!gameMode)
510 return;
511
513 }
514
515 //------------------------------------------------------------------------------------------------
517 void EntitySpawnedByProvider(int prefabID, SCR_EditableEntityComponent editableEntity, int playerId)
518 {
519 SCR_GameModeCampaign campaign = SCR_GameModeCampaign.GetInstance();
520 if (!campaign)
521 return;
522
523 SCR_EditorManagerEntity editorManager = GetEditorManagerEntity(playerId);
524 if (!editorManager)
525 return;
526
527 SCR_EditorModeEntity modeEntity = editorManager.FindModeEntity(EEditorMode.BUILDING);
528 if (!modeEntity)
529 return;
530
531 SCR_CampaignBuildingEditorComponent buildingComponent = SCR_CampaignBuildingEditorComponent.Cast(modeEntity.FindComponent(SCR_CampaignBuildingEditorComponent));
532 if (!buildingComponent)
533 return;
534
535 SCR_CampaignBuildingProviderComponent provider = buildingComponent.GetProviderComponent();
536 if (!provider)
537 return;
538
539 IEntity player = GetGame().GetPlayerManager().GetPlayerControlledEntity(playerId);
540 if (!player)
541 return;
542
543 campaign.OnEntityRequested(editableEntity.GetOwner(), player, SCR_Faction.Cast(SCR_Faction.GetEntityFaction(editableEntity.GetOwner())), provider);
544
546 m_OnEntitySpawnedByProvider.Invoke(prefabID, editableEntity, playerId, provider);
547 }
548
549 //------------------------------------------------------------------------------------------------
550 protected bool TryAddHQ(notnull SCR_CampaignBuildingCompositionComponent composition)
551 {
552 SCR_EditableEntityComponent editableEntity = SCR_EditableEntityComponent.Cast(composition.GetOwner().FindComponent(SCR_EditableEntityComponent));
553 if (!editableEntity)
554 return false;
555
556 if (!IsHQService(editableEntity))
557 return false;
558
559 m_aHQBuildingCompositions.Insert(composition);
560 return true;
561 }
562
563 //------------------------------------------------------------------------------------------------
564 protected bool TryRemoveHQ(notnull SCR_CampaignBuildingCompositionComponent composition)
565 {
566 SCR_EditableEntityComponent editableEntity = SCR_EditableEntityComponent.Cast(composition.GetOwner().FindComponent(SCR_EditableEntityComponent));
567 if (!editableEntity)
568 return false;
569
570 if (!IsHQService(editableEntity))
571 return false;
572
573 m_aHQBuildingCompositions.RemoveItem(composition);
574 return true;
575 }
576
577 //------------------------------------------------------------------------------------------------
578 protected bool IsHQService(notnull SCR_EditableEntityComponent editableEntity)
579 {
580 SCR_EditableEntityUIInfo prefabInfo = SCR_EditableEntityUIInfo.Cast(editableEntity.GetInfo());
581 if (!prefabInfo)
582 return false;
583
584 array<EEditableEntityLabel> entityLabels = {};
585 prefabInfo.GetEntityLabels(entityLabels);
586 return entityLabels.Contains(EEditableEntityLabel.SERVICE_HQ);
587 }
588
589 //------------------------------------------------------------------------------------------------
590 protected void SetOnPlayerDeathEvent(int playerID)
591 {
592 IEntity player = GetGame().GetPlayerManager().GetPlayerControlledEntity(playerID);
593 if (!player)
594 return;
595
597 if (!comp)
598 return;
599
601 }
602
603 //------------------------------------------------------------------------------------------------
604 protected void RemoveOnPlayerDeathEvent(int playerID)
605 {
606 IEntity player = GetGame().GetPlayerManager().GetPlayerControlledEntity(playerID);
607 if (!player)
608 return;
609
611 if (!comp)
612 return;
613
615 }
616
617 //------------------------------------------------------------------------------------------------
618 protected void SetOnProviderDestroyedEvent(IEntity provider)
619 {
620 SCR_DamageManagerComponent hitZoneContainerComponent = SCR_DamageManagerComponent.Cast(provider.FindComponent(SCR_DamageManagerComponent));
621 if (!hitZoneContainerComponent)
622 return;
623
624 SCR_HitZone zone = SCR_HitZone.Cast(hitZoneContainerComponent.GetDefaultHitZone());
625 if (zone)
626 zone.GetOnDamageStateChanged().Insert(OnProviderDestroyed);
627 }
628
629 //------------------------------------------------------------------------------------------------
631 {
632 SCR_DamageManagerComponent hitZoneContainerComponent = SCR_DamageManagerComponent.Cast(provider.FindComponent(SCR_DamageManagerComponent));
633 if (!hitZoneContainerComponent)
634 return;
635
636 SCR_HitZone zone = SCR_HitZone.Cast(hitZoneContainerComponent.GetDefaultHitZone());
637 if (zone)
638 zone.GetOnDamageStateChanged().Remove(OnProviderDestroyed);
639 }
640
641 //------------------------------------------------------------------------------------------------
642 protected void OnPlayerDeath(SCR_CharacterControllerComponent characterController, IEntity instigatorEntity, notnull Instigator killer)
643 {
644 if (!characterController)
645 return;
646
647 int playerID = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(characterController.GetOwner());
648
649 SCR_EditorManagerEntity editorManager = GetEditorManagerEntity(playerID);
650 if (!editorManager)
651 return;
652
653 if (editorManager.IsOpened())
654 ToggleEditorMode(editorManager);
655
656 RemoveEditorMode(playerID);
657 }
658
659 //------------------------------------------------------------------------------------------------
662 protected void OnProviderDestroyed(SCR_HitZone hitZone)
663 {
664 if (!hitZone)
665 return;
666
667 if (hitZone.GetDamageState() != EDamageState.DESTROYED)
668 return;
669
670 IEntity provider = hitZone.GetOwner();
671 if (!provider)
672 return;
673
674 SCR_CampaignBuildingProviderComponent providerComponent = SCR_CampaignBuildingProviderComponent.Cast(provider.FindComponent(SCR_CampaignBuildingProviderComponent));
675 if (!providerComponent)
676 return;
677
678 array<int> playersIDs = {};
679 providerComponent.GetAvailableUsers(playersIDs);
680 foreach (int playerId : playersIDs)
681 {
682 if (providerComponent.ContainActiveUsers(playerId))
683 {
684 RemoveProvider(playerId, providerComponent, true);
685 providerComponent.RemoveActiveUser(playerId);
686 }
687
688 providerComponent.RemoveAvailableUser(playerId);
689 }
690 }
691
692 //------------------------------------------------------------------------------------------------
697 bool RemovePlayerIdFromProvider(int playerID, SCR_CampaignBuildingProviderComponent providerComponent)
698 {
699 bool isActiveUser = providerComponent.ContainActiveUsers(playerID);
700
701 providerComponent.RemoveActiveUser(playerID);
702 providerComponent.RemoveAvailableUser(playerID);
703
704 return isActiveUser;
705 }
706
707 //------------------------------------------------------------------------------------------------
712 void RemoveProvider(int playerID, SCR_CampaignBuildingProviderComponent providerComponent, bool isActiveUser)
713 {
714 SCR_EditorManagerEntity editorManager = GetEditorManagerEntity(playerID);
715 if (!editorManager)
716 return;
717
718 SCR_EditorModeEntity modeEntity = editorManager.FindModeEntity(EEditorMode.BUILDING);
719 if (!modeEntity)
720 return;
721
722 SCR_CampaignBuildingEditorComponent editorComponent = SCR_CampaignBuildingEditorComponent.Cast(modeEntity.FindComponent(SCR_CampaignBuildingEditorComponent));
723 if (!editorComponent)
724 return;
725
726 if (isActiveUser && editorManager.IsOpened())
727 editorManager.Close();
728
729 editorComponent.RemoveProviderEntityEditorComponent(providerComponent);
730
731 IEntity provider = providerComponent.GetOwner();
732 if (provider)
733 RemoveOnProviderDestroyedEvent(providerComponent.GetOwner());
734
735 providerComponent.RemoveCheckProviderMove();
736 providerComponent.SetUseAllAvailableProvidersByPlayer(false);
737
738 RemoveOnPlayerDeathEvent(playerID);
739
741 if (gameMode)
743
744 // if it was a last provider and forced provider doesn't exist, remove the mode completely.
745 if (!editorComponent.GetProviderComponent())
746 RemoveEditorMode(playerID);
747 }
748
749 //------------------------------------------------------------------------------------------------
750 protected void ToggleEditorMode(notnull SCR_EditorManagerEntity editorManager)
751 {
752 EEditorMode mode = editorManager.GetCurrentMode();
753
754 editorManager.Toggle();
755 }
756
757 //------------------------------------------------------------------------------------------------
758 protected void RemoveEditorMode(int playerID)
759 {
760 SCR_EditorManagerEntity editorManager = GetEditorManagerEntity(playerID);
761 if (!editorManager)
762 return;
763
764 SCR_EditorModeEntity editorModeEntity = editorManager.FindModeEntity(EEditorMode.BUILDING);
765 if (!editorModeEntity)
766 return;
767
768 SCR_EntityHelper.DeleteEntityAndChildren(editorModeEntity);
769 }
770
771 //------------------------------------------------------------------------------------------------
773 {
775 if (!core)
776 return null;
777
778 return core.GetEditorManager(playerID);
779 }
780
781 //------------------------------------------------------------------------------------------------
784 void RegisterComposition(notnull SCR_CampaignBuildingCompositionComponent composition)
785 {
788
790 if (!baseSystem)
791 return;
792
793 TryAddHQ(composition);
794
795 vector position = composition.GetOwner().GetOrigin();
796 array<SCR_MilitaryBaseComponent> bases = {};
797 baseSystem.GetBases(bases);
798
799 foreach (SCR_MilitaryBaseComponent base : bases)
800 {
802 if (!campaignBase)
803 continue;
804
805 if (vector.DistanceSqXZ(campaignBase.GetOwner().GetOrigin(), position) <= (campaignBase.GetRadius() * campaignBase.GetRadius()))
806 {
807 if (!m_mCampaignBuildingComponents.Contains(campaignBase))
808 {
809 m_mCampaignBuildingComponents.Set(campaignBase, new array<SCR_CampaignBuildingCompositionComponent>());
810 }
811
812 array<SCR_CampaignBuildingCompositionComponent> baseComponents = m_mCampaignBuildingComponents[campaignBase];
813 if (!baseComponents.Contains(composition))
814 {
815 baseComponents.Insert(composition);
816 composition.GetOnCompositionSpawned().Insert(OnCompositionSpawned);
817 }
818 }
819 }
820 }
821
822 //------------------------------------------------------------------------------------------------
825 void UnregisterComposition(notnull SCR_CampaignBuildingCompositionComponent composition)
826 {
828 return;
829
831 if (!baseSystem)
832 return;
833
834 TryRemoveHQ(composition);
835
836 array<SCR_MilitaryBaseComponent> bases = {};
837 baseSystem.GetBases(bases);
838
839 foreach (SCR_MilitaryBaseComponent base : bases)
840 {
842 if (!campaignBase)
843 continue;
844
845 array<SCR_CampaignBuildingCompositionComponent> baseComponents = m_mCampaignBuildingComponents[campaignBase];
846 if (!baseComponents)
847 continue;
848
849 if (baseComponents.Contains(composition))
850 {
851 baseComponents.RemoveItem(composition);
852 composition.GetOnCompositionSpawned().Remove(OnCompositionSpawned);
853
855 m_OnCompositionUnregistered.Invoke(composition);
856
857 break;
858 }
859 }
860 }
861
862 //------------------------------------------------------------------------------------------------
863 protected void OnCompositionSpawned(bool spawned)
864 {
865 if (!spawned)
866 return;
867
870 }
871
872 //------------------------------------------------------------------------------------------------
873 int GetBuildingCompositions(SCR_CampaignMilitaryBaseComponent base, out array<SCR_CampaignBuildingCompositionComponent> compositions)
874 {
876 return 0;
877
878 array<SCR_CampaignBuildingCompositionComponent> baseComponents = m_mCampaignBuildingComponents[base];
879 if (!baseComponents)
880 return 0;
881
882 return compositions.Copy(baseComponents);
883 }
884
885 //------------------------------------------------------------------------------------------------
887 array<SCR_CampaignBuildingCompositionComponent> GetHQBuildingCompositions()
888 {
890 }
891
892 //------------------------------------------------------------------------------------------------
900
901 //------------------------------------------------------------------------------------------------
909
910 //------------------------------------------------------------------------------------------------
918}
EEditableEntityBudget
EEditableEntityLabel
ArmaReforgerScripted GetGame()
Definition game.c:1398
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
SCR_BaseGameMode GetGameMode()
void SCR_BaseGameModeComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
void OnCompositionSpawned()
An event called on proxi when composition is spawned.
ResourceName GetCompositionResourceName(int prefabID)
int GetBuildingCompositions(SCR_CampaignMilitaryBaseComponent base, out array< SCR_CampaignBuildingCompositionComponent > compositions)
ScriptInvokerEntitySpawnedByProvider GetOnEntitySpawnedByProvider()
ScriptInvokerVoid GetOnAnyCompositionSpawned()
void SpawnCustomResourceHolder(IEntity entityOwner, out SCR_ResourceComponent component)
bool RemovePlayerIdFromProvider(int playerID, SCR_CampaignBuildingProviderComponent providerComponent)
ScriptInvokerBase< ScriptInvokerCompositionUnregisteredMethod > ScriptInvokerCompositionUnregistered
ResourceName m_sPrefabToHoldSupplyOnRefund
func ScriptInvokerCompositionUnregisteredMethod
SCR_EditorManagerEntity GetEditorManagerEntity(int playerID)
RplComponent m_RplComponent
void UnregisterComposition(notnull SCR_CampaignBuildingCompositionComponent composition)
ref array< SCR_CampaignBuildingCompositionComponent > m_aHQBuildingCompositions
SCR_EditableEntityCore m_EntityCore
ref ScriptInvokerCompositionUnregistered m_OnCompositionUnregistered
ResourceName m_sPreviewMaterial
bool m_bSameFactionDisassembleOnly
Note: Provider is saved to composition only when it's built from base.
void RemoveProvider(int playerID, SCR_CampaignBuildingProviderComponent providerComponent, bool isActiveUser)
void SetEditorMode(notnull SCR_EditorManagerEntity editorManager, notnull SCR_EditorModeEntity modeEntity, int playerID, notnull IEntity provider, bool userActionActivationOnly=false, bool userActionUsed=false, bool useAllAvailableProviders=false)
void SetOnProviderDestroyedEvent(IEntity provider)
bool GetSupplyComponent(IEntity ownerEntity, out SCR_CampaignSuppliesComponent suppliesComponent)
Get supply component of the provider entity.
void PlayerDisconnected(int playerId, KickCauseCode cause, int timeout)
bool TryAddHQ(notnull SCR_CampaignBuildingCompositionComponent composition)
void SetOnPlayerDeathEvent(int playerID)
ResourceName m_sPrefabsToBuildResource
void RegisterComposition(notnull SCR_CampaignBuildingCompositionComponent composition)
void SetTemporaryProvider(IEntity ent)
int GetCompositionId(ResourceName resName)
ScriptInvokerBase< ScriptInvokerEntitySpawnedByProviderMethod > ScriptInvokerEntitySpawnedByProvider
bool IsHQService(notnull SCR_EditableEntityComponent editableEntity)
ResourceName m_sFreeRoamBuildingClientTrigger
ScriptInvokerCompositionUnregistered GetOnCompositionUnregistered()
void ToggleEditorMode(notnull SCR_EditorManagerEntity editorManager)
void OnPlayerDeath(SCR_CharacterControllerComponent characterController, IEntity instigatorEntity, notnull Instigator killer)
array< ResourceName > GetPlaceablePrefabs()
EEditableEntityBudget m_BudgetType
void GetPrefabListFromConfig()
Load all the available compositions at the beginning of the game to be accessible without the buildin...
void OnEntityCoreBudgetUpdated(EEditableEntityBudget entityBudget, int originalBudgetValue, int budgetChange, int updatedBudgetValue, SCR_EditableEntityComponent entity)
func ScriptInvokerEntitySpawnedByProviderMethod
ref map< SCR_CampaignMilitaryBaseComponent, ref array< SCR_CampaignBuildingCompositionComponent > > m_mCampaignBuildingComponents
ResourceName GetServerTriggerResourceName()
void OnProviderDestroyed(SCR_HitZone hitZone)
ref ScriptInvokerEntitySpawnedByProvider m_OnEntitySpawnedByProvider
ref array< ResourceName > m_aPlaceablePrefabs
ResourceName GetCompositionPreviewMaterial()
bool TryRemoveHQ(notnull SCR_CampaignBuildingCompositionComponent composition)
ref ScriptInvokerVoid m_OnAnyCompositionSpawned
bool CanDisassembleOnlyWhenCapturing()
ResourceName GetClientTriggerResourceName()
void RemoveOnPlayerDeathEvent(int playerID)
bool IsCommander(int playerId)
void RemoveOnProviderDestroyedEvent(IEntity provider)
ref SCR_CampaignBuildingCompositionOutlineManager m_OutlineManager
void EnterEditorMode(int playerID, notnull IEntity provider, bool userActionActivationOnly=false, bool userActionUsed=false, bool useAllAvailableProviders=false)
SCR_CampaignBuildingCompositionOutlineManager GetOutlineManager()
void ProcesXPreward()
Check if the number of cycles reaches a defined limit. If so, restart counter and send an RPC on serv...
array< SCR_CampaignBuildingCompositionComponent > GetHQBuildingCompositions()
void RemoveEditorMode(int playerID, IEntity provider)
SCR_ResourceComponent GetResourceComponent()
Caches and returns the resource component.
void EntitySpawnedByProvider(int prefabID, SCR_EditableEntityComponent editableEntity)
Event rised when the entity is spawned by this provider.
void SCR_CampaignSuppliesComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
vector position
void SCR_EditorManagerEntity(IEntitySource src, IEntity parent)
void SCR_GameModeCampaign(IEntitySource src, IEntity parent)
it takes to automatically cancel a task when no enemy has been killed in the zone
EResourceGeneratorID
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
ScriptInvokerBase< ScriptInvokerVoidMethod > ScriptInvokerVoid
proto external Managed FindComponent(typename typeName)
proto external void GetTransform(out vector mat[])
Definition Math.c:13
Object holding reference to resource. In destructor release the resource.
Definition Resource.c:25
ScriptInvokerBase< SCR_BaseGameMode_OnPlayerDisconnected > GetOnPlayerDisconnected()
OnPlayerDeathWithParamInvoker GetOnPlayerDeathWithParam()
bool GetEntityAndChildrenBudgetCost(out notnull array< ref SCR_EntityBudgetValue > outBudgets, IEntity owner=null)
int GetEntityLabels(out notnull array< EEditableEntityLabel > entityLabels)
Core component to manage SCR_EditorManagerEntity.
SCR_EditorManagerEntity GetEditorManager()
static Faction GetEntityFaction(notnull IEntity entity)
bool IsPlayerCommander(int playerId)
static bool IsEditMode()
Definition Functions.c:1566
IEntity GetOwner()
Definition SCR_HitZone.c:42
int GetBases(notnull out array< SCR_MilitaryBaseComponent > bases)
static SCR_MilitaryBaseSystem GetInstance()
static sealed bool IsLoadInProgress(float msSinceLoad=1000.0)
bool SetResourceValue(float value, bool notifyChange=true)
SCR_ResourceGenerationResponse RequestGeneration(float resourceAmount, SCR_ResourceGenerator generator=null)
Definition Types.c:486
void EntitySpawnParams()
Definition gameLib.c:130
override void EOnInit(IEntity owner)
SCR_FieldOfViewSettings Attribute
EEditorMode
Editor mode that defines overall functionality.
Definition EEditorMode.c:6
EntityEvent
Various entity events.
Definition EntityEvent.c:14
EDamageState