Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ExtendedTask.c
Go to the documentation of this file.
4
7typedef ScriptInvokerBase<ChildTaskInvokerDelegate> SCR_ChildTaskInvoker;
8
10{
11 [Attribute("1")]
13
14 [Attribute("0")]
15 protected bool m_bEnableProgress;
16
17 [Attribute("0.0", UIWidgets.Slider, "Progression of the task", "0.0 100.0 1.0")]
18 protected float m_fProgress;
19
20 [Attribute("#AR-Tasks_TaskCompletionConditions")]
22
23 protected SCR_ETaskState m_eCachedTaskState; //Used for task progression
24
27
29
30 protected const float MIN_TASK_PROGRESSION_PERCENTAGE = 0.0;
31 protected const float MAX_TASK_PROGRESSION_PERCENTAGE = 100.0;
32
33 //------------------------------------------------------------------------------------------------
37 {
39 if (!extendedData)
40 return string.Empty;
41
42 return extendedData.m_sCustomSubtaskDescription;
43 }
44
45 //------------------------------------------------------------------------------------------------
49 {
50 Rpc_SetCustomSubtaskDescription(subTaskDescription);
51 Rpc(Rpc_SetCustomSubtaskDescription, subTaskDescription);
52 }
53
54 //------------------------------------------------------------------------------------------------
55 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
56 protected void Rpc_SetCustomSubtaskDescription(LocalizedString subTaskDescription)
57 {
59 if (!extendedData)
60 return;
61
62 extendedData.m_sCustomSubtaskDescription = subTaskDescription;
63 }
64
65 //------------------------------------------------------------------------------------------------
69 {
70 return GetParentTask();
71 }
72
73 //------------------------------------------------------------------------------------------------
77 {
78 array<SCR_Task> childTasks = GetChildTasks();
79 return childTasks && !childTasks.IsEmpty();
80 }
81
82 //------------------------------------------------------------------------------------------------
86 {
88 if (!extendedData)
89 return 0;
90
91 return extendedData.m_aChildTasks.Count();
92 }
93
94 //------------------------------------------------------------------------------------------------
98 {
99 return !HasChildTasks();
100 }
101
102 //------------------------------------------------------------------------------------------------
106 {
108 if (!extendedData)
109 return -1;
110
111 return extendedData.m_iNodeDepth;
112 }
113
114 //------------------------------------------------------------------------------------------------
118 {
120 if (!extendedData || !extendedData.m_ParentTask)
121 return null;
122
123 RplComponent rpl = RplComponent.Cast(Replication.FindItem(extendedData.m_ParentTask));
124 if (!rpl)
125 return null;
126
127 return SCR_Task.Cast(rpl.GetEntity());
128 }
129
130 //------------------------------------------------------------------------------------------------
131 protected void SetParentTask(SCR_ExtendedTask parentTask)
132 {
133 RplComponent rpl = RplComponent.Cast(parentTask.FindComponent(RplComponent));
134 if (!rpl)
135 return;
136
137 RplId rplID = rpl.Id();
138 if (!rplID)
139 return;
140
141 Rpc_SetParentTask(rplID);
142 Rpc(Rpc_SetParentTask, rplID);
143 }
144
145 //------------------------------------------------------------------------------------------------
146 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
147 protected void Rpc_SetParentTask(RplId parentTaskRplID)
148 {
149 RplComponent rpl = RplComponent.Cast(Replication.FindItem(parentTaskRplID));
150 if (!rpl)
151 return;
152
153 SCR_ExtendedTask extendedParentTask = SCR_ExtendedTask.Cast(rpl.GetEntity());
154 if (!extendedParentTask)
155 return;
156
157 SCR_ExtendedTaskData parentTaskData = SCR_ExtendedTaskData.Cast(extendedParentTask.GetTaskData());
158 if (!parentTaskData)
159 return;
160
161 //Merge parent data with child data; Unique identifiers such as taskID will remain the same while states and assignees will be copied to this task from parent
162 if (parentTaskData.m_bLinkDataToRelatedTasks)
163 m_TaskData = parentTaskData.Merge(SCR_ExtendedTaskData.Cast(m_TaskData));
164
166 if (!extendedData)
167 return;
168
169 extendedData.m_ParentTask = parentTaskRplID;
170 extendedData.m_iNodeDepth = extendedParentTask.GetNodeDepth() + 1;
171 }
172
173 //------------------------------------------------------------------------------------------------
176 array<SCR_Task> GetChildTasks()
177 {
179 if (!extendedData || !extendedData.m_aChildTasks)
180 return null;
181
182 RplComponent rpl;
184
185 array<SCR_Task> childTasks = {};
186 foreach (RplId rplID : extendedData.m_aChildTasks)
187 {
188 rpl = RplComponent.Cast(Replication.FindItem(rplID));
189 if (!rpl)
190 continue;
191
192 task = SCR_Task.Cast(rpl.GetEntity());
193 if (!task)
194 continue;
195
196 childTasks.Insert(task);
197 }
198
199 return childTasks;
200 }
201
202 //------------------------------------------------------------------------------------------------
207 {
209 if (!extendedData)
210 return false;
211
212 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(task);
213 if (!extendedTask)
214 return false;
215
216 RplComponent rpl = RplComponent.Cast(extendedTask.FindComponent(RplComponent));
217 if (!rpl)
218 return false;
219
220 RplId rplID = rpl.Id();
221 if (!rplID)
222 return false;
223
224 extendedTask.SetParentTask(this);
225
226 Rpc_AddChildTask(rplID);
227 Rpc(Rpc_AddChildTask, rplID);
228 return true;
229 }
230
231 //------------------------------------------------------------------------------------------------
232 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
233 protected void Rpc_AddChildTask(RplId taskRplID)
234 {
236 if (!extendedData || !taskRplID)
237 return;
238
239 if (!extendedData.m_aChildTasks)
240 extendedData.m_aChildTasks = new array<RplId>();
241
242 if (extendedData.m_aChildTasks.Contains(taskRplID))
243 return;
244
245 extendedData.m_aChildTasks.Insert(taskRplID);
246
247 RplComponent rpl = RplComponent.Cast(Replication.FindItem(taskRplID));
248 if (!rpl)
249 return;
250
251 SCR_Task task = SCR_Task.Cast(rpl.GetEntity());
252 if (!task)
253 return;
254
256 m_OnChildTaskAdded.Invoke(task);
257 }
258
259 //------------------------------------------------------------------------------------------------
264 {
266 if (!extendedData)
267 return false;
268
269 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(task);
270 if (!extendedTask)
271 return false;
272
273 RplComponent rpl = RplComponent.Cast(extendedTask.FindComponent(RplComponent));
274 if (!rpl)
275 return false;
276
277 RplId rplID = rpl.Id();
278 if (!rplID)
279 return false;
280
281 array<ref SCR_TaskExecutor> assignees = extendedTask.GetTaskAssignees();
282 if (assignees && !assignees.IsEmpty())
283 {
284 foreach (SCR_TaskExecutor assignee : assignees)
285 {
286 extendedTask.RemoveTaskAssignee(assignee);
287 }
288 }
289
290 Rpc_RemoveChildTask(rplID);
291 Rpc(Rpc_RemoveChildTask, rplID);
292 return true;
293 }
294
295 //------------------------------------------------------------------------------------------------
296 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
297 protected void Rpc_RemoveChildTask(RplId taskRplID)
298 {
300 if (!extendedData || !taskRplID)
301 return;
302
303 if (!extendedData.m_aChildTasks || !extendedData.m_aChildTasks.Contains(taskRplID))
304 return;
305
306 extendedData.m_aChildTasks.RemoveItem(taskRplID);
307
308 RplComponent rpl = RplComponent.Cast(Replication.FindItem(taskRplID));
309 if (!rpl)
310 return;
311
312 SCR_Task task = SCR_Task.Cast(rpl.GetEntity());
313 if (!task)
314 return;
315
318 }
319
320 //------------------------------------------------------------------------------------------------
324 {
326 if (!extendedData)
327 return -1;
328
329 return extendedData.m_fProgress;
330 }
331
332 //------------------------------------------------------------------------------------------------
336 void SetTaskProgress(float percentage, bool changeState = true)
337 {
339 if (!extendedData || percentage == extendedData.m_fProgress)
340 return;
341
342 if (percentage < MIN_TASK_PROGRESSION_PERCENTAGE)
344 else
345 if (percentage > MAX_TASK_PROGRESSION_PERCENTAGE)
347
348 float previousProgress = extendedData.m_fProgress;
349
350 Rpc_SetTaskProgress(percentage, previousProgress);
351 Rpc(Rpc_SetTaskProgress, percentage, previousProgress);
352
353 if (changeState)
354 {
355 if (extendedData.m_fProgress >= previousProgress)
356 {
357 if (extendedData.m_fProgress >= MAX_TASK_PROGRESSION_PERCENTAGE && extendedData.m_eState != SCR_ETaskState.COMPLETED)
358 {
359 m_eCachedTaskState = extendedData.m_eState;
360 SetTaskState(SCR_ETaskState.COMPLETED);
361 }
362 else if (extendedData.m_fProgress > MIN_TASK_PROGRESSION_PERCENTAGE && extendedData.m_eState != SCR_ETaskState.PROGRESSED)
363 {
364 m_eCachedTaskState = extendedData.m_eState;
365 SetTaskState(SCR_ETaskState.PROGRESSED);
366 }
367 }
368 else
369 {
370 if (extendedData.m_fProgress <= MIN_TASK_PROGRESSION_PERCENTAGE)
371 {
373 }
374 else if (extendedData.m_fProgress < MAX_TASK_PROGRESSION_PERCENTAGE && extendedData.m_eState != SCR_ETaskState.PROGRESSED)
375 {
376 SetTaskState(SCR_ETaskState.PROGRESSED);
377 }
378 }
379 }
380
381 if (!extendedData.m_bLinkDataToRelatedTasks)
382 return;
383
385 if (!parent)
386 return;
387
388 int childTaskCount = parent.GetChildTaskCount();
389
390 previousProgress /= childTaskCount;
391 parent.RemoveTaskProgress(previousProgress, changeState);
392
393 percentage /= childTaskCount;
394 parent.AddTaskProgress(percentage, changeState);
395 }
396
397 //------------------------------------------------------------------------------------------------
398 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
399 protected void Rpc_SetTaskProgress(float percentage, float previousProgress)
400 {
402 if (!extendedData)
403 return;
404
405 extendedData.m_fProgress = percentage;
406
408 m_OnProgressChanged.Invoke(previousProgress, percentage);
409 }
410
411 //------------------------------------------------------------------------------------------------
415 void AddTaskProgress(float percentage, bool changeState = true)
416 {
418 if (!extendedData || percentage <= 0)
419 return;
420
421 if (percentage > MAX_TASK_PROGRESSION_PERCENTAGE - extendedData.m_fProgress)
422 percentage = MAX_TASK_PROGRESSION_PERCENTAGE - extendedData.m_fProgress;
423
424 Rpc_AddTaskProgress(percentage);
425 Rpc(Rpc_AddTaskProgress, percentage);
426
427 if (changeState)
428 {
429 if (extendedData.m_fProgress >= MAX_TASK_PROGRESSION_PERCENTAGE && extendedData.m_eState != SCR_ETaskState.COMPLETED)
430 {
431 m_eCachedTaskState = extendedData.m_eState;
432 SetTaskState(SCR_ETaskState.COMPLETED);
433 }
434 else if (extendedData.m_fProgress > MIN_TASK_PROGRESSION_PERCENTAGE && extendedData.m_eState != SCR_ETaskState.PROGRESSED)
435 {
436 m_eCachedTaskState = extendedData.m_eState;
437 SetTaskState(SCR_ETaskState.PROGRESSED);
438 }
439 }
440
441 if (!extendedData.m_bLinkDataToRelatedTasks)
442 return;
443
445 if (!parent)
446 return;
447
448 percentage /= parent.GetChildTaskCount();
449 parent.AddTaskProgress(percentage, changeState);
450 }
451
452 //------------------------------------------------------------------------------------------------
453 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
454 protected void Rpc_AddTaskProgress(float percentage)
455 {
457 if (!extendedData || percentage <= 0)
458 return;
459
460 extendedData.m_fProgress += percentage;
461
463 m_OnProgressChanged.Invoke(extendedData.m_fProgress - percentage, extendedData.m_fProgress);
464 }
465
466 //------------------------------------------------------------------------------------------------
470 void RemoveTaskProgress(float percentage, bool changeState = true)
471 {
473 if (!extendedData || percentage <= 0)
474 return;
475
476 if (percentage > extendedData.m_fProgress)
477 percentage = extendedData.m_fProgress;
478
479 Rpc_RemoveTaskProgress(percentage);
480 Rpc(Rpc_RemoveTaskProgress, percentage);
481
482 if (changeState)
483 {
484 if (extendedData.m_fProgress <= MIN_TASK_PROGRESSION_PERCENTAGE)
486 else if (extendedData.m_fProgress < MAX_TASK_PROGRESSION_PERCENTAGE && extendedData.m_eState != SCR_ETaskState.PROGRESSED)
487 SetTaskState(SCR_ETaskState.PROGRESSED);
488 }
489
490 if (!extendedData.m_bLinkDataToRelatedTasks)
491 return;
492
494 if (!parent)
495 return;
496
497 percentage /= parent.GetChildTaskCount();
498 parent.RemoveTaskProgress(percentage, changeState);
499 }
500
501 //------------------------------------------------------------------------------------------------
502 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
503 protected void Rpc_RemoveTaskProgress(float percentage)
504 {
506 if (!extendedData || percentage <= 0)
507 return;
508
509 extendedData.m_fProgress -= percentage;
510
512 m_OnProgressChanged.Invoke(extendedData.m_fProgress + percentage, extendedData.m_fProgress);
513 }
514
515 //------------------------------------------------------------------------------------------------
519 {
521 if (!extendedData)
522 return false;
523
524 return extendedData.m_bEnableProgress;
525 }
526
527 //------------------------------------------------------------------------------------------------
531 void ShowTaskProgress(bool enable)
532 {
534 if (!extendedData)
535 return;
536
537 Rpc_ShowTaskProgress(enable);
538 Rpc(Rpc_ShowTaskProgress, enable);
539 }
540
541 //------------------------------------------------------------------------------------------------
542 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
543 protected void Rpc_ShowTaskProgress(bool enable)
544 {
546 if (!extendedData)
547 return;
548
549 extendedData.m_bEnableProgress = enable;
550 }
551
552 //------------------------------------------------------------------------------------------------
560 override bool AddTaskAssignee(SCR_TaskExecutor executor, bool listenToInvokers = true, int requesterID = 0)
561 {
562 if (!super.AddTaskAssignee(executor, listenToInvokers, requesterID))
563 return false;
564
566 if (!extendedData)
567 return false;
568
570 if (parent && !parent.AddTaskAssignee(executor, listenToInvokers, requesterID))
571 return false;
572
573 return true;
574 }
575
576 //------------------------------------------------------------------------------------------------
584 override bool RemoveTaskAssignee(SCR_TaskExecutor executor, bool listenToInvokers = true, int requesterID = 0)
585 {
586 if (!super.RemoveTaskAssignee(executor, listenToInvokers, requesterID))
587 return false;
588
590 if (!extendedData)
591 return false;
592
594 if (parent)
595 {
596 if (!parent.RemoveTaskAssignee(executor, listenToInvokers, requesterID))
597 return false;
598
599 return true;
600 }
601
602 array<SCR_Task> childTasks = GetChildTasks();
603 if (!childTasks || childTasks.IsEmpty())
604 return true;
605
606 SCR_ExtendedTask child;
607 foreach (SCR_Task childTask : childTasks)
608 {
609 child = SCR_ExtendedTask.Cast(childTask);
610 if (!child)
611 continue;
612
613 child.RemoveTaskAssignee(executor, listenToInvokers, requesterID);
614 }
615
616 return true;
617 }
618
619 //------------------------------------------------------------------------------------------------
620 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
621 override protected void Rpc_AddOwnerFactionKey(FactionKey factionKey)
622 {
623 super.Rpc_AddOwnerFactionKey(factionKey);
624
626 if (!extendedData)
627 return;
628
629 if (!extendedData.m_bLinkDataToRelatedTasks)
630 return;
631
632 array<SCR_Task> childTasks = GetChildTasks();
633 if (!childTasks || childTasks.IsEmpty())
634 return;
635
636 SCR_ExtendedTask child;
637 foreach (SCR_Task childTask : childTasks)
638 {
639 child = SCR_ExtendedTask.Cast(childTask);
640 if (!child)
641 continue;
642
643 child.AddOwnerFactionKey(factionKey);
644 }
645 }
646
647 //------------------------------------------------------------------------------------------------
648 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
649 override protected void Rpc_RemoveOwnerFactionKey(FactionKey factionKey)
650 {
651 super.Rpc_RemoveOwnerFactionKey(factionKey);
652
654 if (!extendedData)
655 return;
656
657 if (!extendedData.m_bLinkDataToRelatedTasks)
658 return;
659
660 array<SCR_Task> childTasks = GetChildTasks();
661 if (!childTasks || childTasks.IsEmpty())
662 return;
663
664 SCR_ExtendedTask child;
665 foreach (SCR_Task childTask : childTasks)
666 {
667 child = SCR_ExtendedTask.Cast(childTask);
668 if (!child)
669 continue;
670
671 child.RemoveOwnerFactionKey(factionKey);
672 }
673 }
674
675 //------------------------------------------------------------------------------------------------
676 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
677 override protected void Rpc_AddOwnerGroupID(int groupID)
678 {
679 super.Rpc_AddOwnerGroupID(groupID);
680
682 if (!extendedData)
683 return;
684
685 if (!extendedData.m_bLinkDataToRelatedTasks)
686 return;
687
688 array<SCR_Task> childTasks = GetChildTasks();
689 if (!childTasks || childTasks.IsEmpty())
690 return;
691
692 SCR_ExtendedTask child;
693 foreach (SCR_Task childTask : childTasks)
694 {
695 child = SCR_ExtendedTask.Cast(childTask);
696 if (!child)
697 continue;
698
699 child.AddOwnerGroupID(groupID);
700 }
701 }
702
703 //------------------------------------------------------------------------------------------------
704 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
705 override protected void Rpc_RemoveOwnerGroupID(int groupID)
706 {
707 super.Rpc_RemoveOwnerGroupID(groupID);
708
710 if (!extendedData)
711 return;
712
713 if (!extendedData.m_bLinkDataToRelatedTasks)
714 return;
715
716 array<SCR_Task> childTasks = GetChildTasks();
717 if (!childTasks || childTasks.IsEmpty())
718 return;
719
720 SCR_ExtendedTask child
721 foreach (SCR_Task childTask : childTasks)
722 {
723 child = SCR_ExtendedTask.Cast(childTask);
724 if (!child)
725 continue;
726
727 child.RemoveOwnerGroupID(groupID);
728 }
729 }
730
731 //------------------------------------------------------------------------------------------------
735 override bool AddOwnerExecutor(SCR_TaskExecutor executor)
736 {
737 if (!super.AddOwnerExecutor(executor))
738 return false;
739
741 if (!extendedData)
742 return false;
743
744 if (!extendedData.m_bLinkDataToRelatedTasks)
745 return true;
746
747 array<SCR_Task> childTasks = GetChildTasks();
748 if (!childTasks || childTasks.IsEmpty())
749 return true;
750
751 SCR_ExtendedTask child;
752 foreach (SCR_Task childTask : childTasks)
753 {
754 child = SCR_ExtendedTask.Cast(childTask);
755 if (!child)
756 continue;
757
758 child.AddOwnerExecutor(executor);
759 }
760
761 return true;
762 }
763
764 //------------------------------------------------------------------------------------------------
768 override bool RemoveOwnerExecutor(SCR_TaskExecutor executor)
769 {
770 if (!super.RemoveOwnerExecutor(executor))
771 return false;
772
774 if (!extendedData)
775 return false;
776
777 if (!extendedData.m_bLinkDataToRelatedTasks)
778 return true;
779
780 array<SCR_Task> childTasks = GetChildTasks();
781 if (!childTasks || childTasks.IsEmpty())
782 return true;
783
784 SCR_ExtendedTask child;
785 foreach (SCR_Task childTask : childTasks)
786 {
787 child = SCR_ExtendedTask.Cast(childTask);
788 if (!child)
789 continue;
790
791 child.RemoveOwnerExecutor(executor);
792 }
793
794 return true;
795 }
796
797 //------------------------------------------------------------------------------------------------
798 override void SetTaskState(SCR_ETaskState state)
799 {
800 super.SetTaskState(state);
801
802 if (state != SCR_ETaskState.COMPLETED)
803 return;
804
806 if (!extendedData)
807 return;
808
809 if (!extendedData.m_bLinkDataToRelatedTasks)
810 return;
811
813 if (!parent)
814 return;
815
816 SCR_ExtendedTaskData extendedDataParent = SCR_ExtendedTaskData.Cast(parent.GetTaskData());
817 if (!extendedDataParent)
818 return;
819
820 if (!extendedDataParent.m_bEnableProgress)
821 return;
822
823 float percentage = 100 / parent.GetChildTaskCount();
824 parent.AddTaskProgress(percentage);
825 }
826
827 //------------------------------------------------------------------------------------------------
828 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
829 override protected void Rpc_SetTaskOwnership(SCR_ETaskOwnership ownership)
830 {
831 super.Rpc_SetTaskOwnership(ownership);
832
834 if (!extendedData)
835 return;
836
837 if (!extendedData.m_bLinkDataToRelatedTasks)
838 return;
839
840 array<SCR_Task> childTasks = GetChildTasks();
841 if (!childTasks || childTasks.IsEmpty())
842 return;
843
844 SCR_ExtendedTask child;
845 foreach (SCR_Task childTask : childTasks)
846 {
847 child = SCR_ExtendedTask.Cast(childTask);
848 if (!child)
849 continue;
850
851 if (child.GetTaskOwnership() > ownership)
852 child.SetTaskOwnership(ownership);
853 }
854 }
855
856 //------------------------------------------------------------------------------------------------
857 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
858 override protected void Rpc_SetTaskVisibility(SCR_ETaskVisibility visibility)
859 {
860 super.Rpc_SetTaskVisibility(visibility);
861
863 if (!extendedData)
864 return;
865
866 if (!extendedData.m_bLinkDataToRelatedTasks)
867 return;
868
869 array<SCR_Task> childTasks = GetChildTasks();
870 if (!childTasks || childTasks.IsEmpty())
871 return;
872
873 SCR_ExtendedTask child;
874 foreach (SCR_Task childTask : childTasks)
875 {
876 child = SCR_ExtendedTask.Cast(childTask);
877 if (!child)
878 continue;
879
880 if (child.GetTaskVisibility() > visibility)
881 child.SetTaskVisibility(visibility);
882 }
883 }
884
885 //------------------------------------------------------------------------------------------------
895
896 //------------------------------------------------------------------------------------------------
906
907 //------------------------------------------------------------------------------------------------
917
918#ifdef WORKBENCH
919 //------------------------------------------------------------------------------------------------
920 override void _WB_AfterWorldUpdate(float timeSlice)
921 {
922 vector textPosition = GetOrigin() + vector.Up * 0.5;
923 m_DebugText = DebugTextWorldSpace.Create(GetWorld(), "ExtendedTask [" + m_sTaskID + "]", DebugTextFlags.CENTER, textPosition[0], textPosition[1], textPosition[2], 15.0, Color.CYAN, Color.BLUE);
924 }
925#endif
926
927 //------------------------------------------------------------------------------------------------
928 override protected bool RplSave(ScriptBitWriter writer)
929 {
930 if (!super.RplSave(writer))
931 return false;
932
934 if (!extendedData)
935 {
936 writer.WriteBool(false);
937 return true;
938 }
939
940 writer.WriteBool(true);
941 writer.WriteRplId(extendedData.m_ParentTask);
942 writer.WriteInt(extendedData.m_iNodeDepth);
943
944 writer.WriteBool(extendedData.m_bLinkDataToRelatedTasks);
945
946 writer.WriteFloat(extendedData.m_fProgress);
947 writer.WriteBool(extendedData.m_bEnableProgress);
948
949 writer.WriteString(extendedData.m_sCustomSubtaskDescription);
950
951 int childTaskCount = 0;
952 if (extendedData.m_aChildTasks)
953 childTaskCount = extendedData.m_aChildTasks.Count();
954
955 writer.WriteInt(childTaskCount);
956 if (childTaskCount > 0)
957 {
958 foreach (RplId rplID : extendedData.m_aChildTasks)
959 {
960 writer.WriteRplId(rplID);
961 }
962 }
963
964 return true;
965 }
966
967 //------------------------------------------------------------------------------------------------
968 override protected bool RplLoad(ScriptBitReader reader)
969 {
970 if (!m_TaskData)
972
973 if (!super.RplLoad(reader))
974 return false;
975
976 bool hasExtendedData;
977 reader.ReadBool(hasExtendedData);
978 if (!hasExtendedData)
979 return true;
980
982 if (!extendedData) // this shouldn't happen but just being safe
983 {
984 extendedData = new SCR_ExtendedTaskData();
985 m_TaskData = extendedData;
986 }
987
988 reader.ReadRplId(extendedData.m_ParentTask);
989 reader.ReadInt(extendedData.m_iNodeDepth);
990
991 reader.ReadBool(extendedData.m_bLinkDataToRelatedTasks);
992
993 reader.ReadFloat(extendedData.m_fProgress);
994 reader.ReadBool(extendedData.m_bEnableProgress);
995
996 reader.ReadString(extendedData.m_sCustomSubtaskDescription);
997
998 int childTaskCount;
999 reader.ReadInt(childTaskCount);
1000 if (childTaskCount > 0)
1001 {
1002 extendedData.m_aChildTasks = {};
1003
1004 for (int i = 0; i < childTaskCount; i++)
1005 {
1006 RplId rplID;
1007 reader.ReadRplId(rplID);
1008
1009 if (rplID.IsValid())
1010 extendedData.m_aChildTasks.Insert(rplID);
1011 }
1012 }
1013
1014 return true;
1015 }
1016
1017 //------------------------------------------------------------------------------------------------
1018 override protected void InitializeData()
1019 {
1020 if (!m_TaskData)
1022
1023 super.InitializeData();
1024
1026 if (!extendedData)
1027 return;
1028
1029 extendedData.m_ParentTask = RplId.Invalid();
1030 extendedData.m_iNodeDepth = 0;
1031
1032 extendedData.m_aChildTasks = {};
1033
1034 extendedData.m_bLinkDataToRelatedTasks = m_bLinkDataToRelatedTasks;
1035
1036 extendedData.m_fProgress = m_fProgress;
1037 extendedData.m_bEnableProgress = m_bEnableProgress;
1038
1039 extendedData.m_sCustomSubtaskDescription = m_sCustomSubtaskDescription;
1040 }
1041
1042 //------------------------------------------------------------------------------------------------
1043 protected void InitializeChildTasks()
1044 {
1045 float combinedProgress = 0;
1046
1047 IEntity child = GetChildren();
1048 while (child)
1049 {
1050 SCR_ExtendedTask childTask = SCR_ExtendedTask.Cast(child);
1051 if (childTask)
1052 {
1053 AddChildTask(childTask);
1054
1055 if (childTask.GetTaskState() == SCR_ETaskState.COMPLETED)
1056 combinedProgress += MAX_TASK_PROGRESSION_PERCENTAGE;
1057 else
1058 combinedProgress += childTask.GetTaskProgress();
1059 }
1060
1061 child = child.GetSibling();
1062 }
1063
1064 if (combinedProgress <= 0)
1065 return;
1066
1068 if (!extendedData)
1069 return;
1070
1071 extendedData.m_fProgress = combinedProgress / GetChildTaskCount();
1072 }
1073
1074 //------------------------------------------------------------------------------------------------
1075 override void EOnInit(IEntity owner)
1076 {
1077 super.EOnInit(owner);
1078
1079 if (Replication.IsClient())
1080 return;
1081
1082 // Wait until task data has been initialized for all tasks until trying to parent
1083 GetGame().GetCallqueue().CallLater(InitializeChildTasks, 100);
1084 }
1085}
ArmaReforgerScripted GetGame()
Definition game.c:1398
vector GetOrigin()
ScriptInvokerBase< ChildTaskInvokerDelegate > SCR_ChildTaskInvoker
func ChildTaskInvokerDelegate
void GetChildren(out array< SCR_ScenarioFrameworkLayerBase > children)
ScriptInvokerBase< ScriptInvokerFloat2Method > ScriptInvokerFloat2
SCR_ETaskVisibility
Definition SCR_Task.c:24
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
ref SCR_TaskData m_TaskData
Definition SCR_Task.c:110
SCR_ETaskState
Definition SCR_Task.c:3
Definition Color.c:13
proto external IEntity GetSibling()
Main replication API.
Definition Replication.c:14
Replication item identifier.
Definition RplId.c:14
const float MAX_TASK_PROGRESSION_PERCENTAGE
SCR_ChildTaskInvoker GetOnChildTaskRemoved()
SCR_ChildTaskInvoker GetOnChildTaskAdded()
void SetTaskProgress(float percentage, bool changeState=true)
override bool AddTaskAssignee(SCR_TaskExecutor executor, bool listenToInvokers=true, int requesterID=0)
void ShowTaskProgress(bool enable)
void Rpc_AddChildTask(RplId taskRplID)
void SetCustomSubtaskDescription(LocalizedString subTaskDescription)
LocalizedString GetCustomSubtaskDescription()
void Rpc_RemoveOwnerFactionKey(FactionKey factionKey)
void Rpc_ShowTaskProgress(bool enable)
void RemoveTaskProgress(float percentage, bool changeState=true)
override bool RemoveOwnerExecutor(SCR_TaskExecutor executor)
array< SCR_Task > GetChildTasks()
void Rpc_SetTaskProgress(float percentage, float previousProgress)
void Rpc_SetTaskVisibility(SCR_ETaskVisibility visibility)
bool RemoveChildTask(SCR_Task task)
void Rpc_AddOwnerGroupID(int groupID)
ref SCR_ChildTaskInvoker m_OnChildTaskRemoved
override bool RemoveTaskAssignee(SCR_TaskExecutor executor, bool listenToInvokers=true, int requesterID=0)
bool AddChildTask(SCR_Task task)
ref ScriptInvokerFloat2 m_OnProgressChanged
void Rpc_SetTaskOwnership(SCR_ETaskOwnership ownership)
void Rpc_RemoveTaskProgress(float percentage)
const float MIN_TASK_PROGRESSION_PERCENTAGE
bool RplSave(ScriptBitWriter writer)
void Rpc_AddOwnerFactionKey(FactionKey factionKey)
void Rpc_RemoveOwnerGroupID(int groupID)
ref SCR_ChildTaskInvoker m_OnChildTaskAdded
void Rpc_SetCustomSubtaskDescription(LocalizedString subTaskDescription)
bool RplLoad(ScriptBitReader reader)
SCR_ETaskState m_eCachedTaskState
LocalizedString m_sCustomSubtaskDescription
override void EOnInit(IEntity owner)
void AddTaskProgress(float percentage, bool changeState=true)
override bool AddOwnerExecutor(SCR_TaskExecutor executor)
override void SetTaskState(SCR_ETaskState state)
void Rpc_RemoveChildTask(RplId taskRplID)
ScriptInvokerFloat2 GetOnProgressChanged()
void Rpc_AddTaskProgress(float percentage)
void SetParentTask(SCR_ExtendedTask parentTask)
void Rpc_SetParentTask(RplId parentTaskRplID)
DebugTextFlags
SCR_FieldOfViewSettings Attribute
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