9[
ComponentEditorProps(
category:
"GameScripted/Tasks", description:
"Group task manager helps set groups to tasks, attach to game mode entity")]
16 [
Attribute(
"{8FD30741F5E75C87}Configs/Task/GroupTaskRelevanceConfig.conf",
desc:
"Config with group task relevance",
params:
"conf class=SCR_GroupTaskRelevanceConfig")]
20 protected bool m_bEnabledAssigningFrequencies;
23 protected int m_iTaskFrequencyOffset;
26 protected int m_iTaskFrequencyMin;
29 protected int m_iTaskFrequencyMax;
31 [
Attribute(
desc:
"List of tasks to which frequency will be assigned in the min, max range",
category:
"Frequency settings")]
32 protected ref array<string> m_aAllowedTasksWithFrequencies;
35 protected ref array<bool> m_aFreeFactionFrequency = {};
68 return m_bEnabledAssigningFrequencies;
77 if (!m_aFreeFactionFrequency || !m_aFreeFactionFrequency.IsIndexValid(factionIndex))
80 return m_aFreeFactionFrequency[factionIndex];
87 if (!m_aFreeFactionFrequency || !m_aFreeFactionFrequency.IsIndexValid(factionIndex))
90 m_aFreeFactionFrequency[factionIndex] = isFree;
99 if (!resource || !resource.IsValid())
101 Print(
"Task prefab resource name is not valid",
LogLevel.WARNING);
110 return container.GetClassName();
137 if (taskClassName ==
string.Empty)
139 Print(
"Task prefab class name is not set",
LogLevel.WARNING);
144 if (!m_aAllowedTasksWithFrequencies.Contains(taskClassName))
161 string taskClassName =
task.Type().ToString();
162 if (taskClassName ==
string.Empty)
164 Print(
"Task prefab class name is not set",
LogLevel.WARNING);
168 if (m_aAllowedTasksWithFrequencies.Contains(taskClassName))
181 if (!taskRplId.IsValid())
198 array<SCR_Task> tasks = {};
207 if (assignedFrequency != frequency)
224 return data.m_UIInfo.GetTranslatedName();
236 foreach (
string factionKey :
task.GetTaskData().m_aOwnerFactionKeys)
238 if (factionKey.IsEmpty())
254 RplComponent taskRplComponent = RplComponent.Cast(
task.FindComponent(RplComponent));
255 if (!taskRplComponent)
258 return RplId.Invalid();
261 return taskRplComponent.Id();
270 typename taskTypename =
task.Type();
271 if (taskTypename ==
typename.Empty)
274 if (!m_aAllowedTasksWithFrequencies.Contains(taskTypename.ToString()))
291 if (!
task || !faction)
295 if (!taskRplId.IsValid())
306 factions.Insert(faction);
310 else if (usedForFactions.Find(faction) == -1)
312 usedForFactions.Insert(faction);
325 int factionHQFrequency;
332 int minFrequencyAvailable = m_iTaskFrequencyMin;
334 while (minFrequencyAvailable <= m_iTaskFrequencyMax)
336 if (minFrequencyAvailable == factionHQFrequency)
338 minFrequencyAvailable += m_iTaskFrequencyOffset;
345 if (usedForFactions.Find(faction) == -1)
348 minFrequencyAvailable += m_iTaskFrequencyOffset;
351 if (minFrequencyAvailable <= m_iTaskFrequencyMax)
352 return minFrequencyAvailable;
365 if (!taskRplId.IsValid())
374 Print(
"This task has not assigned frequency",
LogLevel.WARNING);
385 if (factions.Count() <= 1 && factions.Find(faction) != -1)
391 int factionIndex = factions.Find(faction);
392 if (factionIndex >= 0 && factionIndex < factions.Count())
393 factions.Remove(factionIndex);
433 if (!m_GroupTaskRelevanceConfig)
436 return m_GroupTaskRelevanceConfig.GetGroupTaskRelevance(taskTypename);
454 array<SCR_Task> tasks = {};
457 SCR_GroupTaskRelevance groupTaskRelevance;
459 SCR_BaseRequestedTaskEntity requestedTask;
467 requestedTask = SCR_BaseRequestedTaskEntity.Cast(
task);
468 if (requestedTask && group.
GetGroupID() == requestedTask.GetRequesterId())
476 if (!groupTaskRelevance)
479 if (groupTaskRelevance.IsTaskExecutableByGroup(group))
482 if (groupTaskRelevance.IsTaskVisibleForGroup(group))
521 array<SCR_Task> tasks = {};
524 SCR_BaseRequestedTaskEntity requestedTask;
527 for (
int i = tasks.Count() - 1; i >= 0; i--)
529 if (
m_TaskSystem.GetTaskOwnership(tasks[i]) != SCR_ETaskOwnership.EXECUTOR)
532 requestedTask = SCR_BaseRequestedTaskEntity.Cast(tasks[i]);
533 if (!requestedTask || group.
GetGroupID() != requestedTask.GetRequesterId())
551 if (!taskFactions || taskFactions.IsEmpty())
555 if (!groupTaskRelevance)
559 array<SCR_AIGroup> groups;
560 foreach (
string taskFaction : taskFactions)
567 if (!groups || groups.IsEmpty())
572 if (groupTaskRelevance.IsTaskExecutableByGroup(group))
575 if (groupTaskRelevance.IsTaskVisibleForGroup(group))
603 SCR_BaseRequestedTaskEntity requestedTask = SCR_BaseRequestedTaskEntity.Cast(
task);
608 if (!taskFactions || taskFactions.IsEmpty())
612 if (!groupTaskRelevance)
616 array<SCR_AIGroup> groups;
617 foreach (
string taskFaction : taskFactions)
630 groupID = group.GetGroupID();
633 if (groupID == requestedTask.GetRequesterId())
640 if (groupTaskRelevance.IsTaskExecutableByGroup(group))
643 if (groupTaskRelevance.IsTaskVisibleForGroup(group))
672 if (!groupTaskRelevance)
675 array<SCR_AIGroup> playableGroups =
m_GroupsManager.GetPlayableGroupsByFaction(faction);
679 array<ref SCR_GroupRoleRelevance> relevanceList;
680 groupTaskRelevance.GetOrderedGroupRoleRelevanceList(relevanceList);
684 array<SCR_AIGroup> playableGroupsSorted = {};
688 groupRole = groupRoleRelevance.GetGroupRole();
690 foreach (
SCR_AIGroup playableGroup : playableGroups)
692 if (playableGroup.GetGroupRole() == groupRole)
693 playableGroupsSorted.Insert(playableGroup);
697 return playableGroupsSorted;
704 writer.WriteInt(usedFrequenciesByTaskMapCount);
708 writer.WriteInt(key);
709 writer.WriteInt(value);
718 int usedFrequenciesByTaskMapCount;
719 reader.ReadInt(usedFrequenciesByTaskMapCount);
727 for (
int i = 0; i < usedFrequenciesByTaskMapCount; i++)
729 reader.ReadInt(taskRplId);
730 reader.ReadInt(frequency);
740 super.EOnInit(owner);
756 m_aFreeFactionFrequency.Insert(
false);
778 super.OnDelete(owner);
799 Print(
"[SCR_GroupTaskManagerComponent.SCR_GroupTaskManagerComponent] instance is missing",
LogLevel.WARNING);
ArmaReforgerScripted GetGame()
override bool RplLoad(ScriptBitReader reader)
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
SCR_CacheNoteComponentClass ScriptComponentClass RplProp()] protected ref array< string > m_aLines
override bool RplSave(ScriptBitWriter writer)
RplComponent m_RplComponent
SCR_EGroupRole
Group roles.
void OnTaskRemoved(notnull SCR_Task task)
Get all prefabs that have the spawner data
void SetFreeFrequencyForFaction(notnull Faction faction, bool isFree)
bool IsAnyFrequencyFreeForFaction(notnull Faction faction)
ref ScriptInvokerGroupTaskSet m_OnGroupTaskSet
void SetGroupTaskOwnership(notnull SCR_Task task)
void OnPlayableGroupRemoved(SCR_AIGroup group)
bool CanCreateNewTaskWithClassName(string taskClassName, notnull Faction faction)
void RpcDo_AddTaskFrequency(RplId taskRplId, int frequency)
void SCR_GroupTaskManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
bool CanAssignFrequencyToTask(notnull SCR_Task task)
ScriptInvokerBase< ScriptInvokerRequestedGroupTaskSetMethod > ScriptInvokerRequestedGroupTaskSet
Faction GetTaskFaction(notnull SCR_Task task)
ScriptInvokerRequestedGroupTaskSet GetOnRequestedGroupTaskSet()
ref map< int, ref FactionHolder > m_mUsedFrequenciesByFactionMap
ref map< int, int > m_mUsedFrequenciesByTaskMap
array< SCR_AIGroup > GetPlayableGroupsSortedByRelevance(notnull SCR_Task task, notnull Faction faction)
bool IsEnabledAssigningFrequencies()
void SetGroupTask(notnull SCR_Task task, int byPlayerID)
SCR_Task GetTaskByFrequency(notnull Faction faction, int frequency)
bool CanCreateNewTaskWithTypename(typename taskTypename, notnull Faction faction)
ref ScriptInvokerRequestedGroupTaskSet m_OnRequestedGroupTaskSet
string GetTaskTranslatedName(notnull SCR_Task task)
int GetTaskFrequency(notnull SCR_Task task)
void OnGroupRoleChanged(int groupID, SCR_EGroupRole groupRole)
void CheckAndDeleteRequestedTasks(SCR_AIGroup group)
string GetTaskPrefabClassName(ResourceName taskPrefabName)
func ScriptInvokerGroupTaskSetMethod
bool CanCreateNewTaskWithResourceName(ResourceName taskPrefabResourceName, notnull Faction faction)
void RpcDo_RemoveTaskFrequency(RplId taskRplId)
ScriptInvokerGroupTaskSet GetOnGroupTaskSet()
func ScriptInvokerRequestedGroupTaskSetMethod
RplId GetTaskRplId(SCR_Task task)
ScriptInvokerBase< ScriptInvokerGroupTaskSetMethod > ScriptInvokerGroupTaskSet
void SetRequestedGroupTask(notnull SCR_Task task, int byPlayerID, int requesterGroupId)
void AssignFrequency(notnull SCR_Task task)
void SetRequestedGroupTaskOwnership(notnull SCR_Task task)
SCR_GroupTaskRelevance GetGroupTaskRelevance(typename taskTypename)
void SCR_GroupsManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
set< Faction > FactionHolder
void ReleaseFrequency(int frequency, Faction faction)
int GetFreeFrequency(Faction frequencyFaction)
void ClaimFrequency(int frequency, Faction faction)
void OnPlayerRemoved(SCR_AIGroup group, int playerId)
SCR_AIGroup event.
SCR_FactionManager m_FactionManager
SCR_GroupsManagerComponent m_GroupsManager
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
SCR_SpawnerSlotManagerClass s_Instance
Class used for managing changes and removals of slots present in world.
void SCR_Task(IEntitySource src, IEntity parent)
SCR_TaskSystem m_TaskSystem
proto external Managed FindComponent(typename typeName)
Object holding reference to resource. In destructor release the resource.
Replication item identifier.
int GetPlayerCount(bool checkMasterAndSlaves=false)
static ScriptInvokerGroupRole GetOnGroupRoleChanged()
static ScriptInvoker GetOnPlayerRemoved()
int GetFactionRadioFrequency()
override void EOnInit(IEntity owner)
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute
EntityEvent
Various entity events.
void RplRpc(RplChannel channel, RplRcver rcver, RplCondition condition=RplCondition.None, string customConditionName="")
RplChannel
Communication channel. Reliable is guaranteed to be delivered. Unreliable not.