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