15 protected ref ScriptInvokerBase<SCR_AIOnFireteamRemoved>
Event_OnFireteamRemoved =
new ScriptInvokerBase<SCR_AIOnFireteamRemoved>();
82 ftTypename = SCR_AIGroupFireteamVehicleCargo;
84 ftTypename = SCR_AIGroupFireteamVehicleCrew;
86 array<ref SCR_AIGroupFireteam> ftsOfVehicle = {};
129 array<ref SCR_AIGroupFireteam> fireteamsOfVehicle = {};
132 array<AIAgent> agents = {};
136 ft.GetMembers(agents);
137 foreach (AIAgent agent : agents)
144 bool FindFreeFireteams(notnull array<SCR_AIGroupFireteam> outFireteams,
int count,
typename ftTypename, array<SCR_AIGroupFireteam> fireteamsExclude = null)
146 outFireteams.Clear();
151 if (ft.Type() != ftTypename)
156 if (!fireteamsExclude || (fireteamsExclude && fireteamsExclude.Find(ft) == -1))
158 outFireteams.Insert(ft);
159 if (outFireteams.Count() == count)
170 void GetFreeFireteams(notnull array<SCR_AIGroupFireteam> outFireteams,
typename ftTypename, array<SCR_AIGroupFireteam> fireteamsExclude = null)
172 outFireteams.Clear();
177 if (ft.Type() != ftTypename)
182 if (!fireteamsExclude || (fireteamsExclude && fireteamsExclude.Find(ft) == -1))
184 outFireteams.Insert(ft);
196 if (ft.HasMember(agent))
210 if (ftVehicle.Type() != ftType)
213 outFireteams.Insert(ftVehicle);
238 array<ref SCR_AIGroupFireteam> normalFireteams = {};
242 normalFireteams.Insert(ft);
253 SCR_AIGroupFireteamVehicleCargo ftCargo = SCR_AIGroupFireteamVehicleCargo.Cast(ft);
254 if (!ftCargo || !ftCargo.GetVehicle())
258 if (!m.Find(ftCargo.GetVehicle(), ftArray))
261 m.Insert(ftCargo.GetVehicle(), ftArray);
263 ftArray.Insert(ftCargo);
287 fireteams.Insert(ft);
300 case SCR_AIGroupFireteamVehicleCrew:
301 return new SCR_AIGroupFireteamVehicleCrew();
302 case SCR_AIGroupFireteamVehicleCargo:
303 return new SCR_AIGroupFireteamVehicleCargo();
311 int id = fireteams.Find(ft);
317 Print(
"SCR_AIGroupUtilityComponent: removing a non-empty fireteam",
LogLevel.ERROR);
323 fireteams.Remove(
id);
336 if (fireteams.IsEmpty())
339 int minSize =
int.MAX;
341 for (
int i = 0; i < fireteams.Count(); i++)
345 if (ft.Type() != fireteamTypename)
351 if (!fireteamsExclude || (fireteamsExclude && fireteamsExclude.Find(ft) == -1))
365 if (fireteams.IsEmpty())
370 for (
int i = 0; i < fireteams.Count(); i++)
374 if (ft.Type() != fireteamTypename)
380 if (!fireteamsExclude || (fireteamsExclude && fireteamsExclude.Find(ft) == -1))
396 else if (groupSize > 4)
398 else if (groupSize == 4)
400 else if (groupSize == 3)
402 else if (groupSize == 2)
409 protected bool RebalanceFireteams(array<ref SCR_AIGroupFireteam> existingFireteams,
typename ftTypename)
413 agentsCount += ft.GetMemberCount();
416 if (agentsCount == 0)
420 float fMaxFtSize = maxFtSize;
421 float fAgentsCount = agentsCount;
423 int desiredFtCount =
Math.Ceil(fAgentsCount / fMaxFtSize);
425 if (existingFireteams.Count() < desiredFtCount)
428 int newFtCount = desiredFtCount - existingFireteams.Count();
429 for (
int i = 0; i < newFtCount; i++)
432 else if (existingFireteams.Count() > desiredFtCount)
436 int deleteFtCount = existingFireteams.Count() - desiredFtCount;
437 array<SCR_AIGroupFireteam> fireteamsDelete = {};
440 for (
int i = 0; i < deleteFtCount; i++)
443 fireteamsDelete.Insert(smallestFt);
450 destinationFt.
MoveMembersFrom(fireteamDelete, fireteamDelete.GetMemberCount());
455 array<SCR_AIGroupFireteam> fireteamsTooBig = {};
456 array<SCR_AIGroupFireteam> fireteamsTooSmall = {};
462 const int maxIterations = 128;
463 while ((!fireteamsTooBig.IsEmpty() || !fireteamsTooSmall.IsEmpty()) && !failed && nIterations < maxIterations)
465 if (!fireteamsTooBig.IsEmpty())
472 for (
int i = 0; i < nExcessMembers; i++)
478 Print(
string.Format(
"SCR_AIGroupUtilityComponent: failed to reorganize fireteams, all other fireteams are full. %1",
489 else if (!fireteamsTooSmall.IsEmpty())
496 for (
int i = 0; i < nLackMembers; i++)
505 Print(
string.Format(
"SCR_AIGroupUtilityComponent: failed to reorganize fireteams, all other fireteams are too small. %1",
522 if (nIterations == maxIterations)
529 protected static void CountUnbalancedFireteams(notnull array<ref SCR_AIGroupFireteam> inFireteams,
int maxFtSize, notnull array<SCR_AIGroupFireteam> fireteamsTooBig, notnull array<SCR_AIGroupFireteam> fireteamsTooSmall)
531 fireteamsTooBig.Clear();
532 fireteamsTooSmall.Clear();
535 int size = ft.GetMemberCount();
536 if (
size == maxFtSize)
539 if (
size > maxFtSize)
540 fireteamsTooBig.Insert(ft);
542 fireteamsTooSmall.Insert(ft);
550 string s =
string.Format(
"Fireteams: %1: ",
m_aFireteams.Count());
553 string strLocked =
string.Empty;
557 s = s +
string.Format(
"%1%2, ", ft.GetMemberCount(), strLocked);
575 const int bgColorsCount = 8;
585 array<AIAgent> members = {};
588 ft.GetMembers(members);
589 int bgColor = bgColors[fireteamId % bgColorsCount];
590 foreach (AIAgent agent : members)
592 IEntity e = agent.GetControlledEntity();
598 if (SCR_AIGroupFireteamVehicleCrew.Cast(ft))
601 textPos[1] = textPos[1] + 0.25;
603 else if (SCR_AIGroupFireteamVehicleCargo.Cast(ft))
605 strFtType =
"Cargo ";
606 textPos[1] = textPos[1] + 0.5;
609 string text =
string.Format(
"%1FT: %2", strFtType, fireteamId);
611 textPos[0], textPos[1], textPos[2], color:
Color.WHITE, bgColor: bgColor,
ArmaReforgerScripted GetGame()
array< ref SCR_AIGroupFireteam > TAIFireteamArray
func SCR_AIOnFireteamRemoved
proto external vector GetOrigin()
void AddMember(AIAgent agent)
void MoveMembersFrom(notnull SCR_AIGroupFireteam otherFt, int count)
Moves 'count' members from other fireteam to this one.
void RemoveMember(AIAgent agent)
SCR_AIGroupFireteam FindFireteam(AIAgent agent)
Finds fireteam which has the provided agent.
static SCR_AIGroupFireteam FireteamFactory(typename t)
void OnAgentAssignedToVehicle(notnull AIAgent agent, notnull SCR_AIVehicleUsageComponent vehicleComp, ECompartmentType compType)
void OnAgentUnassignedFromVehicle(AIAgent agent, notnull SCR_AIVehicleUsageComponent vehicleComp)
string DiagGetFireteamsData()
Returns string with data about fireteams.
static void CountUnbalancedFireteams(notnull array< ref SCR_AIGroupFireteam > inFireteams, int maxFtSize, notnull array< SCR_AIGroupFireteam > fireteamsTooBig, notnull array< SCR_AIGroupFireteam > fireteamsTooSmall)
ref ScriptInvokerBase< SCR_AIOnFireteamRemoved > Event_OnFireteamRemoved
static SCR_AIGroupFireteam FindBiggestFireteam(notnull array< ref SCR_AIGroupFireteam > fireteams, typename fireteamTypename, notnull array< SCR_AIGroupFireteam > fireteamsExclude=null)
ScriptInvokerBase< SCR_AIOnFireteamRemoved > GetOnFireteamRemoved()
void SCR_AIGroupFireteamManager(SCR_AIGroup group)
void OnAgentRemoved(AIAgent agent)
Called from SCR_AIGroupUtilityComponent.
static SCR_AIGroupFireteam FindSmallestFireteam(notnull array< ref SCR_AIGroupFireteam > fireteams, typename fireteamTypename, array< SCR_AIGroupFireteam > fireteamsExclude=null)
void RemoveFireteam(notnull array< ref SCR_AIGroupFireteam > fireteams, SCR_AIGroupFireteam ft)
int GetFireteamId(notnull SCR_AIGroupFireteam ft)
void OnVehicleRemoved(SCR_AIVehicleUsageComponent vehicleComp)
Removes all fireteams related to this vehicle, soldiers are redistributed.
bool FindFreeFireteams(notnull array< SCR_AIGroupFireteam > outFireteams, int count, typename ftTypename, array< SCR_AIGroupFireteam > fireteamsExclude=null)
static int GetMaxFireteamSize(int groupSize)
void FindFireteamsOfVehicle(notnull array< ref SCR_AIGroupFireteam > outFireteams, notnull SCR_AIVehicleUsageComponent vehicleComp, typename ftType)
ref array< ref SCR_AIGroupFireteam > m_aFireteams
const int FIRETEAM_MIN_SIZE
bool m_bRebalanceFireteams
SCR_AIGroupFireteam CreateFireteam(notnull array< ref SCR_AIGroupFireteam > fireteams, typename t)
Creates a fireteam and registers it.
bool RebalanceFireteams(array< ref SCR_AIGroupFireteam > existingFireteams, typename ftTypename)
void RebalanceAllFireteams()
void GetFreeFireteams(notnull array< SCR_AIGroupFireteam > outFireteams, typename ftTypename, array< SCR_AIGroupFireteam > fireteamsExclude=null)
void OnAgentAdded(AIAgent agent)
Called from SCR_AIGroupUtilityComponent.
SCR_AIVehicleUsageComponent GetVehicle()
void SetVehicle(notnull SCR_AIVehicleUsageComponent vehicleComp)
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
proto native vector Vector(float x, float y, float z)