Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_TaskSystemSerializer.c
Go to the documentation of this file.
2class SCR_TaskSystemData : PersistentState
3{
4}
5
6class SCR_TaskSystemSerializer : ScriptedStateSerializer
7{
8 //------------------------------------------------------------------------------------------------
9 override static typename GetTargetType()
10 {
11 return SCR_TaskSystemData;
12 }
13
14 //------------------------------------------------------------------------------------------------
15 override ESerializeResult Serialize(notnull Managed instance, notnull SaveContext context)
16 {
17 const SCR_TaskSystem taskSystem = SCR_TaskSystem.GetInstance();
18 if (!taskSystem)
19 return ESerializeResult.DEFAULT;
20
21 array<SCR_Task> outTasks();
22 taskSystem.GetTasks(outTasks);
23
24 array<ref SCR_TaskSave> tasks();
25 foreach (auto task : outTasks)
26 {
27 if (!task)
28 continue;
29
30 auto save = SCR_TaskSave.GetTaskTypeSave(task);
31 save.Save(task, GetSystem());
32 if (!save.IsDefault())
33 tasks.Insert(save);
34 }
35
36 if (tasks.IsEmpty())
37 return ESerializeResult.DEFAULT;
38
39 context.WriteValue("version", 1);
40 context.Write(tasks);
41 return ESerializeResult.OK;
42 }
43
44 //------------------------------------------------------------------------------------------------
45 override bool Deserialize(notnull Managed instance, notnull LoadContext context)
46 {
47 const SCR_TaskSystem taskSystem = SCR_TaskSystem.GetInstance();
48 if (!taskSystem)
49 return true; // SF system no longer present, so we can ignore it.
50
51 int version;
52 context.Read(version);
53
54 array<ref SCR_TaskSave> tasks();
55 context.Read(tasks);
56
57 foreach (auto save : tasks)
58 {
59 save.Load(taskSystem, GetSystem());
60 }
61
62 return true;
63 }
64}
65
66//------------------------------------------------------------------------------------------------
68{
69 string m_sId;
70 ResourceName m_rPrefab;
71 vector m_vPosition;
72 string m_sIconSet;
73 ResourceName m_rIconPath;
74 ref array<LocalizedString> m_aTaskName = {};
75 ref array<LocalizedString> m_aTaskDescription = {};
76 ref array<UUID> m_aAssignees = {};
77 ref array<string> m_aOwnerFactionKeys = {};
78 ref array<UUID> m_aOwnerGroupIDs = {};
79 ref array<UUID> m_aOwnerExecutors = {};
80 SCR_ETaskState m_eState;
81 SCR_ETaskOwnership m_eOwnership;
82 SCR_ETaskVisibility m_eVisibility;
83 SCR_ETaskUIVisibility m_eUIVisibility;
84
85 //------------------------------------------------------------------------------------------------
86 void Save(notnull SCR_Task task, notnull PersistenceSystem persistence)
87 {
88 auto taskData = task.GetTaskData();
89 m_sId = taskData.m_sID;
90 m_rPrefab = SCR_ResourceNameUtils.GetPrefabName(task);
91 m_vPosition = taskData.m_vPosition;
92
93 auto uiInfo = task.GetTaskUIInfo();
94 if (uiInfo)
95 {
96 if (uiInfo.HasCustomIcon())
97 {
98 m_sIconSet = uiInfo.GetIconSetName();
99 if (m_sIconSet)
100 m_rIconPath = uiInfo.GetImageSetPath();
101 }
102
103 if (uiInfo.HasCustomName())
104 {
105 array<LocalizedString> params();
106 const LocalizedString name = uiInfo.GetUnformattedName(params);
107 if (name)
108 {
109 m_aTaskName.Reserve(params.Count() + 1);
110 m_aTaskName.Insert(name);
111 m_aTaskName.InsertAll(params);
112 }
113 }
114
115 if (uiInfo.HasCustomDescription())
116 {
117 array<LocalizedString> params();
118 const LocalizedString description = uiInfo.GetUnformattedDescription(params);
119 if (description)
120 {
121 m_aTaskDescription.Reserve(params.Count() + 1);
122 m_aTaskDescription.Insert(description);
123 m_aTaskDescription.InsertAll(params);
124 }
125 }
126 }
127
128 foreach (auto asignee : taskData.m_aAssignees)
129 {
130 const UUID id = GetTaskExecutorId(asignee, persistence);
131 if (!id.IsNull())
132 m_aAssignees.Insert(id);
133 }
134
135 m_aOwnerFactionKeys = taskData.m_aOwnerFactionKeys;
136
137 auto groupManager = SCR_GroupsManagerComponent.GetInstance();
138 if (groupManager)
139 {
140 foreach (auto ownerGroup : taskData.m_aOwnerGroupIDs)
141 {
142 const UUID id = persistence.GetId(groupManager.FindGroup(ownerGroup));
143 if (!id.IsNull())
144 m_aOwnerGroupIDs.Insert(id);
145 }
146 }
147
148 foreach (auto owner : taskData.m_aOwnerExecutors)
149 {
150 const UUID id = GetTaskExecutorId(owner, persistence);
151 if (!id.IsNull())
152 m_aOwnerExecutors.Insert(id);
153 }
154
155 m_eState = taskData.m_eState;
156 m_eOwnership = taskData.m_eOwnership;
157 m_eVisibility = taskData.m_eVisibility;
158 m_eUIVisibility = taskData.m_eUIVisibility;
159 }
160
161 //------------------------------------------------------------------------------------------------
162 bool IsDefault()
163 {
164 return
165 m_sId.IsEmpty() &&
166 m_vPosition == vector.Zero &&
167 m_sIconSet.IsEmpty() &&
168 m_aTaskName.IsEmpty() &&
169 m_aTaskDescription.IsEmpty() &&
170 m_aAssignees.IsEmpty() &&
171 m_aOwnerFactionKeys.IsEmpty() &&
172 m_aOwnerGroupIDs.IsEmpty() &&
173 m_aOwnerExecutors.IsEmpty() &&
174 m_eState == SCR_ETaskState.CREATED &&
175 m_eOwnership == SCR_ETaskOwnership.NONE &&
176 m_eVisibility == SCR_ETaskVisibility.NONE &&
177 m_eUIVisibility == SCR_ETaskUIVisibility.NONE;
178 }
179
180 //------------------------------------------------------------------------------------------------
181 SCR_Task Load(notnull SCR_TaskSystem taskSystem, notnull PersistenceSystem persistence)
182 {
183 auto task = taskSystem.CreateTask(m_rPrefab, m_sId, "", "", m_vPosition);
184 if (!task)
185 return null;
186
187 auto uiInfo = task.GetTaskUIInfo();
188 if (uiInfo)
189 {
190 if (m_sIconSet)
191 {
192 task.SetTaskIconSetName(m_sIconSet);
193 task.SetTaskIconPath(m_rIconPath);
194 }
195
196 if (!m_aTaskName.IsEmpty())
197 {
198 const LocalizedString name = m_aTaskName[0];
199 m_aTaskName.RemoveOrdered(0);
200 task.SetTaskName(name, m_aTaskName);
201 }
202
203 if (!m_aTaskDescription.IsEmpty())
204 {
205 const LocalizedString description = m_aTaskDescription[0];
206 m_aTaskDescription.RemoveOrdered(0);
207 task.SetTaskDescription(description, m_aTaskDescription);
208 }
209 }
210
211 task.SetTaskOwnership(m_eOwnership);
212 task.SetTaskVisibility(m_eVisibility);
213 task.SetTaskUIVisibility(m_eUIVisibility);
214
215 foreach (int idx, auto factionKey : m_aOwnerFactionKeys)
216 {
217 if (idx == 0)
218 {
220 if (editableTask && !editableTask.GetFaction())
221 {
222 const Faction faction = GetGame().GetFactionManager().GetFactionByKey(factionKey);
223 editableTask.SetTargetFaction(faction);
224 }
225 }
226
227 task.AddOwnerFactionKey(factionKey);
228 }
229
230 foreach (auto assignee : m_aAssignees)
231 {
232 Tuple2<SCR_Task, int> taskContext(task, 0);
234 persistence.WhenAvailable(assignee, loadTask);
235 }
236
237 foreach (auto group : m_aOwnerGroupIDs)
238 {
239 Tuple1<SCR_Task> taskContext(task);
240 PersistenceWhenAvailableTask loadTask(OnGroupAvailable, taskContext);
241 persistence.WhenAvailable(group, loadTask);
242 }
243
244 foreach (auto owner : m_aOwnerExecutors)
245 {
246 Tuple2<SCR_Task, int> taskContext(task, 1);
248 persistence.WhenAvailable(owner, loadTask);
249 }
250
251 taskSystem.SetTaskState(task, m_eState);
252
253 return task;
254 }
255
256 //------------------------------------------------------------------------------------------------
257 UUID GetTaskExecutorId(notnull SCR_TaskExecutor executor, notnull PersistenceSystem persistence)
258 {
259 auto executorEntity = SCR_TaskExecutorEntity.Cast(executor);
260 if (executorEntity)
261 return persistence.GetId(executorEntity.GetEntity());
262
263 auto executorGroup = SCR_TaskExecutorGroup.Cast(executor);
264 if (executorGroup)
265 {
266 auto groupManager = SCR_GroupsManagerComponent.GetInstance();
267 if (!groupManager)
268 return UUID.NULL_UUID;
269
270 return persistence.GetId(groupManager.FindGroup(executorGroup.GetGroupID()));
271 }
272
273 auto executorPlayer = SCR_TaskExecutorPlayer.Cast(executor);
274 if (executorPlayer)
275 {
276 auto playerManager = GetGame().GetPlayerManager();
277 if (!playerManager)
278 return UUID.NULL_UUID;
279
280 return persistence.GetId(playerManager.GetPlayerController(executorPlayer.GetPlayerID()));
281 }
282
283 return UUID.NULL_UUID;
284 }
285
286 //------------------------------------------------------------------------------------------------
287 static SCR_TaskSave GetTaskTypeSave(const SCR_Task task)
288 {
289 if (task.IsInherited(SCR_CampaignMilitaryBaseTaskEntity))
290 return new SCR_CampaignMilitaryTaskSave();
291
292 if (task.IsInherited(SCR_ScenarioFrameworkTask))
293 return new SCR_ScenarioFrameworkTaskSave();
294
295 if (task.IsInherited(SCR_ExtendedTask))
296 return new SCR_ExtendedTaskSave();
297
298 return new SCR_TaskSave();
299 }
300
301 //------------------------------------------------------------------------------------------------
302 protected static void OnExecutorAvailable(Managed instance, PersistenceDeferredDeserializeTask task, bool expired, Managed context)
303 {
304 auto taskContext = Tuple2<SCR_Task, int>.Cast(context);
305 if (!taskContext.param1)
306 return;
307
308 SCR_TaskExecutor executor;
309 auto playerController = PlayerController.Cast(instance);
310 if (playerController)
311 {
312 executor = SCR_TaskExecutor.FromPlayerID(playerController.GetPlayerId());
313 }
314 else
315 {
316 auto group = SCR_AIGroup.Cast(instance);
317 if (group)
318 {
319 executor = SCR_TaskExecutor.FromGroup(group.GetGroupID());
320 }
321 else
322 {
323 auto entity = IEntity.Cast(instance);
324 executor = SCR_TaskExecutor.FromEntity(entity);
325 }
326 }
327
328 if (!executor)
329 return;
330
331 if (taskContext.param2 == 0)
332 {
333 taskContext.param1.AddTaskAssignee(executor);
334 return;
335 }
336
337 taskContext.param1.AddOwnerExecutor(executor)
338 }
339
340 //------------------------------------------------------------------------------------------------
341 protected static void OnGroupAvailable(Managed instance, PersistenceDeferredDeserializeTask task, bool expired, Managed context)
342 {
343 auto taskContext = Tuple1<SCR_Task>.Cast(context);
344 if (!taskContext.param1)
345 return;
346
347 auto group = SCR_AIGroup.Cast(instance);
348 if (!group)
349 return;
350
351 taskContext.param1.AddOwnerGroupID(group.GetGroupID());
352 }
353
354 //------------------------------------------------------------------------------------------------
356 {
357 context.WriteDefault(m_sId, string.Empty);
358 context.WriteDefault(m_rPrefab, ResourceName.Empty);
359 context.WriteDefault(m_vPosition, vector.Zero);
360 context.WriteDefault(m_sIconSet, string.Empty);
361 context.WriteDefault(m_rIconPath, ResourceName.Empty);
362
363 if (!m_aTaskName.IsEmpty() || !context.CanSeekMembers())
364 context.Write(m_aTaskName);
365
366 if (!m_aTaskDescription.IsEmpty() || !context.CanSeekMembers())
367 context.Write(m_aTaskDescription);
368
369 if (!m_aAssignees.IsEmpty() || !context.CanSeekMembers())
370 context.Write(m_aAssignees);
371
372 if (!m_aOwnerFactionKeys.IsEmpty() || !context.CanSeekMembers())
373 context.Write(m_aOwnerFactionKeys);
374
375 if (!m_aOwnerGroupIDs.IsEmpty() || !context.CanSeekMembers())
376 context.Write(m_aOwnerGroupIDs);
377
378 if (!m_aOwnerExecutors.IsEmpty() || !context.CanSeekMembers())
379 context.Write(m_aOwnerExecutors);
380
381 context.WriteDefault(m_eState, SCR_ETaskState.CREATED);
382 context.WriteDefault(m_eOwnership, SCR_ETaskOwnership.NONE);
383 context.WriteDefault(m_eVisibility, SCR_ETaskVisibility.NONE);
384 context.WriteDefault(m_eUIVisibility, SCR_ETaskUIVisibility.NONE);
385 return true;
386 }
387
388 //------------------------------------------------------------------------------------------------
390 {
391 context.ReadDefault(m_sId, string.Empty);
392 context.ReadDefault(m_rPrefab, ResourceName.Empty);
393 context.ReadDefault(m_vPosition, vector.Zero);
394 context.ReadDefault(m_sIconSet, string.Empty);
395 context.ReadDefault(m_rIconPath, ResourceName.Empty);
396
397 if (!context.Read(m_aTaskName) && !context.CanSeekMembers())
398 return false;
399
400 if (!context.Read(m_aTaskDescription) && !context.CanSeekMembers())
401 return false;
402
403 if (!context.Read(m_aAssignees) && !context.CanSeekMembers())
404 return false;
405
406 if (!context.Read(m_aOwnerFactionKeys) && !context.CanSeekMembers())
407 return false;
408
409 if (!context.Read(m_aOwnerGroupIDs) && !context.CanSeekMembers())
410 return false;
411
412 if (!context.Read(m_aOwnerExecutors) && !context.CanSeekMembers())
413 return false;
414
415 context.ReadDefault(m_eState, SCR_ETaskState.CREATED);
416 context.ReadDefault(m_eOwnership, SCR_ETaskOwnership.NONE);
417 context.ReadDefault(m_eVisibility, SCR_ETaskVisibility.NONE);
418 context.ReadDefault(m_eUIVisibility, SCR_ETaskUIVisibility.NONE);
419 return true;
420 }
421}
422
423//------------------------------------------------------------------------------------------------
424class SCR_CampaignMilitaryTaskSave : SCR_TaskSave
425{
427
428 //------------------------------------------------------------------------------------------------
429 override void Save(notnull SCR_Task task, notnull PersistenceSystem persistence)
430 {
431 super.Save(task, persistence);
432
433 const SCR_CampaignMilitaryBaseTaskEntity militaryBaseTask = SCR_CampaignMilitaryBaseTaskEntity.Cast(task);
434 const SCR_CampaignMilitaryBaseComponent base = militaryBaseTask.GetMilitaryBase();
435 if (base)
436 m_sBaseId = persistence.GetId(base.GetOwner());
437 }
438
439 //------------------------------------------------------------------------------------------------
440 override bool IsDefault()
441 {
442 return super.IsDefault() && m_sBaseId.IsNull();
443 }
444
445 //------------------------------------------------------------------------------------------------
446 override SCR_Task Load(notnull SCR_TaskSystem taskSystem, notnull PersistenceSystem persistence)
447 {
448 auto task = SCR_CampaignMilitaryBaseTaskEntity.Cast(super.Load(taskSystem, persistence));
449 if (task)
450 {
452 PersistenceWhenAvailableTask baseTask(OnBaseAvailable, ctx);
453 persistence.WhenAvailable(m_sBaseId, baseTask);
454 }
455
456 return task;
457 }
458
459 //------------------------------------------------------------------------------------------------
460 protected static void OnBaseAvailable(Managed instance, PersistenceDeferredDeserializeTask task, bool expired, Managed context)
461 {
462 auto base = IEntity.Cast(instance);
463 if (!base)
464 return;
465
466 const SCR_CampaignMilitaryBaseComponent militaryBase = SCR_CampaignMilitaryBaseComponent.Cast(base.FindComponent(SCR_CampaignMilitaryBaseComponent));
467 if (!militaryBase)
468 return;
469
470 auto ctx = Tuple1<SCR_CampaignMilitaryBaseTaskEntity>.Cast(context);
471 if (ctx.param1)
472 ctx.param1.SetMilitaryBaseCallSign(militaryBase.GetCallsign());
473 }
474
475 //------------------------------------------------------------------------------------------------
476 override bool SerializationSave(SaveContext context)
477 {
478 if (!super.SerializationSave(context))
479 return false;
480
481 context.WriteDefault(m_sBaseId, UUID.NULL_UUID);
482 return true;
483 }
484
485 //------------------------------------------------------------------------------------------------
486 override bool SerializationLoad(LoadContext context)
487 {
488 if (!super.SerializationLoad(context))
489 return false;
490
491 context.ReadDefault(m_sBaseId, UUID.NULL_UUID);
492 return true;
493 }
494}
495
496//------------------------------------------------------------------------------------------------
498{
499 float m_fProgress;
500 ref array<ref SCR_TaskSave> m_aChildTasks = {};
501
502 //------------------------------------------------------------------------------------------------
503 override void Save(notnull SCR_Task task, notnull PersistenceSystem persistence)
504 {
505 super.Save(task, persistence);
506
507 auto extendedTaskData = SCR_ExtendedTaskData.Cast(task.GetTaskData());
508 m_fProgress = extendedTaskData.m_fProgress;
509 if (!extendedTaskData.m_aChildTasks)
510 return;
511
512 foreach (auto childRpl : extendedTaskData.m_aChildTasks)
513 {
514 auto rpl = RplComponent.Cast(Replication.FindItem(childRpl));
515 if (!rpl)
516 continue;
517
518 auto childTask = SCR_Task.Cast(rpl.GetEntity());
519 if (childTask)
520 {
521 auto save = GetTaskTypeSave(childTask);
522 save.Save(childTask, persistence);
523 if (!save.IsDefault())
524 m_aChildTasks.Insert(save);
525 }
526 }
527 }
528
529 //------------------------------------------------------------------------------------------------
530 override bool IsDefault()
531 {
532 return
533 super.IsDefault() &&
534 float.AlmostEqual(m_fProgress, 0) &&
535 m_aChildTasks.IsEmpty();
536 }
537
538 //------------------------------------------------------------------------------------------------
539 override SCR_Task Load(notnull SCR_TaskSystem taskSystem, notnull PersistenceSystem persistence)
540 {
541 auto task = SCR_ExtendedTask.Cast(super.Load(taskSystem, persistence));
542 if (task)
543 {
544 task.SetTaskProgress(m_fProgress);
545 foreach (auto childSave : m_aChildTasks)
546 {
547 auto childTask = childSave.Load(taskSystem, persistence);
548 if (childTask)
549 task.AddChildTask(childTask);
550 }
551 }
552
553 return task;
554 }
555
556 //------------------------------------------------------------------------------------------------
557 override bool SerializationSave(SaveContext context)
558 {
559 if (!super.SerializationSave(context))
560 return false;
561
562 context.WriteDefault(m_fProgress, 0.0);
563
564 if (!m_aChildTasks.IsEmpty() || !context.CanSeekMembers())
565 context.Write(m_aChildTasks);
566
567 return true;
568 }
569
570 //------------------------------------------------------------------------------------------------
571 override bool SerializationLoad(LoadContext context)
572 {
573 if (!super.SerializationLoad(context))
574 return false;
575
576 context.ReadDefault(m_fProgress, 0);
577
578 if (!context.Read(m_aChildTasks) && !context.CanSeekMembers())
579 return false;
580
581 return true;
582 }
583}
584
585//------------------------------------------------------------------------------------------------
586class SCR_ScenarioFrameworkTaskSave : SCR_ExtendedTaskSave
587{
589
590 //------------------------------------------------------------------------------------------------
591 override void Save(notnull SCR_Task task, notnull PersistenceSystem persistence)
592 {
593 super.Save(task, persistence);
594
595 auto scenarioFrameworkTaskData = SCR_ScenarioFrameworkTaskData.Cast(task.GetTaskData());
596 if (scenarioFrameworkTaskData.m_bCustomBriefing)
597 m_sTaskExecutionBriefing = scenarioFrameworkTaskData.m_sTaskExecutionBriefing;
598 }
599
600 //------------------------------------------------------------------------------------------------
601 override bool IsDefault()
602 {
603 return
604 super.IsDefault() &&
605 m_sTaskExecutionBriefing.IsEmpty();
606 }
607
608 //------------------------------------------------------------------------------------------------
609 override SCR_Task Load(notnull SCR_TaskSystem taskSystem, notnull PersistenceSystem persistence)
610 {
611 auto task = SCR_ScenarioFrameworkTask.Cast(super.Load(taskSystem, persistence));
612 if (task && !m_sTaskExecutionBriefing.IsEmpty())
613 task.SetTaskExecutionBriefing(m_sTaskExecutionBriefing);
614
615 return task;
616 }
617
618 //------------------------------------------------------------------------------------------------
619 override bool SerializationSave(SaveContext context)
620 {
621 if (!super.SerializationSave(context))
622 return false;
623
624 context.WriteDefault(m_sTaskExecutionBriefing, string.Empty);
625 return true;
626 }
627
628 //------------------------------------------------------------------------------------------------
629 override bool SerializationLoad(LoadContext context)
630 {
631 if (!super.SerializationLoad(context))
632 return false;
633
634 context.ReadDefault(m_sTaskExecutionBriefing, string.Empty);
635 return true;
636 }
637}
class SCR_PersistentThreatSector GetTargetType()
ArmaReforgerScripted GetGame()
Definition game.c:1398
void SCR_EditableTaskComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
override bool Save(notnull ScriptBitWriter writer)
void SCR_GroupsManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
override bool SerializationLoad(LoadContext context)
override bool SerializationSave(SaveContext context)
SCR_ETaskVisibility
Definition SCR_Task.c:24
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
SCR_ETaskState
Definition SCR_Task.c:3
SCR_ExtendedTaskSave m_sTaskExecutionBriefing
override bool IsDefault()
class SCR_TaskSave m_sBaseId
enum EVehicleType IEntity
Main replication API.
Definition Replication.c:14
static void OnExecutorAvailable(Managed instance, PersistenceDeferredDeserializeTask task, bool expired, Managed context)
bool SerializationSave(SaveContext context)
bool SerializationLoad(LoadContext context)
static void OnGroupAvailable(Managed instance, PersistenceDeferredDeserializeTask task, bool expired, Managed context)
Dummy state proxy to access task system instance.
bool Deserialize(notnull Managed instance, notnull LoadContext context)
ESerializeResult Serialize(notnull Managed instance, notnull SaveContext context)
Definition UUID.c:28
void Load()
Definition gameLib.c:220
ESerializeResult
void Tuple1(T1 p1)
Definition tuple.c:37