Arma Reforger Explorer
1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Toggle main menu visibility
Loading...
Searching...
No Matches
SCR_AISearchAndDestroyActivity.c
Go to the documentation of this file.
1
class
SCR_AISearchAndDestroyActivity
:
SCR_AIActivityBase
2
{
3
protected
ref SCR_BTParamAssignable<vector>
m_vPosition
=
new
SCR_BTParamAssignable<vector>(
SCR_AIActionTask
.POSITION_PORT);
4
protected
ref SCR_BTParam<IEntity>
m_Entity
=
new
SCR_BTParam<IEntity>(
SCR_AIActionTask
.ENTITY_PORT);
5
6
protected
SCR_AIGroup
m_Group
;
7
protected
const
float
m_fBehaviorRadius
= 3;
8
9
protected
SCR_SearchAndDestroyWaypoint
m_WP
;
10
protected
AIPathfindingComponent
m_pathFindindingComp
;
11
protected
vector
m_vGridOrigin
;
12
protected
ref array<vector>
m_aTiles
= {};
13
protected
bool
m_bAllTilesLoaded
;
14
15
protected
ref array<vector>
m_aCorrectedPositions
= {};
16
protected
ref array<vector>
m_aAvailablePositions
= {};
17
protected
ref array<vector>
m_aAssignedPositions
= {};
18
19
protected
float
m_fHoldingTime
= 600.0;
20
protected
float
m_fStartTime
;
21
protected
float
m_fTimeStamp
;
22
23
#ifdef WORKBENCH
24
protected
ref array<ref Shape> m_aDbgShape = {};
25
#endif
26
27
//------------------------------------------------------------------------------------------------
28
void
InitParameters
(
vector
position
,
IEntity
entity)
29
{
30
m_vPosition
.Init(
this
,
position
);
31
m_vPosition
.m_AssignedOut = (
position
!=
vector
.Zero);
32
m_Entity
.Init(
this
, entity);
33
}
34
35
//------------------------------------------------------------------------------------------------
36
void
SCR_AISearchAndDestroyActivity
(
SCR_AIGroupUtilityComponent
utility, AIWaypoint relatedWaypoint,
vector
pos,
IEntity
ent,
EMovementType
movementType =
EMovementType
.RUN,
bool
useVehicles =
false
,
float
priority = PRIORITY_ACTIVITY_SEEK_AND_DESTROY,
float
priorityLevel =
PRIORITY_LEVEL_NORMAL
)
37
{
38
InitParameters
(pos, ent);
39
SetPriority(priority);
40
41
m_Group
=
SCR_AIGroup
.Cast(
m_Utility
.GetAIAgent());
42
if
(!
m_Group
)
43
return
;
44
m_pathFindindingComp
= AIPathfindingComponent.Cast(
m_Group
.FindComponent(AIPathfindingComponent));
45
m_vGridOrigin
= pos;
46
47
AIWaypoint wp = relatedWaypoint;
48
if
(wp)
49
m_WP
=
SCR_SearchAndDestroyWaypoint
.Cast(wp);
50
51
m_fStartTime
=
GetGame
().GetWorld().GetWorldTime();
52
if
(
m_WP
)
53
m_fHoldingTime
=
m_WP
.GetHoldingTime();
54
m_fTimeStamp
=
m_fStartTime
;
55
}
56
57
//------------------------------------------------------------------------------------------------
58
override
void
OnActionSelected
()
59
{
60
super.OnActionSelected();
61
GenerateInvestigationGrid
();
62
63
if
(
m_WP
)
64
m_WP
.GetOnWaypointPropertiesChanged().Insert(
OnWaypointPropertiesChanged
);
65
}
66
67
//------------------------------------------------------------------------------------------------
68
override
float
CustomEvaluate
()
69
{
70
float
currentTime =
GetGame
().GetWorld().GetWorldTime();
71
72
if
(GetActionState() ==
EAIActionState
.RUNNING)
73
{
74
// check every 2s if all tiles are loaded and proceed w/ activity
75
if
(!
m_bAllTilesLoaded
&& currentTime -
m_fTimeStamp
> 2)
76
{
77
if
(
LoadTiles
())
78
{
79
AdjustInvestigationPositions
();
80
81
// assign first available position to all fireteams
82
ref array<SCR_AIGroupFireteam> fireTeams = {};
83
m_Utility
.m_FireteamMgr.GetFreeFireteams(fireTeams,
SCR_AIGroupFireteam
);
84
85
foreach
(
SCR_AIGroupFireteam
ft : fireTeams)
86
AssignInvestigationPositions
(ft);
87
88
m_bAllTilesLoaded
=
true
;
89
}
90
91
m_fTimeStamp
= currentTime;
92
}
93
}
94
95
return
GetPriority
();
96
}
97
98
//------------------------------------------------------------------------------------------------
99
// on investigation finished, assign another investigation position
100
override
void
OnChildBehaviorFinished
(
SCR_AIBehaviorBase
childBehavior)
101
{
102
103
SCR_AIMoveAndInvestigateBehavior
behavior =
SCR_AIMoveAndInvestigateBehavior
.Cast(childBehavior);
104
if
(!childBehavior || !behavior)
105
return
;
106
if
(
m_aAssignedPositions
.Contains(behavior.m_vPosition.m_Value) < 0)
107
return
;
108
109
m_aAssignedPositions
.RemoveItem(behavior.m_vPosition.m_Value);
110
111
AIAgent agent = childBehavior.m_Utility.GetOwner();
112
if
(!agent)
113
return
;
114
SCR_AIGroupFireteam
ft =
m_Utility
.m_FireteamMgr.FindFireteam(agent);
115
if
(!ft)
116
return
;
117
118
if
(behavior.GetActionState() !=
EAIActionState
.FAILED)
119
AssignInvestigationPositions
(ft);
120
121
// Fail behavior when WP holding time is up
122
if
(
m_WP
)
123
{
124
float
currentTime =
GetGame
().GetWorld().GetWorldTime();
125
if
(currentTime -
m_fStartTime
>
m_fHoldingTime
)
126
behavior.Fail();
127
}
128
}
129
130
//------------------------------------------------------------------------------------------------
131
protected
void
GenerateInvestigationGrid
()
132
{
133
float
actionRadius = 20.0;
134
float
tileSize;
135
vector
tileCenterPos;
136
vector
XOffset;
137
vector
XZOffset;
138
139
m_aTiles
.Clear();
140
141
if
(
m_WP
)
142
{
143
actionRadius =
m_WP
.GetCompletionRadius();
144
m_vGridOrigin
=
m_WP
.GetOrigin() +
Vector
(-actionRadius, 0, -actionRadius);
145
}
146
147
// get fireteam x tile ratio
148
int
fireteamCount =
m_Utility
.m_FireteamMgr.GetFireteamCount();
149
if
(fireteamCount == 0)
150
return
;
151
const
int
maxFireteam = 8;
152
float
fireteamTileRatio = (maxFireteam - fireteamCount) / 10;
153
154
tileSize =
Math
.Clamp(fireteamTileRatio * actionRadius, 5, 20);
155
vector
addedTileSize =
Vector
(tileSize, tileSize, tileSize);
156
157
int
tileCount = (actionRadius * 2) / tileSize;
158
159
for
(
int
x = 0; x < tileCount; x++)
160
{
161
for
(
int
z = 0; z < tileCount; z++)
162
{
163
// calculate tile vector of its X and XZ
164
vector
vectorX =
Vector
(x * tileSize, 0, z * tileSize);
165
vector
vectorXZ = vectorX + addedTileSize;
166
// add offset of WP origin
167
XOffset = vectorX +
m_vGridOrigin
;
168
XZOffset = vectorXZ +
m_vGridOrigin
;
169
// get center position
170
tileCenterPos = XZOffset / 2 + XOffset / 2;
171
m_aTiles
.Insert(tileCenterPos);
172
173
#ifdef WORKBENCH
174
if
(
DiagMenu
.GetBool(
SCR_DebugMenuID
.DEBUGUI_AI_SHOW_SEARCH_AND_DESTROY))
175
{
176
m_aDbgShape.Insert(
Shape
.Create(
ShapeType
.BBOX,
Color
.DARK_CYAN,
ShapeFlags
.WIREFRAME, XOffset, XZOffset));
177
}
178
#endif
179
}
180
}
181
}
182
183
//-----------------------------------------------------------------------------------------------------
184
// are grid tiles loaded?
185
protected
bool
LoadTiles
()
186
{
187
bool
allTilesLoaded =
true
;
188
189
if
(!
m_pathFindindingComp
)
190
return
false
;
191
NavmeshWorldComponent navmesh =
m_pathFindindingComp
.GetNavmeshComponent();
192
if
(!navmesh)
193
return
false
;
194
195
foreach
(
vector
tile :
m_aTiles
)
196
{
197
if
(!navmesh.IsTileLoaded(tile))
198
{
199
navmesh.LoadTileIn(tile);
200
allTilesLoaded =
false
;
201
}
202
}
203
204
return
allTilesLoaded;
205
}
206
207
//------------------------------------------------------------------------------------------------
208
// adjust investigation positions vis-a-vis navmesh
209
protected
void
AdjustInvestigationPositions
()
210
{
211
vector
correctedPosition;
212
m_aCorrectedPositions
.Clear();
213
214
foreach
(
vector
tile :
m_aTiles
)
215
{
216
m_pathFindindingComp
.GetClosestPositionOnNavmesh(tile,
"15 15 15"
, correctedPosition);
217
218
if
(!
m_aCorrectedPositions
.Contains(correctedPosition))
219
{
220
#ifdef WORKBENCH
221
if
(
DiagMenu
.GetBool(
SCR_DebugMenuID
.DEBUGUI_AI_SHOW_SEARCH_AND_DESTROY))
222
{
223
m_aDbgShape.Insert(
Shape
.CreateSphere(
Color
.RED,
ShapeFlags
.NOZWRITE, correctedPosition, 0.5));
224
}
225
#endif
226
m_aCorrectedPositions
.Insert(correctedPosition);
227
}
228
}
229
230
m_aAvailablePositions
.Copy(
m_aCorrectedPositions
);
231
}
232
233
//------------------------------------------------------------------------------------------------
234
protected
void
AssignInvestigationPositions
(
SCR_AIGroupFireteam
ft)
235
{
236
array<AIAgent> agents = {};
237
ft.
GetMembers
(agents);
238
foreach
(AIAgent ag : agents)
239
{
240
SCR_AIMessage_Investigate
msg =
SCR_AIMessage_Investigate
.Create(
this
,
m_aAvailablePositions
[0],
m_fBehaviorRadius
,
true
,
EAIUnitType
.UnitType_Infantry);
241
m_Utility
.m_Mailbox.RequestBroadcast(msg,ag);
242
}
243
244
#ifdef WORKBENCH
245
if
(
DiagMenu
.GetBool(
SCR_DebugMenuID
.DEBUGUI_AI_SHOW_SEARCH_AND_DESTROY))
246
{
247
m_aDbgShape.Insert(
Shape
.CreateSphere(
Color
.GREEN,
ShapeFlags
.NOZWRITE,
m_aAvailablePositions
[0], 1.5));
248
}
249
#endif
250
251
m_aAssignedPositions
.Insert(
m_aAvailablePositions
[0]);
252
m_aAvailablePositions
.Remove(0);
253
254
if
(!
m_aAvailablePositions
.IsIndexValid(0))
255
{
256
#ifdef WORKBENCH
257
ClearDebug();
258
#endif
259
m_aAvailablePositions
.Copy(
m_aCorrectedPositions
);
260
}
261
}
262
263
//------------------------------------------------------------------------------------------------
264
protected
void
OnWaypointPropertiesChanged
()
265
{
266
GenerateInvestigationGrid
();
267
m_bAllTilesLoaded
=
false
;
268
}
269
270
//------------------------------------------------------------------------------------------------
271
override
void
OnActionFailed
()
272
{
273
super.OnActionFailed();
274
SendCancelMessagesToAllAgents
();
275
}
276
277
//------------------------------------------------------------------------------------------------
278
override
void
OnActionDeselected
()
279
{
280
super.OnActionDeselected();
281
SendCancelMessagesToAllAgents
();
282
283
if
(
m_WP
)
284
m_WP
.GetOnWaypointPropertiesChanged().Remove(
OnWaypointPropertiesChanged
);
285
}
286
287
//------------------------------------------------------------------------------------------------
288
override
string
GetActionDebugInfo
()
289
{
290
return
this.
ToString
() +
" seek and destroy around"
+ m_Entity.m_Value.ToString();
291
}
292
293
//-----------------------------------------------------------------------------------------------
294
#ifdef WORKBENCH
295
private
void
ClearDebug()
296
{
297
m_aDbgShape.Clear();
298
}
299
#endif
300
};
SCR_DebugMenuID
SCR_DebugMenuID
This enum contains all IDs for DiagMenu entries added in script.
Definition
DebugMenuID.c:4
GetGame
ArmaReforgerScripted GetGame()
Definition
game.c:1398
PRIORITY_LEVEL_NORMAL
enum EAIActionFailReason PRIORITY_LEVEL_NORMAL
SendCancelMessagesToAllAgents
void SendCancelMessagesToAllAgents()
Definition
SCR_AIActivity.c:51
SCR_AIActivityBase
void SCR_AIActivityBase(SCR_AIGroupUtilityComponent utility, AIWaypoint relatedWaypoint)
Definition
SCR_AIActivity.c:44
m_Utility
enum SCR_EAIActivityCause m_Utility
SCR_AIBehaviorBase
void SCR_AIBehaviorBase(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity)
Definition
SCR_AIBehavior.c:23
position
vector position
Definition
SCR_DestructibleTreeV2.c:30
Color
Definition
Color.c:13
DiagMenu
Diagnostic and developer menu system.
Definition
DiagMenu.c:18
IEntity
Definition
IEntity.c:13
Math
Definition
Math.c:13
SCR_AIActionTask
Definition
SCR_AIBehaviorTask.c:2
SCR_AIGroupFireteam
Definition
SCR_AIGroupFireteam.c:4
SCR_AIGroupFireteam::GetMembers
void GetMembers(notnull array< AIAgent > outAgents)
Definition
SCR_AIGroupFireteam.c:58
SCR_AIGroup
Definition
SCR_AIGroup.c:75
SCR_AIGroupUtilityComponent
Definition
SCR_AIGroupUtilityComponent.c:18
SCR_AIMessage_Investigate
Definition
SCR_AIMessage.c:417
SCR_AIMoveAndInvestigateBehavior
Definition
SCR_AIMoveBehavior.c:75
SCR_AISearchAndDestroyActivity::m_fTimeStamp
float m_fTimeStamp
Definition
SCR_AISearchAndDestroyActivity.c:21
SCR_AISearchAndDestroyActivity::m_bAllTilesLoaded
bool m_bAllTilesLoaded
Definition
SCR_AISearchAndDestroyActivity.c:13
SCR_AISearchAndDestroyActivity::m_aCorrectedPositions
ref array< vector > m_aCorrectedPositions
Definition
SCR_AISearchAndDestroyActivity.c:15
SCR_AISearchAndDestroyActivity::m_aAssignedPositions
ref array< vector > m_aAssignedPositions
Definition
SCR_AISearchAndDestroyActivity.c:17
SCR_AISearchAndDestroyActivity::m_Group
SCR_AIGroup m_Group
Definition
SCR_AISearchAndDestroyActivity.c:6
SCR_AISearchAndDestroyActivity::InitParameters
void InitParameters(vector position, IEntity entity)
Definition
SCR_AISearchAndDestroyActivity.c:28
SCR_AISearchAndDestroyActivity::AdjustInvestigationPositions
void AdjustInvestigationPositions()
Definition
SCR_AISearchAndDestroyActivity.c:209
SCR_AISearchAndDestroyActivity::OnWaypointPropertiesChanged
void OnWaypointPropertiesChanged()
Definition
SCR_AISearchAndDestroyActivity.c:264
SCR_AISearchAndDestroyActivity::CustomEvaluate
override float CustomEvaluate()
Definition
SCR_AISearchAndDestroyActivity.c:68
SCR_AISearchAndDestroyActivity::LoadTiles
bool LoadTiles()
Definition
SCR_AISearchAndDestroyActivity.c:185
SCR_AISearchAndDestroyActivity::GenerateInvestigationGrid
void GenerateInvestigationGrid()
Definition
SCR_AISearchAndDestroyActivity.c:131
SCR_AISearchAndDestroyActivity::m_aAvailablePositions
ref array< vector > m_aAvailablePositions
Definition
SCR_AISearchAndDestroyActivity.c:16
SCR_AISearchAndDestroyActivity::m_pathFindindingComp
AIPathfindingComponent m_pathFindindingComp
Definition
SCR_AISearchAndDestroyActivity.c:10
SCR_AISearchAndDestroyActivity::SCR_AISearchAndDestroyActivity
void SCR_AISearchAndDestroyActivity(SCR_AIGroupUtilityComponent utility, AIWaypoint relatedWaypoint, vector pos, IEntity ent, EMovementType movementType=EMovementType.RUN, bool useVehicles=false, float priority=PRIORITY_ACTIVITY_SEEK_AND_DESTROY, float priorityLevel=PRIORITY_LEVEL_NORMAL)
Definition
SCR_AISearchAndDestroyActivity.c:36
SCR_AISearchAndDestroyActivity::m_vGridOrigin
vector m_vGridOrigin
Definition
SCR_AISearchAndDestroyActivity.c:11
SCR_AISearchAndDestroyActivity::OnChildBehaviorFinished
override void OnChildBehaviorFinished(SCR_AIBehaviorBase childBehavior)
Definition
SCR_AISearchAndDestroyActivity.c:100
SCR_AISearchAndDestroyActivity::m_fStartTime
float m_fStartTime
Definition
SCR_AISearchAndDestroyActivity.c:20
SCR_AISearchAndDestroyActivity::OnActionFailed
override void OnActionFailed()
Definition
SCR_AISearchAndDestroyActivity.c:271
SCR_AISearchAndDestroyActivity::GetActionDebugInfo
override string GetActionDebugInfo()
Definition
SCR_AISearchAndDestroyActivity.c:288
SCR_AISearchAndDestroyActivity::m_fHoldingTime
float m_fHoldingTime
Definition
SCR_AISearchAndDestroyActivity.c:19
SCR_AISearchAndDestroyActivity::AssignInvestigationPositions
void AssignInvestigationPositions(SCR_AIGroupFireteam ft)
Definition
SCR_AISearchAndDestroyActivity.c:234
SCR_AISearchAndDestroyActivity::OnActionDeselected
override void OnActionDeselected()
Definition
SCR_AISearchAndDestroyActivity.c:278
SCR_AISearchAndDestroyActivity::m_fBehaviorRadius
const float m_fBehaviorRadius
Definition
SCR_AISearchAndDestroyActivity.c:7
SCR_AISearchAndDestroyActivity::m_Entity
ref SCR_BTParam< IEntity > m_Entity
Definition
SCR_AISearchAndDestroyActivity.c:4
SCR_AISearchAndDestroyActivity::m_WP
SCR_SearchAndDestroyWaypoint m_WP
Definition
SCR_AISearchAndDestroyActivity.c:9
SCR_AISearchAndDestroyActivity::OnActionSelected
override void OnActionSelected()
Definition
SCR_AISearchAndDestroyActivity.c:58
SCR_AISearchAndDestroyActivity::m_aTiles
ref array< vector > m_aTiles
Definition
SCR_AISearchAndDestroyActivity.c:12
SCR_AISearchAndDestroyActivity::m_vPosition
ref SCR_BTParamAssignable< vector > m_vPosition
Definition
SCR_AISearchAndDestroyActivity.c:3
SCR_SearchAndDestroyWaypoint
Definition
SCR_SearchAndDestroyWaypoint.c:7
Shape
Instance of created debug visualizer.
Definition
Shape.c:14
vector
Definition
vector.c:13
EAIActionState
EAIActionState
Definition
EAIActionState.c:13
EAIUnitType
EAIUnitType
Definition
EAIUnitType.c:13
EMovementType
EMovementType
Definition
EMovementType.c:13
ShapeType
ShapeType
Definition
ShapeType.c:13
ShapeFlags
ShapeFlags
Definition
ShapeFlags.c:13
GetPriority
int GetPriority()
Definition
SCR_BaseManualCameraComponent.c:247
ToString
proto external string ToString()
Plain C++ pointer, no weak pointers, no memory management.
Vector
proto native vector Vector(float x, float y, float z)
scripts
Game
AI
Behavior
SCR_AISearchAndDestroyActivity.c
Generated by
1.17.0