Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AIWorld.c
Go to the documentation of this file.
1void ScriptInvoker_AIWorldControlModeChangedMethod(AIGroup group, EGroupControlMode mode);
3typedef ScriptInvokerBase<ScriptInvoker_AIWorldControlModeChangedMethod> ScriptInvoker_AIWorldControlModeChanged;
4
5//#define DEBUG_NAVMESH_REBUILD_AREAS //--- Show bounds of recalculated navmesh areas
6
10
22
23class SCR_AIWorld : ChimeraAIWorld
24{
25 static const float MAX_NAVMESH_REBUILD_SIZE = 100 * 100; //--- Squared value
26
27 static ref ScriptInvoker s_OnAgentSpawned = new ScriptInvoker();
28 static ref ScriptInvoker s_OnAgentRemoved = new ScriptInvoker();
29 static bool s_bDiagRegistered;
30
31 [Attribute("", UIWidgets.Object)]
32 ref array<ref SCR_AIMessageGoal> m_aGoalMessages;
33 ref array<ref SCR_AIMessageGoal> m_aGoalMessagesPacked = new array<ref SCR_AIMessageGoal>();
34
35 [Attribute("", UIWidgets.Object)]
36 ref array<ref SCR_AIMessageInfo> m_aInfoMessages;
37 ref array<ref SCR_AIMessageInfo> m_aInfoMessagesPacked = new array<ref SCR_AIMessageInfo>();
38
39 [Attribute("", UIWidgets.Object)]
40 ref array<ref SCR_AIOrderBase> m_aOrders;
41 ref array<ref SCR_AIOrderBase> m_aOrdersPacked = new array<ref SCR_AIOrderBase>();
42
44
45#ifdef DEBUG_NAVMESH_REBUILD_AREAS
46 protected ref array<ref Shape> m_DebugNavmeshRebuildAreas = new array<ref Shape>;
47#endif
48 //------------------------------------------------------------------------------------------------
58
59 protected void RegisterDbgCategory()
60 {
61 string categories;
62 for (int i = 0; i < EAIDebugCategory.LAST-1; i++)
63 {
64 categories += typename.EnumToString(EAIDebugCategory, i)+",";
65 }
66 categories += typename.EnumToString(EAIDebugCategory, EAIDebugCategory.LAST-1);
67
68 DiagMenu.RegisterItem(SCR_DebugMenuID.DEBUGUI_AI_DEBUG_CATEGORY, "", "AI Debug Category", "AIScript", categories);
69#ifdef AI_DEBUG
70 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_AI_DEBUG_CATEGORY,EAIDebugCategory.BEHAVIOR);
71#endif
72 }
73
74 //------------------------------------------------------------------------------------------------
75 override void EOnInit (IEntity owner)
76 {
77 if (!s_bDiagRegistered)
78 {
79 DiagMenu.RegisterMenu(SCR_DebugMenuID.DEBUGUI_AI_SCRIPT, "AIScript", "AI");
80 //this add AI categories inside to DiagMenu
82
83 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SET_BT_BREAKPOINT, "", "Set BT Breakpoint", "AIScript");
84 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_PRINT_DEBUG,"","Print debug from BTs","AIScript");
85 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_PRINT_GROUP_INFO,"","Print init of groups","AIScript");
86 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_FIRETEAMS, "", "Show fireteams", "AIScript");
87 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SUBGROUPS, "", "Show subgroups", "AIScript");
88 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_TARGET_CLUSTERS, "", "Show target clusters", "AIScript");
89 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_PRINT_SHOT_STATISTICS,"","Print stats for aiming","AIScript");
90 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_PRINT_ACTIVITY,"","Print new activity","AIScript");
91 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_DEBUG_SHAPES,"","Show debug shapes from BTs","AIScript");
92 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_FRIENDLY_IN_AIM,"","Show fiendly in aim","AIScript");
93 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_TARGET_LASTSEEN,"","Show target last seen","AIScript");
94 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SELECT_FIXED_AGENT,"","Select fixed AIAgent","AIScript");
95 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_DEBUG_COVERS,"","Debug cover search","AIScript");
96 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_COMMS_HANDLERS,"", "Show Comms Handlers","AIScript");
97 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_PERCEPTION_PANEL,"","Show perception panel","AIScript");
98 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_GRENADE_POSITIONS,"","Show grenade positions","AIScript");
99 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_SUPPRESS_DEBUG,"","Show suppression debug","AIScript");
100 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_ILLUM_FLARES_POSITIONS,"","Show illum flares positions","AIScript");
101 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_AIM_LEAD_DEBUG,"","Show aim leading debug","AIScript");
102 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_SECTOR_THREAT_FILTER, "", "Show sector threat filter", "AIScript");
103 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_SEARCH_AND_DESTROY,"","Show search and destroy points of interest","AIScript");
104
105
106#ifdef AI_DEBUG
107 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SEND_MESSAGE, "", "Show Send Message Menu","AIScript");
108 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_AI_PRINT_DEBUG,true);
109 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_AI_PRINT_GROUP_INFO,true);
110
111 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_TARGET_AIMPOINT,"", "Show target aimpoint", "Aiming");
112 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_TARGET_PROJECTED_SIZE,"", "Show target projected size", "Aiming");
113 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_OPEN_DEBUG_PANEL, "", "Open Debug Panel", "AIScript");
114
115 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_AI_SHOW_GRENADE_TRACE, "", "Show Grenade Trace", "AIScript");
116#endif
117
118 s_bDiagRegistered = true;
119 }
120
121 typename type_EMessageType_Goal = EMessageType_Goal;
122 typename type_EMessageType_Info = EMessageType_Info;
123 typename type_EOrderType_Character = EOrderType_Character;
124
125 m_aGoalMessagesPacked.Resize(type_EMessageType_Goal.GetVariableCount());
126 foreach (SCR_AIMessageGoal message : m_aGoalMessages)
127 {
128 if(message.m_eUIType != EMessageType_Goal.NONE)
129 m_aGoalMessagesPacked[message.m_eUIType] = message;
130 }
131
132 m_aInfoMessagesPacked.Resize(type_EMessageType_Info.GetVariableCount());
133 foreach (SCR_AIMessageInfo message : m_aInfoMessages)
134 {
135 if(message.m_eUIType != EMessageType_Info.NONE)
136 m_aInfoMessagesPacked[message.m_eUIType] = message;
137 }
138
139 m_aOrdersPacked.Resize(type_EOrderType_Character.GetVariableCount());
140 foreach (SCR_AIOrderBase order : m_aOrders)
141 {
142 if(order.m_eUIType != EOrderType_Character.NONE)
143 m_aOrdersPacked[order.m_eUIType] = order;
144 }
145
146#ifdef AI_DEBUG
149#endif
150 }
151
152 //------------------------------------------------------------------------------------------------
153 override void OnDebugAgentTeleport(AIAgent agent)
154 {
155 PrintFormat("Focused AI agent: %1", agent);
156
157 IEntity agentEntity = agent.GetControlledEntity();
158 if (!agentEntity) return;
159
161 if (editorCameraManager)
162 {
163 SCR_ManualCamera editorCamera = editorCameraManager.GetCamera();
164 if (editorCamera)
165 {
167 if (teleportComponent)
168 {
169 teleportComponent.TeleportCamera(agentEntity.GetWorldTransformAxis(3));
170 }
171 }
172 }
173 }
174
175 //------------------------------------------------------------------------------------------------
176 override void OnDebugCameraTeleport(vector pos)
177 {
178 PrintFormat("Moving camera to pos %1", pos);
179
181 if (editorCameraManager)
182 {
183 SCR_ManualCamera editorCamera = editorCameraManager.GetCamera();
184 if (editorCamera)
185 {
187 if (teleportComponent)
188 {
189 teleportComponent.TeleportCamera(pos);
190 }
191 }
192 }
193 }
194
195 //------------------------------------------------------------------------------------------------
196 override void AddedAIAgent(AIAgent agent)
197 {
198 s_OnAgentSpawned.Invoke(agent);
199 }
200
201 //------------------------------------------------------------------------------------------------
202 override void RemovingAIAgent(AIAgent agent)
203 {
204 s_OnAgentRemoved.Invoke(agent);
205 }
206
207 //----------Used for translating enum to message type, confirugable in editor---------------------
209 {
210 return m_aGoalMessagesPacked[eventType].Type();
211 }
212
214 {
215 return m_aInfoMessagesPacked[eventType].Type();
216 }
217
219 {
220 return m_aOrdersPacked[eventType].Type();
221 }
222
227 void RequestNavmeshRebuildAreas(notnull array<ref Tuple2<vector, vector>> areas, notnull array<bool> redoRoads)
228 {
229#ifdef DEBUG_NAVMESH_REBUILD_AREAS
230 vector points[19];
231 m_DebugNavmeshRebuildAreas.Clear();
232#endif
233 int i = 0;
234 foreach (Tuple2<vector, vector> area: areas)
235 {
236 RequestNavmeshRebuild(area.param1, area.param2);
237 if(redoRoads[i])
238 RequestRoadNetworkRebuild(area.param1, area.param2);
239#ifdef DEBUG_NAVMESH_REBUILD_AREAS
240 SCR_Shape.GetBoundsPoints(area.param1, area.param2, points);
241 m_DebugNavmeshRebuildAreas.Insert(Shape.CreateLines(Color.BLUE, ShapeFlags.NOZBUFFER, points, 19));
242#endif
243 ++i;
244 }
245 }
246
251 {
252 array<ref Tuple2<vector, vector>> areas = new array<ref Tuple2<vector, vector>>; //--- Min, max
253 array<bool> redoRoads = new array<bool>;
254 GetNavmeshRebuildAreas(entity, areas, redoRoads);
255 RequestNavmeshRebuildAreas(areas, redoRoads);
256 }
257
261 void GetNavmeshRebuildAreas(IEntity entity, out notnull array<ref Tuple2<vector, vector>> outAreas, out notnull array<bool> redoRoads)
262 {
263 //--- No entity, no rebuild needed
264 if (!entity)
265 return;
266
267 //--- Skip entities without physics and mesh (but process their children; e.g., compositions)
268 if (entity.GetVObject() && entity.GetPhysics())
269 {
270 //--- Skip objects not marked for update (ignore their children as well; e.g., soldiers or vehicles)
271 if (!(entity.GetPhysics().GetInteractionLayer() & (EPhysicsLayerDefs.Navmesh | EPhysicsLayerDefs.NavmeshVehicle)))
272 return;
273
274 //--- Get single entity mesh bounds
275 vector boundMin, boundMax;
276 entity.GetWorldBounds(boundMin, boundMax);
277
278 //--- Find the closest bounds
279 bool found = false;
280 int i = 0;
281 foreach (Tuple2<vector, vector> area: outAreas)
282 {
283 if (vector.DistanceSqXZ(GetAreaCenter(boundMin, boundMax), GetAreaCenter(area.param1, area.param2)) < MAX_NAVMESH_REBUILD_SIZE)
284 {
285 area.param1 = SCR_Math3D.Min(area.param1, boundMin);
286 area.param2 = SCR_Math3D.Max(area.param2, boundMax);
287 found = true;
288 }
289 //Check if the entity has a navlink and it has a link that applies to vehicles
290 if (redoRoads[i])
291 redoRoads[i] = !HasVehicleNavlink(entity);
292 i++;
293 }
294
295 //--- No suitable bounds found, create new ones
296 if (!found)
297 {
298 outAreas.Insert(new Tuple2<vector, vector>(boundMin, boundMax));
299 //Check if the entity has a navlink and it has a link that applies to vehicles
300 redoRoads.Insert(!HasVehicleNavlink(entity));
301 }
302 }
303 //--- Process children
304 IEntity child = entity.GetChildren();
305 while (child)
306 {
307 GetNavmeshRebuildAreas(child, outAreas, redoRoads);
308 child = child.GetSibling();
309 }
310 }
311 protected vector GetAreaCenter(vector min, vector max)
312 {
313 return min + (max - min) / 2;
314 }
315 protected bool HasVehicleNavlink(IEntity entity)
316 {
318 if (link)
319 return link.HasLinkOfNavmeshType("BTRlike");
320 return false;
321 }
322};
SCR_DebugMenuID
This enum contains all IDs for DiagMenu entries added in script.
Definition DebugMenuID.c:4
@ COMBAT
@ THREAT
SCR_AIGroupInfoComponentClass LAST
EMessageType_Goal
EMessageType_Info
EOrderType_Character
Definition SCR_AIOrder.c:2
ScriptInvokerBase< ScriptInvoker_AIWorldControlModeChangedMethod > ScriptInvoker_AIWorldControlModeChanged
Definition SCR_AIWorld.c:3
func ScriptInvoker_AIWorldControlModeChangedMethod
Definition SCR_AIWorld.c:2
EAIDebugCategory
Definition SCR_AIWorld.c:12
@ BEHAVIOR
Definition SCR_AIWorld.c:14
@ DANGER
Definition SCR_AIWorld.c:15
@ ORDER
Definition SCR_AIWorld.c:18
Definition Color.c:13
Diagnostic and developer menu system.
Definition DiagMenu.c:18
proto external Managed FindComponent(typename typeName)
proto external Physics GetPhysics()
proto external vector GetWorldTransformAxis(int axis)
See IEntity::GetTransformAxis.
proto external IEntity GetChildren()
proto external void GetWorldBounds(out vector mins, out vector maxs)
proto external IEntity GetSibling()
proto external VObject GetVObject()
Returns visual object set to this Entity. No reference is added.
void GetNavmeshRebuildAreas(IEntity entity, out notnull array< ref Tuple2< vector, vector > > outAreas, out notnull array< bool > redoRoads)
override void OnDebugAgentTeleport(AIAgent agent)
void RequestNavmeshRebuildAreas(notnull array< ref Tuple2< vector, vector > > areas, notnull array< bool > redoRoads)
GetOrderMessageOfType(EOrderType_Character eventType)
vector GetAreaCenter(vector min, vector max)
bool HasVehicleNavlink(IEntity entity)
GetGoalMessageOfType(EMessageType_Goal eventType)
void RegisterDbgCategory()
Definition SCR_AIWorld.c:59
ScriptInvoker_AIWorldControlModeChanged GetOnControlModeChanged()
Definition SCR_AIWorld.c:54
void RequestNavmeshRebuildEntity(IEntity entity)
override void AddedAIAgent(AIAgent agent)
override void EOnInit(IEntity owner)
Definition SCR_AIWorld.c:75
ref ScriptInvoker_AIWorldControlModeChanged m_OnControlModeChanged
Definition SCR_AIWorld.c:43
override void RemovingAIAgent(AIAgent agent)
GetInfoMessageOfType(EMessageType_Info eventType)
override void OnDebugCameraTeleport(vector pos)
SCR_BaseManualCameraComponent FindCameraComponent(typename type)
Contains various scripted 3D math functions.
Definition SCR_Math3D.c:3
Teleport the camera to the cursor's world position.
Instance of created debug visualizer.
Definition Shape.c:14
proto external void RequestRoadNetworkRebuild(vector min, vector max)
proto external void RequestNavmeshRebuild(vector min, vector max)
ShapeFlags
Definition ShapeFlags.c:13
proto void PrintFormat(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL, LogLevel level=LogLevel.NORMAL)
@ NONE
When Shape is created and not initialized yet.
Definition ShapeType.c:15
SCR_FieldOfViewSettings Attribute
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134