4 static const string ACTIVITY_NAME =
"SCR_AIVehicleCombatActivity";
9 SetPriority(PRIORITY_ACTIVITY_COMBAT_WITH_VEHICLES);
16 if (
m_Utility.m_VehicleMgr.GetVehiclesCount() == 0)
33 int countNonStatic = 0;
34 array<ref SCR_AIGroupVehicle> allVehicles = {};
35 m_Utility.m_VehicleMgr.GetAllVehicles(allVehicles);
42 if (countNonStatic == 0)
55 array<ref SCR_AIGroupVehicle> vehicles = {};
56 m_Utility.m_VehicleMgr.GetAllVehicles(vehicles);
67 void GunnerRetreatLogic(AIAgent agent,
IEntity vehicle)
75 if (!chimeraAgent || !vehicle)
78 if (ShouldGunnerRetreatInVehicle(chimeraAgent, vehicle))
80 AICommunicationComponent myComms =
m_Utility.m_Owner.GetCommunicationComponent();
85 SCR_AIMessageHandling.SendGetInMessage(agent, vehicle,
EAICompartmentType.Pilot,
this, myComms, ACTIVITY_NAME);
96 BaseTarget target = chimeraAgent.m_UtilityComponent.m_CombatComponent.GetCurrentTarget();
98 target = chimeraAgent.m_UtilityComponent.m_CombatComponent.GetLastSeenEnemy();
109 dangerPos = target.GetLastSeenPosition();
110 dangerDistance = target.GetDistance();
118 dangerPos = cluster.m_State.GetCenterPosition();
119 dangerDistance = cluster.GetMinDistance();
123 if (dangerDistance > 300)
127 if (dangerDistance < 40)
150 AICommunicationComponent myComms =
m_Utility.m_Owner.GetCommunicationComponent();
154 if (!vehicleEntity || !vehicleComp || !myComms)
157 array<ref SCR_AIGroupFireteam> crewFireteams = {};
158 array<ref SCR_AIGroupFireteam> cargoFireteams = {};
159 m_Utility.m_FireteamMgr.FindFireteamsOfVehicle(crewFireteams, vehicleComp, SCR_AIGroupFireteamVehicleCrew);
160 m_Utility.m_FireteamMgr.FindFireteamsOfVehicle(cargoFireteams, vehicleComp, SCR_AIGroupFireteamVehicleCargo);
162 int soldierCounter = 0;
164 array<AIAgent> ftAgents = {};
169 ft.GetMembers(ftAgents);
170 foreach (AIAgent agent : ftAgents)
172 SCR_AIMessageHandling.SendDismountMessage(agent, vehicleEntity, soldierCounter,
this, myComms, ACTIVITY_NAME);
173 ft.RemoveMember(agent);
182 ft.GetMembers(ftAgents);
183 foreach (AIAgent agent : ftAgents)
203 if (GetAvailableAgent(cargoFireteams, newDriver, newDriversFireTeam))
206 SCR_AIMessageHandling.SendGetInMessage(newDriver, vehicleEntity,
EAICompartmentType.Pilot,
this, myComms, ACTIVITY_NAME);
209 else if (agentInfo.
HasUnitState(EUnitState.IN_TURRET) && ftAgents.Count() == 1)
214 if (GetAvailableAgent(cargoFireteams, newDriver, newDriversFireTeam))
217 SCR_AIMessageHandling.SendGetInMessage(newDriver, vehicleEntity,
EAICompartmentType.Pilot,
this, myComms, ACTIVITY_NAME);
220 GunnerRetreatLogic(agent, vehicleEntity);
228 ft.GetMembers(ftAgents);
229 foreach (AIAgent agent : ftAgents)
231 SCR_AIMessageHandling.SendDismountMessage(agent, vehicleEntity, soldierCounter,
this, myComms, ACTIVITY_NAME);
232 ft.RemoveMember(agent);
242 bool GetAvailableAgent(array<ref SCR_AIGroupFireteam> fireteams, out AIAgent availableAgent, out
SCR_AIGroupFireteam agentsFireTeam)
244 array<AIAgent> ftAgents = {};
248 ft.GetMembers(ftAgents);
249 foreach (AIAgent agent : ftAgents)
254 availableAgent = agent;
267 if (c.m_State.GetTimeSinceLastNewInformation() > 20.0)
274 if (c.m_State.m_iCountEndangering > 0)
275 distThreshold = 550.0;
277 distThreshold = 200.0;
279 if (c.m_State.m_fDistMin > distThreshold)
294 AICommunicationComponent myComms =
m_Utility.m_Owner.GetCommunicationComponent();
295 if (!fireTeam || !myComms)
298 array<AIAgent> agentsOfGroup = {};
299 m_Utility.m_Owner.GetAgents(agentsOfGroup);
300 int agentsNum = agentsOfGroup.Count();
307 array<AIAgent> agentsOfFireteam = {};
309 AIAgent newDriverAgent, newGunnerAgent;
310 bool newDriverIsOldGunner =
false;
311 foreach (AIAgent agent : agentsOfFireteam)
313 if (agent != incapacitatedAgent && memberCount == 2)
315 newDriverAgent = agent;
316 newDriverIsOldGunner =
true;
319 else if (agent != incapacitatedAgent)
324 newDriverAgent = agent;
329 if (newDriverIsOldGunner && agentsNum > 2)
331 foreach (AIAgent agent : agentsOfGroup)
333 if (!agent || agent == incapacitatedAgent || agent == newDriverAgent)
338 newGunnerAgent = agent;
344 GunnerRetreatLogic(newDriverAgent, vehicle);
348 SCR_AIMessageHandling.SendGetInMessage(newGunnerAgent, vehicle,
EAICompartmentType.Turret,
this, myComms, ACTIVITY_NAME);
349 SCR_AIMessageHandling.SendMoveMessage(newDriverAgent, newGunnerAgent.GetControlledEntity(),
this, myComms, ACTIVITY_NAME);
359 super.OnActionDeselected();