Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ScenarioFrameworkArea.c
Go to the documentation of this file.
1[EntityEditorProps(category: "GameScripted/ScenarioFramework", description: "")]
5
6// Helper class for designer to specify what tasks will be available in this area
8class SCR_ScenarioFrameworkTaskType
9{
10 [Attribute("Type of task", UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(SCR_ESFTaskType))]
11 protected SCR_ESFTaskType m_eTypeOfTask;
12
13 //------------------------------------------------------------------------------------------------
16 {
17 return m_eTypeOfTask;
18 }
19}
20
25{
26 [Attribute(uiwidget: UIWidgets.ResourcePickerThumbnail, "Trigger for area", category: "Trigger")]
27 ResourceName m_sTriggerResource;
28
29 [Attribute(defvalue: "5.0", UIWidgets.Slider, params: "0 inf", desc: "Radius of the trigger area", category: "Trigger")]
30 float m_fAreaRadius;
31
32 [Attribute(defvalue: "1", UIWidgets.CheckBox, desc: "Activate the trigger once or everytime the activation condition is true?", category: "Trigger")]
33 bool m_bOnce;
34
35 [Attribute(desc: "Actions that will be activated when Trigger gets activated", category: "OnActivation")]
36 ref array<ref SCR_ScenarioFrameworkActionBase> m_aTriggerActions;
37
38 SCR_BaseTriggerEntity m_Trigger;
40 ref ScriptInvoker m_OnAreaInit = new ScriptInvoker();
41 bool m_bAreaSelected;
42 SCR_Task m_Task;
43 string m_sItemDeliveryPointName;
44 SCR_ScenarioFrameworkLayerTask m_LayerTask;
45 SCR_ScenarioFrameworkSlotTask m_SlotTask; //storing this one in order to get the task title and description
46
47 ref array<ref Tuple3<SCR_ScenarioFrameworkLayerBase, vector, int>> m_aSpawnedLayers = {};
48 ref array<ref Tuple3<SCR_ScenarioFrameworkLayerBase, vector, int>> m_aDespawnedLayers = {};
49
50 //------------------------------------------------------------------------------------------------
53 {
54 return m_Task;
55 }
56
57 //------------------------------------------------------------------------------------------------
59 SCR_ScenarioFrameworkSlotTask GetSlotTask()
60 {
61 return m_SlotTask;
62 }
63
64 //------------------------------------------------------------------------------------------------
66 void SetSlotTask(SCR_ScenarioFrameworkSlotTask slotTask)
67 {
68 m_SlotTask = slotTask;
69 }
70
71 //------------------------------------------------------------------------------------------------
73 override SCR_ScenarioFrameworkLayerTask GetLayerTask()
74 {
75 return m_LayerTask;
76 }
77
78 //------------------------------------------------------------------------------------------------
80 void SetLayerTask(SCR_ScenarioFrameworkLayerTask layerTask)
81 {
82 m_LayerTask = layerTask;
83 }
84
85 //------------------------------------------------------------------------------------------------
87 string GetLayerTaskName()
88 {
89 return m_LayerTask.GetOwner().GetName();
90 }
91
92 //------------------------------------------------------------------------------------------------
94 SCR_ESFTaskType GetLayerTaskType()
95 {
96 return m_LayerTask.GetTaskType();
97 }
98
99 //------------------------------------------------------------------------------------------------
101 string GetDeliveryPointName()
102 {
103 return m_sItemDeliveryPointName;
104 }
105
106 //------------------------------------------------------------------------------------------------
109 void StoreDeliveryPoint(string sDeliveryPointName)
110 {
111 m_sItemDeliveryPointName = sDeliveryPointName;
112 if (!SCR_TaskDeliver.Cast(m_Task))
113 return;
114
115 SCR_TaskDeliver.Cast(m_Task).SetTriggerNameToDeliver(sDeliveryPointName);
116 }
117
118 //------------------------------------------------------------------------------------------------
121 void StoreTaskToArea(SCR_Task task)
122 {
123 m_Task = task;
124 }
125
126 //------------------------------------------------------------------------------------------------
129 SCR_ScenarioFrameworkLayerTask Create()
130 {
131 array<SCR_ScenarioFrameworkLayerBase> aSlotsOut = {};
132 GetChildren(aSlotsOut);
133 if (aSlotsOut.IsEmpty())
134 return null;
135
136 SCR_ScenarioFrameworkLayerBase layer = aSlotsOut.GetRandomElement();
137 if (layer)
138 layer.Init(this);
139
140 return SCR_ScenarioFrameworkLayerTask.Cast(layer);
141 }
142
143 //------------------------------------------------------------------------------------------------
147 SCR_ScenarioFrameworkLayerTask Create(SCR_ESFTaskType eTaskType)
148 {
149 array<SCR_ScenarioFrameworkLayerBase> aSlotsOut = {};
150 GetSuitableLayersForTaskType(aSlotsOut, eTaskType);
151 if (aSlotsOut.IsEmpty())
152 return null;
153
154 //there might be more layers in the area conforming to the task type (i.e. 2x the Truck task)
155 m_LayerTask = SCR_ScenarioFrameworkLayerTask.Cast(aSlotsOut.GetRandomElement());
156 if (m_LayerTask)
157 m_LayerTask.Init(this, SCR_ScenarioFrameworkEActivationType.ON_TASKS_INIT);
158
159 return m_LayerTask;
160 }
161
162 //------------------------------------------------------------------------------------------------
166 void Create(SCR_ScenarioFrameworkLayerTask layerTask, SCR_ScenarioFrameworkSlotTask slotTask = null)
167 {
168 if (!layerTask)
169 return;
170
171 m_LayerTask = layerTask;
172 m_LayerTask.AddRandomlySpawnedChild(slotTask);
173 m_LayerTask.Init(this, SCR_ScenarioFrameworkEActivationType.ON_TASKS_INIT);
174 }
175
176 //------------------------------------------------------------------------------------------------
178 SCR_BaseTriggerEntity GetTrigger()
179 {
180 return m_Trigger;
181 }
182
183 //------------------------------------------------------------------------------------------------
185 protected void SetupTrigger()
186 {
187 if (!m_Trigger)
188 {
189 EntitySpawnParams spawnParams = new EntitySpawnParams();
190 spawnParams.TransformMode = ETransformMode.WORLD;
191 GetOwner().GetWorldTransform(spawnParams.Transform);
192 m_Trigger = SCR_BaseTriggerEntity.Cast(GetGame().SpawnEntityPrefabEx(m_sTriggerResource, false, params: spawnParams));
193 }
194
195 if (!m_Trigger)
196 return;
197
198 m_Trigger.SetSphereRadius(m_fAreaRadius);
199 m_Trigger.GetOnActivate().Insert(OnAreaTriggerActivated);
200
202 if (sfTrigger)
203 sfTrigger.SetOnce(m_bOnce);
204
205 if (m_Trigger)
206 {
207 foreach (SCR_ScenarioFrameworkActionBase triggerAction : m_aTriggerActions)
208 {
209 triggerAction.Init(m_Trigger);
210 }
211 }
212 }
213
214 //------------------------------------------------------------------------------------------------
218 {
219 task.SetOrigin(GetOwner().GetOrigin());
220
221 }
222
223 //------------------------------------------------------------------------------------------------
228 {
229 array<SCR_ESFTaskType> aTaskTypes = {};
230 GetAvailableTaskTypes(aTaskTypes);
231 if (aTaskTypes.IsEmpty())
232 return false;
233
234 return aTaskTypes.Find(eTaskType) != -1;
235 }
236
237 //------------------------------------------------------------------------------------------------
240 void GetAvailableTaskTypes(out array<SCR_ESFTaskType> aTaskTypes)
241 {
242 array<SCR_ScenarioFrameworkLayerBase> aSlots = {};
243 GetChildren(aSlots);
244 SCR_ESFTaskType eType;
245 SCR_ScenarioFrameworkLayerTask pos;
246 foreach (SCR_ScenarioFrameworkLayerBase layer : aSlots)
247 {
248 pos = SCR_ScenarioFrameworkLayerTask.Cast(layer);
249 if (!pos)
250 continue;
251
252 eType = pos.GetTaskType();
253 if (aTaskTypes.Find(eType) == -1)
254 aTaskTypes.Insert(eType);
255 }
256 }
257
258 //------------------------------------------------------------------------------------------------
262 void GetSuitableLayersForTaskType(out notnull array<SCR_ScenarioFrameworkLayerBase> aSlotsOut, SCR_ESFTaskType eTaskType)
263 {
264 SCR_ESFTaskType eType;
265 array<SCR_ScenarioFrameworkLayerBase> aSlots = {};
266 GetChildren(aSlots);
267 SCR_ScenarioFrameworkLayerTask pos;
268 foreach (SCR_ScenarioFrameworkLayerBase layer : aSlots)
269 {
270 pos = SCR_ScenarioFrameworkLayerTask.Cast(layer);
271 if (!pos)
272 continue;
273
274 eType = pos.GetTaskType();
275 if (eTaskType == eType)
276 aSlotsOut.Insert(pos);
277 }
278 }
279
280 //------------------------------------------------------------------------------------------------
282 void SetAreaSelected(bool bSet)
283 {
284 m_bAreaSelected = bSet;
285 }
286
287 //------------------------------------------------------------------------------------------------
290 {
291 return m_bAreaSelected;
292 }
293
294 //------------------------------------------------------------------------------------------------
297 {
298 if (m_OnTriggerActivated)
299 {
300 m_OnTriggerActivated.Invoke(this, SCR_ScenarioFrameworkEActivationType.ON_AREA_TRIGGER_ACTIVATION, false);
301 m_OnTriggerActivated.Clear();
302 if (!m_bOnce)
303 return;
304
305 m_Trigger.EnablePeriodicQueries(false);
306 }
307 }
308
309 //------------------------------------------------------------------------------------------------
312 {
313 if (!m_OnTriggerActivated)
315
316 return m_OnTriggerActivated;
317 }
318
319 //------------------------------------------------------------------------------------------------
322 {
323 return m_OnAreaInit;
324 }
325
326 //------------------------------------------------------------------------------------------------
331 override void RestoreToDefault(bool includeChildren = false, bool reinitAfterRestoration = false, bool affectRandomization = true, bool deleteSpawnedEntities = true)
332 {
333 m_bAreaSelected = false;
334 m_Trigger = null;
335 m_sItemDeliveryPointName = "";
336 m_LayerTask = null;
337 m_SlotTask = null;
338
339 super.RestoreToDefault(includeChildren, reinitAfterRestoration, affectRandomization, deleteSpawnedEntities);
340 }
341
342 //------------------------------------------------------------------------------------------------
344 override void DynamicReinit()
345 {
346 Init();
347 }
348
349 //------------------------------------------------------------------------------------------------
353 {
355 return;
356
357 m_bInitiated = false;
359 m_aChildren.RemoveItem(null);
361 {
362 // Check if the child has its own Dynamic Despawn in place that is managed by the parent area and not the parent layer
363 if (!child.m_bDynamicDespawn)
364 child.DynamicDespawn(this);
365 }
366
367 m_aChildren.Clear();
368 }
369
370 //------------------------------------------------------------------------------------------------
373 override bool InitParentLayer()
374 {
375 // Areas do not have parents
376 return true;
377 }
378
379 //------------------------------------------------------------------------------------------------
384 {
386 PrintFormat("ScenarioFramework: Area %1 is set to %2 activation type, but area will always spawn on Init as default", GetOwner().GetName(), activation, LogLevel.WARNING);
387
388 // Area is always spawned on the start
389 super.Init(this, SCR_ScenarioFrameworkEActivationType.ON_INIT);
390 }
391
392 //------------------------------------------------------------------------------------------------
396 {
397 super.AfterAllChildrenSpawned(layer);
398
399 SetupTrigger();
400 }
401
402 //------------------------------------------------------------------------------------------------
406 void PrepareLayerSpecificDynamicDespawn(SCR_ScenarioFrameworkLayerBase layer, bool staySpawned = false, int despawnRange = 0)
407 {
408 layer.SetDynamicDespawnEnabled(true);
409 layer.SetDynamicDespawnRange(despawnRange);
410
411 if (m_aDespawnedLayers.IsEmpty() && m_aSpawnedLayers.IsEmpty())
413
414 //If this method is called with staySpawned = false, layer will be added to m_aDespawnedLayers and gets despawned
415 if (!staySpawned)
416 {
417 m_aDespawnedLayers.Insert(new Tuple3<SCR_ScenarioFrameworkLayerBase, vector, int>(layer, layer.GetOwner().GetOrigin(), (despawnRange * despawnRange)));
418 layer.DynamicDespawn(layer);
419 }
420 else
421 {
422 m_aSpawnedLayers.Insert(new Tuple3<SCR_ScenarioFrameworkLayerBase, vector, int>(layer, layer.GetOwner().GetOrigin(), (despawnRange * despawnRange)));
423 }
424 }
425
426 //------------------------------------------------------------------------------------------------
431 {
432 layer.SetDynamicDespawnEnabled(false);
433
434 //If this method is called with staySpawned = false, layer will be despawned
435 if (!staySpawned)
436 layer.DynamicDespawn(layer);
437
438 for (int i = m_aDespawnedLayers.Count() - 1; i >= 0; i--)
439 {
440 Tuple3<SCR_ScenarioFrameworkLayerBase, vector, int> layerInfo = m_aDespawnedLayers[i];
441 if (layer == layerInfo.param1)
442 m_aDespawnedLayers.Remove(i);
443 }
444
445 for (int i = m_aSpawnedLayers.Count() - 1; i >= 0; i--)
446 {
447 Tuple3<SCR_ScenarioFrameworkLayerBase, vector, int> layerInfo = m_aSpawnedLayers[i];
448 if (layer == layerInfo.param1)
449 m_aSpawnedLayers.Remove(i);
450 }
451
452 if (m_aDespawnedLayers.IsEmpty() && m_aSpawnedLayers.IsEmpty())
454 }
455
456 //------------------------------------------------------------------------------------------------
459 {
461 return;
462
464 if (!scenarioFrameworkSystem)
465 return;
466
467 ExecuteDynamicDespawn(scenarioFrameworkSystem);
468 SCR_ScenarioFrameworkSystem.GetCallQueuePausable().CallLater(ExecuteDynamicDespawn, 1000 * scenarioFrameworkSystem.m_iUpdateRate, true, scenarioFrameworkSystem);
469 }
470
471 //------------------------------------------------------------------------------------------------
474 {
476 return;
477
479 if (!scenarioFrameworkSystem)
480 return;
481
483 }
484
485 //------------------------------------------------------------------------------------------------
488 {
489 if (!scenarioFrameworkSystem)
490 return;
491
492 DynamicSpawnLayer(scenarioFrameworkSystem.m_aObservers);
493 DynamicDespawnLayer(scenarioFrameworkSystem.m_aObservers);
494 }
495
496 //------------------------------------------------------------------------------------------------
498 void DynamicSpawnLayer(array<vector> observers)
499 {
501 for (int i = m_aDespawnedLayers.Count() - 1; i >= 0; i--)
502 {
503 layerInfo = m_aDespawnedLayers[i];
504 if (!layerInfo.param1)
505 {
506 continue;
507 }
508
509 foreach (vector observerPos : observers)
510 {
511 if (vector.DistanceSqXZ(observerPos, layerInfo.param2) < layerInfo.param3)
512 {
513 layerInfo.param1.DynamicReinit();
514 m_aSpawnedLayers.Insert(layerInfo);
515 m_aDespawnedLayers.Remove(i);
516 break;
517 }
518 }
519 }
520 }
521
522 //------------------------------------------------------------------------------------------------
524 void DynamicDespawnLayer(array<vector> observers)
525 {
527 for (int i = m_aSpawnedLayers.Count() - 1; i >= 0; i--)
528 {
529 layerInfo = m_aSpawnedLayers[i];
530 if (!layerInfo.param1)
531 continue;
532
533 bool observerInRange;
534 foreach (vector observerPos : observers)
535 {
536 if (vector.DistanceSqXZ(observerPos, layerInfo.param2) < layerInfo.param3)
537 {
538 observerInRange = true;
539 break;
540 }
541 }
542
543 if (!observerInRange)
544 {
545 layerInfo.param1.DynamicDespawn(null);
546 m_aDespawnedLayers.Insert(layerInfo);
547 m_aSpawnedLayers.Remove(i);
548 }
549 }
550 }
551
552 //------------------------------------------------------------------------------------------------
555 override void EOnInit(IEntity owner)
556 {
558 if (!gameMode)
559 return;
560
562 if (scenarioFrameworkSystem)
563 scenarioFrameworkSystem.RegisterArea(this);
564
565 array<SCR_ScenarioFrameworkLayerBase> children = {};
566 GetAllLayers(children);
567
568 foreach (SCR_ScenarioFrameworkLayerBase child : children)
569 {
570 if (child.GetActivationType() == SCR_ScenarioFrameworkEActivationType.ON_INIT)
571 {
572 if (scenarioFrameworkSystem && scenarioFrameworkSystem.IsMaster())
573 child.Init(this, SCR_ScenarioFrameworkEActivationType.ON_INIT);
574
575 child.SetActivationType(SCR_ScenarioFrameworkEActivationType.SAME_AS_PARENT);
576 }
577
578 if (!child.GetDynamicDespawnEnabled())
579 continue;
580
581 int despawnRange = child.GetDynamicDespawnRange();
582 m_aDespawnedLayers.Insert(new Tuple3<SCR_ScenarioFrameworkLayerBase, vector, int>(child, child.GetOwner().GetOrigin(), (despawnRange * despawnRange)));
583 }
584
585 if (!m_aDespawnedLayers.IsEmpty())
587 }
588
589 //------------------------------------------------------------------------------------------------
591 override void OnPostInit(IEntity owner)
592 {
593 SetEventMask(owner, EntityEvent.INIT);
594
595 super.OnPostInit(owner);
596 }
597
598 //------------------------------------------------------------------------------------------------
601 override protected void DrawDebugShape(bool draw)
602 {
603 Shape dbgShape = null;
604 if (!draw)
605 return;
606
607 dbgShape = Shape.CreateSphere(
609 ShapeFlags.TRANSP | ShapeFlags.DOUBLESIDE | ShapeFlags.NOZWRITE | ShapeFlags.ONCE | ShapeFlags.NOOUTLINE,
612 );
613
614 if (m_sTriggerResource.IsEmpty())
615 return;
616
617 Shape triggerdbgShape = null;
618 triggerdbgShape = Shape.CreateSphere(
619 ARGB(100, 0x99, 0x10, 0xF2),
620 ShapeFlags.TRANSP | ShapeFlags.DOUBLESIDE | ShapeFlags.NOZWRITE | ShapeFlags.ONCE | ShapeFlags.NOOUTLINE,
622 m_fAreaRadius
623 );
624 }
625 //------------------------------------------------------------------------------------------------
626 // constructor
631 {
633#ifdef WORKBENCH
634 m_iDebugShapeColor = ARGB(32, 0x99, 0xF3, 0x12);
635#endif
636 }
637
638 //------------------------------------------------------------------------------------------------
640 {
642 if (scenarioFrameworkSystem)
643 scenarioFrameworkSystem.UnregisterArea(this);
644 }
645}
override void Init()
IEntity SpawnEntityPrefabEx(ResourceName prefab, bool randomizeEditableVariant, BaseWorld world=null, EntitySpawnParams params=null)
Definition game.c:90
ArmaReforgerScripted GetGame()
Definition game.c:1398
LayerPresets layer
vector GetOrigin()
SCR_BaseGameMode GetGameMode()
ScriptedGameTriggerEntity GetTrigger()
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
SCR_ESFTaskType
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
SCR_ScenarioFrameworkAreaClass SCR_ScenarioFrameworkLayerBaseClass BaseContainerProps()] class SCR_ScenarioFrameworkTaskType
SCR_ScenarioFrameworkEActivationType m_eActivationType
void GetChildren(out array< SCR_ScenarioFrameworkLayerBase > children)
ref array< SCR_ScenarioFrameworkLayerBase > m_aChildren
bool m_bExcludeFromDynamicDespawn
void SCR_ScenarioFrameworkLayerBase(IEntityComponentSource src, IEntity ent, IEntity parent)
SCR_ScenarioFrameworkLayerTask GetLayerTask()
bool m_bDynamicallyDespawned
float m_fDebugShapeRadius
void GetAllLayers(out notnull array< SCR_ScenarioFrameworkLayerBase > layers)
SCR_ScenarioFrameworkSlotTask GetSlotTask()
SCR_ScenarioFrameworkTask GetTask()
SCR_ESFTaskType GetTaskType()
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
proto external void GetWorldTransform(out vector mat[])
See IEntity::GetTransform.
void SetupTrigger()
Spawns a trigger entity with specified resource, sets its radius, and attaches an activation event.
override void DynamicDespawn(SCR_ScenarioFrameworkLayerBase layer)
void PrepareDynamicDespawn()
Prepares dynamic spawn/despawn for layers.
void RemoveDynamicDespawn()
Removes dynamic spawn/despawn for layers.
void RemoveLayerSpecificDynamicDespawn(SCR_ScenarioFrameworkLayerBase layer, bool staySpawned=false)
void SCR_ScenarioFrameworkArea(IEntityComponentSource src, IEntity ent, IEntity parent)
void GetSuitableLayersForTaskType(out notnull array< SCR_ScenarioFrameworkLayerBase > aSlotsOut, SCR_ESFTaskType eTaskType)
override void RestoreToDefault(bool includeChildren=false, bool reinitAfterRestoration=false, bool affectRandomization=true, bool deleteSpawnedEntities=true)
override void Init(SCR_ScenarioFrameworkArea area=null, SCR_ScenarioFrameworkEActivationType activation=SCR_ScenarioFrameworkEActivationType.SAME_AS_PARENT)
void GetAvailableTaskTypes(out array< SCR_ESFTaskType > aTaskTypes)
void DynamicDespawnLayer(array< vector > observers)
Goes over spawned layers and checks whether or not said area should despawn.
override void EOnInit(IEntity owner)
void PrepareLayerSpecificDynamicDespawn(SCR_ScenarioFrameworkLayerBase layer, bool staySpawned=false, int despawnRange=0)
bool GetIsTaskSuitableForArea(SCR_ESFTaskType eTaskType)
override void DynamicReinit()
Initializes dynamic reinitialization by calling Init() method.
void ExecuteDynamicDespawn(SCR_ScenarioFrameworkSystem scenarioFrameworkSystem)
Executes dynamic spawn/despawn for layers.
override void OnPostInit(IEntity owner)
void DynamicSpawnLayer(array< vector > observers)
Goes over despawned layers and checks whether or not said area should spawn.
void OnAreaTriggerActivated(IEntity entity)
override void AfterAllChildrenSpawned(SCR_ScenarioFrameworkLayerBase layer)
void MoveTaskIconToArea(notnull SCR_Task task)
static ScriptCallQueue GetCallQueuePausable()
static SCR_ScenarioFrameworkSystem GetInstance()
void UnregisterArea(SCR_ScenarioFrameworkArea area)
void RegisterArea(SCR_ScenarioFrameworkArea area)
void SetOnce(bool bOnce)
Sets if trigger can be finished just once.
Instance of created debug visualizer.
Definition Shape.c:14
void EntitySpawnParams()
Definition gameLib.c:130
IEntity GetOwner()
Owner entity of the fuel tank.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
ShapeFlags
Definition ShapeFlags.c:13
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)
SCR_FieldOfViewSettings Attribute
EntityEvent
Various entity events.
Definition EntityEvent.c:14
void Tuple3(T1 p1, T2 p2, T3 p3)
Definition tuple.c:95
proto int ARGB(int a, int r, int g, int b)
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134