Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ScenarioFrameworkLayerTask.c
Go to the documentation of this file.
1[EntityEditorProps(category: "GameScripted/ScenarioFramework/Layer", description: "")]
5
6class SCR_ScenarioFrameworkLayerTask : SCR_ScenarioFrameworkLayerBase
7{
8 [Attribute(desc: "Name of the task in list of tasks", category: "Task")]
9 string m_sTaskTitle;
10
11 [Attribute(desc: "Description of the task", category: "Task", )]
12 string m_sTaskDescription;
13
14 [Attribute(desc: "Type of task used for ON_TASKS_INIT generation", uiwidget: UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(SCR_ESFTaskType), category: "Task Enums")];
15 SCR_ESFTaskType m_eTypeOfTask;
16
17 [Attribute(defvalue: SCR_ETaskOwnership.FACTION.ToString(), desc: "Who will be the owner of the task for whom it will be assignable. In Default, it will be owned by the given Faction.", uiwidget: UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(SCR_ETaskOwnership), category: "Task Enums")];
18 SCR_ETaskOwnership m_eTaskOwnership;
19
20 [Attribute(defvalue: SCR_ETaskVisibility.FACTION.ToString(), desc: "To whom will the task be visible for. In Default, it will be visible for given Faction.", uiwidget: UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(SCR_ETaskVisibility), category: "Task Enums")];
22
23 [Attribute(defvalue: SCR_ETaskUIVisibility.ALL.ToString(), desc: "Where will the task be visible in UI. In default, it will be visible in the Task List and on the Map.", uiwidget: UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(SCR_ETaskUIVisibility), category: "Task Enums")];
24 SCR_ETaskUIVisibility m_eTaskUIVisibility;
25
26 [Attribute(params: "et", desc: "Task prefab", category: "Task")]
27 ResourceName m_sTaskPrefab;
28
29 [Attribute(desc: "Overrides display name of the spawned object for task purposes", category: "Task")]
30 string m_sOverrideObjectDisplayName;
31
32 [Attribute(params: "edds imageset", uiwidget: UIWidgets.ResourcePickerThumbnail, desc: "Task icon set", category: "Task UI")]
33 ResourceName m_sTaskIconSet;
34
35 [Attribute(desc: "Name of the specific icon from the icon set", category: "Task UI")]
36 string m_sTaskIconName;
37
38 [Attribute(defvalue: "1", desc: "Whether task has functionality on its own or it is just holder for parent task without actuall functionality", category: "Task")]
39 bool m_bTaskFunctionsOnItsOwn;
40
41 [Attribute(desc: "Conditions that will be checked upon trying to finish a task", category: "Task")]
42 ref array<ref SCR_ScenarioFrameworkActivationConditionBase> m_aFinishConditions;
43
44 [Attribute(defvalue: SCR_EScenarioFrameworkLogicOperators.AND.ToString(), UIWidgets.ComboBox, "Which Boolean Logic will be used for Finish Conditions.", "", enums: SCR_EScenarioFrameworkLogicOperatorHelper.GetParamInfo(), category: "Task")]
45 SCR_EScenarioFrameworkLogicOperators m_eFinishConditionLogic;
46
47 [Attribute(defvalue: "0", desc: "Whether or not to show progress bar", category: "Task UI")]
48 bool m_bProgressBar;
49
50 [Attribute(defvalue: "1", desc: "It will set percentage of progress based on the number of completed tasks that are not optional", category: "Task UI")]
51 bool m_bCalculateProgressBarOnCompletedTasks;
52
53 [Attribute(desc: "Marker on map is placed directly on the task subject Slot or on layer Slot", category: "Task UI")]
54 bool m_bPlaceMarkerOnSubjectSlot;
55
56 [Attribute(desc: "Attach marker to entity", category: "Task UI")]
57 ref SCR_ScenarioFrameworkGet m_EntityToAttachGetter;
58
59 [Attribute(defvalue: "0", desc: "Marker Update Interval. If set to 0, marker position won't be automatically updated", params: "0 inf 0.01", category: "Task UI")]
60 protected float m_fMarkerUpdateInterval;
61
62 [Attribute(defvalue: SCR_Enum.GetFlagValues(SCR_ETaskNotificationSettings).ToString(), desc: "Task Notification Settings", uiwidget: UIWidgets.Flags, enumType: SCR_ETaskNotificationSettings, category: "Task Notifications")]
63 SCR_ETaskNotificationSettings m_eTaskNotificationSettings;
64
65 [Attribute(defvalue: "-1", desc: "Number Of Requiered Tasks To Finish this task if it has subtasks. Optional subtasks are excluded. -1 for currently attached subtasks (It can change in runtime)", params: "-1 inf", category: "Subtask")]
66 int m_iNumberOfRequieredTasksToFinish;
67
68 [Attribute(desc: "Description that is displayed above subtasks in the parent task", category: "Subtask", )]
69 string m_sSubtasksDescription;
70
71 [Attribute(defvalue: "0", desc: "If it is a subtask it will be grouped under the top most LayerTask or if attribute target parent task is filled, it will group it under that", category: "Subtask")]
72 bool m_bIsSubtask;
73
74 [Attribute(defvalue: "0", desc: "If this is subtask, whether or not the subtask is optional or not.", category: "Subtask")]
75 bool m_bIsOptional;
76
77 [Attribute(desc: "Name of the parent LayerTask if this LayerTask is set to be a Subtask. It will override default behaviour, where parent LayerTask is the top most LayerTask in hierarchy.", category: "Subtask", )]
78 string m_sParentLayerTask;
79
80 [Attribute(desc: "What to do once task is finished", category: "Task State Changed Actions")]
81 ref array<ref SCR_ScenarioFrameworkActionBase> m_aTriggerActionsOnFinish;
82
83 [Attribute(desc: "What to do once task is created", category: "Task State Changed Actions")]
84 ref array<ref SCR_ScenarioFrameworkActionBase> m_aActionsOnCreated;
85
86 [Attribute(desc: "What to do once task is created", category: "Task State Changed Actions")]
87 ref array<ref SCR_ScenarioFrameworkActionBase> m_aActionsOnFailed;
88
89 [Attribute(desc: "What to do once task is cancelled", category: "Task State Changed Actions")]
90 ref array<ref SCR_ScenarioFrameworkActionBase> m_aActionsOnCancelled;
91
92 [Attribute(desc: "What to do once task progressed", category: "Task State Changed Actions")]
93 ref array<ref SCR_ScenarioFrameworkActionBase> m_aActionsOnProgress;
94
95 [Attribute(desc: "What to do once task is updated", category: "Task State Changed Actions")]
96 ref array<ref SCR_ScenarioFrameworkActionBase> m_aActionsOnAssigned;
97
98 SCR_ScenarioFrameworkLayerTask m_TopParentLayerTask;
99 SCR_ScenarioFrameworkSlotTask m_SlotTask;
101 SCR_ETaskState m_eLayerTaskState = SCR_ETaskState.CREATED;
102 bool m_bTaskResolvedBeforeLoad;
103 bool m_bTaskCompletedWithoutSubtasks;
105
106 static const ref ScriptInvoker s_OnTaskSetup = new ScriptInvoker();
107
108 //------------------------------------------------------------------------------------------------
110 SCR_ETaskState GetLayerTaskState()
111 {
112 return m_eLayerTaskState;
113 }
114
115 //------------------------------------------------------------------------------------------------
118 {
119 return m_bTaskResolvedBeforeLoad;
120 }
121
122 //------------------------------------------------------------------------------------------------
125 {
126 m_eLayerTaskState = state;
127 }
128
129 //------------------------------------------------------------------------------------------------
132 {
133 return m_Task;
134 }
135
136 //------------------------------------------------------------------------------------------------
139 {
140 return m_sTaskPrefab;
141 }
142
143 //------------------------------------------------------------------------------------------------
146 {
147 return m_sOverrideObjectDisplayName;
148 }
149
150 //------------------------------------------------------------------------------------------------
153 {
154 m_sOverrideObjectDisplayName = name;
155 }
156
157 //------------------------------------------------------------------------------------------------
160 {
161 return m_sTaskTitle;
162 }
163
164 //------------------------------------------------------------------------------------------------
167 {
168 return m_sTaskDescription;
169 }
170
171 //------------------------------------------------------------------------------------------------
174 {
175 if (!m_sOverrideObjectDisplayName.IsEmpty() && m_SlotTask && m_SlotTask.GetOverriddenObjectDisplayName().IsEmpty())
176 m_SlotTask.SetOverriddenObjectDisplayName(m_sOverrideObjectDisplayName);
177
178 return m_sTaskDescription;
179 }
180
181 //------------------------------------------------------------------------------------------------
184 {
185 return m_eTypeOfTask;
186 }
187
188 //------------------------------------------------------------------------------------------------
190 SCR_ScenarioFrameworkLayerTask GetTopMostParentTaskLayer()
191 {
192 SCR_ScenarioFrameworkLayerTask topMostLayer;
193 IEntity entity = GetOwner().GetParent();
194 while (entity)
195 {
196 SCR_ScenarioFrameworkLayerTask layer = SCR_ScenarioFrameworkLayerTask.Cast(entity.FindComponent(SCR_ScenarioFrameworkLayerTask));
197 if (layer)
198 topMostLayer = layer; // Keep updating with the last found layer
199
200 entity = entity.GetParent();
201 }
202
203 return topMostLayer;
204 }
205
206 //------------------------------------------------------------------------------------------------
211 override void RestoreToDefault(bool includeChildren = false, bool reinitAfterRestoration = false, bool affectRandomization = true, bool deleteSpawnedEntities = true)
212 {
214 {
215 activationAction.RestoreToDefault();
216 }
217
218 foreach (SCR_ScenarioFrameworkActionBase activationAction : m_aActionsOnCreated)
219 {
220 activationAction.RestoreToDefault();
221 }
222
223 foreach (SCR_ScenarioFrameworkActionBase activationAction : m_aActionsOnFailed)
224 {
225 activationAction.RestoreToDefault();
226 }
227
228 foreach (SCR_ScenarioFrameworkActionBase activationAction : m_aActionsOnCancelled)
229 {
230 activationAction.RestoreToDefault();
231 }
232
233 foreach (SCR_ScenarioFrameworkActionBase activationAction : m_aActionsOnProgress)
234 {
235 activationAction.RestoreToDefault();
236 }
237
238 foreach (SCR_ScenarioFrameworkActionBase activationAction : m_aActionsOnAssigned)
239 {
240 activationAction.RestoreToDefault();
241 }
242
243 m_SlotTask = null;
244
245 if (m_TaskSystem)
247
248 m_Task = null;
250 m_bTaskResolvedBeforeLoad = false;
251
252 super.RestoreToDefault(includeChildren, reinitAfterRestoration, affectRandomization, deleteSpawnedEntities);
253 }
254
255 //------------------------------------------------------------------------------------------------
257 override void DynamicReinit()
258 {
259 Init(null, SCR_ScenarioFrameworkEActivationType.SAME_AS_PARENT);
260 }
261
262 //------------------------------------------------------------------------------------------------
266 {
268 if (!m_bInitiated)
269 {
271 return;
272 }
273
275 return;
276
278 {
279 //If just one condition is false, we don't continue and interrupt the init
280 if (!activationCondition.Init(GetOwner()))
281 {
282 if (m_ParentLayer)
283 m_ParentLayer.CheckAllChildrenSpawned(this);
284
285 return;
286 }
287 }
288
289 m_bInitiated = false;
291 m_aChildren.RemoveItem(null);
293 {
294 child.DynamicDespawn(this);
295 }
296
297 foreach (IEntity entity : m_aSpawnedEntities)
298 {
299 SCR_EntityHelper.DeleteEntityAndChildren(entity);
300 }
301
302 m_SlotTask = null;
303 m_aSpawnedEntities.Clear();
304
306 }
307
308 //------------------------------------------------------------------------------------------------
310 override void FinishInit()
311 {
313
314 super.FinishInit();
315 }
316
317 //------------------------------------------------------------------------------------------------
322 {
323 if (newState == SCR_ETaskState.CREATED)
324 {
326 {
327 action.OnActivate(GetOwner());
328 }
329 }
330 else if (newState == SCR_ETaskState.COMPLETED && !m_bTaskResolvedBeforeLoad)
331 {
333 {
334 action.OnActivate(GetOwner());
335 }
336 }
337 else if (newState == SCR_ETaskState.FAILED && !m_bTaskResolvedBeforeLoad)
338 {
340 {
341 action.OnActivate(GetOwner());
342 }
343 }
344 else if (newState == SCR_ETaskState.CANCELLED && !m_bTaskResolvedBeforeLoad)
345 {
347 {
348 action.OnActivate(GetOwner());
349 }
350 }
351 else if (newState == SCR_ETaskState.PROGRESSED && !m_bTaskResolvedBeforeLoad)
352 {
354 {
355 action.OnActivate(GetOwner());
356 }
357 }
358 else
359 {
361 {
362 action.OnActivate(GetOwner());
363 };
364 }
365 }
366
367 //------------------------------------------------------------------------------------------------
369 void SetSlotTask(SCR_ScenarioFrameworkSlotTask slotTask)
370 {
371 m_SlotTask = slotTask;
372 if (m_Task)
373 m_Task.SetSlotTask(slotTask);
374 }
375
376 //------------------------------------------------------------------------------------------------
378 SCR_ScenarioFrameworkSlotTask GetSlotTask()
379 {
380 return m_SlotTask;
381 }
382
383 //------------------------------------------------------------------------------------------------
388 void ProcessLayerTaskState(SCR_ETaskState state, bool forced = false, bool calledFromSubtask = false)
389 {
390 if (!m_SlotTask && m_Task)
391 m_SlotTask = m_Task.GetSlotTask();
392
393 if (!m_TaskSystem || !m_Task || !m_SlotTask || m_eLayerTaskState == SCR_ETaskState.CANCELLED || m_eLayerTaskState == SCR_ETaskState.FAILED)
394 return;
395
396 if (state == SCR_ETaskState.COMPLETED || !m_bTaskCompletedWithoutSubtasks)
397 {
398 if (m_SlotTask.m_eFinishConditionLogic == SCR_EScenarioFrameworkLogicOperators.AND)
399 {
400 if (!m_SlotTask.m_aFinishConditions || m_SlotTask.m_aFinishConditions.IsEmpty())
401 {
402 if (!forced && !SCR_ScenarioFrameworkActivationConditionBase.EvaluateEmptyOrConditions(m_eFinishConditionLogic, m_aFinishConditions, m_SlotTask.GetOwner()))
403 return;
404 }
405 else
406 {
407 if (!forced && !SCR_ScenarioFrameworkActivationConditionBase.EvaluateEmptyOrConditions(m_eFinishConditionLogic, m_SlotTask.m_aFinishConditions, m_SlotTask.GetOwner()))
408 return;
409 }
410 }
411 else
412 {
413 if (!m_SlotTask.m_aFinishConditions || m_SlotTask.m_aFinishConditions.IsEmpty())
414 {
415 if (!forced && !SCR_ScenarioFrameworkActivationConditionBase.EvaluateEmptyOrConditions(m_SlotTask.m_eFinishConditionLogic, m_aFinishConditions, m_SlotTask.GetOwner()))
416 return;
417 }
418 else
419 {
420 if (!forced && !SCR_ScenarioFrameworkActivationConditionBase.EvaluateEmptyOrConditions(m_SlotTask.m_eFinishConditionLogic, m_SlotTask.m_aFinishConditions, m_SlotTask.GetOwner()))
421 return;
422 }
423 }
424 }
425
426 int allRequiredTasks;
427 int finishedTasks;
428
429 if (!m_bIsSubtask)
430 {
431 if (state == SCR_ETaskState.COMPLETED)
432 {
433 array<SCR_Task> subtasks = m_Task.GetChildTasks();
434 array<SCR_ScenarioFrameworkTask> optional_subtasks = {};
435 if (subtasks && subtasks.Count() > 0)
436 {
437 SCR_ScenarioFrameworkTask frameworkTask;
438 foreach (SCR_Task subtask : subtasks)
439 {
440 frameworkTask = SCR_ScenarioFrameworkTask.Cast(subtask);
441 if (!frameworkTask)
442 continue;
443
444 if (!frameworkTask.GetLayerTask())
445 continue;
446
447 if (frameworkTask.GetLayerTask().m_bIsOptional)
448 {
449 if (subtask.GetTaskState() != SCR_ETaskState.COMPLETED)
450 optional_subtasks.Insert(SCR_ScenarioFrameworkTask.Cast(subtask));
451
452 continue;
453 }
454
455 allRequiredTasks++;
456 if (subtask.GetTaskState() == SCR_ETaskState.COMPLETED)
457 finishedTasks++;
458 }
459
460 if (m_iNumberOfRequieredTasksToFinish == -1)
461 {
462 if (finishedTasks != allRequiredTasks)
463 {
464 m_bTaskCompletedWithoutSubtasks = true;
465 return;
466 }
467 }
468 else
469 {
470 if (finishedTasks != m_iNumberOfRequieredTasksToFinish)
471 {
472 m_bTaskCompletedWithoutSubtasks = true;
473 return;
474 }
475 }
476
477 if (calledFromSubtask)
478 {
479 if (m_bTaskFunctionsOnItsOwn && !m_bTaskCompletedWithoutSubtasks)
480 return;
481 }
482 else
483 {
484 if (!m_bTaskFunctionsOnItsOwn)
485 return;
486 }
487
488 foreach (SCR_ScenarioFrameworkTask frameworkSubtask : optional_subtasks)
489 {
490 if (!frameworkSubtask.GetLayerTask())
491 continue;
492
493 frameworkSubtask.GetLayerTask().ProcessLayerTaskState(SCR_ETaskState.CANCELLED, false, true);
494 }
495 }
496 }
497 }
498 else
499 {
500 SetLayerTaskState(state);
501 m_TaskSystem.SetTaskState(m_Task, state);
502
503 if (state == SCR_ETaskState.COMPLETED)
504 {
505 SCR_ScenarioFrameworkTask frameworkTask = SCR_ScenarioFrameworkTask.Cast(m_Task.GetParentTask());
506 if (!frameworkTask)
507 return;
508
509 frameworkTask.GetLayerTask().ProcessSubTasks();
510 }
511 return;
512 }
513
514 if (m_bProgressBar && m_bCalculateProgressBarOnCompletedTasks && allRequiredTasks != 0)
515 m_Task.SetTaskProgress(100 * (finishedTasks/allRequiredTasks), false);
516
517 SetLayerTaskState(state);
518 m_TaskSystem.SetTaskState(m_Task, state);
519 }
520
521 //------------------------------------------------------------------------------------------------
524 {
525 array<SCR_Task> subtasks = m_Task.GetChildTasks();
526 if (subtasks && subtasks.Count() > 0)
527 {
528 SCR_ScenarioFrameworkTask frameworkTask;
529 int allRequiredTasks;
530 int finishedTasks;
531 foreach (SCR_Task subtask : subtasks)
532 {
533 frameworkTask = SCR_ScenarioFrameworkTask.Cast(subtask);
534 if (!frameworkTask)
535 continue;
536
537 if (!frameworkTask.GetLayerTask() || frameworkTask.GetLayerTask().m_bIsOptional)
538 continue;
539
540 allRequiredTasks++;
541 if (subtask.GetTaskState() == SCR_ETaskState.COMPLETED)
542 finishedTasks++;
543 }
544
545 if (m_bProgressBar && m_bCalculateProgressBarOnCompletedTasks && allRequiredTasks != 0)
546 m_Task.SetTaskProgress(100 * (finishedTasks/allRequiredTasks), false);
547
548 if (m_iNumberOfRequieredTasksToFinish == -1)
549 {
550 if (finishedTasks == allRequiredTasks)
551 {
552 ProcessLayerTaskState(SCR_ETaskState.COMPLETED, false, true);
553 }
554 }
555 else
556 {
557 if (finishedTasks == m_iNumberOfRequieredTasksToFinish)
558 {
559 ProcessLayerTaskState(SCR_ETaskState.COMPLETED, false, true);
560 }
561 }
562 }
563 }
564
565 //------------------------------------------------------------------------------------------------
569 {
571
572 m_TaskSystem = SCR_TaskSystem.GetInstance();
573 if (!m_TaskSystem)
574 return;
575
576 //If m_Task already exists, we are reiniting it, not creating new one. Will already be there for a save-game load.
577 if (m_Task)
578 {
579 // We need to make sure that we have m_SlotTask to work with
580 if (!m_SlotTask)
581 m_SlotTask = m_Task.GetSlotTask();
582
583 if (!m_SlotTask)
584 {
585 if (!m_aRandomlySpawnedChildren.IsEmpty())
587 else
588 m_SlotTask = GetSlotTask(m_aChildren);
589 }
590
591 if (!m_SlotTask)
592 {
593 Print(string.Format("ScenarioFramework: %1 could not reinit task due to missing m_SlotTask!", GetOwner().GetName()), LogLevel.ERROR);
594 return;
595 }
596
597 SetLayerTaskState(m_Task.GetTaskState());
598
599 if (m_SlotTask.GetIsTerminated() || m_bIsTerminated)
600 {
601 if (m_eLayerTaskState >= SCR_ETaskState.COMPLETED)
602 {
603 m_bTaskResolvedBeforeLoad = true;
604 m_SlotTask.SetTaskResolvedBeforeLoad(true);
605 ProcessLayerTaskState(m_eLayerTaskState);
606 }
607 }
608
609 m_Task.HookTaskAsset(m_Entity);
610 return;
611 }
612
613 if (!m_SlotTask)
614 {
615 if (!m_aRandomlySpawnedChildren.IsEmpty())
617 else
618 m_SlotTask = GetSlotTask(m_aChildren);
619
620 if (!m_SlotTask)
621 {
622 Print(string.Format("ScenarioFramework: %1 could not init task due to missing m_SlotTask!", GetOwner().GetName()), LogLevel.ERROR);
623 return;
624 }
625 }
626
628 {
629 SetupTask();
630 m_Task.SetLayerTask(this);
631 m_SlotTask.OnTaskStateChanged(m_eLayerTaskState);
632
633 if (m_eLayerTaskState >= SCR_ETaskState.COMPLETED)
634 {
635 m_bTaskResolvedBeforeLoad = true;
636 m_SlotTask.SetTaskResolvedBeforeLoad(true);
637 }
638
639 if (m_eLayerTaskState != SCR_ETaskState.CREATED)
640 ProcessLayerTaskState(m_eLayerTaskState);
641
642 if (m_SlotTask.GetIsTerminated() || m_bIsTerminated)
643 SCR_EntityHelper.DeleteEntityAndChildren(m_SlotTask.GetSpawnedEntity());
644
645 m_Task.HookTaskAsset(m_Entity);
646
647 if (m_fMarkerUpdateInterval > 0)
649 }
650 }
651
652 //------------------------------------------------------------------------------------------------
655 void SetMarkerUpdateInterval(float newInterval)
656 {
658
659 if (m_fMarkerUpdateInterval > 0)
661 }
662
663 //------------------------------------------------------------------------------------------------
666 {
667 if (!m_TaskSystem || !m_Task)
668 return;
669
670 vector newPosition = GetMarkerPosition();
671 if (newPosition == m_Task.GetTaskPosition())
672 return;
673
675 }
676
677 //------------------------------------------------------------------------------------------------
678 // Returns marker position vector, according to set parameters of LayerTask
680 {
681 if (!m_TaskSystem)
682 return vector.Zero;
683
684 if (m_EntityToAttachGetter)
685 {
686 SCR_ScenarioFrameworkParam<IEntity> entityWrapper = SCR_ScenarioFrameworkParam<IEntity>.Cast(m_EntityToAttachGetter.Get());
687 if (entityWrapper)
688 {
689 IEntity entity = entityWrapper.GetValue();
690 if (entity)
691 return entity.GetOrigin();
692 }
693 }
694
695 if (m_bPlaceMarkerOnSubjectSlot && m_SlotTask)
696 return m_SlotTask.GetOwner().GetOrigin();
697
698 return GetOwner().GetOrigin();
699 }
700
701 //------------------------------------------------------------------------------------------------
704 protected bool CreateTask(vector position)
705 {
706 SCR_Task task = m_TaskSystem.CreateTask(m_sTaskPrefab, GetName(), PrepareName(), PrepareDescription(), position);
708 if (!m_Task)
709 {
710 Print(string.Format("ScenarioFramework: Creating of task %1 failed! Task manager refused to create it.", m_sTaskTitle), LogLevel.ERROR);
711 return false;
712 }
713 //TODO: make selection of the faction dynamic
714 array<Faction> aPlayableFactions = {};
715 SCR_Faction factionSelected;
716 FactionManager manager = GetGame().GetFactionManager();
717 if (!manager)
718 {
719 Print(string.Format("ScenarioFramework: Creating of task %1 failed! Faction manager doesn't exist", m_sTaskTitle), LogLevel.ERROR);
720 return false;
721 }
722
723 manager.GetFactionsList(aPlayableFactions);
724 if (m_sFactionKey.IsEmpty())
725 m_sFactionKey = "US"; //set a default US one if none is set by user
726
727 SCR_Faction testFaction = SCR_Faction.Cast(manager.GetFactionByKey(m_sFactionKey));
728
729 foreach (Faction faction : aPlayableFactions)
730 {
731 if (!SCR_Faction.Cast(faction))
732 continue;
733
734 if (SCR_Faction.Cast(faction).IsPlayable())
735 {
736 if (m_sFactionKey == "")
737 {
738 factionSelected = SCR_Faction.Cast(faction);
739 break;
740 }
741
742 if (faction == testFaction)
743 {
744 factionSelected = SCR_Faction.Cast(faction);
745 break;
746 }
747 }
748 }
749
750 if (!factionSelected)
751 {
752 Print(string.Format("ScenarioFramework: Creating of task %1 failed for %2! No playable faction available", m_sTaskTitle, GetOwner().GetName()), LogLevel.ERROR);
753 return false;
754 }
755
756 m_TaskSystem.SetTaskOwnership(m_Task, m_eTaskOwnership);
757 m_TaskSystem.SetTaskVisibility(m_Task, m_eTaskVisibility);
758 m_TaskSystem.SetTaskUIVisibility(m_Task, m_eTaskUIVisibility);
759
760 if (!SCR_StringHelper.IsEmptyOrWhiteSpace(m_sSubtasksDescription))
761 m_Task.SetCustomSubtaskDescription(m_sSubtasksDescription);
762
763 m_Task.SetSlotTask(m_SlotTask);
764 m_TaskSystem.AddTaskFaction(task, factionSelected.GetFactionKey());
765
766 return true;
767 }
768
769 //------------------------------------------------------------------------------------------------
772 protected string PrepareName()
773 {
774 if (m_SlotTask)
775 {
776 if (!m_SlotTask.GetTaskTitle().IsEmpty())
777 return m_SlotTask.GetTaskTitle();
778 else
779 return m_sTaskTitle;
780 }
781 else
782 {
783 Print(string.Format("ScenarioFramework - LayerTask: Task Subject not found doesn't exist for %1. Task won't be spawned!", GetOwner().GetName()), LogLevel.ERROR);
784 return m_sTaskTitle;
785 }
786 }
787
788 //------------------------------------------------------------------------------------------------
791 protected string PrepareDescription()
792 {
793 if (m_SlotTask)
794 {
795 if (!m_SlotTask.GetTaskDescription().IsEmpty())
796 return m_SlotTask.GetTaskDescription();
797 else
798 return m_sTaskDescription;
799 }
800 else
801 {
802 Print(string.Format("ScenarioFramework - LayerTask: Task Subject not found doesn't exist for %1. Task won't be spawned!", GetOwner().GetName()), LogLevel.ERROR);
803 return m_sTaskDescription;
804 }
805 }
806
807 //------------------------------------------------------------------------------------------------
809 protected void InitIcon()
810 {
811 if (m_SlotTask)
812 {
813 if (SCR_StringHelper.IsEmptyOrWhiteSpace(m_SlotTask.m_sTaskIconSet))
814 {
815 if (SCR_StringHelper.IsEmptyOrWhiteSpace(m_sTaskIconSet))
816 return;
817
818 if (SCR_StringHelper.IsEmptyOrWhiteSpace(m_sTaskIconName))
819 {
820 Print(string.Format("ScenarioFramework - LayerTask: Init Icon failed for %1 due to empty Task Icon Name", GetOwner().GetName()), LogLevel.ERROR);
821 return;
822 }
823
824 m_Task.SetTaskIconPath(m_sTaskIconSet);
825 m_Task.SetTaskIconSetName(m_sTaskIconName);
826 }
827 else
828 {
829 if (SCR_StringHelper.IsEmptyOrWhiteSpace(m_SlotTask.m_sTaskIconName))
830 {
831 Print(string.Format("ScenarioFramework - LayerTask: Init Icon failed for %1 due to empty Task Icon Name on the Slot Task", GetOwner().GetName()), LogLevel.ERROR);
832 return;
833 }
834
835 m_Task.SetTaskIconPath(m_SlotTask.m_sTaskIconSet);
836 m_Task.SetTaskIconSetName(m_SlotTask.m_sTaskIconName);
837 }
838 }
839 else
840 {
841 Print(string.Format("ScenarioFramework - LayerTask: Slot Task not found doesn't exist for %1. Icon won't be initialized", GetOwner().GetName()), LogLevel.ERROR);
842 }
843 }
844
845 //------------------------------------------------------------------------------------------------
848 SCR_ScenarioFrameworkLayerTask GetLayerTaskByName(string name)
849 {
850 IEntity entity = GetGame().GetWorld().FindEntityByName(name);
851 if (!entity)
852 return null;
853
854 return SCR_ScenarioFrameworkLayerTask.Cast(entity.FindComponent(SCR_ScenarioFrameworkLayerTask));
855 }
856
857 //------------------------------------------------------------------------------------------------
858 protected void SetupTask()
859 {
860 InitIcon();
861
862 if (m_SlotTask)
863 {
864 array<LocalizedString> descriptionParams = {};
865 descriptionParams.Insert(m_SlotTask.GetSpawnedEntityDisplayName());
866 m_Task.SetTaskName(PrepareName(), descriptionParams);
867 m_Task.SetTaskDescription(PrepareDescription(), descriptionParams);
868 }
869 else
870 {
871 Print(string.Format("ScenarioFramework - LayerTask: Task Subject not found doesn't exist for %1. Task won't be spawned!", GetOwner().GetName()), LogLevel.ERROR);
872 }
873
874 m_TaskSystem.ShowProgressForTask(m_Task, m_bProgressBar);
875
876 s_OnTaskSetup.Invoke(m_Task);
877
878 //---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
879
880 string cachedLanguage;
881 WidgetManager.GetLanguage(cachedLanguage);
882 if (cachedLanguage != "en_us")
883 WidgetManager.SetLanguage("en_us");
884
885 Print(string.Format("ScenarioFramework: -> LayerTask: SlotTask %1 - generating task %2. Description: %3", m_SlotTask.GetOwner().GetName(), WidgetManager.Translate(m_Task.GetTaskName()), string.Format(WidgetManager.Translate(m_Task.GetTaskDescription(), WidgetManager.Translate(m_Task.GetSlotTask().GetSpawnedEntityDisplayName())))), LogLevel.NORMAL);
886
887 if (cachedLanguage != "en_us")
888 WidgetManager.SetLanguage(cachedLanguage);
889
890 //---- REFACTOR NOTE END ----
891
892 if (m_bIsSubtask)
893 SetupSubtask();
894 }
895
896 //------------------------------------------------------------------------------------------------
899 {
900 SCR_ExtendedTaskData taskData = SCR_ExtendedTaskData.Cast(m_Task.GetTaskData());
901 if (taskData)
902 taskData.m_bLinkDataToRelatedTasks = false;
903
904 if (SCR_StringHelper.IsEmptyOrWhiteSpace(m_sParentLayerTask))
905 m_TopParentLayerTask = GetTopMostParentTaskLayer();
906 else
907 m_TopParentLayerTask = GetLayerTaskByName(m_sParentLayerTask);
908
909 if (!m_TopParentLayerTask)
910 {
911 Print(string.Format("ScenarioFramework - LayerTask: Registering this task as a Subtask failed for %1", GetOwner().GetName()), LogLevel.ERROR);
912 return;
913 }
914
915 if (m_bIsOptional)
916 {
917 array<LocalizedString> nameParams = {};
918 nameParams.Insert("#AR-Tasks_Optional");
919 nameParams.Insert(PrepareName());
920 m_Task.SetTaskName("%1 %2", nameParams);
921 }
922
923 if (m_TopParentLayerTask.GetIsInitiated())
924 OnTopParentLayerTaskInitialized(m_TopParentLayerTask);
925 else
926 m_TopParentLayerTask.GetOnAllChildrenSpawned().Insert(OnTopParentLayerTaskInitialized);
927 }
928
929 //------------------------------------------------------------------------------------------------
932 {
933 if (!m_TopParentLayerTask || !m_Task)
934 return;
935
936 m_TopParentLayerTask.GetOnAllChildrenSpawned().Remove(OnTopParentLayerTaskInitialized);
937
938 SCR_ScenarioFrameworkTask parentTask = m_TopParentLayerTask.GetTask();
939 if (!parentTask)
940 return;
941
942 m_TaskSystem.AddChildTaskTo(parentTask, m_Task);
943 }
944
945 //------------------------------------------------------------------------------------------------
958}
override void Init()
ArmaReforgerScripted GetGame()
Definition game.c:1398
LayerPresets layer
enum EAITargetInfoCategory m_Entity
void OnTaskStateChanged(SCR_Task task, SCR_ETaskState newState)
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
vector position
SCR_ESFTaskType
void CreateTask(ResourceName taskPrefab, vector position, SCR_AIGroup group, int playerId)
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
ref array< IEntity > m_aSpawnedEntities
FactionKey m_sFactionKey
ref array< ref SCR_ScenarioFrameworkActivationConditionBase > m_aActivationConditions
void DynamicReinit()
Reinitializes this layer.
ref array< SCR_ScenarioFrameworkLayerBase > m_aChildren
SCR_ScenarioFrameworkLayerBase m_ParentLayer
ScriptInvokerScenarioFrameworkLayer GetOnAllChildrenSpawned()
bool m_bExcludeFromDynamicDespawn
void FinishInit()
Initializes children, retrieves them, and spawns them.
ref array< SCR_ScenarioFrameworkLayerBase > m_aRandomlySpawnedChildren
void SCR_ScenarioFrameworkLayerBase(IEntityComponentSource src, IEntity ent, IEntity parent)
void DynamicDespawn(SCR_ScenarioFrameworkLayerBase layer)
bool m_bDynamicallyDespawned
void SetOverridenObjectDisplayName(string name)
void ~SCR_ScenarioFrameworkLayerTask()
Removes task from support entity and despawns if in edit mode or task is cancelled.
void SetSlotTask(SCR_ScenarioFrameworkSlotTask slotTask)
void SetMarkerUpdateInterval(float newInterval)
void InitTask(SCR_ScenarioFrameworkLayerBase layer)
SCR_ScenarioFrameworkSlotTask GetSlotTask()
void SetLayerTaskState(SCR_ETaskState state)
ResourceName GetTaskPrefab()
string GetTaskDescription()
string GetOverridenObjectDisplayName()
SCR_ScenarioFrameworkTask GetTask()
void UpdateMarkerPosition()
Updates marker position on map, if it changed from previous one.
void InitIcon()
Initializes task icon based on provided task or slot task. If task icon set name or path is empty,...
string GetOriginalTaskDescription()
SCR_ESFTaskType GetTaskType()
void ProcessLayerTaskState(SCR_ETaskState state, bool forced=false, bool calledFromSubtask=false)
bool GetLayerTaskResolvedBeforeLoad()
string PrepareDescription()
SCR_ScenarioFrameworkLayerTask GetLayerTaskByName(string name)
SCR_ScenarioFrameworkLayerTask GetTopMostParentTaskLayer()
void OnTopParentLayerTaskInitialized(SCR_ScenarioFrameworkLayerBase layer)
void SetupSubtask()
Sets up a subtask, disables linking data to related tasks, and registers the task as a subtask of a p...
void ProcessSubTasks()
This method processes subtasks of a main task, calculates progress bar based on completed subtasks,...
vector GetMarkerPosition()
string GetTaskTitle()
void RestoreToDefault()
ref array< ref SCR_ScenarioFrameworkActionSave > m_aActionsOnCancelled
ref array< ref SCR_ScenarioFrameworkActionSave > m_aActionsOnCreated
ref array< ref SCR_ScenarioFrameworkActionSave > m_aTriggerActionsOnFinish
ref array< ref SCR_ScenarioFrameworkActionSave > m_aActionsOnAssigned
ref array< ref SCR_ScenarioFrameworkActionSave > m_aActionsOnFailed
ref array< ref SCR_ScenarioFrameworkActionSave > m_aActionsOnProgress
SCR_ETaskVisibility
Definition SCR_Task.c:24
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
SCR_ETaskOwnership m_eTaskOwnership
Definition SCR_Task.c:90
SCR_ETaskUIVisibility m_eTaskUIVisibility
Definition SCR_Task.c:96
SCR_ETaskState
Definition SCR_Task.c:3
SCR_ETaskVisibility m_eTaskVisibility
Definition SCR_Task.c:93
SCR_TaskSystem m_TaskSystem
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
proto external BaseWorld GetWorld()
proto external IEntity GetParent()
bool IsPlayable()
static bool IsEditMode()
Definition Functions.c:1566
SCR_ScenarioFrameworkLayerTask GetLayerTask()
static bool IsEmptyOrWhiteSpace(string input)
IEntity GetOwner()
Owner entity of the fuel tank.
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
SCR_EditableTaskComponentClass m_Task
Editable SCR_BaseTask.
SCR_FieldOfViewSettings Attribute
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134