Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_CampaignBuildingEditorComponent.c
Go to the documentation of this file.
1// Attached on EditorModeBuilding prefab
2[ComponentEditorProps(category: "GameScripted/Editor", description: "Main conflict component for handling building editor mode", icon: "WBData/ComponentEditorProps/componentEditor.png")]
6
7//------------------------------------------------------------------------------------------------
8
9class SCR_CampaignBuildingEditorComponent : SCR_BaseEditorComponent
10{
11 protected ref array<SCR_CampaignBuildingProviderComponent> m_aProvidersComponents = {};
12 protected ref array<RplId> m_aProvidersRplIds = {};
14 protected SCR_CampaignBuildingProviderComponent m_ForcedProviderComponent;
15 protected bool m_bViewObstructed;
16 protected ScriptedGameTriggerEntity m_BuildingAreaTrigger;
17
20
21 //------------------------------------------------------------------------------------------------
29
30 //------------------------------------------------------------------------------------------------
38
39 //------------------------------------------------------------------------------------------------
40 void AddProviderEntityEditorComponent(notnull SCR_CampaignBuildingProviderComponent providerComponent)
41 {
42 if (m_aProvidersComponents.Contains(providerComponent))
43 return;
44
45 SCR_MilitaryBaseComponent base = providerComponent.GetMilitaryBaseComponent();
46 if (base)
47 m_aProvidersComponents.InsertAt(providerComponent, 0);
48 else
49 m_aProvidersComponents.Insert(providerComponent);
50
52 }
53
54 //------------------------------------------------------------------------------------------------
55 void RemoveProviderEntityEditorComponent(SCR_CampaignBuildingProviderComponent providerComponent)
56 {
57 if (m_ForcedProviderComponent == providerComponent)
59
60 m_aProvidersComponents.RemoveItemOrdered(providerComponent);
61
62 if (!m_aProvidersComponents.IsEmpty())
64 }
65
66 //------------------------------------------------------------------------------------------------
68 SCR_CampaignBuildingProviderComponent GetProviderComponent(bool getMasterProviderComponent = false)
69 {
70 SCR_CampaignBuildingProviderComponent temporaryProviderComponent;
72 temporaryProviderComponent = m_ForcedProviderComponent;
73
74 if (m_aProvidersComponents.IsEmpty())
75 return null;
76
77 temporaryProviderComponent = m_aProvidersComponents[0];
78
79 if (getMasterProviderComponent && temporaryProviderComponent && temporaryProviderComponent.UseMasterProvider())
80 return SCR_CampaignBuildingProviderComponent.Cast(GetMasterProviderEntity().FindComponent(SCR_CampaignBuildingProviderComponent));
81
82 return temporaryProviderComponent;
83 }
84
85 //------------------------------------------------------------------------------------------------
87 void SetForcedProvider(SCR_CampaignBuildingProviderComponent forcedProviderComponent = null)
88 {
89 m_ForcedProviderComponent = forcedProviderComponent;
90 }
91
92 //------------------------------------------------------------------------------------------------
94 {
95 return m_aProvidersComponents.Count();
96 }
97
98 //------------------------------------------------------------------------------------------------
99 bool IsActiveProvider(notnull SCR_CampaignBuildingProviderComponent providerComponent)
100 {
101 if (providerComponent == m_ForcedProviderComponent)
102 return true;
103
104 // there exist a forced provider and it's not a tested entity, then it can't be an active provider. ToDo: Zamyslet se a zeptat
106 return false;
107
108 if (!m_aProvidersComponents.IsEmpty() && m_aProvidersComponents[0] == providerComponent)
109 return true;
110
111 return false;
112 }
113
114 //------------------------------------------------------------------------------------------------
115 bool GetProviderResourceComponent(out SCR_ResourceComponent resourceComponent)
116 {
117 if (m_aProvidersComponents.IsEmpty())
118 return false;
119
120 resourceComponent = SCR_ResourceComponent.FindResourceComponent(GetProviderEntity());
121
122 if (resourceComponent)
123 return true;
124
125 IEntity parent = GetProviderEntity();
126
127 while (parent)
128 {
129 resourceComponent = SCR_ResourceComponent.FindResourceComponent(parent);
130
131 if (resourceComponent)
132 return true;
133
134 parent = parent.GetParent();
135 }
136
137 return false;
138 }
139
140 //------------------------------------------------------------------------------------------------
143 {
144 SCR_CampaignBuildingProviderComponent providerComponent = GetProviderComponent();
145 if (!providerComponent)
146 return -1;
147
148 return providerComponent.GetShownBudget();
149 }
150
151 //------------------------------------------------------------------------------------------------
152 [Obsolete("SCR_CampaignBuildingEditorComponent.GetProviderResourceComponent() should be used instead.")]
154 {
155 if (m_aProvidersComponents.IsEmpty())
156 return false;
157
158 IEntity parent = GetProviderEntity();
159 while (parent)
160 {
162 if (suppliesComponent)
163 return true;
164
165 parent = parent.GetParent();
166 }
167
168 return false;
169 }
170
171 //------------------------------------------------------------------------------------------------
173 {
174 if (m_aProvidersComponents.IsEmpty())
175 return null;
176
178 IEntity parent = GetProviderEntity();
179 while (parent)
180 {
182 if (factionComp)
183 return factionComp;
184
185 parent = parent.GetParent();
186 }
187
188 return null;
189 }
190
191 //------------------------------------------------------------------------------------------------
192 ScriptedGameTriggerEntity GetTrigger()
193 {
195 }
196
197 //------------------------------------------------------------------------------------------------
198 //~ This function will add/remove the faction label of the saved editor state. Thus displaying the correct faction entities in the menu
199 protected void AddRemoveFactionLabel(SCR_Faction faction, bool addLabel)
200 {
201 if (!faction)
202 return;
203
204 m_ContentBrowserManager.AddRemoveLabelOfPersistentBrowserState(faction.GetFactionLabel(), addLabel);
205 }
206
207 //------------------------------------------------------------------------------------------------
208 ScriptedGameTriggerEntity SpawnClientTrigger()
209 {
210 BaseGameMode gameMode = GetGame().GetGameMode();
211
212 SCR_CampaignBuildingManagerComponent buildingManagerComponent = SCR_CampaignBuildingManagerComponent.Cast(gameMode.FindComponent(SCR_CampaignBuildingManagerComponent));
213 if (!buildingManagerComponent)
214 return null;
215
216 SCR_CampaignBuildingProviderComponent providerComponent = GetProviderComponent();
217 if (!providerComponent)
218 return null;
219
220 IEntity provider = GetProviderEntity(providerComponent.UseMasterProvider());
221 if (!provider)
222 return null;
223
224 Resource resource = Resource.Load(buildingManagerComponent.GetClientTriggerResourceName());
225 if (!resource || !resource.IsValid())
226 return null;
227
229 params.TransformMode = ETransformMode.LOCAL;
230 params.Parent = provider;
231
232 return ScriptedGameTriggerEntity.Cast(GetGame().SpawnEntityPrefab(resource, provider.GetWorld(), params));
233 }
234
235 //---- REFACTOR NOTE START: Has a hot fix for content browser as for some reason it would show an empty entry. So we skip an entry from the catalog and simply hide it ----
236 //------------------------------------------------------------------------------------------------
238 override protected void EOnEditorActivate()
239 {
240 SCR_CampaignBuildingProviderComponent providerComponent = GetProviderComponent(true);
241 if (!providerComponent)
242 return;
243
244 if (!System.IsConsoleApp() && GetGame().GetPlayerController())
245 {
247
249 {
250 m_BuildingAreaTrigger.SetSphereRadius(providerComponent.GetBuildingRadius());
251
252 SCR_CampaignBuildingAreaMeshComponent areaMeshComponent = SCR_CampaignBuildingAreaMeshComponent.Cast(m_BuildingAreaTrigger.FindComponent(SCR_CampaignBuildingAreaMeshComponent));
253 if (areaMeshComponent && areaMeshComponent.ShouldEnableFrameUpdateDuringEditor())
254 {
255 areaMeshComponent.ActivateEveryFrame();
256 areaMeshComponent.GenerateAreaMesh();
257 }
258
259 m_BuildingAreaTrigger.SetFlags(EntityFlags.VISIBLE, false);
260 }
261 }
262
263 if (providerComponent.ObstrucViewWhenEnemyInRange())
265
267
268 FactionAffiliationComponent factionComponent = GetProviderFactionComponent();
269 if (!factionComponent)
270 return;
271
272 Faction buildingFaction;
273 if (SCR_VehicleFactionAffiliationComponent.Cast(factionComponent))
274 buildingFaction = factionComponent.GetDefaultAffiliatedFaction();
275 else
276 {
277 buildingFaction = factionComponent.GetAffiliatedFaction();
278
279 if (!buildingFaction)
280 buildingFaction = factionComponent.GetDefaultAffiliatedFaction();
281 }
282
283 if (buildingFaction)
284 AddRemoveFactionLabel(SCR_Faction.Cast(buildingFaction), true);
285
286 array<SCR_EditorContentBrowserSaveStateDataUI> contentBrowserStates = {};
287 int tabsCount = m_ContentBrowserManager.GetContentBrowserTabStates(contentBrowserStates);
288
289 for (int i = 0; i < tabsCount; i++)
290 {
291 if (!contentBrowserStates[i])
292 continue;
293
294 //~ Todo: Fix first tab being broken
295 //~ Hotfix for first tab being broken
296 if (i == 0 || !CanBeShown(contentBrowserStates[i]))
297 m_ContentBrowserManager.SetStateTabVisible(i, false);
298 }
299
300 ToggleBuildingTool(false);
301
302 SCR_CampaignBuildingProviderComponent nonMasterProviderComponent = GetProviderComponent(false);
303 if (!nonMasterProviderComponent)
304 return;
305
306 if (!nonMasterProviderComponent.UseAllAvailableProviders())
307 return;
308
309 array<SCR_MilitaryBaseComponent> bases = {};
310 int basesCount = nonMasterProviderComponent.GetBases(bases);
311 if (basesCount > 0)
312 {
313 bases[0].GetOnMilitaryBaseRegistered().Insert(OnMilitaryBaseRegistrationChanged);
314 bases[0].GetOnMilitaryBaseUnregistered().Insert(OnMilitaryBaseRegistrationChanged);
315 }
316 }
317 //---- REFACTOR NOTE END ----
318
319 //------------------------------------------------------------------------------------------------
322 {
323 if (!TabContainLabel(tab))
324 return false;
325
326 return tab.CanBeShown(GetProviderEntity(), m_Manager.GetPlayerID());
327 }
328
329 //------------------------------------------------------------------------------------------------
332 {
333 return m_bViewObstructed;
334 }
335
336 //------------------------------------------------------------------------------------------------
339 {
340 SCR_CampaignBuildingProviderComponent providerComponent = GetProviderComponent();
341 if (!providerComponent)
342 return false;
343
344 array<EEditableEntityLabel> labels = providerComponent.GetAvailableTraits();
345 if (labels.Contains(EEditableEntityLabel.SERVICE_HQ) && !SCR_CampaignBuildingProviderComponent.CanBeUsedToEstablishBase(providerComponent.GetOwner(), m_Manager.GetPlayerID()))
346 labels.RemoveItem(EEditableEntityLabel.SERVICE_HQ);
347
348 foreach (EEditableEntityLabel label : labels)
349 {
350 if (tab.ContainsLabel(label))
351 return true;
352 }
353
354 return false;
355 }
356
357 //------------------------------------------------------------------------------------------------
360 {
361 SCR_CampaignBuildingProviderComponent providerComponent = GetProviderComponent();
362 if (!providerComponent)
363 return false;
364
365 return providerComponent.GetMilitaryBaseComponent();
366 }
367
368 //------------------------------------------------------------------------------------------------
369 void ToggleBuildingTool(bool mode)
370 {
371 IEntity player = EntityUtils.GetPlayer();
372 if (!player)
373 return;
374
376 if (!gadgetManager)
377 return;
378
379 SCR_CampaignBuildingGadgetToolComponent gadgetComponent = SCR_CampaignBuildingGadgetToolComponent.Cast(gadgetManager.GetHeldGadgetComponent());
380 if (!gadgetComponent)
381 return;
382
383 if (mode)
384 gadgetComponent.ToolToHand();
385 else
386 gadgetComponent.ToolToInventory();
387 }
388
389 //------------------------------------------------------------------------------------------------
391 protected void SetOnEnterEvent()
392 {
394 if (!trigger)
395 return;
396
399 }
400
401 //------------------------------------------------------------------------------------------------
402 protected void EntityEnterTrigger(IEntity ent)
403 {
404 if (CanBlockView(ent))
405 {
407
408 // show the notification and rise an event only when this is for the first time.
410 {
412 SCR_NotificationsComponent.SendLocal(ENotification.EDITOR_ENEMY_IN_AREA);
413 m_bViewObstructed = true;
414 }
415 }
416 }
417
418 //------------------------------------------------------------------------------------------------
419 // Called when entity leaves the trigger. Can be also when the entity is killed or deleted.
421 protected void EntityLeaveTrigger(IEntity ent)
422 {
423 if (!ent)
424 return;
425
426 if (CanBlockView(ent))
428
429 ScriptedGameTriggerEntity trigger = GetTrigger();
430 if (!trigger)
431 return;
432
433 trigger.QueryEntitiesInside();
434 array<IEntity> entitiesInside = {};
435 trigger.GetEntitiesInside(entitiesInside);
436
437 // Check if in trigger is still present any entity that can block the view. If so, don't continue.
438 foreach (IEntity entity : entitiesInside)
439 {
440 // The entity that triggers an event as the leaving one is still on the list of entities present in trigger, skip it.
441 if (ent == entity)
442 continue;
443
444 if (entity && CanBlockView(entity))
445 return;
446 }
447
449 m_OnObstructionEventTriggered.Invoke(false);
450
451 m_bViewObstructed = false;
452 }
453
454 //------------------------------------------------------------------------------------------------
457 protected bool CanBlockView(notnull IEntity ent)
458 {
459 SCR_ChimeraCharacter character = SCR_ChimeraCharacter.Cast(ent);
460 if (!character)
461 return false;
462
463 CharacterControllerComponent charControl = character.GetCharacterController();
464 if (!charControl || charControl.GetLifeState() == ECharacterLifeState.DEAD)
465 return false;
466
467 int playerId = SCR_PossessingManagerComponent.GetPlayerIdFromControlledEntity(ent);
468 if (playerId == 0)
469 {
470 AIControlComponent ctrComp = charControl.GetAIControlComponent();
471 if (ctrComp && !ctrComp.IsAIActivated())
472 return false;
473 }
474
475 foreach (SCR_CampaignBuildingProviderComponent providerComponent : m_aProvidersComponents)
476 {
477 if (!providerComponent || !providerComponent.IsEnemyFaction(character))
478 continue;
479
480 return true;
481 }
482
483 return false;
484 }
485
486 //------------------------------------------------------------------------------------------------
489 {
490 SCR_EditableCharacterComponent editableCharacter = SCR_EditableCharacterComponent.Cast(ent.FindComponent(SCR_EditableCharacterComponent));
491 if (!editableCharacter)
492 return;
493
494 editableCharacter.GetOnDestroyed().Insert(EntityLeaveTrigger);
495 editableCharacter.GetOnDeleted().Insert(EntityLeaveTrigger);
496 }
497
498 //------------------------------------------------------------------------------------------------
501 {
502 SCR_EditableCharacterComponent editableCharacter = SCR_EditableCharacterComponent.Cast(ent.FindComponent(SCR_EditableCharacterComponent));
503 if (!editableCharacter)
504 return;
505
506 editableCharacter.GetOnDestroyed().Remove(EntityLeaveTrigger);
507 editableCharacter.GetOnDeleted().Remove(EntityLeaveTrigger);
508 }
509
510 //------------------------------------------------------------------------------------------------
511 SCR_ECharacterRank GetUserRank()
512 {
513 int playerId = SCR_PlayerController.GetLocalPlayerId();
514
515 PlayerController playerController = GetGame().GetPlayerManager().GetPlayerController(playerId);
516 if (!playerController)
517 return SCR_ECharacterRank.INVALID;
518
519 return SCR_CharacterRankComponent.GetCharacterRank(playerController.GetControlledEntity());
520 }
521
522 //------------------------------------------------------------------------------------------------
523 override protected void EOnEditorOpenServer()
524 {
525 SCR_MilitaryBaseComponent base;
526
527 IEntity provider = GetProviderEntity();
528 if (provider)
529 {
530 SCR_CampaignBuildingProviderComponent providerComponent = SCR_CampaignBuildingProviderComponent.Cast(provider.FindComponent(SCR_CampaignBuildingProviderComponent));
531 if (!providerComponent)
532 return;
533
534 base = providerComponent.GetMilitaryBaseComponent();
535 }
536
537 if (base)
538 return;
539
541 }
542
543 //------------------------------------------------------------------------------------------------
544 override protected void EOnEditorCloseServer()
545 {
546 ToggleBuildingTool(true);
547
548 IEntity provider = GetProviderEntity();
549 if (!provider)
550 return;
551
552 // In case the provider of the building was the base, don't remove it's stamp from component. So the composition can't be build from another providers
553 SCR_CampaignBuildingProviderComponent providerComponent = SCR_CampaignBuildingProviderComponent.Cast(provider.FindComponent(SCR_CampaignBuildingProviderComponent));
554 if (!providerComponent)
555 return;
556
557 SCR_MilitaryBaseComponent base = providerComponent.GetMilitaryBaseComponent();
558 if (base)
559 return;
560
562 }
563
564 //------------------------------------------------------------------------------------------------
566 {
568 if (!editableComponent || editableComponent.GetParentEntity())
569 return true;
570
571 SCR_CampaignBuildingCompositionComponent comp = SCR_CampaignBuildingCompositionComponent.Cast(ent.FindComponent(SCR_CampaignBuildingCompositionComponent));
572 if (!comp)
573 return true;
574
575 // compositioni has no owner, set one.
576 if (comp.GetProviderEntity() == null)
577 comp.SetProviderEntityServer(GetProviderEntity());
578
579 return true;
580 }
581
582 //------------------------------------------------------------------------------------------------
584 {
586 if (!editableComponent || editableComponent.GetParentEntity())
587 return true;
588
589 SCR_CampaignBuildingCompositionComponent comp = SCR_CampaignBuildingCompositionComponent.Cast(ent.FindComponent(SCR_CampaignBuildingCompositionComponent));
590 if (!comp)
591 return true;
592
593 if (comp.GetProviderEntity() == GetProviderEntity())
594 comp.SetProviderEntityServer(null);
595
596 return true;
597 }
598
599 //------------------------------------------------------------------------------------------------
600 override protected void EOnEditorPostActivate()
601 {
602 if (!m_RplComponent.IsOwner())
603 return;
604
606 return;
607
608 SCR_CampaignBuildingNetworkComponent buildingNetworkingComp = SCR_CampaignBuildingNetworkComponent.Cast(SCR_PlayerController.s_pLocalPlayerController.FindComponent(SCR_CampaignBuildingNetworkComponent));
609 if (buildingNetworkingComp)
610 buildingNetworkingComp.RequestBuildModeProvider();
611 }
612
613 //------------------------------------------------------------------------------------------------
616 {
618 m_Manager.Close();
619
620 RplComponent providerRplComp;
621 array<RplId> providerIds = {};
622 foreach (SCR_CampaignBuildingProviderComponent providerComp : m_aProvidersComponents)
623 {
624 if (!providerComp)
625 continue;
626
627 providerRplComp = SCR_EntityHelper.GetEntityRplComponent(providerComp.GetOwner());
628 if (providerRplComp)
629 providerIds.Insert(providerRplComp.Id());
630 }
631
632 RplId forcedProviderId = RplId.Invalid();
634 {
636 if (providerRplComp)
637 forcedProviderId = providerRplComp.Id();
638 }
639
640 if (forcedProviderId.IsValid() && providerIds.IsEmpty())
641 {
642 m_Manager.Close();
643 return;
644 }
645
646 Rpc(RpcDo_SyncBuildModeProviders, providerIds, forcedProviderId);
647 }
648
649 //------------------------------------------------------------------------------------------------
650 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
651 protected void RpcDo_SyncBuildModeProviders(array<RplId> providers, RplId forcedProvider)
652 {
653 RplComponent providerRplComp = RplComponent.Cast(Replication.FindItem(forcedProvider));
654 IEntity providerEnt;
655 SCR_CampaignBuildingProviderComponent providerComp;
656 if (providerRplComp)
657 {
658 providerEnt = providerRplComp.GetEntity();
659 providerComp = SCR_CampaignBuildingProviderComponent.Cast(providerEnt.FindComponent(SCR_CampaignBuildingProviderComponent));
660 if (providerComp)
661 SetForcedProvider(providerComp);
662 }
663
664 if (providers)
665 {
666 foreach (RplId providerRplId : providers)
667 {
668 providerRplComp = RplComponent.Cast(Replication.FindItem(providerRplId));
669 if (!providerRplComp)
670 continue;
671
672 providerEnt = providerRplComp.GetEntity();
673 if (!providerEnt)
674 continue;
675
676 providerComp = SCR_CampaignBuildingProviderComponent.Cast(providerEnt.FindComponent(SCR_CampaignBuildingProviderComponent));
677 if (providerComp)
679 }
680 }
681 }
682
683 //------------------------------------------------------------------------------------------------
685 override protected void EOnEditorDeactivate()
686 {
687 ScriptedGameTriggerEntity trigger = GetTrigger();
688 if (trigger)
689 {
690 IEntity ent = trigger.GetParent();
691 if (ent)
692 ent.RemoveChild(trigger);
693
694 trigger.Update();
695 SCR_EntityHelper.DeleteEntityAndChildren(trigger);
696 }
697
698 FactionAffiliationComponent factionComponent = GetProviderFactionComponent();
699 if (factionComponent)
700 {
701 // here we have to check both Affiliated faction and Default affiliated faction in case of vehicles. It's because vehicles can't have set a affiliated faction if no one is sitting inside (to prevent AI to shoot at empty vehicles)
702 Faction buildingFaction = factionComponent.GetAffiliatedFaction();
703
704 if (!buildingFaction)
705 buildingFaction = factionComponent.GetDefaultAffiliatedFaction();
706
707 if (buildingFaction)
708 AddRemoveFactionLabel(SCR_CampaignFaction.Cast(buildingFaction), false);
709 }
710
711 ToggleBuildingTool(true);
712
713 SCR_CampaignBuildingProviderComponent providerComponent = GetProviderComponent(false);
714 if (!providerComponent)
715 return;
716
717 if (!providerComponent.UseAllAvailableProviders())
718 return;
719
720 array<SCR_MilitaryBaseComponent> bases = {};
721 int basesCount = providerComponent.GetBases(bases);
722 if (basesCount > 0)
723 {
724 bases[0].GetOnMilitaryBaseRegistered().Remove(OnMilitaryBaseRegistrationChanged);
725 bases[0].GetOnMilitaryBaseUnregistered().Remove(OnMilitaryBaseRegistrationChanged);
726 }
727 }
728
729 //------------------------------------------------------------------------------------------------
730 protected void OnMilitaryBaseRegistrationChanged(SCR_MilitaryBaseLogicComponent baseComponent)
731 {
732 SCR_CampaignBuildingProviderComponent provider = SCR_CampaignBuildingProviderComponent.Cast(baseComponent);
733 if (!provider)
734 return;
735
736 UpdateTabs();
737 }
738
739 //------------------------------------------------------------------------------------------------
742 {
745
746 array<SCR_EditorContentBrowserSaveStateDataUI> contentBrowserStates = {};
747 int tabsCount = m_ContentBrowserManager.GetContentBrowserTabStates(contentBrowserStates);
748
749 for (int i = 0; i < tabsCount; i++)
750 {
751 if (!contentBrowserStates[i])
752 continue;
753
754 if (i == 0 || !CanBeShown(contentBrowserStates[i]))
755 m_ContentBrowserManager.SetStateTabVisible(i, false);
756 else
757 m_ContentBrowserManager.SetStateTabVisible(i, true);
758 }
759 }
760
761 //------------------------------------------------------------------------------------------------
762 // Return the entity which belongs to currently active provider componenet.
764 IEntity GetProviderEntity(bool getMasterProvider = false)
765 {
766 if (getMasterProvider)
768
769 SCR_CampaignBuildingProviderComponent providerComponent = GetProviderComponent();
770 if (!providerComponent)
771 return null;
772
773 return providerComponent.GetOwner();
774 }
775
776 //------------------------------------------------------------------------------------------------
780 {
781 SCR_CampaignBuildingProviderComponent providerComponent = GetProviderComponent();
782 if (!providerComponent)
783 return null;
784
785 return providerComponent.GetMasterProviderEntity();
786 }
787
788 //------------------------------------------------------------------------------------------------
791 {
792 int count = m_aProvidersRplIds.Count();
793 for (int i = 0; i < count; i++)
794 {
795 RplComponent rplComp = RplComponent.Cast(Replication.FindItem(m_aProvidersRplIds[i]));
796 if (!rplComp)
797 continue;
798
799 IEntity provider = rplComp.GetEntity();
800 if (!provider)
801 continue;
802
803 SCR_CampaignBuildingProviderComponent providerComponent = SCR_CampaignBuildingProviderComponent.Cast(provider.FindComponent(SCR_CampaignBuildingProviderComponent));
804 if (!providerComponent)
805 continue;
806
807 AddProviderEntityEditorComponent(providerComponent);
808 m_aProvidersRplIds.RemoveOrdered(i);
809 count--;
810 }
811
812 if (m_aProvidersRplIds.IsEmpty())
813 SCR_CampaignBuildingProviderComponent.GetOnProviderCreated().Remove(SetProviderFromRplID);
814 }
815
816 //------------------------------------------------------------------------------------------------
817 private void RequestRecreationOfEditors()
818 {
819 m_Manager.Close();
820 m_Manager.RecreateEditorModes();
821 }
822
823 //------------------------------------------------------------------------------------------------
824 override protected bool RplSave(ScriptBitWriter writer)
825 {
826 array<RplId> providers = {};
827 RplComponent rplComp;
828 IEntity provider;
829
830 if (m_aProvidersComponents.Contains(null))
831 {
832 if (GetGame().IsDev())
833 Debug.Error(string.Format("WARNING: SCR_CampaignBuildingEditorComponent.RplSave encountered a null in the list of providers while packing data for the editor %1, which belongs to the player %2", FilePath.StripPath(GetOwner().GetPrefabData().GetPrefabName().GetPath()), SCR_PlayerIdentityUtils.GetPlayerLogInfo(m_Manager.GetPlayerID())));
834
835 GetGame().GetCallqueue().CallLater(RequestRecreationOfEditors); // wait with closing and recreation until we are done with sending information to the client
836 }
837
838 foreach (SCR_CampaignBuildingProviderComponent providerComponent : m_aProvidersComponents)
839 {
840 if (!providerComponent)
841 continue;
842
843 provider = providerComponent.GetOwner();
844 if (!provider)
845 continue;
846
847 rplComp = SCR_EntityHelper.GetEntityRplComponent(provider);
848 if (rplComp)
849 providers.Insert(rplComp.Id());
850 }
851
852 int count = providers.Count();
853 writer.WriteInt(count);
854 foreach (RplId rplId : providers)
855 {
856 writer.WriteRplId(rplId);
857 }
858
859 return true;
860 }
861
862 //------------------------------------------------------------------------------------------------
863 override protected bool RplLoad(ScriptBitReader reader)
864 {
865 RplId entityRplID;
866 RplComponent rplComp;
867 IEntity ent;
868 int count;
869 SCR_CampaignBuildingProviderComponent providerComponent;
870 reader.ReadInt(count);
871
872 for (int i = 0; i < count; i++)
873 {
874 reader.ReadRplId(entityRplID);
875 if (!entityRplID.IsValid())
876 continue;
877
878 rplComp = RplComponent.Cast(Replication.FindItem(entityRplID));
879 if (!rplComp)
880 {
881 m_aProvidersRplIds.Insert(entityRplID);
882 continue;
883 }
884
885 ent = rplComp.GetEntity();
886 if (!ent)
887 continue;
888
889 providerComponent = SCR_CampaignBuildingProviderComponent.Cast(ent.FindComponent(SCR_CampaignBuildingProviderComponent));
890 if (providerComponent)
891 AddProviderEntityEditorComponent(providerComponent);
892 }
893
894 if (!m_aProvidersRplIds.IsEmpty())
895 SCR_CampaignBuildingProviderComponent.GetOnProviderCreated().Insert(SetProviderFromRplID);
896
897 if (!m_aProvidersComponents.IsEmpty())
899
900 return true;
901 }
902}
EEditableEntityBudget
EEditableEntityLabel
ENotification
ArmaReforgerScripted GetGame()
Definition game.c:1398
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
vector GetOrigin()
SCR_ECharacterRank GetUserRank()
void SetProviderFromRplID()
Set a provider, loaded from RPL ID.
bool GetProviderResourceComponent(out SCR_ResourceComponent resourceComponent)
ScriptInvokerBool GetOnObstructionEventTriggered()
ref ScriptInvokerBool m_OnObstructionEventTriggered
SCR_FactionAffiliationComponent GetProviderFactionComponent()
ScriptInvoker GetOnProviderChanged()
bool AssociateCompositionsToProvider(IEntity ent)
void RemoveOnEntityKilled(IEntity ent)
Remove an event called when entity which can block view in Free Roam Building is killed / leave the a...
bool TabContainLabel(SCR_EditorContentBrowserSaveStateDataUI tab)
Check if the given tabUI contains any label set on provider.
bool GetProviderSuppliesComponent(out SCR_CampaignSuppliesComponent suppliesComponent)
ref array< RplId > m_aProvidersRplIds
SCR_ContentBrowserEditorComponent m_ContentBrowserManager
void AddProviderEntityEditorComponent(notnull SCR_CampaignBuildingProviderComponent providerComponent)
ScriptedGameTriggerEntity m_BuildingAreaTrigger
void OnMilitaryBaseRegistrationChanged(SCR_MilitaryBaseLogicComponent baseComponent)
void SetOnEnterEvent()
Set event to obstruct view when enemy character enters a building radius.
bool IsViewObstructed()
returns true if the view should be obsctructed
void SendProviders_S()
Authority method for replicating information about currently used providers to the client who owns th...
SCR_CampaignBuildingProviderComponent GetProviderComponent(bool getMasterProviderComponent=false)
Return provider component of current provider.
ref ScriptInvoker m_OnProviderChanged
bool CanBlockView(notnull IEntity ent)
bool IsProviderBase()
Returns true if the provider is a base.
void UpdateTabs()
Update tabs.
void ToggleBuildingTool(bool mode)
void RpcDo_SyncBuildModeProviders(array< RplId > providers, RplId forcedProvider)
void AddRemoveFactionLabel(SCR_Faction faction, bool addLabel)
void RemoveProviderEntityEditorComponent(SCR_CampaignBuildingProviderComponent providerComponent)
void EntityEnterTrigger(IEntity ent)
void SetForcedProvider(SCR_CampaignBuildingProviderComponent forcedProviderComponent=null)
Used when player initiate a building mode via user action - forced provider is an entity owning the u...
IEntity GetMasterProviderEntity()
bool UnassignCompositionProvider(IEntity ent)
SCR_CampaignBuildingEditorComponentClass m_aProvidersComponents
bool IsActiveProvider(notnull SCR_CampaignBuildingProviderComponent providerComponent)
void EntityLeaveTrigger(IEntity ent)
ScriptedGameTriggerEntity GetTrigger()
bool CanBeShown(notnull SCR_EditorContentBrowserSaveStateDataUI tab)
Check if the given tab can be shown.
SCR_CampaignBuildingProviderComponent m_ForcedProviderComponent
ScriptedGameTriggerEntity SpawnClientTrigger()
RplComponent m_RplComponent
void SetOnEntityKilled(IEntity ent)
Set an event called when entity spawned by this provider get killed.
EEditableEntityBudget GetShownBudget()
Evaluate all set budgets with this provider and return first one that is marked as to be shown in UI.
void SCR_CampaignSuppliesComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
void SCR_CharacterRankComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
ScriptInvokerBase< ScriptInvokerBoolMethod > ScriptInvokerBool
SCR_VehicleDamageManagerComponentClass GetPrefabData()
Definition Debug.c:13
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 BaseWorld GetWorld()
proto external IEntity GetParent()
proto external void RemoveChild(notnull IEntity child, bool keepTransform=false)
Remove Entity from hierarchy.
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
void EOnEditorCloseServer()
When the editor is closed (called on server).
void EOnEditorOpenServer()
When the editor is opened (called on server).
void EOnEditorPostActivate()
When the component is activated, but after EOnEditorActivate() function was called in all components.
SCR_EditableEntityComponent GetParentEntity()
Editor Content browser State data that includes UI data for tabs.
static RplComponent GetEntityRplComponent(notnull IEntity entity)
EEditableEntityLabel GetFactionLabel()
static SCR_GadgetManagerComponent GetGadgetManager(IEntity entity)
SCR_GadgetComponent GetHeldGadgetComponent()
static int GetLocalPlayerId()
Returns either a valid ID of local player or 0.
bool RplLoad(ScriptBitReader reader)
bool RplSave(ScriptBitWriter writer)
void EntitySpawnParams()
Definition gameLib.c:130
IEntity GetOwner()
Owner entity of the fuel tank.
ECharacterLifeState
EntityFlags
Various entity flags.
Definition EntityFlags.c:14
proto external PlayerController GetPlayerController()
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
EQueryEntitiesFlags
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134