Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AIMoveFromDanger.c
Go to the documentation of this file.
1
4class SCR_AIMoveFromDangerBehavior : SCR_AIBehaviorBase
5{
6 ref SCR_BTParam<vector> m_DangerPosition = new SCR_BTParam<vector>("DangerPosition");
7 ref SCR_BTParam<IEntity> m_DangerEntity = new SCR_BTParam<IEntity>("DangerEntity");
8 ref SCR_BTParam<ECharacterStance> m_Stance = new SCR_BTParam<ECharacterStance>("CharacterStance");
9 ref SCR_BTParam<EMovementType> m_MovementType = new SCR_BTParam<EMovementType>("MovementType");
10
11 //-----------------------------------------------------------------------------------------------------
12 void InitParameters(IEntity dangerEntity, vector dangerPos)
13 {
14 m_DangerEntity.Init(this, dangerEntity);
15 m_DangerPosition.Init(this, dangerPos);
16 m_Stance.Init(this, ECharacterStance.STAND);
17 m_MovementType.Init(this, EMovementType.RUN); // Don't use sprint! Character can't reload during sprint, it makes it broken.
18 }
19
20 //---------------------------------------------------------------------------------------------------------------------------------
21 override int GetCause()
22 {
23 return SCR_EAIBehaviorCause.DANGER_HIGH;
24 }
25
26 //-----------------------------------------------------------------------------------------------------
27 void SCR_AIMoveFromDangerBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity)
28 {
29 SetPriority(PRIORITY_BEHAVIOR_MOVE_FROM_DANGER);
30 InitParameters(dangerEntity, dangerPos);
31
32 if (dangerEntity)
33 {
34 m_DangerPosition.m_Value = dangerEntity.GetOrigin();
35 }
36
37 m_sBehaviorTree = "{D12937CF422B639B}AI/BehaviorTrees/Chimera/Soldier/MoveFromDanger_Position.bt"
38 }
39
40 //-----------------------------------------------------------------------------------------------------
42 static bool ExistsBehaviorForEntity(SCR_AIUtilityComponent utility, IEntity ent)
43 {
44 SCR_AIMoveFromDangerBehavior behavior = SCR_AIMoveFromDangerBehavior.Cast(utility.FindActionOfInheritedType(SCR_AIMoveFromDangerBehavior));
45 if (behavior && behavior.m_DangerEntity.m_Value == ent)
46 return true;
47 else
48 return false;
49 }
50}
51
53{
54 ref SCR_BTParam<float> m_Distance = new SCR_BTParam<float>("Distance");
55
56 //-----------------------------------------------------------------------------------------------------
57 void SCR_AIMoveFromUnsafeAreaBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity, float distance)
58 {
59 m_Distance.Init(this, distance);
60 m_MovementType.Init(this, EMovementType.RUN);
61 m_sBehaviorTree = "{9C0564CA979D57B1}AI/BehaviorTrees/Chimera/Soldier/MoveFromDanger_UnsafeArea.bt";
62 }
63}
64
65class SCR_AIMoveFromGrenadeBehavior : SCR_AIMoveFromDangerBehavior
66{
67 static const float MAX_GRENADE_LOOKAT_TIMEOUT_MS = 600;
68 static const float DISTANCE_MAX_SQ = 13*13;
69
70 float m_fBehaviorTimeout = 0;
71 float m_fDistanceToGrenade = 0;
72 vector m_vObserveReactionPosition;
73
74 //-----------------------------------------------------------------------------------------------------
75 void SCR_AIMoveFromGrenadeBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity, float behaviorDelay, vector observePosition)
76 {
77 m_bAllowLook = false;
78 m_fBehaviorTimeout = GetGame().GetWorld().GetWorldTime() + behaviorDelay;
79 m_sBehaviorTree = "{478811D2295EAF3E}AI/BehaviorTrees/Chimera/Soldier/MoveFromDanger_Grenade.bt";
80 m_MovementType.m_Value = EMovementType.SPRINT;
81 m_fDistanceToGrenade = vector.Distance(utility.m_OwnerEntity.GetOrigin(), dangerPos);
82 m_vObserveReactionPosition = observePosition;
83
84 SetPriority(0);
85
86 m_bUseCombatMove = true;
87 }
88
89 //-----------------------------------------------------------------------------------------------------
90 override float CustomEvaluate()
91 {
92 if (CompleteActionCondition())
93 {
94 Complete();
95 return 0;
96 }
97
98 if (GetGame().GetWorld().GetWorldTime() > m_fBehaviorTimeout)
99 return PRIORITY_BEHAVIOR_MOVE_FROM_DANGER;
100
101 return 0;
102 }
103
104 bool CompleteActionCondition()
105 {
106 if (!m_DangerEntity.m_Value)
107 return true;
108
109 IEntity myEntity = m_Utility.m_OwnerEntity;
110 if (!myEntity)
111 return true;
112
113 if (vector.DistanceSq(myEntity.GetOrigin(), m_DangerPosition.m_Value) > DISTANCE_MAX_SQ)
114 return true;
115
116 return false;
117 }
118}
119
121{
122 protected static const float MIN_COS_ANGLE_COVER_TO_VEHICLE = -0.707; // Cos 135 deg
123
124 //-----------------------------------------------------------------------------------------------------
125 void SCR_AIMoveFromIncomingVehicleBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity)
126 {
127 m_sBehaviorTree = "{2488649728730886}AI/BehaviorTrees/Chimera/Soldier/MoveFromDanger_Vehicle.bt";
128 SetPriority(PRIORITY_BEHAVIOR_MOVE_FROM_DANGER);
129 m_MovementType.m_Value = EMovementType.SPRINT;
130 m_bUseCombatMove = true;
131 m_bAllowLook = false;
132 }
133
134 //-----------------------------------------------------------------------------------------------------
135 override float CustomEvaluate()
136 {
137 if (!ExecuteBehaviorCondition(m_Utility, m_DangerEntity.m_Value))
138 {
139 Complete();
140 return 0;
141 }
142
143 return GetPriority();
144 }
145
146 //-----------------------------------------------------------------------------------------------------
147 // Condition for the behavior to run
148 static bool ExecuteBehaviorCondition(notnull SCR_AIUtilityComponent utilityComp, IEntity vehicle)
149 {
150 if (!vehicle)
151 return false;
152
153 // If vehicle is not moving towards us
154 IEntity myEntity = utilityComp.m_OwnerEntity;
155 if (!IsVehicleMovingTowardsMe(myEntity, vehicle))
156 return false;
157
158 // If we are already in good cover
159 SCR_AICombatMoveState cmStace = utilityComp.m_CombatMoveState;
160 SCR_AICoverLock cover = utilityComp.m_CombatMoveState.GetAssignedCover();
161 if (cmStace.m_bInCover && cover && cover.IsValid() && IsCoverSafeAgainstVehicle(cover, vehicle))
162 return false;
163
164 return true;
165 }
166
167 //-----------------------------------------------------------------------------------------------------
168 static bool IsCoverSafeAgainstVehicle(notnull SCR_AICoverLock cover, notnull IEntity vehicle)
169 {
170 float cosAngleCoverToTgt = cover.CosAngleToThreat(vehicle.GetOrigin());
171 return cosAngleCoverToTgt > MIN_COS_ANGLE_COVER_TO_VEHICLE;
172 }
173
174 //-----------------------------------------------------------------------------------------------------
175 protected static bool IsVehicleMovingTowardsMe(notnull IEntity myEntity, notnull IEntity vehicle)
176 {
177 Physics phy = vehicle.GetPhysics();
178
179 if (!phy)
180 return false;
181
182 // Bail if velocity is around zero
183 vector velocityWorld = phy.GetVelocity();
184 float velocityAbsSq = velocityWorld.LengthSq();
185 if (velocityAbsSq <= 0.001)
186 return false;
187
188 vector velocityDir = velocityWorld.Normalized();
189
190 vector vecToMe = vector.Direction(vehicle.GetOrigin(), myEntity.GetOrigin());
191 vecToMe.Normalize();
192
193 float cosAngle = vector.Dot(vecToMe, velocityDir);
194
195 return cosAngle > 0.707; // 45deg
196 }
197}
198
199class SCR_AIMoveFromVehicleHornBehavior : SCR_AIMoveFromDangerBehavior
200{
201 //-----------------------------------------------------------------------------------------------------
202 void SCR_AIMoveFromVehicleHornBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity)
203 {
204 m_sBehaviorTree = "{10A3DFFBC3629A79}AI/BehaviorTrees/Chimera/Soldier/MoveFromDanger_VehicleHorn.bt";
205 SetPriority(PRIORITY_BEHAVIOR_MOVE_FROM_VEHICLE_HORN);
206 }
207}
208
211{
212 ref SCR_BTParam<vector> m_vMovePos = new SCR_BTParam<vector>("MovePos");
213
214 protected const float EXTRAPOLATE_POS_FORWARD_TIME_S = 0.2;
215 protected const float SIDE_STEP_LEN = 8;
216 protected const float SIDE_STEP_FORWARD = 12;
217 //-----------------------------------------------------------------------------------------------------
218 void SCR_AIPilotMoveFromIncomingVehicleBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity)
219 {
220 m_sBehaviorTree = "{4CD41D1E2C9CD745}AI/BehaviorTrees/Chimera/Soldier/MoveFromDanger_PilotVehicle.bt";
221 m_vMovePos.Init(this, vector.Zero);
222 }
223
224 //-----------------------------------------------------------------------------------------------------
225 override void OnActionSelected()
226 {
227 // Initialize m_vMovePos
228 if (!m_DangerEntity.m_Value)
229 {
230 Fail();
231 return;
232 }
233
234 IEntity myVehicle = m_Utility.m_OwnerEntity.GetRootParent();
235 Physics phy = myVehicle.GetPhysics();
236 if (!phy)
237 {
238 Fail();
239 return;
240 }
241
242 Physics phyDanger = m_DangerEntity.m_Value.GetPhysics();
243 if (!phyDanger)
244 return; // shouldn't happen as it triggered the even in first place
245
246 vector dangerVelocity = phyDanger.GetVelocity().Normalized();
247
248 vector myVelWorld = phy.GetVelocity();
249 vector myTransform[4];
250 myVehicle.GetTransform(myTransform);
251
252 // basicaly the rule is when danger comes from front or back go to right side
253 // if comes from side - go forward
254 float dot = vector.DotXZ(dangerVelocity, myTransform[2]);
255 if (dot > 0.5 || dot < -0.5)
256 {
257 m_vMovePos.m_Value = myTransform[3] + EXTRAPOLATE_POS_FORWARD_TIME_S * myVelWorld + SIDE_STEP_LEN * myTransform[0] + SIDE_STEP_FORWARD * myTransform[2];
258 }
259 else
260 {
261 m_vMovePos.m_Value = myTransform[3] + EXTRAPOLATE_POS_FORWARD_TIME_S * myVelWorld + SIDE_STEP_LEN * myTransform[2];
262 }
263 }
264}
265
ArmaReforgerScripted GetGame()
Definition game.c:1398
TStringArray GetPortNames()
ResourceName m_sBehaviorTree
int GetCause()
void Fail(bool doNotCompleteWaypoint)
void SCR_AIActivityBase(SCR_AIGroupUtilityComponent utility, AIWaypoint relatedWaypoint)
enum SCR_EAIActivityCause m_Utility
void SCR_AIBehaviorBase(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity)
bool m_bUseCombatMove
SCR_EAIBehaviorCause
bool m_bAllowLook
const float SIDE_STEP_LEN
SCR_AIMoveFromGrenadeBehavior MIN_COS_ANGLE_COVER_TO_VEHICLE
void SCR_AIPilotMoveFromIncomingVehicleBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity)
void SCR_AIMoveFromIncomingVehicleBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity)
SCR_AIMoveFromDangerBehavior m_Distance
const float SIDE_STEP_FORWARD
SCR_AIMoveFromVehicleHornBehavior m_vMovePos
Special behavior for pilot when he's about to collide with another vehicle.
override void OnActionSelected()
const float EXTRAPOLATE_POS_FORWARD_TIME_S
override float CustomEvaluate()
void SCR_AIMoveFromUnsafeAreaBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector dangerPos, IEntity dangerEntity, float distance)
float distance
enum EVehicleType IEntity
proto external vector GetOrigin()
proto external Physics GetPhysics()
proto external void GetTransform(out vector mat[])
ECharacterStance
EMovementType
array< string > TStringArray
Definition Types.c:385