Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AIOccupyMovableVehicles.c
Go to the documentation of this file.
2{
3 [Attribute(defvalue: "100", uiwidget: UIWidgets.EditBox, desc: "Limit search for nearby vehicle to distance [m]?")]
4 protected float m_fMaxDistanceOfSearch_m;
5
6 [Attribute(defvalue: "100", uiwidget: UIWidgets.EditBox, desc: "Update time of checks [ms]")]
7 protected float m_fUpdateInterval_ms;
8
9 static const string NODE_NAME = "SCR_AIOccupyMovableVehicles";
10
11 protected float m_fNextUpdate_ms;
12 protected ref array<AIAgent> m_aAgents = {};
13 protected ref array<AIAgent> m_aInformedAgents = {};
14 protected ref array<ref SCR_AIGroupVehicle> m_aUsedVehicles = {};
15 protected ref array<ref SCR_AIGroupVehicle> m_aVehiclesToOccupy = {};
16 protected ref array<int> m_aVehiclesFreeSeats = {};
19 protected int m_iStateOfExecution;
20
21 protected static int STATE_TESTING_STATE = 0; // testing initial setup
22 protected static int STATE_SENDING_SIGNALS = 1; // sending signals to agents
23 protected static int STATE_WAITING = 2; // waiting for agents to obey
24 protected static int STATE_FINISHED = 3; // done everything
25
26 //----------------------------------------------------------------------------------------------------------------------------------------------
27 override void OnEnter(AIAgent owner)
28 {
29 m_Group = SCR_AIGroup.Cast(owner);
30 if (!m_Group)
31 {
32 SCR_AgentMustBeAIGroup(this, owner);
33 return;
34 }
36 if (!m_Utility)
37 return;
38 m_aAgents.Clear();
39 m_aInformedAgents.Clear();
40 m_aUsedVehicles.Clear();
42 m_aVehiclesToOccupy.Clear();
43 m_Utility.m_OnAgentLifeStateChanged.Remove(OnAgentLifeStateChanged);
44 m_Utility.m_OnAgentLifeStateChanged.Insert(OnAgentLifeStateChanged);
46 }
47
48 //----------------------------------------------------------------------------------------------------------------------------------------------
49 override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
50 {
51 if (!m_Group || !m_Utility)
52 return ENodeResult.FAIL;
53
54 float currentTime_ms = GetGame().GetWorld().GetWorldTime();
55 if (currentTime_ms < m_fNextUpdate_ms)
56 return ENodeResult.RUNNING;
57 m_fNextUpdate_ms = currentTime_ms + m_fUpdateInterval_ms;
58
59 switch (m_iStateOfExecution)
60 {
62 {
63 return Testing_State(true);
64 }
66 {
67 return SendingMessages_State();
68 }
69 case STATE_WAITING:
70 {
71 return Waiting_State();
72 }
73 case STATE_FINISHED:
74 {
75 return Finished_State();
76 }
77 }
78 return ENodeResult.RUNNING;
79 }
80
81 //----------------------------------------------------------------------------------------------------------------------------------------------
82 protected ENodeResult Testing_State(bool isScheduled)
83 {
84 m_Group.GetAgents(m_aAgents);
85 if (isScheduled)
86 {
87 // check that AIAgents arent just moving in/out of compartments
88 foreach (AIAgent agent: m_aAgents)
89 {
90 ChimeraCharacter chChar = ChimeraCharacter.Cast(agent.GetControlledEntity());
91 if (!chChar)
92 continue;
93 CompartmentAccessComponent compAcc = chChar.GetCompartmentAccessComponent();
94 if (!compAcc)
95 continue;
96 bool inTransition = compAcc.IsGettingIn() || compAcc.IsGettingOut();
97 if (inTransition)
98 return ENodeResult.RUNNING;
99 }
100 }
101 m_aVehiclesFreeSeats.Clear();
102 m_aVehiclesToOccupy.Clear();
103 m_Utility.m_VehicleMgr.GetAllVehicles(m_aUsedVehicles);
104
105 foreach (SCR_AIGroupVehicle groupVehicle : m_aUsedVehicles)
106 {
107 if (!groupVehicle)
108 continue;
109 // we skip group helicopters and static turrets
110 SCR_AIVehicleUsageComponent vehicleUsage = groupVehicle.GetVehicleUsageComponent();
111 if (!groupVehicle.IsStatic() && groupVehicle.CanMove() && vehicleUsage && vehicleUsage.CanBePiloted())
112 {
113 int freeCompartments = SCR_AICompartmentHandling.GetAvailableCompartmentCount(groupVehicle.GetEntity());
114 if (freeCompartments > 0)
115 {
116 m_aVehiclesFreeSeats.Insert(freeCompartments);
117 m_aVehiclesToOccupy.Insert(groupVehicle);
118 }
119 continue;
120 }
121 }
122 bool willTryToOccupy = m_aVehiclesToOccupy.Count() > 0;
123 if (willTryToOccupy)
125 else
127 return ENodeResult.RUNNING;
128 }
129
130 //----------------------------------------------------------------------------------------------------------------------------------------------
132 {
133 if (m_aVehiclesToOccupy.Count() == 0)
134 {
136 return ENodeResult.RUNNING;
137 };
138 m_aInformedAgents.Clear();
139 float maxDistSearchSq = m_fMaxDistanceOfSearch_m * m_fMaxDistanceOfSearch_m;
140 AICommunicationComponent myComms = m_Utility.m_Owner.GetCommunicationComponent();
141 array<AIAgent> agentsOnFoot = {};
142 m_Utility.m_GroupMovementComponent.GetAgentsInHandler(agentsOnFoot, AIGroupMovementComponent.DEFAULT_HANDLER_ID);
143 foreach (int vehicleIndex, SCR_AIGroupVehicle groupVehicle : m_aVehiclesToOccupy)
144 {
145 int numberOfAgentsLeft = Math.Min(agentsOnFoot.Count(), m_aVehiclesFreeSeats[vehicleIndex]);
146 for (int i = numberOfAgentsLeft - 1; i >= 0; i--)
147 {
148 if (vector.DistanceSq(agentsOnFoot[i].GetControlledEntity().GetOrigin(), groupVehicle.GetEntity().GetOrigin())
149 < maxDistSearchSq)
150 {
151 SCR_AIMessageHandling.SendGetInMessage(agentsOnFoot[i], groupVehicle.GetEntity(), EAICompartmentType.None, null, myComms, NODE_NAME);
152 m_aInformedAgents.Insert(agentsOnFoot[i]);
153 agentsOnFoot.Remove(i);
154 }
155 }
156 if (agentsOnFoot.IsEmpty())
157 break;
158 }
159 if (m_aInformedAgents.IsEmpty())
162 return ENodeResult.RUNNING;
163
164 }
165
166 //----------------------------------------------------------------------------------------------------------------------------------------------
168 {
169 foreach (AIAgent agent : m_aInformedAgents)
170 {
171 SCR_ChimeraAIAgent chimAg = SCR_ChimeraAIAgent.Cast(agent);
172 if (!chimAg)
173 continue;
174 SCR_AIInfoComponent info = chimAg.m_InfoComponent;
175 if (!info)
176 continue;
177 if (!info.HasUnitState(EUnitState.IN_VEHICLE))
178 return ENodeResult.RUNNING;
179 }
181 return ENodeResult.RUNNING;
182 }
183
184 //----------------------------------------------------------------------------------------------------------------------------------------------
186 {
187 return ENodeResult.SUCCESS;
188 }
189
190 //----------------------------------------------------------------------------------------------------------------------------------------------
191 protected void CancelOrders()
192 {
193 AICommunicationComponent myComms = m_Utility.m_Owner.GetCommunicationComponent();
194 for (int index = m_aInformedAgents.Count() - 1; index >=0; index--)
195 {
197 SCR_AIMessageHandling.SendCancelMessage(m_aInformedAgents[index], null, myComms, NODE_NAME);
198 m_aInformedAgents.Remove(index);
199 }
200 }
201
202 //----------------------------------------------------------------------------------------------------------------------------------------------
203 override void OnAbort(AIAgent owner, Node nodeCausingAbort)
204 {
205 if (!m_Utility)
206 return;
207 m_Utility.m_OnAgentLifeStateChanged.Remove(OnAgentLifeStateChanged);
208 switch (m_iStateOfExecution)
209 {
211 {
212 CancelOrders();
213 break;
214 }
215 case STATE_WAITING:
216 {
217 CancelOrders();
218 break;
219 }
220 case STATE_FINISHED:
221 {
222 return;
223 }
224 }
225 }
226
227 //----------------------------------------------------------------------------------------------------------------------------------------------
228 void OnAgentLifeStateChanged(AIAgent incapacitatedAgent, SCR_AIInfoComponent infoIncap, IEntity vehicle, ECharacterLifeState lifeState)
229 {
230 if (vehicle && infoIncap.HasUnitState(EUnitState.IN_VEHICLE) && m_iStateOfExecution != STATE_FINISHED)
231 Testing_State(false);
232 else if (m_aInformedAgents.Find(incapacitatedAgent) > -1)
234 }
235
236 //----------------------------------------------------------------------------------------------------------------------------------------------
237 static override bool VisibleInPalette()
238 {
239 return true;
240 };
241
242 //----------------------------------------------------------------------------------------------------------------------------------------
243 static override string GetOnHoverDescription()
244 {
245 return "OccupyMovableVehicles: goes over the array of known vehicles and sends group members on foot to get in movable vehicles. Keeps running until they are there.";
246 };
247
248 //----------------------------------------------------------------------------------------------------------------------------------------
249 static override bool CanReturnRunning()
250 {
251 return true;
252 };
253};
ArmaReforgerScripted GetGame()
Definition game.c:1398
void SCR_AgentMustBeAIGroup(Node node, AIAgent owner)
Definition NodeError.c:14
EAICompartmentType
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
Definition Math.c:13
Definition Node.c:13
This class is used for keeping track of vehicles assigned to group.
bool HasUnitState(EUnitState state)
SCR_AIGroupUtilityComponent m_Utility
ref array< ref SCR_AIGroupVehicle > m_aUsedVehicles
override void OnEnter(AIAgent owner)
ENodeResult Testing_State(bool isScheduled)
ref array< ref SCR_AIGroupVehicle > m_aVehiclesToOccupy
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
void OnAgentLifeStateChanged(AIAgent incapacitatedAgent, SCR_AIInfoComponent infoIncap, IEntity vehicle, ECharacterLifeState lifeState)
static override string GetOnHoverDescription()
override void OnAbort(AIAgent owner, Node nodeCausingAbort)
bool CanBePiloted()
AI can use the pilot compartments on this vehicle.
ENodeResult
Definition ENodeResult.c:13
ECharacterLifeState
SCR_FieldOfViewSettings Attribute