Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ScenarioFrameworkSystem.c
Go to the documentation of this file.
2{
3 //------------------------------------------------------------------------------------------------
4 override static void InitInfo(WorldSystemInfo outInfo) // TODO: move down with other methods
5 {
6 outInfo
7 .SetAbstract(false)
8 .AddPoint(ESystemPoint.FixedFrame);
9 }
10
11 [Attribute("Available Tasks for the Scenario", category: "Tasks")]
12 ref array<ref SCR_ScenarioFrameworkTaskType> m_aTaskTypesAvailable;
13
14 [Attribute(defvalue: "3", desc: "Maximal number of tasks that can be generated", category: "Tasks")]
15 int m_iMaxNumberOfTasks;
16
17 [Attribute(UIWidgets.Auto, desc: "Actions that will be activated after tasks are initialized", category: "Tasks")]
18 ref array<ref SCR_ScenarioFrameworkActionBase> m_aAfterTasksInitActions;
19
20 [Attribute(desc: "Debug actions accessible from Debug Menu.", category: "Debug")]
21 ref array<ref SCR_ScenarioFrameworkDebugAction> m_aDebugActions;
22
23 [Attribute(desc: "List of Core Areas that are essential for the Scenario to spawn alongside Debug Areas", category: "Debug")]
24 ref array<string> m_aCoreAreas;
25
26 [Attribute(desc: "List of Areas that will be spawned (Optionally with desired Layer Task) as opposed to leaving it to random generation", category: "Debug")]
27 ref array<ref SCR_ScenarioFrameworkDebugArea> m_aDebugAreas;
28
29 [Attribute(desc: "Should the dynamic Spawn/Despawn based on distance from player characters be enabled for the whole GameMode?", category: "Dynamic Spawn/Despawn")]
30 bool m_bDynamicDespawn;
31
32 [Attribute(defvalue: "4", UIWidgets.Slider, params: "0 600 1", desc: "How frequently is dynamic spawn/despawn being checked in seconds", category: "Dynamic Spawn/Despawn")]
33 int m_iUpdateRate;
34
35 [Attribute(desc: "Config with voice over data for whole scenario", params: "conf class=SCR_VoiceoverData")]
36 ResourceName m_sVoiceOverDataConfig;
37
38 bool m_bMatchOver;
39 bool m_bDebugInit;
40 bool m_bIsWorldLoadInit;
41 bool m_bIsSaveGameLoad;
42
43 ref ScriptInvoker m_OnAllAreasInitiated;
44 ref ScriptInvoker m_OnTaskStateChanged;
45 static ref ScriptInvokerBase<ScriptInvokerScenarioFrameworkSlotAIMethod> m_OnSlotAISpawned;
46 protected FactionManager m_FactionManager;
48
52
53 ref array<SCR_ScenarioFrameworkArea> m_aAreas = {};
54 ref array<SCR_ScenarioFrameworkArea> m_aSelectedAreas = {};
55 ref array<SCR_ScenarioFrameworkLayerTask> m_aLayerTasksToBeInitialized = {};
56 ref array<SCR_ScenarioFrameworkLayerTask> m_aLayerTasksForRandomization = {};
57 ref array<int> m_aIntroVoicelineIndexes = {};
58 ref array<string> m_aAreasTasksToSpawn = {};
59 ref array<string> m_aLayersTaskToSpawn = {};
60 ref array<string> m_aSlotsTaskToSpawn = {};
61 ref array<SCR_ESFTaskType> m_aESFTaskTypesAvailable = {};
62 ref array<SCR_ESFTaskType> m_aESFTaskTypeForRandomization = {};
63
64 ref array<ref Tuple3<SCR_ScenarioFrameworkArea, vector, int>> m_aSpawnedAreas = {};
65 ref array<ref Tuple3<SCR_ScenarioFrameworkArea, vector, int>> m_aDespawnedAreas = {};
66 ref array<ref Tuple3<EntityID, bool, float>> m_aDebugShapesLayers = {};
67 ref array<vector> m_aObservers = {};
69
71 protected float m_fTimer;
72 protected float m_fCheckInterval;
73
74 //------------------------------------------------------------------------------------------------
77 {
78 World world = GetGame().GetWorld();
79 if (!world)
80 return null;
81
82 return SCR_ScenarioFrameworkSystem.Cast(world.FindSystem(SCR_ScenarioFrameworkSystem));
83 }
84
85 //------------------------------------------------------------------------------------------------
91
92 //------------------------------------------------------------------------------------------------
95 {
96 if (!m_OnSlotAISpawned)
97 m_OnSlotAISpawned = new ScriptInvokerBase<ScriptInvokerScenarioFrameworkSlotAIMethod>();
98
99 return m_OnSlotAISpawned;
100 }
101
102 //------------------------------------------------------------------------------------------------
104 {
105 if (m_OnSlotAISpawned)
106 m_OnSlotAISpawned.Invoke(layer, entity);
107 }
108
109 //------------------------------------------------------------------------------------------------
111 override event bool ShouldBePaused()
112 {
113 return true;
114 }
115
116 //------------------------------------------------------------------------------------------------
121 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
122 void RpcDo_SetSignalOnEntity(EntityID pEntID, string signalName, int val)
123 {
124 if (!pEntID)
125 return;
126
127 IEntity entity = GetGame().GetWorld().FindEntityByID(pEntID);
128 if (!entity)
129 return;
130
132 if (!signalComponent)
133 return;
134
135 signalComponent.SetSignalValue(signalComponent.FindSignal(signalName), val);
136 }
137
138 //------------------------------------------------------------------------------------------------
143 void SetSignalValue(IEntity entity, string signalName, int val)
144 {
145 if (!entity)
146 return;
147
148 if (IsMaster())
149 Rpc(RpcDo_SetSignalOnEntity, entity.GetID(), signalName, val);
150
151 RpcDo_SetSignalOnEntity(entity.GetID(), signalName, val);
152 }
153
154 //------------------------------------------------------------------------------------------------
158 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
159 void RpcDo_PlaySoundOnEntity(EntityID pEntID, string sSndName)
160 {
161 if (!pEntID)
162 return;
163
164 IEntity entity = GetGame().GetWorld().FindEntityByID(pEntID);
165 if (!entity)
166 return;
167
169 if (!pSndComp)
170 return;
171
172 pSndComp.SoundEvent(sSndName);
173 }
174
175 //------------------------------------------------------------------------------------------------
179 void PlaySoundOnEntity(IEntity entity, string sSndName)
180 {
181 if (!entity)
182 entity = GetGame().GetGameMode(); //play it on game mode if any entity is passed
183
184 if (!entity)
185 return;
186
187 if (IsMaster())
188 Rpc(RpcDo_PlaySoundOnEntity, entity.GetID(), sSndName);
189
190 RpcDo_PlaySoundOnEntity(entity.GetID(), sSndName);
191 }
192
193 //------------------------------------------------------------------------------------------------
197 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
198 void RpcDo_PlayCommunicationSoundOnEntity(EntityID pEntID, string sSndName)
199 {
200 if (!pEntID)
201 return;
202
203 IEntity entity = GetGame().GetWorld().FindEntityByID(pEntID);
204 if (!entity)
205 return;
206
208 if (!pSndComp)
209 return;
210
211 pSndComp.SoundEvent(sSndName);
212 }
213
214 //------------------------------------------------------------------------------------------------
218 void PlayCommunicationSoundOnEntity(IEntity entity, string sSndName)
219 {
220 if (!entity)
221 entity = GetGame().GetGameMode(); //play it on game mode if any entity is passed
222
223 if (!entity)
224 return;
225
226 if (IsMaster())
228
230 }
231
232 //------------------------------------------------------------------------------------------------
237 void PlayIntroVoiceline(int playerID, string eventName, EntityID entityID)
238 {
239 Rpc(RpcDo_PlayIntroVoiceline, playerID, eventName, entityID);
240 RpcDo_PlayIntroVoiceline(playerID, eventName, entityID);
241 }
242
243 //---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
244 //------------------------------------------------------------------------------------------------
249 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
250 void RpcDo_PlayIntroVoiceline(int playerID, string eventName, EntityID entityID)
251 {
252 PlayerManager playerManager = GetGame().GetPlayerManager();
253 if (!playerManager)
254 return;
255
256 PlayerController playerController = GetGame().GetPlayerController();
257 if (!playerController)
258 return;
259
260 if (playerID != playerController.GetPlayerId())
261 return;
262
263 IEntity entity;
264 if (entityID)
265 {
266 entity = GetGame().GetWorld().FindEntityByID(entityID);
267 if (!entity)
268 return;
269 }
270 else
271 {
272 entity = playerManager.GetPlayerControlledEntity(playerID);
273 if (!entity)
274 return;
275 }
276
278 if (!signalComp)
279 return;
280
281 if (m_aIntroVoicelineIndexes.IsEmpty())
282 {
283 signalComp.SetSignalValue(signalComp.AddOrFindSignal("PlanName"), 0);
284 }
285 else
286 {
287 signalComp.SetSignalValue(signalComp.AddOrFindSignal("PlanName"), Math.RandomIntInclusive(0, 2));
288 }
289
290 int indexCount = m_aIntroVoicelineIndexes.Count();
291
292 if (indexCount > 0)
293 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective1"), m_aIntroVoicelineIndexes[0]);
294 else
295 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective1"), 1);
296
297 if (indexCount > 1)
298 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective2"), m_aIntroVoicelineIndexes[1]);
299 else
300 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective2"), 2);
301
302 if (indexCount > 2)
303 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective3"), m_aIntroVoicelineIndexes[2]);
304 else
305 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective3"), 3);
306
307 if (indexCount > 3)
308 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective4"), m_aIntroVoicelineIndexes[3]);
309 else
310 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective4"), 4);
311
312 if (indexCount > 4)
313 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective5"), m_aIntroVoicelineIndexes[4]);
314 else
315 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective5"), 5);
316
317 if (indexCount > 5)
318 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective6"), m_aIntroVoicelineIndexes[5]);
319 else
320 signalComp.SetSignalValue(signalComp.AddOrFindSignal("Objective6"), 6);
321
323 if (!soundComp)
324 return;
325
326 soundComp.SoundEvent(eventName);
327 }
328 //---- REFACTOR NOTE END ----
329
330 //------------------------------------------------------------------------------------------------
335 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
336 void RpcDo_PlaySoundOnEntityPosition(RplId objectID, string soundFile, string soundEventName)
337 {
338 IEntity object = IEntity.Cast(Replication.FindItem(objectID));
339 if (!object)
340 return;
341
342 SCR_AudioSourceConfiguration audioConfig = new SCR_AudioSourceConfiguration();
343 audioConfig.m_sSoundProject = soundFile;
344 audioConfig.m_sSoundEventName = soundEventName;
345 audioConfig.m_eFlags = EAudioSourceConfigurationFlag.FinishWhenEntityDestroyed;
346
347 SCR_SoundManagerModule.CreateAndPlayAudioSource(object, audioConfig);
348 }
349
350 //------------------------------------------------------------------------------------------------
355 void PlaySoundOnEntityPosition(IEntity object, string soundFile, string soundEventName)
356 {
357 RplId objectID = Replication.FindItemId(object);
358 if (!objectID.IsValid())
359 return;
360
362 return;
363
364 if (SCR_StringHelper.IsEmptyOrWhiteSpace(soundEventName))
365 return;
366
367 if (IsMaster())
368 Rpc(RpcDo_PlaySoundOnEntityPosition, objectID, soundFile, soundEventName);
369
370 RpcDo_PlaySoundOnEntityPosition(objectID, soundFile, soundEventName);
371 }
372
373 //------------------------------------------------------------------------------------------------
379
380 //------------------------------------------------------------------------------------------------
386
387 //------------------------------------------------------------------------------------------------
389 array<SCR_ScenarioFrameworkArea> GetAreas()
390 {
391 return m_aAreas;
392 }
393
394 //------------------------------------------------------------------------------------------------
397 {
398 s_CallQueuePausable.CallLater(OnTaskAddedCalledLater, 200, false, task)
399 }
400
401 //------------------------------------------------------------------------------------------------
404 {
406 if (!sfTask)
407 return;
408
409 if (!SCR_Enum.HasFlag(sfTask.GetTaskNotificationSettings(), SCR_ETaskNotificationSettings.ON_CREATED))
410 return;
411
412 if (!m_TaskSystem)
413 {
414 m_TaskSystem = SCR_TaskSystem.GetInstance();
415 if (!m_TaskSystem)
416 return;
417 }
418
419 array<string> factionKeys = {};
420 factionKeys = m_TaskSystem.GetTaskFactions(task);
421 if (!factionKeys)
422 return;
423
424 SCR_ScenarioFrameworkLayerTask layerTask = sfTask.GetLayerTask();
425 if (!layerTask)
426 return;
427
428 string titleParam = layerTask.GetOverridenObjectDisplayName();
429 if (SCR_StringHelper.IsEmptyOrWhiteSpace(titleParam) && layerTask.m_SlotTask)
430 titleParam = layerTask.m_SlotTask.GetSpawnedEntityDisplayName();
431
432 foreach (string factionKey : factionKeys)
433 {
434 PopUpMessage(layerTask.GetTaskTitle(), "#AR-CampaignTasks_NewObjectivesAvailable-UC", factionKey, titleParam1:titleParam);
435 }
436 }
437
438
439 //------------------------------------------------------------------------------------------------
444 {
445 if (!m_TaskSystem)
446 {
447 m_TaskSystem = SCR_TaskSystem.GetInstance();
448 if (!m_TaskSystem)
449 return;
450 }
451
453 if (!frameworkTask)
454 return;
455
456 SCR_ScenarioFrameworkLayerTask layerTask = frameworkTask.GetLayerTask();
457 if (!layerTask)
458 return;
459
460 SCR_ScenarioFrameworkSlotTask slotTask = layerTask.GetSlotTask();
461 if (!slotTask)
462 {
463 slotTask = frameworkTask.GetSlotTask();
464 if (!slotTask)
465 return;
466 }
467
468 slotTask.OnTaskStateChanged(taskState);
469
470 array<string> factionKeys = {};
471 factionKeys = m_TaskSystem.GetTaskFactions(task);
472 if (!factionKeys)
473 return;
474
475 if (m_bIsSaveGameLoad)
476 return; // No notification on load of save game
477
478 string titleParam = layerTask.GetOverridenObjectDisplayName();
480 titleParam = slotTask.GetSpawnedEntityDisplayName();
481
482 foreach (string factionKey : factionKeys)
483 {
484 if (task.GetTaskState() == SCR_ETaskState.COMPLETED)
485 {
488
489 if (SCR_Enum.HasFlag(frameworkTask.GetTaskNotificationSettings(), SCR_ETaskNotificationSettings.ON_FINISH))
490 PopUpMessage(layerTask.GetTaskTitle(), "#AR-Tasks_StatusFinished-UC", factionKey, titleParam1:titleParam);
491 }
492 else if (taskState == SCR_ETaskState.FAILED)
493 {
494 if (SCR_Enum.HasFlag(frameworkTask.GetTaskNotificationSettings(), SCR_ETaskNotificationSettings.ON_FAILED))
495 PopUpMessage(layerTask.GetTaskTitle(), "#AR-Tasks_StatusFailed-UC", factionKey, titleParam1:titleParam);
496 }
497 else if (taskState == SCR_ETaskState.CANCELLED)
498 {
499 if (SCR_Enum.HasFlag(frameworkTask.GetTaskNotificationSettings(), SCR_ETaskNotificationSettings.ON_CANCELLED))
500 PopUpMessage(layerTask.GetTaskTitle(), "#AR-Tasks_StatusCancelled-UC", factionKey, titleParam1:titleParam);
501 }
502 else if (taskState == SCR_ETaskState.PROGRESSED)
503 {
504 if (SCR_Enum.HasFlag(frameworkTask.GetTaskNotificationSettings(), SCR_ETaskNotificationSettings.ON_UPDATED))
505 PopUpMessage(layerTask.GetTaskTitle(), "#AR-Workshop_ButtonUpdate", factionKey, titleParam1:titleParam);
506 }
507 }
508 }
509
510 //------------------------------------------------------------------------------------------------
513 {
514 m_eGameOverType = GameOverType;
515 }
516
517 //------------------------------------------------------------------------------------------------
519 void Finish()
520 {
521 SCR_GameModeEndData endData = SCR_GameModeEndData.CreateSimple(m_eGameOverType, 0, 0);
522
523 m_bMatchOver = true;
524
526 }
527
528 //------------------------------------------------------------------------------------------------
531 {
532 return m_bMatchOver;
533 }
534
535 //------------------------------------------------------------------------------------------------
538 {
539 if (!m_OnAllAreasInitiated)
540 m_OnAllAreasInitiated = new ScriptInvoker();
541
542 return m_OnAllAreasInitiated;
543 }
544
545 //------------------------------------------------------------------------------------------------
550 {
551 if (m_aAreas.IsEmpty())
552 return null;
553
554 SCR_ScenarioFrameworkArea selectedArea = null;
556 return null;
557
558 vector vTaskPos = m_LastFinishedTask.GetOrigin();
559 float fMinDistance = float.MAX;
560 float fDistance = 0;
561 for (int i = 0, count = m_aAreas.Count(); i < count; i++)
562 {
563 if (!m_aAreas[i].GetIsTaskSuitableForArea(eTaskType))
564 continue;
565
566 fDistance = vector.Distance(vTaskPos, m_aAreas[i].GetOwner().GetOrigin());
567 if (fDistance < fMinDistance)
568 {
569 fMinDistance = fDistance;
570 selectedArea = m_aAreas[i];
571 }
572 }
573 return selectedArea;
574 }
575
576 //---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
577 //------------------------------------------------------------------------------------------------
580 bool IsMaster() // IsServer
581 {
582 BaseGameMode gameMode = GetGame().GetGameMode();
583 if (!gameMode)
584 return false;
585
586 RplComponent comp = RplComponent.Cast(gameMode.FindComponent(RplComponent));
587 if (!comp)
588 return false; //by purpose - debug
589
590 return !comp.IsProxy();
591 }
592 //---- REFACTOR NOTE END ----
593
594 //------------------------------------------------------------------------------------------------
598 {
599 if (!m_aAreas.Contains(area))
600 m_aAreas.Insert(area);
601 }
602
603 //------------------------------------------------------------------------------------------------
607 {
608 if (m_aAreas)
609 m_aAreas.RemoveItem(area);
610 }
611
612 //------------------------------------------------------------------------------------------------
615 {
616 SCR_GameModeSFManager sfManager = SCR_GameModeSFManager.Cast(GetGame().GetGameMode().FindComponent(SCR_GameModeSFManager));
617 if (!sfManager)
618 return;
619
620 m_aTaskTypesAvailable = sfManager.m_aTaskTypesAvailable;
621 m_iMaxNumberOfTasks = sfManager.m_iMaxNumberOfTasks;
622 m_aAfterTasksInitActions = sfManager.m_aAfterTasksInitActions;
623 m_aDebugActions = sfManager.m_aDebugActions;
624 m_aCoreAreas = sfManager.m_aCoreAreas;
625 m_aDebugAreas = sfManager.m_aDebugAreas;
626 m_bDynamicDespawn = sfManager.m_bDynamicDespawn;
627 m_iUpdateRate = sfManager.m_iUpdateRate;
628 m_sVoiceOverDataConfig = sfManager.m_sVoiceOverDataConfig;
629 }
630
631 //------------------------------------------------------------------------------------------------
634 {
635 SCR_MissionHeader header = SCR_MissionHeader.Cast(GetGame().GetMissionHeader());
636 if (!header)
637 return;
638
639 SCR_MissionHeaderScenarioFramework scenarioFrameworkHeader = SCR_MissionHeaderScenarioFramework.Cast(header);
640 if (!scenarioFrameworkHeader)
641 return;
642
643 if (scenarioFrameworkHeader.m_iMaxNumberOfTasks != -1)
644 m_iMaxNumberOfTasks = scenarioFrameworkHeader.m_iMaxNumberOfTasks;
645
646 if (!scenarioFrameworkHeader.m_aTaskTypesAvailable.IsEmpty())
647 {
648 m_aTaskTypesAvailable.Clear();
649 foreach (SCR_ScenarioFrameworkTaskType taskType : scenarioFrameworkHeader.m_aTaskTypesAvailable)
650 {
651 m_aTaskTypesAvailable.Insert(taskType);
652 }
653 }
654
655 if (!scenarioFrameworkHeader.m_aDebugAreas.IsEmpty())
656 {
657 m_aDebugAreas.Clear();
658 foreach (SCR_ScenarioFrameworkDebugArea debugArea : scenarioFrameworkHeader.m_aDebugAreas)
659 {
660 m_aDebugAreas.Insert(debugArea);
661 }
662 }
663
664 if (scenarioFrameworkHeader.m_iDynamicDespawn != -1)
665 {
666 if (scenarioFrameworkHeader.m_iDynamicDespawn == 0)
667 m_bDynamicDespawn = false;
668 else
669 m_bDynamicDespawn = true;
670 }
671
672 if (scenarioFrameworkHeader.m_iUpdateRate != -1)
673 m_iUpdateRate = scenarioFrameworkHeader.m_iUpdateRate;
674 }
675
676 //------------------------------------------------------------------------------------------------
678 override event protected void OnInit()
679 {
680 super.OnInit();
681
682 DiagMenu.RegisterMenu(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_MENU, "ScenarioFramework", "");
683 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_TASKS, "", "Tasks", "ScenarioFramework");
684 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_REGISTERED_AREAS, "", "Log Registered Areas", "ScenarioFramework");
685 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_DEBUG_AREAS, "", "Log Debug Areas", "ScenarioFramework");
686 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_LAYER_INSPECTOR, "", "Log Layer Inspector", "ScenarioFramework");
687 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_ACTION_INSPECTOR, "", "Log Action Inspector", "ScenarioFramework");
688 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_LOGIC_INSPECTOR, "", "Log Logic Inspector", "ScenarioFramework");
689 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_PLUGIN_INSPECTOR, "", "Log Plugin Inspector", "ScenarioFramework");
690 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_CONDITION_INSPECTOR, "", "Log Condition Inspector", "ScenarioFramework");
691 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_DEBUG_ACTIONS, "", "Log Debug Actions", "ScenarioFramework");
692 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_SCENARIO_FRAMEWORK_FINISH_TASK, "", "Cheat Finish Current Task", "ScenarioFramework");
693
694 m_FactionManager = GetGame().GetFactionManager();
695 SCR_Task.GetOnTaskStateChanged().Remove(OnTaskUpdate);
696 SCR_Task.GetOnTaskStateChanged().Insert(OnTaskUpdate);
697
698 m_TaskSystem = SCR_TaskSystem.GetInstance();
699 if (m_TaskSystem)
700 {
701 m_TaskSystem.GetOnTaskAdded().Remove(OnTaskAdded);
702 m_TaskSystem.GetOnTaskAdded().Insert(OnTaskAdded);
703 }
704
705 m_bIsWorldLoadInit = true;
706
707 Init();
708
709 m_bIsWorldLoadInit = false;
710 m_bIsSaveGameLoad = false;
711 }
712
713 //------------------------------------------------------------------------------------------------
716 bool Init()
717 {
718 if (!IsMaster())
719 return false;
720
723
724 if (!m_bDebugInit)
725 {
728 }
729 else
730 {
731 m_bDebugInit = false;
732 }
733
734 if (m_aDebugAreas.IsEmpty())
735 {
736 foreach (SCR_ScenarioFrameworkArea area : m_aAreas)
737 {
738 if (!area || area.GetDynamicDespawnEnabled())
739 continue;
740
741 area.Init();
742 }
743 }
744 else
745 {
747 SCR_ScenarioFrameworkLayerTask layerTask;
748 SCR_ScenarioFrameworkSlotTask slotTask;
749 foreach (SCR_ScenarioFrameworkDebugArea debugArea : m_aDebugAreas)
750 {
751 area = debugArea.GetForcedArea();
752 if (!area)
753 continue;
754
755 if (!m_aAreasTasksToSpawn.Contains(area.GetName()))
756 m_aAreasTasksToSpawn.Insert(area.GetName());
757
758 if (!area.GetDynamicDespawnEnabled())
759 area.Init();
760
761 layerTask = debugArea.GetForcedLayerTask();
762 if (layerTask && !m_aLayersTaskToSpawn.Contains(layerTask.GetName()))
763 m_aLayersTaskToSpawn.Insert(layerTask.GetName());
764
765 slotTask = debugArea.GetForcedSlotTask();
766 if (!slotTask || (slotTask && m_aSlotsTaskToSpawn.Contains(slotTask.GetName())))
767 {
768 m_aSlotsTaskToSpawn.Insert("0");
769 }
770 else
771 {
772 m_aSlotsTaskToSpawn.Insert(slotTask.GetName());
773 }
774 }
775
776 IEntity entity;
777 foreach (string coreArea : m_aCoreAreas)
778 {
780 continue;
781
782 entity = GetGame().GetWorld().FindEntityByName(coreArea);
783 if (!entity)
784 continue;
785
787 if (area && !area.GetDynamicDespawnEnabled())
788 area.Init()
789 }
790 }
791
792 //if someone registered for the event, then call it
793 if (m_OnAllAreasInitiated)
794 m_OnAllAreasInitiated.Invoke();
795
796 PostInit();
797
798 return true;
799 }
800
801 //------------------------------------------------------------------------------------------------
803 void PostInit()
804 {
806
807 if (m_aDebugShapesLayers.IsEmpty())
808 return;
809
810 BaseGameMode gameMode = GetGame().GetGameMode();
811 if (!gameMode)
812 return;
813
814 SCR_BaseGameMode scriptedGameMode = SCR_BaseGameMode.Cast(gameMode);
815 if (!scriptedGameMode)
816 return;
817
818 scriptedGameMode.GetOnPlayerConnected().Remove(OnPlayerConnected);
819 scriptedGameMode.GetOnPlayerConnected().Insert(OnPlayerConnected);
820 }
821
822 //------------------------------------------------------------------------------------------------
823 void OnPlayerConnected(int playerID)
824 {
825 SyncDebugShapes(playerID);
826
827 if (m_mVariableMap.IsEmpty())
828 return;
829
830 foreach (string key, string value : m_mVariableMap)
831 {
832 Rpc(RpcDo_CreateVariableValue, key, value, playerID);
833 }
834 }
835
836 //------------------------------------------------------------------------------------------------
839 void SyncDebugShapes(int playerID)
840 {
841 int count = m_aDebugShapesLayers.Count();
842 for (int i = 0; i < count; i++)
843 {
845 Rpc(RpcDo_ManageLayerDebugShape, playerID, debugLayer.param1, debugLayer.param2, debugLayer.param3);
846 }
847 }
848
849 //---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
850 //------------------------------------------------------------------------------------------------
853 void SpawnRandomTask(int countSafe = 0)
854 {
855 if (countSafe >= m_iMaxNumberOfTasks)
856 return;
857
858 // In case of more max tasks to be spawned but with less task types, we need to refill it again
859 if (m_aESFTaskTypeForRandomization.IsEmpty())
861
862 if (m_aLayerTasksForRandomization.IsEmpty())
863 return;
864
865 SCR_ScenarioFrameworkLayerTask layerTask = m_aLayerTasksForRandomization.GetRandomElement();
866 if (!layerTask)
867 return;
868
869 // This filters out task types that were already spawned
870 SCR_ESFTaskType taskType = layerTask.GetTaskType();
871 if (!m_aESFTaskTypeForRandomization.Contains(taskType))
872 {
873 for (int i = m_aLayerTasksForRandomization.Count() - 1; i >= 0; i--)
874 {
875 if (m_aLayerTasksForRandomization[i].GetTaskType() == taskType)
877 }
878
879 if (m_aESFTaskTypesAvailable.Contains(taskType))
880 SpawnRandomTask(countSafe + 1);
881 }
882 m_aESFTaskTypeForRandomization.RemoveItem(taskType);
883
884 //Spawning and setting necessary states
885 SCR_ScenarioFrameworkArea area = layerTask.GetParentArea();
886 m_aLayerTasksToBeInitialized.Insert(layerTask);
887 layerTask.SetParentLayer(layerTask.GetParentLayer());
888 layerTask.Init(area, SCR_ScenarioFrameworkEActivationType.ON_TASKS_INIT);
889 area.SetLayerTask(layerTask);
890 area.SetAreaSelected(true);
891 m_aSelectedAreas.Insert(area);
892
893 // Removing all Layer Tasks that have the same Task Type
894 for (int i = m_aLayerTasksForRandomization.Count() - 1; i >= 0; i--)
895 {
896 if (m_aLayerTasksForRandomization[i].GetTaskType() == taskType)
898 }
899
900 // Removing all Layer Tasks that are from the same Area of randomly selected Layer Task
901 for (int i = m_aLayerTasksForRandomization.Count() - 1; i >= 0; i--)
902 {
905 }
906
907 Print(string.Format("ScenarioFramework: Creating area %1 with Layer Task %2", area.GetOwner().GetName(), layerTask.GetOwner().GetName()), LogLevel.NORMAL);
908 }
909
910 //------------------------------------------------------------------------------------------------
913 {
914 if (m_aTaskTypesAvailable.IsEmpty())
915 {
916 Print("ScenarioFramework: Available tasks are empty, no new tasks will be generated.", LogLevel.NORMAL);
917 return;
918 }
919
920 if (m_aAreas.IsEmpty())
921 {
922 Print("ScenarioFramework: There are no Areas to generate tasks from", LogLevel.NORMAL);
923 return;
924 }
925
926 Print("ScenarioFramework: ---------------------- Generating tasks -------------------", LogLevel.NORMAL);
927
928 if (!m_aLayersTaskToSpawn.IsEmpty())
929 {
930 for (int i = 0; i < m_aLayersTaskToSpawn.Count(); i++)
931 {
933 }
934
936 Print("ScenarioFramework: ---------------------- Generation of tasks completed -------------------", LogLevel.NORMAL);
937
938 //If counts are not the same, we want randomization to occur
939 if (m_aAreasTasksToSpawn.Count() == m_aLayersTaskToSpawn.Count())
940 return;
941 }
942
943 //Fetching all Layer Tasks from Areas
944 array<SCR_ScenarioFrameworkLayerTask> layerTasksToRandomize = {};
945 array<SCR_ScenarioFrameworkLayerTask> layerTasks = {};
946 if (m_aDebugAreas.IsEmpty())
947 {
948 foreach (SCR_ScenarioFrameworkArea area : m_aAreas)
949 {
950 if (!area)
951 continue;
952
953 area.GetAllLayerTasks(layerTasks);
954 layerTasksToRandomize.InsertAll(layerTasks);
955 }
956 }
957 else
958 {
959 SCR_ScenarioFrameworkArea forcedArea;
960 SCR_ScenarioFrameworkArea forcedLayerTask;
961 foreach (SCR_ScenarioFrameworkDebugArea debugArea : m_aDebugAreas)
962 {
963 forcedArea = debugArea.GetForcedArea();
964 if (!forcedArea)
965 continue;
966
967 //If debug area has LayerTask set, we don't want to put it for randomization
968 if (debugArea.GetForcedLayerTask())
969 continue;
970
971 forcedArea.GetAllLayerTasks(layerTasks);
972 layerTasksToRandomize.InsertAll(layerTasks);
973 }
974 }
975
976 //Fetching available Task Types for generation based on type
977 foreach (SCR_ScenarioFrameworkTaskType taskTypeClass : m_aTaskTypesAvailable)
978 {
979 m_aESFTaskTypesAvailable.Insert(taskTypeClass.GetTaskType());
980 }
981
982 //Removing Layer Tasks that don't have Task Type set in Available Task Types
983 for (int i = layerTasksToRandomize.Count() - 1; i >= 0; i--)
984 {
985 if (!m_aESFTaskTypesAvailable.Contains(layerTasksToRandomize[i].GetTaskType()))
986 layerTasksToRandomize.Remove(i);
987 }
988
989 //Removing Layer Tasks that don't have activation type set to ON_TASKS_INIT
990 for (int i = layerTasksToRandomize.Count() - 1; i >= 0; i--)
991 {
992 if (layerTasksToRandomize[i].GetActivationType() != SCR_ScenarioFrameworkEActivationType.ON_TASKS_INIT)
993 layerTasksToRandomize.Remove(i);
994 }
995
996 // Cleans unused task types
997 for (int i = m_aESFTaskTypesAvailable.Count() - 1; i >= 0; i--)
998 {
999 bool invalidType = true;
1000 foreach (SCR_ScenarioFrameworkLayerTask layerTask : m_aLayerTasksForRandomization)
1001 {
1002 if (layerTask.GetTaskType() == m_aESFTaskTypesAvailable[i])
1003 {
1004 invalidType = false;
1005 break;
1006 }
1007
1008 if (invalidType)
1010 }
1011 }
1012
1013 //Creating a copy so we can work with these in loops
1015 m_aLayerTasksForRandomization.Copy(layerTasksToRandomize);
1016
1017 //Spawning desired number of tasks
1018 for (int i = 0; i < m_iMaxNumberOfTasks; i++)
1019 {
1020 //Layers Tasks are shrinked down and after certain number of generations, we need to refill it
1021 if (m_aLayerTasksForRandomization.IsEmpty())
1022 {
1023 m_aLayerTasksForRandomization.Copy(layerTasksToRandomize);
1024
1025 foreach (SCR_ScenarioFrameworkArea selectedArea : m_aSelectedAreas)
1026 {
1027 for (int j = m_aLayerTasksForRandomization.Count() - 1; j >= 0; j--)
1028 {
1029 if (m_aLayerTasksForRandomization[j].GetParentArea() == selectedArea)
1030 {
1032 continue;
1033 }
1034 }
1035 }
1036 }
1037
1039 }
1040
1041 if (m_aLayerTasksToBeInitialized.Count() < m_iMaxNumberOfTasks)
1042 Print(string.Format("ScenarioFramework: Available areas do not have any other tasks to generate. Only %1 out of %2 was generated", m_aLayerTasksToBeInitialized, m_iMaxNumberOfTasks), LogLevel.NORMAL);
1043
1045 Print("ScenarioFramework: ---------------------- Generation of tasks completed -------------------", LogLevel.NORMAL);
1046 }
1047 //---- REFACTOR NOTE END ----
1048
1049 //------------------------------------------------------------------------------------------------
1051 void CreateVariableValue(string key, string value)
1052 {
1053 Rpc(RpcDo_CreateVariableValue, key, value, -2);
1054 RpcDo_CreateVariableValue(key, value, -2);
1055 }
1056
1057 //------------------------------------------------------------------------------------------------
1059 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
1060 void RpcDo_CreateVariableValue(string key, string value, int playerID)
1061 {
1062 // -2 is used for runtime creations. JIP uses actual playerID
1063 if (playerID > -2 && SCR_PlayerController.GetLocalPlayerId() != playerID)
1064 return;
1065
1066 string notUsed;
1067 if (!GetVariable(key, notUsed))
1068 m_mVariableMap.Insert(key, value);
1069 }
1070
1071 //------------------------------------------------------------------------------------------------
1073 void SetVariableValue(string key, string value)
1074 {
1075 Rpc(RpcDo_SetVariableValue, key, value);
1076 RpcDo_SetVariableValue(key, value);
1077 }
1078
1079 //------------------------------------------------------------------------------------------------
1081 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
1082 void RpcDo_SetVariableValue(string key, string value)
1083 {
1084 string notUsed;
1085 if (GetVariable(key, notUsed))
1086 m_mVariableMap.Set(key, value);
1087 else
1088 RpcDo_CreateVariableValue(key, value, -2);
1089 }
1090
1091 //------------------------------------------------------------------------------------------------
1093 bool GetVariable(string key, out string value)
1094 {
1095 if (key.IsEmpty())
1096 {
1097 Print(string.Format("Variable %1 is not set in this scenario", key), LogLevel.NORMAL);
1098 return false;
1099 }
1100
1101 return m_mVariableMap.Find(key, value);
1102 }
1103
1104 //------------------------------------------------------------------------------------------------
1108 void ProcessVoicelineEnumAndString(typename targetEnum, string targetString)
1109 {
1110 targetEnum = SCR_ECombatOps_Everon_Tasks;
1111 array<string> stringValues = {};
1112 SCR_Enum.GetEnumNames(targetEnum, stringValues);
1113
1114 int index = stringValues.Find(targetString);
1115 if (index != -1)
1117 }
1118
1119 //------------------------------------------------------------------------------------------------
1122 {
1123 foreach (SCR_ScenarioFrameworkLayerTask layerTask : m_aLayerTasksToBeInitialized)
1124 {
1125 if (!layerTask)
1126 continue;
1127
1128 SCR_ScenarioFrameworkArea parentArea = layerTask.GetParentArea();
1129 if (!parentArea)
1130 continue;
1131
1132 if (m_bDynamicDespawn && (layerTask.m_bDynamicDespawn || parentArea.m_bDynamicDespawn) && !layerTask.GetDynamicDespawnExcluded())
1133 layerTask.DynamicDespawn(null);
1134 }
1135
1136 foreach (SCR_ScenarioFrameworkActionBase afterTasksInitActions : m_aAfterTasksInitActions)
1137 {
1138 afterTasksInitActions.Init(m_aAreas.GetRandomElement().GetOwner());
1139 }
1140 }
1141
1142 //---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
1143 //------------------------------------------------------------------------------------------------
1147 {
1148 if (!m_aAreasTasksToSpawn.IsIndexValid(index) || !m_aLayersTaskToSpawn.IsIndexValid(index))
1149 return;
1150
1151 string targetLayer = m_aLayersTaskToSpawn[index];
1152 string targetArea = m_aAreasTasksToSpawn[index];
1153
1154 IEntity layerEntity = GetGame().GetWorld().FindEntityByName(targetLayer);
1155 if (!layerEntity)
1156 return;
1157
1158 SCR_ScenarioFrameworkLayerTask taskComponent = SCR_ScenarioFrameworkLayerTask.Cast(layerEntity.FindComponent(SCR_ScenarioFrameworkLayerTask));
1159 if (!taskComponent)
1160 return;
1161
1162 m_aLayerTasksToBeInitialized.Insert(taskComponent);
1163
1164 IEntity areaEntity = GetGame().GetWorld().FindEntityByName(targetArea);
1165 if (!areaEntity)
1166 areaEntity = layerEntity.GetParent();
1167
1168 if (!areaEntity)
1169 return;
1170
1172 if (!area)
1173 return;
1174
1175 string targetSlot;
1176 if (m_aSlotsTaskToSpawn.IsIndexValid(index))
1177 targetSlot = m_aSlotsTaskToSpawn[index];
1178
1179 SCR_ScenarioFrameworkSlotTask slotComponent;
1180 if (targetSlot != "0" && !SCR_StringHelper.IsEmptyOrWhiteSpace(targetSlot))
1181 {
1182 IEntity slotEntity = GetGame().GetWorld().FindEntityByName(targetSlot);
1183 if (slotEntity)
1184 slotComponent = SCR_ScenarioFrameworkSlotTask.Cast(slotEntity.FindComponent(SCR_ScenarioFrameworkSlotTask));
1185 }
1186
1187 area.SetAreaSelected(true);
1188 taskComponent.SetActivationType(SCR_ScenarioFrameworkEActivationType.ON_TASKS_INIT);
1189
1190 area.Create(taskComponent, slotComponent);
1191 Print(string.Format("ScenarioFramework: Creating area %1", area.GetOwner().GetName()), LogLevel.NORMAL);
1192 Print("ScenarioFramework: ---------------------------------------------------------------", LogLevel.NORMAL);
1193 }
1194
1195 //------------------------------------------------------------------------------------------------
1200 {
1201 if (m_aAreas.IsEmpty())
1202 return null;
1203
1204 SCR_ScenarioFrameworkArea selectedArea;
1205 array<SCR_ScenarioFrameworkArea> aAreasCopy = {};
1206 aAreasCopy.Copy(m_aAreas);
1207 for (int i = 0, count = m_aAreas.Count(); i < count; i++)
1208 {
1209 selectedArea = aAreasCopy.GetRandomElement();
1210 if (!selectedArea.GetIsAreaSelected() && selectedArea.GetIsTaskSuitableForArea(eTaskType))
1211 {
1212 selectedArea.SetAreaSelected(true);
1213 return selectedArea;
1214 }
1215 else
1216 {
1217 aAreasCopy.RemoveItem(selectedArea);
1218 }
1219 }
1220 return null;
1221 }
1222 //---- REFACTOR NOTE END ----
1223
1224 //------------------------------------------------------------------------------------------------
1228 {
1229 if (!child)
1230 return null;
1231
1233 IEntity entity = child.GetParent();
1234 while (entity)
1235 {
1237 if (layer)
1238 return layer;
1239
1240 entity = entity.GetParent();
1241 }
1242
1243 return layer;
1244 }
1245
1246 //------------------------------------------------------------------------------------------------
1250 void PrepareAreaSpecificDynamicDespawn(SCR_ScenarioFrameworkArea area, bool staySpawned = false, int despawnRange = 0)
1251 {
1252 area.SetDynamicDespawnEnabled(true);
1253 area.SetDynamicDespawnRange(despawnRange);
1254
1255 //If this method is called with staySpawned = false, area will be added to m_aDespawnedAreas and gets despawned
1256 if (!staySpawned)
1257 {
1258 m_aDespawnedAreas.Insert(new Tuple3<SCR_ScenarioFrameworkArea, vector, int>(area, area.GetOwner().GetOrigin(), (despawnRange * despawnRange)));
1259 area.DynamicDespawn(area);
1260 }
1261 else
1262 {
1263 m_aSpawnedAreas.Insert(new Tuple3<SCR_ScenarioFrameworkArea, vector, int>(area, area.GetOwner().GetOrigin(), (despawnRange * despawnRange)));
1264 }
1265 }
1266
1267 //------------------------------------------------------------------------------------------------
1272 {
1273 area.SetDynamicDespawnEnabled(false);
1274
1275 //If this method is called with staySpawned = false, area will be despawned
1276 if (!staySpawned)
1277 area.DynamicDespawn(area);
1278
1279 for (int i = m_aDespawnedAreas.Count() - 1; i >= 0; i--)
1280 {
1282 if (area == areaInfo.param1)
1283 m_aDespawnedAreas.Remove(i);
1284 }
1285
1286 for (int i = m_aSpawnedAreas.Count() - 1; i >= 0; i--)
1287 {
1289 if (area == areaInfo.param1)
1290 m_aSpawnedAreas.Remove(i);
1291 }
1292 }
1293
1294 //------------------------------------------------------------------------------------------------
1297 {
1298 if (!m_bDynamicDespawn)
1299 return;
1300
1302
1303 foreach (SCR_ScenarioFrameworkArea area : m_aAreas)
1304 {
1305 if (!area || !area.GetDynamicDespawnEnabled())
1306 continue;
1307
1308 int despawnRange = area.GetDynamicDespawnRange();
1309 m_aDespawnedAreas.Insert(new Tuple3<SCR_ScenarioFrameworkArea, vector, int>(area, area.GetOwner().GetOrigin(), (despawnRange * despawnRange)));
1310
1311 area.DynamicDespawn(null);
1312 }
1313
1314 SCR_ScenarioFrameworkSystem.GetCallQueuePausable().CallLater(CheckDistance, 1000 * m_iUpdateRate, true);
1315 }
1316
1317 //------------------------------------------------------------------------------------------------
1320 {
1321 m_aObservers.Clear();
1322 array<int> playerIds = {};
1323 PlayerManager playerManager = GetGame().GetPlayerManager();
1324 IEntity player;
1325 SCR_DamageManagerComponent damageManager;
1326 playerManager.GetPlayers(playerIds);
1327
1328 foreach (int playerId : playerIds)
1329 {
1330 player = playerManager.GetPlayerControlledEntity(playerId);
1331 if (!player)
1332 continue;
1333
1334 damageManager = SCR_DamageManagerComponent.GetDamageManager(player);
1335 if (damageManager && damageManager.GetState() != EDamageState.DESTROYED)
1336 m_aObservers.Insert(player.GetOrigin());
1337 }
1338
1339 DynamicSpawn();
1341 }
1342
1343 //------------------------------------------------------------------------------------------------
1346 {
1348 for (int i = m_aDespawnedAreas.Count() - 1; i >= 0; i--)
1349 {
1350 areaInfo = m_aDespawnedAreas[i];
1351 if (!areaInfo.param1)
1352 continue;
1353
1354 foreach (vector observerPos : m_aObservers)
1355 {
1356 if (vector.DistanceSqXZ(observerPos, areaInfo.param2) < areaInfo.param3)
1357 {
1358 areaInfo.param1.DynamicReinit();
1359 m_aSpawnedAreas.Insert(areaInfo);
1360 m_aDespawnedAreas.Remove(i);
1361 break;
1362 }
1363 }
1364 }
1365 }
1366
1367 //------------------------------------------------------------------------------------------------
1370 {
1372 for (int i = m_aSpawnedAreas.Count() - 1; i >= 0; i--)
1373 {
1374 areaInfo = m_aSpawnedAreas[i];
1375 if (!areaInfo.param1)
1376 continue;
1377
1378 bool observerInRange;
1379 foreach (vector observerPos : m_aObservers)
1380 {
1381 if (vector.DistanceSqXZ(observerPos, areaInfo.param2) < areaInfo.param3)
1382 {
1383 observerInRange = true;
1384 break;
1385 }
1386 }
1387
1388 if (!observerInRange)
1389 {
1390 areaInfo.param1.DynamicDespawn(null);
1391 m_aDespawnedAreas.Insert(areaInfo);
1392 m_aSpawnedAreas.Remove(i);
1393 }
1394 }
1395 }
1396
1397 //------------------------------------------------------------------------------------------------
1404 void ShowHint(string sTitle, string sSubtitle, int timeOut, FactionKey factionKey = "", int playerID = -1)
1405 {
1406 Rpc(RpcDo_ShowHint, sTitle, sSubtitle, timeOut, factionKey, playerID);
1407 RpcDo_ShowHint(sTitle, sSubtitle, timeOut, factionKey, playerID);
1408 }
1409
1410 //------------------------------------------------------------------------------------------------
1417 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
1418 void RpcDo_ShowHint(string sTitle, string sSubtitle, int timeOut, FactionKey factionKey, int playerID)
1419 {
1420 if (RplSession.Mode() == RplMode.Dedicated)
1421 return;
1422
1423 if (!SCR_StringHelper.IsEmptyOrWhiteSpace(factionKey))
1424 {
1425 if (SCR_FactionManager.SGetLocalPlayerFaction() != GetGame().GetFactionManager().GetFactionByKey(factionKey))
1426 return;
1427 }
1428
1429 if (playerID != -1)
1430 {
1431 PlayerController playerController = GetGame().GetPlayerController();
1432 if (!playerController)
1433 return;
1434
1435 if (playerID != playerController.GetPlayerId())
1436 return;
1437 }
1438
1439 SCR_HintUIInfo info = SCR_HintUIInfo.CreateInfo(sTitle, sSubtitle, timeOut, 0, 0, true);
1440 if (info)
1441 SCR_HintManagerComponent.ShowHint(info);
1442 }
1443
1444 //------------------------------------------------------------------------------------------------
1448 void HideHint(FactionKey factionKey = "", int playerID = -1)
1449 {
1450 Rpc(RpcDo_HideHint, factionKey, playerID);
1451 RpcDo_HideHint(factionKey, playerID);
1452 }
1453
1454 //------------------------------------------------------------------------------------------------
1458 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
1459 void RpcDo_HideHint(FactionKey factionKey, int playerID)
1460 {
1461 if (RplSession.Mode() == RplMode.Dedicated)
1462 return;
1463
1464 if (!SCR_StringHelper.IsEmptyOrWhiteSpace(factionKey))
1465 {
1466 if (SCR_FactionManager.SGetLocalPlayerFaction() != GetGame().GetFactionManager().GetFactionByKey(factionKey))
1467 return;
1468 }
1469
1470 if (playerID != -1)
1471 {
1472 PlayerController playerController = GetGame().GetPlayerController();
1473 if (!playerController)
1474 return;
1475
1476 if (playerID != playerController.GetPlayerId())
1477 return;
1478 }
1479
1480 SCR_HintManagerComponent.HideHint();
1481 }
1482
1483 //------------------------------------------------------------------------------------------------
1489 void PopUpMessage(string sTitle, string sSubtitle, FactionKey factionKey = "", int playerID = -1, string titleParam1 = "", string titleParam2 = "", string subtitleParam1 = "", string subtitleParam2 = "")
1490 {
1491 Rpc(RpcDo_PopUpMessage, sTitle, sSubtitle, factionKey, playerID, titleParam1, titleParam2, subtitleParam1, subtitleParam2);
1492 RpcDo_PopUpMessage(sTitle, sSubtitle, factionKey, playerID, titleParam1, titleParam2, subtitleParam1, subtitleParam2);
1493 }
1494
1495 //------------------------------------------------------------------------------------------------
1501 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
1502 void RpcDo_PopUpMessage(string sTitle, string sSubtitle, FactionKey factionKey, int playerID, string titleParam1, string titleParam2, string subtitleParam1, string subtitleParam2)
1503 {
1504 if (RplSession.Mode() == RplMode.Dedicated)
1505 return;
1506
1507 if (!SCR_StringHelper.IsEmptyOrWhiteSpace(factionKey))
1508 {
1509 const FactionManager fm = GetGame().GetFactionManager();
1510 if (!fm || SCR_FactionManager.SGetLocalPlayerFaction() != fm.GetFactionByKey(factionKey))
1511 return;
1512 }
1513
1514 if (playerID != -1)
1515 {
1516 PlayerController playerController = GetGame().GetPlayerController();
1517 if (!playerController)
1518 return;
1519
1520 if (playerID != playerController.GetPlayerId())
1521 return;
1522 }
1523
1524 SCR_PopUpNotification.GetInstance().PopupMsg(sTitle, text2: sSubtitle, param1: titleParam1, param2: titleParam2, text2param1: subtitleParam1, text2param2: subtitleParam2);
1525 }
1526
1527 //------------------------------------------------------------------------------------------------
1533 void ManageLayerDebugShape(EntityID id, bool draw, float radius, bool runtime)
1534 {
1535 IEntity entity = GetGame().GetWorld().FindEntityByID(id);
1536 if (!entity)
1537 return;
1538
1540 if (!layer)
1541 return;
1542
1543 layer.m_bShowDebugShapesDuringRuntime = draw;
1544 layer.m_fDebugShapeRadius = radius;
1545
1546 if (draw)
1547 layer.SetEventMask(layer.GetOwner(), EntityEvent.INIT | EntityEvent.FRAME);
1548
1549 if (RplSession.Mode() != RplMode.Client)
1550 m_aDebugShapesLayers.Insert(new Tuple3<EntityID, bool, float>(id, draw, radius));
1551
1552 /*if (runtime)
1553 Rpc(RpcDo_ManageLayerDebugShape, id, draw, radius); */
1554 }
1555
1556 //------------------------------------------------------------------------------------------------
1562 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
1563 void RpcDo_ManageLayerDebugShape(int playerID, EntityID id, bool draw, float radius)
1564 {
1565 if (RplSession.Mode() == RplMode.Dedicated)
1566 return;
1567
1568 if (SCR_PlayerController.GetLocalPlayerId() != playerID)
1569 return;
1570
1571 IEntity entity = GetGame().GetWorld().FindEntityByID(id);
1572 if (!entity)
1573 return;
1574
1576 if (!layer)
1577 return;
1578
1579 layer.m_bShowDebugShapesDuringRuntime = draw;
1580 layer.m_fDebugShapeRadius = radius;
1581
1582 if (draw)
1583 layer.SetEventMask(layer.GetOwner(), EntityEvent.INIT | EntityEvent.FRAME);
1584 }
1585
1586 //------------------------------------------------------------------------------------------------
1595
1596 void ShowLayout(int playerId = -1, EntityID actionOwnerEntId = EntityID.INVALID, int layoutId = -1, float fadeIn = -1, float fadeOut = -1, float visibilityTime = -1, float opacity = -1)
1597 {
1598 Rpc(RpcDo_ShowLayout, playerId, actionOwnerEntId, layoutId, fadeIn, fadeOut, visibilityTime, opacity);
1599 RpcDo_ShowLayout(playerId, actionOwnerEntId, layoutId, fadeIn, fadeOut, visibilityTime, opacity);
1600 }
1601
1602 //------------------------------------------------------------------------------------------------
1611 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
1612 void RpcDo_ShowLayout(int playerID, EntityID actionOwnerEntId, int layoutId, float fadeIn, float fadeOut, float visibilityTime, float opacity)
1613 {
1614 if (RplSession.Mode() == RplMode.Dedicated)
1615 return;
1616
1617 if (playerID == -1)
1618 return;
1619
1620 PlayerController playerController = GetGame().GetPlayerController();
1621 if (!playerController)
1622 return;
1623
1624 if (playerID != playerController.GetPlayerId())
1625 return;
1626
1627 IEntity actionOwnerEntity = GetGame().GetWorld().FindEntityByID(actionOwnerEntId);
1628 if (!actionOwnerEntity)
1629 return;
1630
1632 if (!layerBase)
1633 return;
1634
1635 SCR_ScenarioFrameworkActionShowLayout actionShowLayout = GetLayoutComponent(layerBase, layoutId);
1636 if (!actionShowLayout)
1637 {
1638 PrintFormat("ScenarioFramework Action: Action ShowLayout with ID %1 wasn't found at layer %2.", layoutId, layerBase, LogLevel.ERROR);
1639 return;
1640 }
1641
1643 Widget rootWidget = hudManager.CreateLayout(actionShowLayout.GetLayoutResource(), EHudLayers.OVERLAY);
1644 if (!rootWidget)
1645 return;
1646
1647 Widget imgWidget = rootWidget.FindAnyWidget("Image");
1648 if (!imgWidget)
1649 imgWidget = ImageWidget.Cast(rootWidget);
1650
1651 if (!imgWidget)
1652 return;
1653
1654 imgWidget.SetOpacity(0);
1655
1656 float animVal;
1657 if (fadeIn == 0)
1658 animVal = 1000;
1659 else
1660 animVal = 1 / fadeIn;
1661
1662 AnimateWidget.Opacity(imgWidget, opacity, animVal);
1663 SCR_ScenarioFrameworkCallQueueSystem.GetCallQueueNonPausable().CallLater(FadeOut, (fadeIn + visibilityTime) * 1000, false, imgWidget, fadeOut);
1664 }
1665
1666 //------------------------------------------------------------------------------------------------
1667 void FadeOut(Widget imgWidget, float fadeOut)
1668 {
1669 float animVal;
1670 if (fadeOut == 0)
1671 animVal = 1000;
1672 else
1673 animVal = 1 / fadeOut;
1674
1675 AnimateWidget.Opacity(imgWidget, 0, animVal);
1676 }
1677
1678 //------------------------------------------------------------------------------------------------
1680 {
1682 array<ref SCR_ScenarioFrameworkActionBase> activationActions = layerBase.GetActivationActions();
1683
1684 foreach (SCR_ScenarioFrameworkActionBase action : activationActions)
1685 {
1686 actionShowLayout = SCR_ScenarioFrameworkActionShowLayout.Cast(action);
1687 if (actionShowLayout && actionShowLayout.m_iID == layoutId)
1688 return actionShowLayout;
1689
1690 actionShowLayout = CheckSubActions(action, layoutId);
1691 if (actionShowLayout)
1692 return actionShowLayout;
1693 }
1694
1695 array<ref SCR_ScenarioFrameworkPlugin> plugins = layerBase.GetSpawnedPlugins();
1696 foreach (SCR_ScenarioFrameworkPlugin plugin : plugins)
1697 {
1698 array<ref SCR_ScenarioFrameworkActionBase> pluginActions = plugin.GetActions();
1699 foreach (SCR_ScenarioFrameworkActionBase pluginAction : pluginActions)
1700 {
1701 actionShowLayout = SCR_ScenarioFrameworkActionShowLayout.Cast(pluginAction);
1702 if (actionShowLayout && actionShowLayout.m_iID == layoutId)
1703 return actionShowLayout;
1704
1705 actionShowLayout = CheckSubActions(pluginAction, layoutId);
1706 if (actionShowLayout)
1707 return actionShowLayout;
1708 }
1709 }
1710
1711 return actionShowLayout;
1712 }
1713
1714 //------------------------------------------------------------------------------------------------
1716 {
1718 array<ref SCR_ScenarioFrameworkActionBase> subAtions = action.GetSubActions();
1719 if (!subAtions)
1720 return null;
1721
1722 foreach (SCR_ScenarioFrameworkActionBase subAction : subAtions)
1723 {
1724 actionShowLayout = SCR_ScenarioFrameworkActionShowLayout.Cast(subAction);
1725 if (actionShowLayout && actionShowLayout.m_iID == layoutId)
1726 return actionShowLayout;
1727
1728 actionShowLayout = CheckSubActions(subAction, layoutId);
1729 }
1730
1731 return actionShowLayout;
1732 }
1733
1734 //------------------------------------------------------------------------------------------------
1735 static bool IsSaveGameLoading()
1736 {
1737 auto instance = SCR_ScenarioFrameworkSystem.GetInstance();
1738 return instance && instance.m_bIsSaveGameLoad;
1739 }
1740
1741 //------------------------------------------------------------------------------------------------
1742 static bool IsWorldLoadInit()
1743 {
1744 auto instance = SCR_ScenarioFrameworkSystem.GetInstance();
1745 return instance && instance.m_bIsWorldLoadInit;
1746 }
1747
1748 //------------------------------------------------------------------------------------------------
1749 override event protected void OnUpdatePoint(WorldUpdatePointArgs args)
1750 {
1751 float timeSlice = args.GetTimeSliceSeconds();
1752
1753 m_fTimer += timeSlice;
1754
1756 return;
1757
1758 m_fTimer = 0;
1759
1760 s_CallQueuePausable.Tick(timeSlice);
1761 }
1762
1763 //------------------------------------------------------------------------------------------------
1765 override event protected void OnDiag(float timeSlice)
1766 {
1767 super.OnDiag(timeslice);
1768
1770 }
1771
1772 //------------------------------------------------------------------------------------------------
1775 {
1777 s_CallQueuePausable.Clear();
1778 }
1779}
SCR_DebugMenuID
This enum contains all IDs for DiagMenu entries added in script.
Definition DebugMenuID.c:4
EGameOverTypes
ArmaReforgerScripted GetGame()
Definition game.c:1398
LayerPresets layer
RplMode
Mode of replication.
Definition RplMode.c:9
vector GetOrigin()
SCR_BaseGameMode GetGameMode()
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
SCR_ESFTaskType
void SCR_FactionManager(IEntitySource src, IEntity parent)
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
SCR_ScenarioFrameworkEActivationType GetActivationType()
SCR_ScenarioFrameworkArea GetParentArea()
void SCR_ScenarioFrameworkLayerBase(IEntityComponentSource src, IEntity ent, IEntity parent)
SCR_ESFTaskType GetTaskType()
ScriptInvokerBase< ScriptInvokerScenarioFrameworkSlotAIMethod > ScriptInvokerScenarioFrameworkSlotAI
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
SCR_ETaskState
Definition SCR_Task.c:3
static WidgetAnimationOpacity Opacity(Widget widget, float targetValue, float speed, bool toggleVisibility=false)
Diagnostic and developer menu system.
Definition DiagMenu.c:18
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
proto external BaseWorld GetWorld()
proto external EntityID GetID()
proto external IEntity GetParent()
Definition Math.c:13
Main replication API.
Definition Replication.c:14
Replication item identifier.
Definition RplId.c:14
void EndGameMode(SCR_GameModeEndData endData)
ScriptInvokerBase< SCR_BaseGameMode_PlayerId > GetOnPlayerConnected()
static SCR_HUDManagerComponent GetHUDManager()
Widget CreateLayout(ResourceName path, EHudLayers layer, int zOrder=0)
static SCR_HintUIInfo CreateInfo(string description, string name, float duration, EHint type, EFieldManualEntryId fieldManualEntry, bool isTimerVisible)
static int GetLocalPlayerId()
Returns either a valid ID of local player or 0.
Takes care of dynamic and static onscreen popups.
void PopupMsg(string text, float duration=DEFAULT_DURATION, string text2="", int prio=-1, string param1="", string param2="", string param3="", string param4="", string text2param1="", string text2param2="", string text2param3="", string text2param4="", string sound="", SCR_EPopupMsgFilter category=SCR_EPopupMsgFilter.ALL, WorldTimestamp progressStart=null, WorldTimestamp progressEnd=null)
static SCR_PopUpNotification GetInstance()
override void DynamicDespawn(SCR_ScenarioFrameworkLayerBase layer)
override void Init(SCR_ScenarioFrameworkArea area=null, SCR_ScenarioFrameworkEActivationType activation=SCR_ScenarioFrameworkEActivationType.SAME_AS_PARENT)
bool GetIsTaskSuitableForArea(SCR_ESFTaskType eTaskType)
void ~SCR_ScenarioFrameworkSystem()
Clears CallQueue after destruction of this system.
void SetVariableValue(string key, string value)
Set a value to global variable at the scenario.
SCR_ScenarioFrameworkActionShowLayout GetLayoutComponent(SCR_ScenarioFrameworkLayerBase layerBase, int layoutId)
ref array< ref Tuple3< SCR_ScenarioFrameworkArea, vector, int > > m_aSpawnedAreas
void RpcDo_SetSignalOnEntity(EntityID pEntID, string signalName, int val)
ref array< ref Tuple3< SCR_ScenarioFrameworkArea, vector, int > > m_aDespawnedAreas
void AfterLayerTasksInit()
Executes AfterTasksInitActions after all Layer Tasks are finished spawning.
void GenerateTasks()
Main function responsible for selecting available tasks and spawning the areas related to the tasks.
SCR_ScenarioFrameworkArea GetParentArea(IEntity child)
static ScriptCallQueue GetCallQueuePausable()
void ShowLayout(int playerId=-1, EntityID actionOwnerEntId=EntityID.INVALID, int layoutId=-1, float fadeIn=-1, float fadeOut=-1, float visibilityTime=-1, float opacity=-1)
static void InvokeSlotAISpawned(SCR_ScenarioFrameworkLayerBase layer, IEntity entity)
void RpcDo_PopUpMessage(string sTitle, string sSubtitle, FactionKey factionKey, int playerID, string titleParam1, string titleParam2, string subtitleParam1, string subtitleParam2)
void PrepareAreaSpecificDynamicDespawn(SCR_ScenarioFrameworkArea area, bool staySpawned=false, int despawnRange=0)
void OnInit()
Registers debug menus for ScenarioFramework in DiagMenu.
void RpcDo_SetVariableValue(string key, string value)
Set a value to global variable at the scenario.
void PlayCommunicationSoundOnEntity(IEntity entity, string sSndName)
void PlayIntroVoiceline(int playerID, string eventName, EntityID entityID)
void PostInit()
Generates tasks for debug shape layers on player connect, if any.
void RpcDo_CreateVariableValue(string key, string value, int playerID)
Create a new global variable at the scenario.
void OnTaskUpdate(SCR_Task task, SCR_ETaskState taskState)
void RpcDo_ShowHint(string sTitle, string sSubtitle, int timeOut, FactionKey factionKey, int playerID)
static SCR_ScenarioFrameworkSystem GetInstance()
void ProcessVoicelineEnumAndString(typename targetEnum, string targetString)
ref array< SCR_ScenarioFrameworkLayerTask > m_aLayerTasksForRandomization
void CreateVariableValue(string key, string value)
Create a new global variable at the scenario.
override event bool ShouldBePaused()
Is this system should be paused while the simulation is paused?
void PlaySoundOnEntityPosition(IEntity object, string soundFile, string soundEventName)
void SetSignalValue(IEntity entity, string signalName, int val)
void ShowHint(string sTitle, string sSubtitle, int timeOut, FactionKey factionKey="", int playerID=-1)
void RpcDo_ManageLayerDebugShape(int playerID, EntityID id, bool draw, float radius)
void RpcDo_ShowLayout(int playerID, EntityID actionOwnerEntId, int layoutId, float fadeIn, float fadeOut, float visibilityTime, float opacity)
ref array< ref Tuple3< EntityID, bool, float > > m_aDebugShapesLayers
void RpcDo_PlaySoundOnEntity(EntityID pEntID, string sSndName)
bool GetVariable(string key, out string value)
Get value of given variable.
ref array< SCR_ScenarioFrameworkArea > m_aAreas
void RemoveAreaSpecificDynamicDespawn(SCR_ScenarioFrameworkArea area, bool staySpawned=false)
void UnregisterArea(SCR_ScenarioFrameworkArea area)
void CheckDistance()
Refreshes array of player characters and checks which areas should spawn/despawn.
static ScriptInvokerScenarioFrameworkSlotAI GetOnSlotAISpawned()
ref array< SCR_ESFTaskType > m_aESFTaskTypesAvailable
void RpcDo_PlayIntroVoiceline(int playerID, string eventName, EntityID entityID)
void RpcDo_HideHint(FactionKey factionKey, int playerID)
void DynamicDespawn()
Goes over spawned areas and checks whether or not said area should despawn.
SCR_ScenarioFrameworkLayerBase m_LastFinishedTaskLayer
void RegisterArea(SCR_ScenarioFrameworkArea area)
void SetMissionEndScreen(EGameOverTypes GameOverType)
void ManageLayerDebugShape(EntityID id, bool draw, float radius, bool runtime)
void PlaySoundOnEntity(IEntity entity, string sSndName)
SCR_ScenarioFrameworkActionShowLayout CheckSubActions(SCR_ScenarioFrameworkActionBase action, int layoutId)
void FadeOut(Widget imgWidget, float fadeOut)
void PrepareDynamicDespawn()
Prepares dynamic spawn/despawn.
SCR_ScenarioFrameworkArea SelectRandomAreaByTaskType(SCR_ESFTaskType eTaskType)
ref array< SCR_ScenarioFrameworkArea > m_aSelectedAreas
void LoadComponentSettings()
Loads component settings from SCR_GameModeSFManager.
array< SCR_ScenarioFrameworkArea > GetAreas()
void LoadHeaderSettings()
Loads mission header settings.
void OnUpdatePoint(WorldUpdatePointArgs args)
void DynamicSpawn()
Goes over despawned areas and checks whether or not said area should spawn.
SCR_ScenarioFrameworkLayerBase GetLastFinishedTaskLayer()
void PopUpMessage(string sTitle, string sSubtitle, FactionKey factionKey="", int playerID=-1, string titleParam1="", string titleParam2="", string subtitleParam1="", string subtitleParam2="")
void Finish()
Finishes current game mode, sets match over flag, and ends game mode with specified type.
void HideHint(FactionKey factionKey="", int playerID=-1)
void RpcDo_PlaySoundOnEntityPosition(RplId objectID, string soundFile, string soundEventName)
ref array< SCR_ScenarioFrameworkLayerTask > m_aLayerTasksToBeInitialized
static ref ScriptCallQueue s_CallQueuePausable
ref map< string, string > m_mVariableMap
void RpcDo_PlayCommunicationSoundOnEntity(EntityID pEntID, string sSndName)
SCR_ScenarioFrameworkArea SelectNearestAreaByTaskType(SCR_ESFTaskType eTaskType)
ref array< SCR_ESFTaskType > m_aESFTaskTypeForRandomization
SCR_ScenarioFrameworkLayerTask GetLayerTask()
SCR_ScenarioFrameworkSlotTask GetSlotTask()
SCR_ETaskNotificationSettings GetTaskNotificationSettings()
static bool IsEmptyOrWhiteSpace(string input)
ScriptCallQueue Class provide "lazy" calls - when we don't want to execute function immediately but l...
Definition tools.c:53
Definition World.c:16
void Rpc(func method, void p0=NULL, void p1=NULL, void p2=NULL, void p3=NULL, void p4=NULL, void p5=NULL, void p6=NULL, void p7=NULL)
Structure holding world system meta-information required by the engine.
Structure holding extra data of WorldSystem update point.
Definition Types.c:486
WorldSystemPoint ESystemPoint
Definition gameLib.c:7
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
proto void PrintFormat(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL, LogLevel level=LogLevel.NORMAL)
SCR_FieldOfViewSettings Attribute
EntityEvent
Various entity events.
Definition EntityEvent.c:14
FactionManagerClass GenericEntityClass GetFactionByKey(FactionKey factionKey)
EDamageState
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
void Tuple3(T1 p1, T2 p2, T3 p3)
Definition tuple.c:95
T2 param2
Definition tuple.c:92
Tuple param1
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134