94 notnull array<ref SCR_AIActivitySmokeCoverFeatureAgent> outConsideredAgents, out
int combatReadyAgentsCount)
96 combatReadyAgentsCount = 0;
101 if (!agent || excludeAgents.Contains(agent))
109 combatReadyAgentsCount++;
111 IEntity controlledEntity = agent.GetControlledEntity();
113 if (!controlledEntity || !infoComp.
HasRole(EUnitRole.HAS_SMOKE_GRENADE))
117 float distanceToTargetSq =
vector.DistanceSq(targetPosition, controlledEntity.
GetOrigin());
118 if (distanceToTargetSq > MAX_DISTANCE_TO_TARGET_POS_SQ)
128 int clustersCount = targetClusters.Count();
130 array<ref SCR_AIActivitySmokeCoverFeatureCluster> clusters = {};
135 if (clustersCount > maxSmokePositions)
138 float maxClustersCount =
Math.Min(maxSmokePositions, clustersCount);
143 for (
int i = 0; i < maxClustersCount; i++)
146 vector clusterPos = cluster.GetCenterPosition();
148 lastDirection =
vector.Direction(targetPosition, clusterPos).Normalized();
149 smokePositions.Insert(targetPosition + (lastDirection * (5 + (maxClustersCount * 3))));
152 int smokesLeft = maxSmokePositions - maxClustersCount;
159 if (maxClustersCount == 1)
163 vector pos = smokePositions[0];
164 vector relDir = (lastDirection *
vector.Up).Normalized();
166 for (
int i = 0; i < smokesLeft; i++)
175 smokePositions.Insert(pos + relVector);
177 smokePositions.Insert(pos - relVector);
184 int maxPositions =
Math.Min(maxClustersCount / 2, smokesLeft);
186 for (
int i = 0; i < maxPositions; i++)
188 vector pos1 = smokePositions[i];
189 vector pos2 = smokePositions[i + 1];
203 notnull array<AIAgent> avoidAgents,
204 notnull array<AIAgent> excludeAgents,
205 int maxPositionCount = 1,
210 int combatReadyAgentsCount;
212 array<ref SCR_AIActivitySmokeCoverFeatureAgent> consideredAgents = {};
214 GetConsideredAgents(groupUtility, targetPosition, excludeAgents, avoidAgents, consideredAgents, combatReadyAgentsCount);
216 int consideredAgentsCount = consideredAgents.Count();
219 if (!consideredAgentsCount)
225 int maxSmokePositions =
Math.Min(
Math.Floor(combatReadyAgentsCount / 2),
Math.Min(maxPositionCount, consideredAgentsCount));
228 if (maxSmokePositions <= 0)
232 if (consideredAgentsCount > maxSmokePositions)
233 consideredAgents.Sort();
235 array<vector> smokePositions = {};
240 array<ref SCR_AIGroupTargetCluster> targetClusters = groupUtility.m_Perception.m_aTargetClusters;
248 float angle =
Math.RandomFloat(0, 360);
249 for (
int i = 0; i < maxSmokePositions; i++)
253 float distance = 1 + maxSmokePositions +
Math.RandomFloat(0, maxSmokePositions * 1.5);
256 angle += (360 / maxSmokePositions);
264 smokePositions.Insert(targetPosition);
266 AICommunicationComponent comms = groupUtility.m_Owner.GetCommunicationComponent();
270 int smokePositionsCount = smokePositions.Count();
273 for (
int i = 0; i < smokePositionsCount; i++)
276 float delay = 0.3 +
Math.RandomFloat(0, 1.5);
277 consideredAgents[i].SendMessage(comms, contextActivity, smokePositions[i], delay);