7 protected RplComponent
m_Rpl;
13 protected static ref array<SCR_Task>
s_aTasks = {};
19 private bool diag_taskListMenu;
20 private int diag_taskListMenuSelection;
21 private string diag_taskListMenuExecutorName;
24 private const int DIAG_MAX_NAME_LENGTH = 30;
25 private const int DIAG_MAX_NAME_LENGTH_LIST = 20;
26 private const int DIAG_MAX_DESCRIPTION_LENGTH = 23;
31 super.InitInfo(outInfo);
93 void GetAssigneesForTask(notnull
SCR_Task task, out array<ref SCR_TaskExecutor> assignees)
95 assignees =
task.GetTaskAssignees();
104 return task.GetTaskUIVisibility() == SCR_ETaskUIVisibility.ALL ||
task.GetTaskUIVisibility() == SCR_ETaskUIVisibility.LIST_ONLY;
113 return task.GetTaskUIVisibility() == SCR_ETaskUIVisibility.ALL ||
task.GetTaskUIVisibility() == SCR_ETaskUIVisibility.MAP_ONLY;
121 bool IsTaskVisibleFor(notnull
SCR_Task task, notnull SCR_TaskExecutor executor)
131 array<ref SCR_TaskExecutor> executors =
task.GetOwnerExecutors();
135 SCR_TaskExecutor match = SCR_TaskExecutor.FindMatchingTaskExecutor(executors, executor,
true);
141 array<ref SCR_TaskExecutor> assignees =
task.GetTaskAssignees();
145 SCR_TaskExecutor match = SCR_TaskExecutor.FindMatchingTaskExecutor(assignees, executor,
true);
151 int groupID = executor.GetGroupID();
155 array<int> groupIDs =
task.GetOwnerGroupIDs();
159 if (!groupIDs.Contains(groupID))
164 FactionKey factionKey = executor.GetFactionKey();
168 array<string> factionKeys =
task.GetOwnerFactionKeys();
172 if (!factionKeys.Contains(factionKey))
184 bool CanTaskBeAssignedTo(notnull
SCR_Task task, notnull SCR_TaskExecutor executor)
186 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
194 SCR_ETaskOwnership ownership =
task.GetTaskOwnership();
196 if (ownership == SCR_ETaskOwnership.NONE)
200 else if (ownership == SCR_ETaskOwnership.EXECUTOR)
202 array<ref SCR_TaskExecutor> executors =
task.GetOwnerExecutors();
206 SCR_TaskExecutor match = SCR_TaskExecutor.FindMatchingTaskExecutor(executors, executor);
209 array<int> groupIDs = {};
210 foreach (SCR_TaskExecutor e : executors)
212 SCR_TaskExecutorGroup eGroup = SCR_TaskExecutorGroup.Cast(e);
217 SCR_TaskExecutorPlayer executorPlayer = SCR_TaskExecutorPlayer.Cast(executor);
221 if (!IsGroupLeader(groupIDs, executorPlayer.
GetPlayerID()))
225 else if (ownership == SCR_ETaskOwnership.GROUP)
227 int groupID = executor.GetGroupID();
231 array<int> groupIDs =
task.GetOwnerGroupIDs();
235 if (!groupIDs.Contains(groupID))
238 else if (ownership == SCR_ETaskOwnership.FACTION)
240 FactionKey factionKey = executor.GetFactionKey();
244 array<string> factionKeys =
task.GetOwnerFactionKeys();
248 if (!factionKeys.Contains(factionKey))
259 bool IsGroupLeader(notnull array<int> groupIDs,
int playerID)
262 if (!groupsManagerComponent)
265 if (!groupIDs || groupIDs.IsEmpty())
269 foreach (
int groupID : groupIDs)
271 group = groupsManagerComponent.FindGroup(groupID);
276 if (groupLeaderID == playerID)
288 int FindGroupByLeader(notnull array<int> groupIDs,
int leaderID)
291 if (!groupsManagerComponent)
294 if (!groupIDs || groupIDs.IsEmpty())
297 foreach (
int groupID : groupIDs)
299 SCR_AIGroup group = groupsManagerComponent.FindGroup(groupID);
314 int GetTasks(out notnull array<SCR_Task> outTasks)
317 return outTasks.Count();
324 SCR_Task GetTaskAssignedTo(notnull SCR_TaskExecutor executor)
331 if (
task.IsTaskAssignedTo(executor))
348 array<string> factionKeys;
356 if ((state &
task.GetTaskState()) == 0)
361 factionKeys =
task.GetOwnerFactionKeys();
362 if (!factionKeys || factionKeys.IsEmpty())
365 if (!factionKeys.Contains(filterFaction))
369 if (filterGroup > -1)
371 groupIDs =
task.GetOwnerGroupIDs();
372 if (!groupIDs || groupIDs.IsEmpty())
375 if (!groupIDs.Contains(filterGroup))
379 outTasks.Insert(
task);
391 int GetTasksByStateFiltered(out notnull array<SCR_Task> outTasks,
SCR_ETaskState state,
FactionKey filterFaction =
FactionKey.Empty,
int filterGroup = -1,
typename filterClass =
typename.Empty,
bool allowInherited =
false)
393 SCR_TaskSystem.GetInstance().GetTasksByState(outTasks, state, filterFaction, filterGroup);
395 if (filterClass == filterClass.Empty)
396 return outTasks.Count();
398 for (
int i = outTasks.Count() - 1; i >= 0; i--)
407 if (outTasks[i].
Type() != filterClass)
412 return outTasks.Count();
420 int GetTasksVisibleFor(out notnull array<SCR_Task> outTasks, notnull SCR_TaskExecutor executor)
424 array<SCR_Task> tasks = {};
431 if (!IsTaskVisibleFor(
task, executor))
434 outTasks.Insert(
task);
437 return outTasks.Count();
469 void AssignTask(notnull
SCR_Task task, notnull SCR_TaskExecutor executor,
bool force =
false,
int requesterID = 0)
471 if (Replication.IsClient())
473 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
477 if (
task.IsTaskAssignedTo(executor))
480 SCR_TaskExecutor assignee;
484 if (
task.GetTaskOwnership() == SCR_ETaskOwnership.EXECUTOR)
486 array<ref SCR_TaskExecutor> ownerExecutors =
task.GetOwnerExecutors();
487 if (ownerExecutors && !ownerExecutors.IsEmpty())
489 array<int> groupIDs = {};
490 foreach (SCR_TaskExecutor ownerExecutor : ownerExecutors)
492 SCR_TaskExecutorGroup ownerExecutorGroup = SCR_TaskExecutorGroup.Cast(ownerExecutor);
493 if (ownerExecutorGroup)
494 groupIDs.Insert(ownerExecutorGroup.
GetGroupID());
497 SCR_TaskExecutorPlayer assigneePlayer = SCR_TaskExecutorPlayer.Cast(assignee);
500 int groupID = FindGroupByLeader(groupIDs, assigneePlayer.
GetPlayerID());
502 assignee = TaskExecutorFromGroup(groupID);
510 SCR_TaskExecutorPlayer assigneePlayer = SCR_TaskExecutorPlayer.Cast(assignee);
513 PlayerManager playerManager =
GetGame().GetPlayerManager();
518 name = playerManager.GetPlayerName(playerID);
519 suffix = playerID.ToString();
522 SCR_TaskExecutorEntity assigneeEntity = SCR_TaskExecutorEntity.Cast(assignee);
530 suffix = entity.Type().ToString();
533 SCR_TaskExecutorGroup assigneeGroup = SCR_TaskExecutorGroup.Cast(assignee);
537 if (!groupsManagerComponent)
549 if (!CanTaskBeAssignedTo(
task, assignee))
551 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" cannot be assigned to " + name +
"(" + suffix +
")",
LogLevel.WARNING);
560 if (t.IsTaskAssignedTo(assignee))
564 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" is already assigned to " + name +
"(" + suffix +
")",
LogLevel.WARNING);
570 Print(
"SCR_TaskSystem: " + name +
"(" + suffix +
") can only have 1 task assigned to it at a time!",
LogLevel.WARNING);
574 t.RemoveTaskAssignee(assignee,
true, requesterID);
578 if (!
task.AddTaskAssignee(assignee,
true, requesterID))
580 Print(
"SCR_TaskSystem: Could not assign " + name +
"(" + suffix +
") to task with ID: " +
task.GetTaskID(),
LogLevel.ERROR);
588 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" force-assigned to " + name +
"(" + suffix +
")",
LogLevel.DEBUG);
590 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" assigned to " + name +
"(" + suffix +
")",
LogLevel.DEBUG);
598 void UnassignTask(notnull
SCR_Task task, notnull SCR_TaskExecutor executor,
int requesterID = 0)
600 if (Replication.IsClient())
602 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
606 SCR_TaskExecutor assignee;
610 if (
task.GetTaskOwnership() == SCR_ETaskOwnership.EXECUTOR)
612 array<ref SCR_TaskExecutor> ownerExecutors =
task.GetOwnerExecutors();
613 if (ownerExecutors && !ownerExecutors.IsEmpty())
615 array<int> groupIDs = {};
616 foreach (SCR_TaskExecutor ownerExecutor : ownerExecutors)
618 SCR_TaskExecutorGroup ownerExecutorGroup = SCR_TaskExecutorGroup.Cast(ownerExecutor);
619 if (ownerExecutorGroup)
620 groupIDs.Insert(ownerExecutorGroup.
GetGroupID());
623 SCR_TaskExecutorPlayer assigneePlayer = SCR_TaskExecutorPlayer.Cast(assignee);
626 int groupID = FindGroupByLeader(groupIDs, assigneePlayer.
GetPlayerID());
628 assignee = TaskExecutorFromGroup(groupID);
636 SCR_TaskExecutorPlayer assigneePlayer = SCR_TaskExecutorPlayer.Cast(assignee);
639 PlayerManager playerManager =
GetGame().GetPlayerManager();
644 name = playerManager.GetPlayerName(playerID);
645 suffix = playerID.ToString();
648 SCR_TaskExecutorEntity assigneeEntity = SCR_TaskExecutorEntity.Cast(assignee);
656 suffix = entity.Type().ToString();
659 SCR_TaskExecutorGroup assigneeGroup = SCR_TaskExecutorGroup.Cast(assignee);
663 if (!groupsManagerComponent)
675 if (!
task.RemoveTaskAssignee(assignee,
true, requesterID))
677 Print(
"SCR_TaskSystem: Could not unassign " + name +
"(" + suffix +
") from task with ID: " +
task.GetTaskID(),
LogLevel.ERROR);
684 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" unassigned from " + name +
"(" + suffix +
")",
LogLevel.DEBUG);
693 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
705 void ShowProgressForTask(notnull
SCR_Task task,
bool enable)
707 if (Replication.IsClient())
709 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
713 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
716 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" is not an extended task!",
LogLevel.WARNING);
723 Print(
"SCR_TaskSystem: Enabled progress bar for task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
725 Print(
"SCR_TaskSystem: Disabled progress bar for task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
734 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
746 void SetTaskProgress(notnull
SCR_Task task,
float percentage)
748 if (Replication.IsClient())
750 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
754 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
757 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" is not an extended task!",
LogLevel.WARNING);
762 Print(
"SCR_TaskSystem: Changed progress of task with ID: " +
task.GetTaskID() +
" to " + percentage +
"%",
LogLevel.DEBUG);
770 void AddTaskProgress(notnull
SCR_Task task,
float percentage)
772 if (Replication.IsClient())
774 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
778 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
781 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" is not an extended task!",
LogLevel.WARNING);
786 Print(
"SCR_TaskSystem: Added " + percentage +
"% progress to task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
794 void RemoveTaskProgress(notnull
SCR_Task task,
float percentage)
796 if (Replication.IsClient())
798 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
802 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
805 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" is not an extended task!",
LogLevel.WARNING);
810 Print(
"SCR_TaskSystem: Removed " + percentage +
"% progress from task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
822 return task.GetTaskState();
831 if (Replication.IsClient())
833 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
837 task.SetTaskState(state);
850 return task.GetTaskOwnership();
857 void SetTaskOwnership(notnull
SCR_Task task, SCR_ETaskOwnership ownership)
859 if (Replication.IsClient())
861 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
865 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
872 if (ownership > parentTask.GetTaskOwnership())
874 Print(
"SCR_TaskSystem: Cannot change ownership for task with ID: " +
task.GetTaskID() +
" as ownership level cannot be higher than parent!",
LogLevel.WARNING);
879 task.SetTaskOwnership(ownership);
881 array<ref SCR_TaskExecutor> assignees =
task.GetTaskAssignees();
882 if (assignees && !assignees.IsEmpty())
884 foreach (SCR_TaskExecutor assignee : assignees)
886 if (!CanTaskBeAssignedTo(
task, assignee))
887 task.RemoveTaskAssignee(assignee);
891 Print(
"SCR_TaskSystem: Changed ownership for task with ID: " +
task.GetTaskID() +
" to " + SCR_Enum.GetEnumName(SCR_ETaskOwnership, ownership),
LogLevel.DEBUG);
903 return task.GetTaskVisibility();
912 if (Replication.IsClient())
914 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
918 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
925 if (visibility > parentTask.GetTaskVisibility())
927 Print(
"SCR_TaskSystem: Cannot change visibility for task with ID: " +
task.GetTaskID() +
" as visibility level cannot be higher than parent!",
LogLevel.WARNING);
932 task.SetTaskVisibility(visibility);
945 return task.GetTaskUIVisibility();
952 void SetTaskUIVisibility(notnull
SCR_Task task, SCR_ETaskUIVisibility visibility)
954 if (Replication.IsClient())
956 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
960 task.SetTaskUIVisibility(visibility);
961 Print(
"SCR_TaskSystem: Changed UI visibility for task with ID: " +
task.GetTaskID() +
" to " + SCR_Enum.GetEnumName(SCR_ETaskUIVisibility, visibility),
LogLevel.DEBUG);
973 return task.GetOwnerFactionKeys();
982 if (Replication.IsClient())
984 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
988 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
995 if (parentTask.GetTaskOwnership() <= SCR_ETaskOwnership.FACTION || parentTask.GetTaskVisibility() <=
SCR_ETaskVisibility.FACTION)
997 Print(
"SCR_TaskSystem: Cannot add faction to task with ID: " +
task.GetTaskID() +
" as parent task does not allow it!",
LogLevel.WARNING);
1002 FactionManager factionManager =
GetGame().GetFactionManager();
1003 if (!factionManager)
1006 if (!factionManager.GetFactionByKey(factionKey))
1008 Print(
"SCR_TaskSystem: Faction with key: " + factionKey +
" does not exist!",
LogLevel.WARNING);
1012 task.AddOwnerFactionKey(factionKey);
1013 Print(
"SCR_TaskSystem: Added faction with key: " + factionKey +
" to task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1022 if (Replication.IsClient())
1024 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1028 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
1035 if (parentTask.GetTaskOwnership() <= SCR_ETaskOwnership.FACTION || parentTask.GetTaskVisibility() <=
SCR_ETaskVisibility.FACTION)
1037 Print(
"SCR_TaskSystem: Cannot remove faction from task with ID: " +
task.GetTaskID() +
" as parent task does not allow it!",
LogLevel.WARNING);
1042 FactionManager factionManager =
GetGame().GetFactionManager();
1043 if (!factionManager)
1046 if (!factionManager.GetFactionByKey(factionKey))
1048 Print(
"SCR_TaskSystem: Faction with key: " + factionKey +
" does not exist!",
LogLevel.WARNING);
1052 task.RemoveOwnerFactionKey(factionKey);
1054 array<ref SCR_TaskExecutor> assignees =
task.GetTaskAssignees();
1055 if (assignees && !assignees.IsEmpty())
1057 foreach (SCR_TaskExecutor assignee : assignees)
1059 if (!CanTaskBeAssignedTo(
task, assignee))
1060 task.RemoveTaskAssignee(assignee);
1064 Print(
"SCR_TaskSystem: Removed faction with key: " + factionKey +
" from task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1076 return task.GetOwnerGroupIDs();
1085 if (Replication.IsClient())
1087 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1095 SCR_AIGroup group = groupsManager.FindGroup(groupID);
1098 Print(
"SCR_TaskSystem: Group with ID: " + groupID +
" does not exist!",
LogLevel.WARNING);
1102 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
1109 if (parentTask.GetTaskOwnership() <= SCR_ETaskOwnership.GROUP || parentTask.GetTaskVisibility() <=
SCR_ETaskVisibility.GROUP)
1111 Print(
"SCR_TaskSystem: Cannot add group with ID: " + groupID +
" to task with ID: " +
task.GetTaskID() +
" as parent task does not allow it!",
LogLevel.WARNING);
1115 array<string> parentTaskFactions = parentTask.GetOwnerFactionKeys();
1116 if ((!parentTaskFactions || !parentTaskFactions.Contains(group.
GetFactionName())) && parentTask.GetTaskOwnership() == SCR_ETaskOwnership.FACTION)
1118 Print(
"SCR_TaskSystem: Cannot add group with ID: " + groupID +
" to task with ID: " +
task.GetTaskID() +
" as group is from another faction!",
LogLevel.WARNING);
1123 task.AddOwnerGroupID(groupID);
1124 Print(
"SCR_TaskSystem: Added group with ID: " + groupID +
" to task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1131 void RemoveTaskGroup(notnull
SCR_Task task,
int groupID)
1133 if (Replication.IsClient())
1135 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1143 SCR_AIGroup group = groupsManager.FindGroup(groupID);
1146 Print(
"SCR_TaskSystem: Group with ID: " + groupID +
" does not exist!",
LogLevel.WARNING);
1150 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
1157 if (parentTask.GetTaskOwnership() <= SCR_ETaskOwnership.GROUP || parentTask.GetTaskVisibility() <=
SCR_ETaskVisibility.GROUP)
1159 Print(
"SCR_TaskSystem: Cannot remove group with ID: " + groupID +
" from task with ID: " +
task.GetTaskID() +
" as parent task does not allow it!",
LogLevel.WARNING);
1164 task.RemoveOwnerGroupID(groupID);
1166 array<ref SCR_TaskExecutor> assignees =
task.GetTaskAssignees();
1167 if (assignees && !assignees.IsEmpty())
1169 foreach (SCR_TaskExecutor assignee : assignees)
1171 if (!CanTaskBeAssignedTo(
task, assignee))
1172 task.RemoveTaskAssignee(assignee);
1176 Print(
"SCR_TaskSystem: Removed group with ID: " + groupID +
" from task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1183 array<ref SCR_TaskExecutor> GetTaskExecutors(notnull
SCR_Task task)
1188 return task.GetOwnerExecutors();
1195 void AddTaskExecutor(notnull
SCR_Task task, notnull SCR_TaskExecutor executor)
1197 if (Replication.IsClient())
1199 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1203 string name, suffix;
1206 SCR_TaskExecutorPlayer executorPlayer = SCR_TaskExecutorPlayer.Cast(executor);
1209 PlayerManager playerManager =
GetGame().GetPlayerManager();
1214 name = playerManager.GetPlayerName(playerID);
1215 suffix = playerID.ToString();
1218 SCR_TaskExecutorEntity executorEntity = SCR_TaskExecutorEntity.Cast(executor);
1226 suffix = entity.Type().ToString();
1229 SCR_TaskExecutorGroup executorGroup = SCR_TaskExecutorGroup.Cast(executor);
1233 if (!groupsManagerComponent)
1245 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
1252 if (parentTask.GetTaskOwnership() <= SCR_ETaskOwnership.EXECUTOR || parentTask.GetTaskVisibility() <=
SCR_ETaskVisibility.EXECUTOR)
1254 Print(
"SCR_TaskSystem: Cannot add " + name +
"(" + suffix +
") to task with ID: " +
task.GetTaskID() +
" as parent task does not allow it!",
LogLevel.WARNING);
1258 if (parentTask.GetTaskOwnership() == SCR_ETaskOwnership.FACTION || parentTask.GetTaskVisibility() ==
SCR_ETaskVisibility.FACTION)
1260 string factionKey = executor.GetFactionKey();
1262 array<string> parentTaskFactions = parentTask.GetOwnerFactionKeys();
1263 if (!parentTaskFactions || !parentTaskFactions.Contains(factionKey))
1265 Print(
"SCR_TaskSystem: Cannot add " + name +
"(" + suffix +
") to task with ID: " +
task.GetTaskID() +
" as entity is from another faction!",
LogLevel.WARNING);
1270 if (parentTask.GetTaskOwnership() == SCR_ETaskOwnership.GROUP || parentTask.GetTaskVisibility() ==
SCR_ETaskVisibility.GROUP)
1272 int groupID = executor.GetGroupID();
1274 array<int> parentTaskGroupIDs = parentTask.GetOwnerGroupIDs();
1275 if (!parentTaskGroupIDs)
1278 if (!parentTaskGroupIDs.Contains(groupID))
1280 Print(
"SCR_TaskSystem: Cannot add " + name +
"(" + suffix +
") to task with ID: " +
task.GetTaskID() +
" as entity is from another group!",
LogLevel.WARNING);
1286 if (!
task.AddOwnerExecutor(executor))
1288 Print(
"SCR_TaskSystem: Could not add " + name +
"(" + suffix +
") to task with ID: " +
task.GetTaskID(),
LogLevel.ERROR);
1292 Print(
"SCR_TaskSystem: Added " + name +
"(" + suffix +
") to task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1299 void RemoveTaskExecutor(notnull
SCR_Task task, notnull SCR_TaskExecutor executor)
1301 if (Replication.IsClient())
1303 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1307 string name, suffix;
1310 SCR_TaskExecutorPlayer executorPlayer = SCR_TaskExecutorPlayer.Cast(executor);
1313 PlayerManager playerManager =
GetGame().GetPlayerManager();
1318 name = playerManager.GetPlayerName(playerID);
1319 suffix = playerID.ToString();
1322 SCR_TaskExecutorEntity executorEntity = SCR_TaskExecutorEntity.Cast(executor);
1330 suffix = entity.Type().ToString();
1333 SCR_TaskExecutorGroup executorGroup = SCR_TaskExecutorGroup.Cast(executor);
1337 if (!groupsManagerComponent)
1349 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
1356 if (parentTask.GetTaskOwnership() <= SCR_ETaskOwnership.EXECUTOR || parentTask.GetTaskVisibility() <=
SCR_ETaskVisibility.EXECUTOR)
1358 Print(
"SCR_TaskSystem: Cannot remove " + name +
"(" + suffix +
") from task with ID: " +
task.GetTaskID() +
" as parent task does not allow it!",
LogLevel.WARNING);
1363 if (!
task.RemoveOwnerExecutor(executor))
1365 Print(
"SCR_TaskSystem: Could not remove " + name +
"(" + suffix +
") from task with ID: " +
task.GetTaskID(),
LogLevel.ERROR);
1369 array<ref SCR_TaskExecutor> assignees =
task.GetTaskAssignees();
1370 if (assignees && !assignees.IsEmpty())
1372 foreach (SCR_TaskExecutor assignee : assignees)
1374 if (!CanTaskBeAssignedTo(
task, assignee))
1375 task.RemoveTaskAssignee(assignee);
1379 Print(
"SCR_TaskSystem: Removed " + name +
"(" + suffix +
") from task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1391 return task.GetTaskPosition();
1398 void MoveTask(notnull
SCR_Task task, vector destination)
1400 if (Replication.IsClient())
1402 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1406 task.SetTaskPosition(destination);
1407 Print(
"SCR_TaskSystem: Task with ID: " +
task.GetTaskID() +
" moved to " + destination,
LogLevel.DEBUG);
1416 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
1427 void GetChildTasksFor(notnull
SCR_Task task, out array<SCR_Task> childTasks)
1429 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
1442 if (Replication.IsClient())
1444 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1448 SCR_ExtendedTask extendedParentTask = SCR_ExtendedTask.Cast(
task);
1449 SCR_ExtendedTask extendedChildTask = SCR_ExtendedTask.Cast(childTask);
1450 if (!extendedParentTask || !extendedChildTask)
1452 Print(
"SCR_TaskSystem: Both parent and child tasks need to be extended tasks!",
LogLevel.WARNING);
1458 Print(
"SCR_TaskSystem: Tasks cannot be nested beyond depth 1!",
LogLevel.WARNING);
1464 Print(
"SCR_TaskSystem: Could not parent task with ID: " + childTask.GetTaskID() +
" to task with ID: " +
task.GetTaskID(),
LogLevel.ERROR);
1468 Print(
"SCR_TaskSystem: Task with ID: " + childTask.GetTaskID() +
" parented to task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1477 if (Replication.IsClient())
1479 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1483 SCR_ExtendedTask extendedTask = SCR_ExtendedTask.Cast(
task);
1486 Print(
"SCR_TaskSystem: Parent task needs to be an extended task!",
LogLevel.ERROR);
1492 Print(
"SCR_TaskSystem: Could not unparent task with ID: " + childTask.GetTaskID() +
" from task with ID: " +
task.GetTaskID(),
LogLevel.ERROR);
1496 Print(
"SCR_TaskSystem: Task with ID: " + childTask.GetTaskID() +
" unparented from task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1507 SCR_Task CreateTask(ResourceName taskResourceName,
string taskID,
string name,
string desc, vector
position = vector.Zero,
int playerId = -1)
1509 if (Replication.IsClient())
1511 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1515 if (GetTaskFromTaskID(taskID,
false))
1517 Print(
"SCR_TaskSystem: Task with ID: " + taskID +
" already exists!",
LogLevel.WARNING);
1521 if (!taskResourceName || taskResourceName.IsEmpty())
1523 Print(
"SCR_TaskSystem: Task resource name is empty! Using default task resource",
LogLevel.WARNING);
1527 Resource taskResource = Resource.Load(taskResourceName);
1528 if (!taskResource || !taskResource.IsValid())
1530 Print(
"SCR_TaskSystem: Task resource is invalid!",
LogLevel.WARNING);
1534 IEntitySource entitySource = taskResource.GetResource().ToEntitySource();
1538 typename taskType = entitySource.GetClassName().ToType();
1539 if (!taskType.IsInherited(
SCR_Task))
1542 vector transform[4];
1543 Math3D.MatrixIdentity3(transform);
1547 spawnParams.TransformMode = ETransformMode.WORLD;
1548 spawnParams.Transform = transform;
1551 if (!
task || !
task.FindComponent(RplComponent))
1553 Print(
"SCR_TaskSystem: Failed to create task with ID: " + taskID,
LogLevel.WARNING);
1557 task.SetTaskID(taskID);
1561 UUID playerIdentity = SCR_PlayerIdentityUtils.GetPlayerIdentityId(playerId);
1562 PlayerManager playerManager =
GetGame().GetPlayerManager();
1563 PlatformKind platform = playerManager.GetPlatformKind(playerId);
1564 task.SetAuthorCredentials(playerId,playerIdentity,platform);
1567 if (!SCR_StringHelper.IsEmptyOrWhiteSpace(name))
1568 task.SetTaskName(name);
1570 if (!SCR_StringHelper.IsEmptyOrWhiteSpace(
desc))
1577 Print(
"SCR_TaskSystem: Created task with ID: " + taskID,
LogLevel.DEBUG);
1586 if (Replication.IsClient())
1588 Print(
"SCR_TaskSystem: Trying to invoke server-only function on client",
LogLevel.ERROR);
1592 RplComponent taskRpl = RplComponent.Cast(
task.FindComponent(RplComponent));
1595 Print(
"SCR_TaskSystem: Missing Rpl Component; Cannot delete task with ID: " +
task.GetTaskID(),
LogLevel.WARNING);
1599 Print(
"SCR_TaskSystem: Deleted task with ID: " +
task.GetTaskID(),
LogLevel.DEBUG);
1600 taskRpl.DeleteRplEntity(
task,
false);
1608 static SCR_Task GetTaskFromTaskID(
string taskID,
bool notify =
true)
1615 string ID =
task.GetTaskID();
1616 if (!
ID ||
ID.IsEmpty())
1624 Print(
"SCR_TaskSystem: Task with ID: " + taskID +
" does not exist!",
LogLevel.WARNING);
1633 static SCR_TaskExecutor TaskExecutorFromPlayerID(
int playerID)
1635 return SCR_TaskExecutor.FromPlayerID(playerID);
1642 static SCR_TaskExecutor TaskExecutorFromEntity(
IEntity ent)
1644 return SCR_TaskExecutor.FromEntity(ent);
1651 static SCR_TaskExecutor TaskExecutorFromGroup(
int groupID)
1653 return SCR_TaskExecutor.FromGroup(groupID);
1675 DbgUI.Begin(
"Create Task");
1678 DbgUI.InputText(
"ID: ", taskID);
1681 DbgUI.InputText(
"Name: ", taskName);
1684 DbgUI.InputText(
"Description: ", taskDesc);
1686 if (
DbgUI.Button(
"Create Base Task") &&
1691 if (
DbgUI.Button(
"Create Extended Task") &&
1702 array<SCR_Task> tasks = {};
1706 if (diag_taskListMenu && diag_selectedExecutor)
1708 taskCount = GetTasksVisibleFor(tasks, diag_selectedExecutor);
1710 string executorName;
1714 executorName =
GetGame().GetPlayerManager().GetPlayerName(playerExecutor.
GetPlayerID());
1722 executorName = groupExecutor.
GetGroupID().ToString();
1724 header =
string.Format(
"Task List for %1 (%2)", executorName, taskCount);
1728 taskCount = GetTasks(tasks);
1729 header =
string.Format(
"Task List (%1)", taskCount);
1732 DbgUI.Begin(header);
1734 bool checked = diag_taskListMenu;
1735 DbgUI.Check(
"Show Task List for: ", checked);
1736 diag_taskListMenu = checked;
1738 if (diag_taskListMenu)
1741 DbgUI.Text(
"________________________________________________");
1767 string taskName =
task.GetTaskName();
1768 if (taskName.Length() > DIAG_MAX_NAME_LENGTH_LIST)
1769 taskName = taskName.Substring(0, DIAG_MAX_NAME_LENGTH_LIST) +
"...";
1773 taskText =
string.Format(
"%1.%2 - id:%3 | name:%4",
index, subIndex,
task.GetTaskID(), taskName);
1775 taskText =
string.Format(
"%1 - id:%2 | name:%3",
index,
task.GetTaskID(), taskName);
1777 bool checked =
data.diag_isChecked;
1778 DbgUI.Check(taskText +
" " , checked);
1779 data.diag_isChecked = checked;
1781 if (
data.diag_isChecked)
1789 if (!childTasks || childTasks.IsEmpty())
1792 int currentChildTask;
1793 foreach (
SCR_Task childTask : childTasks)
1806 DbgUI.Begin(
"Show task list for individual executor");
1808 array<string> executorTypes = {
"PLAYER",
"ENTITY",
"GROUP"};
1809 DbgUI.Combo(
"Executor Type: ", diag_taskListMenuSelection, executorTypes);
1811 DbgUI.InputText(
"Executor Name/ID: ", diag_taskListMenuExecutorName);
1817 switch (diag_taskListMenuSelection)
1821 int playerID = diag_taskListMenuExecutorName.ToInt();
1828 IEntity entity =
GetGame().FindEntity(diag_taskListMenuExecutorName);
1835 int groupID = diag_taskListMenuExecutorName.ToInt();
1847 DbgUI.Begin(
string.Format(
"Task: %1 (%2)",
task.GetTaskID(),
task.Type()));
1852 string taskName =
task.GetTaskName();
1853 if (taskName.Length() > DIAG_MAX_NAME_LENGTH)
1854 taskName = taskName.Substring(0, DIAG_MAX_NAME_LENGTH) +
"...";
1856 checked =
data.diag_checkedSettings[0];
1857 DbgUI.Check(
string.Format(
"Name: %1", taskName), checked);
1858 data.diag_checkedSettings[0] = checked;
1860 if (
data.diag_checkedSettings[0])
1864 string taskDesc =
task.GetTaskDescription();
1865 if (taskDesc.Length() > DIAG_MAX_DESCRIPTION_LENGTH)
1866 taskDesc = taskDesc.Substring(0, DIAG_MAX_DESCRIPTION_LENGTH) +
"...";
1868 checked =
data.diag_checkedSettings[1];
1869 DbgUI.Check(
string.Format(
"Description: %1", taskDesc), checked);
1870 data.diag_checkedSettings[1] = checked;
1872 if (
data.diag_checkedSettings[1])
1876 checked =
data.diag_checkedSettings[2];
1878 data.diag_checkedSettings[2] = checked;
1880 if (
data.diag_checkedSettings[2])
1884 checked =
data.diag_checkedSettings[3];
1885 DbgUI.Check(
string.Format(
"Ownership: %1",
SCR_Enum.GetEnumName(SCR_ETaskOwnership,
task.GetTaskOwnership())), checked);
1886 data.diag_checkedSettings[3] = checked;
1888 if (
data.diag_checkedSettings[3])
1892 checked =
data.diag_checkedSettings[4];
1894 data.diag_checkedSettings[4] = checked;
1896 if (
data.diag_checkedSettings[4])
1900 checked =
data.diag_checkedSettings[5];
1901 DbgUI.Check(
string.Format(
"UI Visibility: %1",
SCR_Enum.GetEnumName(SCR_ETaskUIVisibility,
task.GetTaskUIVisibility())), checked);
1902 data.diag_checkedSettings[5] = checked;
1904 if (
data.diag_checkedSettings[5])
1908 checked =
data.diag_checkedSettings[6];
1909 DbgUI.Check(
string.Format(
"Assignees: %1",
task.GetTaskAssigneeCount()), checked);
1910 data.diag_checkedSettings[6] = checked;
1912 if (
data.diag_checkedSettings[6])
1916 checked =
data.diag_checkedSettings[7];
1917 DbgUI.Check(
string.Format(
"Executors: %1",
task.GetOwnerExecutorCount()), checked);
1918 data.diag_checkedSettings[7] = checked;
1920 if (
data.diag_checkedSettings[7])
1924 checked =
data.diag_checkedSettings[8];
1925 DbgUI.Check(
string.Format(
"Factions: %1",
task.GetOwnerFactionCount()), checked);
1926 data.diag_checkedSettings[8] = checked;
1928 if (
data.diag_checkedSettings[8])
1932 checked =
data.diag_checkedSettings[9];
1933 DbgUI.Check(
string.Format(
"Groups: %1",
task.GetOwnerGroupCount()), checked);
1934 data.diag_checkedSettings[9] = checked;
1936 if (
data.diag_checkedSettings[9])
1940 checked =
data.diag_checkedSettings[10];
1941 DbgUI.Check(
string.Format(
"Position: %1",
task.GetTaskPosition()), checked);
1942 data.diag_checkedSettings[10] = checked;
1944 if (
data.diag_checkedSettings[10])
1950 if (extendedTask && extendedData)
1953 checked = extendedData.diag_checkedExtendedSettings[0];
1955 extendedData.diag_checkedExtendedSettings[0] = checked;
1957 if (extendedData.diag_checkedExtendedSettings[0])
1961 checked = extendedData.diag_checkedExtendedSettings[1];
1963 extendedData.diag_checkedExtendedSettings[1] = checked;
1965 if (extendedData.diag_checkedExtendedSettings[1])
1970 DbgUI.Text(
"_________________________________________");
1971 DbgUI.Text(
"Shortcuts:");
1973 PlayerController localPlayerController;
1976 SCR_TaskSystemNetworkComponent networkComponent;
1978 if (
DbgUI.Button(
"Assign Self"))
1980 localPlayerController =
GetGame().GetPlayerController();
1981 localPlayerID = localPlayerController.GetPlayerId();
1984 networkComponent = SCR_TaskSystemNetworkComponent.Cast(localPlayerController.FindComponent(SCR_TaskSystemNetworkComponent));
1985 if (networkComponent)
1986 networkComponent.AssignTask(
task, localPlayerExecutor,
true);
1989 if (
DbgUI.Button(
"Unassign Self"))
1991 localPlayerController =
GetGame().GetPlayerController();
1992 localPlayerID = localPlayerController.GetPlayerId();
1995 networkComponent = SCR_TaskSystemNetworkComponent.Cast(localPlayerController.FindComponent(SCR_TaskSystemNetworkComponent));
1996 if (networkComponent)
1997 networkComponent.UnassignTask(
task, localPlayerExecutor);
2000 if (
DbgUI.Button(
"Complete Task"))
2003 if (
DbgUI.Button(
"Fail Task"))
2007 if (
DbgUI.Button(
"Delete Task"))
2020 input =
task.GetTaskName();
2023 input =
task.GetTaskDescription();
2027 DbgUI.Begin(
string.Format(
"Edit %1 for task: %2", name,
task.GetTaskID()));
2029 DbgUI.InputText(
string.Format(
"%1:", name), input);
2036 task.SetTaskName(input);
2039 task.SetTaskDescription(input);
2043 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2058 selection =
Math.Log2(
task.GetTaskState());
2060 case SCR_ETaskOwnership:
2061 enumName =
"Ownership";
2062 selection =
task.GetTaskOwnership();
2065 enumName =
"Visibility";
2066 selection =
task.GetTaskVisibility();
2068 case SCR_ETaskUIVisibility:
2069 enumName =
"UI Visibility";
2070 selection =
task.GetTaskUIVisibility();
2074 DbgUI.Begin(
string.Format(
"Edit %1 for task: %2", enumName,
task.GetTaskID()));
2076 array<string> enumNames = {};
2077 SCR_Enum.GetEnumNames(enumType, enumNames);
2079 DbgUI.Combo(enumName, selection, enumNames);
2081 if (
DbgUI.Button(
string.Format(
"Set %1", enumName)))
2086 SetTaskState(
task, 1 << selection);
2088 case SCR_ETaskOwnership:
2089 SetTaskOwnership(
task, selection);
2092 SetTaskVisibility(
task, selection);
2094 case SCR_ETaskUIVisibility:
2095 SetTaskUIVisibility(
task, selection);
2099 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2108 DbgUI.Begin(
string.Format(
"Add/Remove %1 for task: %2", name,
task.GetTaskID()));
2110 array<ref SCR_TaskExecutor> executors;
2114 executors =
task.GetTaskAssignees();
2117 executors =
task.GetOwnerExecutors();
2121 int currentExecutor;
2122 if (executors && !executors.IsEmpty())
2126 string executorName, executorType;
2131 executorName =
GetGame().GetPlayerManager().GetPlayerName(playerExecutor.
GetPlayerID());
2132 executorType =
"PLAYER";
2139 executorType =
"ENTITY";
2145 executorName = groupExecutor.
GetGroupID().ToString();
2146 executorType =
"GROUP";
2149 DbgUI.Text(
string.Format(
"%1 - name/id:%2 | type:%3", currentExecutor, executorName, executorType));
2154 if (currentExecutor > 0)
2155 DbgUI.Text(
"________________________________________________");
2157 array<string> executorTypes = {
"PLAYER",
"ENTITY",
"GROUP"};
2159 DbgUI.Combo(
"Executor Type: ", selection, executorTypes);
2162 DbgUI.InputText(
"Executor Name/ID: ", input);
2171 int playerID = input.ToInt();
2185 int groupID = input.ToInt();
2193 PlayerController localPlayerController;
2194 SCR_TaskSystemNetworkComponent networkComponent;
2196 if (
DbgUI.Button(
string.Format(
"Add %1", name)) && executor)
2198 localPlayerController =
GetGame().GetPlayerController();
2199 networkComponent = SCR_TaskSystemNetworkComponent.Cast(localPlayerController.FindComponent(SCR_TaskSystemNetworkComponent));
2204 networkComponent.AssignTask(
task, executor,
true);
2207 AddTaskExecutor(
task, executor);
2211 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2214 if (
DbgUI.Button(
string.Format(
"Remove %1", name)) && executor)
2216 localPlayerController =
GetGame().GetPlayerController();
2217 networkComponent = SCR_TaskSystemNetworkComponent.Cast(localPlayerController.FindComponent(SCR_TaskSystemNetworkComponent));
2222 networkComponent.UnassignTask(
task, executor);
2225 RemoveTaskExecutor(
task, executor);
2229 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2238 DbgUI.Begin(
string.Format(
"Add/Remove Faction for task: %1",
task.GetTaskID()));
2240 array<string> factionKeys =
task.GetOwnerFactionKeys();
2242 int currentFaction = 0;
2243 if (factionKeys && !factionKeys.IsEmpty())
2245 foreach (
string factionKey : factionKeys)
2247 DbgUI.Text(
string.Format(
"%1 - key:%2", currentFaction, factionKey));
2252 if (currentFaction > 0)
2253 DbgUI.Text(
"________________________________________________");
2256 DbgUI.InputText(
"Faction Key: ", input);
2258 if (
DbgUI.Button(
"Add Faction"))
2260 AddTaskFaction(
task, input);
2261 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2264 if (
DbgUI.Button(
"Remove Faction"))
2266 RemoveTaskFaction(
task, input);
2267 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2276 DbgUI.Begin(
string.Format(
"Add/Remove Group for task: %1",
task.GetTaskID()));
2278 array<int> groupIDs =
task.GetOwnerGroupIDs();
2280 int currentGroup = 0;
2281 if (groupIDs && !groupIDs.IsEmpty())
2283 foreach (
int groupID : groupIDs)
2285 DbgUI.Text(
string.Format(
"%1 - id:%2", currentGroup, groupID.ToString()));
2290 if (currentGroup > 0)
2291 DbgUI.Text(
"________________________________________________");
2294 DbgUI.InputText(
"Group ID: ", input);
2296 if (
DbgUI.Button(
"Add Group"))
2298 AddTaskGroup(
task, input.ToInt());
2299 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2302 if (
DbgUI.Button(
"Remove Group"))
2304 RemoveTaskGroup(
task, input.ToInt());
2305 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2314 DbgUI.Begin(
string.Format(
"Move task: %1",
task.GetTaskID()));
2320 DbgUI.InputFloat(
"X: ", x);
2321 DbgUI.InputFloat(
"Y: ", y);
2322 DbgUI.InputFloat(
"Z: ", z);
2324 if (
DbgUI.Button(
"Move Task"))
2326 MoveTask(
task, {x, y, z});
2327 task.GetTaskData().diag_checkedSettings[settingIndex] =
false;
2336 DbgUI.Begin(
string.Format(
"Add/Remove Child Task for task: %1", extendedTask.GetTaskID()));
2338 array<SCR_Task> childTasks = extendedTask.GetChildTasks();
2341 int currentChildTask = 0;
2342 if (childTasks && !childTasks.IsEmpty())
2344 foreach (
SCR_Task childTask : childTasks)
2346 taskName = childTask.GetTaskName();
2347 if (taskName.Length() > DIAG_MAX_NAME_LENGTH_LIST)
2348 taskName = taskName.Substring(0, DIAG_MAX_NAME_LENGTH_LIST) +
"...";
2350 DbgUI.Text(
string.Format(
"%1 - id:%2 | name:%3", currentChildTask, childTask.GetTaskID(), taskName));
2355 if (currentChildTask > 0)
2356 DbgUI.Text(
"________________________________________________");
2359 DbgUI.InputText(
"Task ID: ", input);
2361 if (
DbgUI.Button(
"Parent Task"))
2365 AddChildTaskTo(extendedTask,
task);
2367 SCR_ExtendedTaskData.Cast(extendedTask.GetTaskData()).diag_checkedExtendedSettings[settingIndex] =
false;
2370 if (
DbgUI.Button(
"Unparent Task"))
2374 RemoveChildTaskFrom(extendedTask,
task);
2376 SCR_ExtendedTaskData.Cast(extendedTask.GetTaskData()).diag_checkedExtendedSettings[settingIndex] =
false;
2385 DbgUI.Begin(
string.Format(
"Edit Progress for task: %1", extendedTask.GetTaskID()));
2387 float input = extendedTask.GetTaskProgress();
2388 DbgUI.InputFloat(
"Progress: ", input);
2390 if (
DbgUI.Button(
"Set Progress"))
2392 SetTaskProgress(extendedTask, input);
2393 SCR_ExtendedTaskData.Cast(extendedTask.GetTaskData()).diag_checkedExtendedSettings[settingIndex] =
false;
2396 if (
DbgUI.Button(
"Add Progress"))
2398 AddTaskProgress(extendedTask, input);
2399 SCR_ExtendedTaskData.Cast(extendedTask.GetTaskData()).diag_checkedExtendedSettings[settingIndex] =
false;
2402 if (
DbgUI.Button(
"Remove Progress"))
2404 RemoveTaskProgress(extendedTask, input);
2405 SCR_ExtendedTaskData.Cast(extendedTask.GetTaskData()).diag_checkedExtendedSettings[settingIndex] =
false;