3 static const string PORT_REQUIREMENTS_IN =
"RequirementsIn";
4 static const string PORT_ENTITY_IN =
"EntityIn";
5 static const string PORT_GROUP_MEMBER_OUT =
"GroupMemberOut";
6 static const string PORT_AGENTS_EXCLUDE_ARRAY =
"AgentsExcludeArray";
13 override ENodeResult EOnTaskSimulate(AIAgent owner,
float dt)
17 array<AIAgent> groupAgents = {};
18 array<AIAgent> agentsToExclude = {};
19 array<AIAgent> agentsOfHandler = {};
22 AIGroup group = AIGroup.Cast(owner);
26 group.GetAgents(groupAgents);
29 if (!groupUtilityComponent || !groupUtilityComponent.m_aInfoComponents)
35 if (!
GetVariableIn(PORT_AGENTS_EXCLUDE_ARRAY, agentsToExclude))
41 AIControlComponent contr = AIControlComponent.Cast(charToHeal.FindComponent(AIControlComponent));
44 AIAgent agentToHeal = contr.GetControlAIAgent();
49 if (charToHeal.IsInVehicle())
52 int agentToHealHandler = groupUtilityComponent.m_GroupMovementComponent.GetAgentMoveHandlerId(agentToHeal);
53 if (agentToHealHandler < AIGroupMovementComponent.DEFAULT_HANDLER_ID)
54 Print(
"Healing agent not member of our group!",
LogLevel.WARNING);
55 agentToHealHandler =
Math.Max(AIGroupMovementComponent.DEFAULT_HANDLER_ID, agentToHealHandler);
56 groupUtilityComponent.m_GroupMovementComponent.GetAgentsInHandler(agentsOfHandler, agentToHealHandler);
59 medic =
FindAgentMedic(entityToHeal, agentsOfHandler, agentsToExclude,
true);
66 medic =
FindAgentMedic(entityToHeal, agentsOfHandler, agentsToExclude,
false);
73 medic =
FindAgentMedic(entityToHeal, groupAgents, agentsToExclude);
86 groupUtilityComponent.m_GroupMovementComponent.GetAgentsInHandler(agentsOfHandler, AIGroupMovementComponent.DEFAULT_HANDLER_ID);
87 medic =
FindAgentMedic(entityToHeal, agentsOfHandler, agentsToExclude);
96 medic =
FindAgentMedic(entityToHeal, groupAgents, agentsToExclude);
112 protected AIAgent
FindAgentMedic(
IEntity entToHeal, notnull array<AIAgent> agents, notnull array<AIAgent> agentsToExclude,
bool excludeDrivers =
false)
114 AIAgent closestMedic = null;
115 float closestMedicDistance =
float.MAX;
117 foreach (AIAgent agent : agents)
123 if(!agent.GetControlledEntity())
125 if(agent.GetControlledEntity() == entToHeal)
127 if(agentsToExclude.Contains(agent))
136 if (info.
HasRole(EUnitRole.MEDIC) && info.
GetAIState() == EUnitAIState.AVAILABLE)
138 float dist =
vector.DistanceSq(agent.GetControlledEntity().GetOrigin(), entToHeal.
GetOrigin());
140 if (dist < closestMedicDistance)
142 closestMedicDistance = dist;
143 closestMedic = agent;
153 PORT_GROUP_MEMBER_OUT
162 PORT_REQUIREMENTS_IN,
164 PORT_AGENTS_EXCLUDE_ARRAY
174 return "Finds group member available for medic role";
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.