9 protected SCR_AICombatMoveState
m_State;
33 protected bool OnUpdate(AIAgent owner,
float dt);
45 protected override void OnInit(AIAgent owner)
47 m_Utility = SCR_AIUtilityComponent.Cast(owner.FindComponent(SCR_AIUtilityComponent));
62 float currentTime_ms =
GetGame().GetWorld().GetWorldTime();
75 if (executedBehavior && !executedBehavior.m_bUseCombatMove)
130 m_State.ApplyRequestChangeStanceInCover(
false);
135 m_State.ApplyRequestChangeStanceInCover(
true);
154 m_State.ApplyRequestChangeStanceOutsideCover(newStance);
183 return m_Utility.m_CombatComponent.IsFriendlyInAim();
189 if (!
m_State.IsExecutingRequest())
198 return rq.m_eReason != SCR_EAICombatMoveReason.FF_AVOIDANCE;
205 rq.m_eReason = SCR_EAICombatMoveReason.FF_AVOIDANCE;
210 if (prevRequest && prevRequest.m_eReason == SCR_EAICombatMoveReason.FF_AVOIDANCE)
212 rq.m_eDirection = prevRequest.m_eDirection;
216 if (
Math.RandomIntInclusive(0, 1) == 1)
217 rq.m_eDirection = SCR_EAICombatMoveDirection.RIGHT;
219 rq.m_eDirection = SCR_EAICombatMoveDirection.LEFT;
223 rq.m_eStanceEnd = rq.m_eStanceMoving;
226 rq.m_fMoveDuration_s = 1.0;
227 rq.m_bAimAtTarget =
SCR_AICombatMoveUtils.IsAimingAndMovementPossible(rq.m_eStanceMoving, rq.m_eMovementType);
228 rq.m_bAimAtTargetEnd =
true;
241 rq.m_eReason = SCR_EAICombatMoveReason.STANDARD;
246 rq.m_bTryFindCover =
true;
247 rq.m_bUseCoverSearchDirectivity =
true;
248 rq.m_bCheckCoverVisibility =
true;
250 float coverSearchDistMin = 0;
251 float coverSearchDistMax = 30;
252 float moveDurationMax = 6;
259 case EAIThreatState.THREATENED:
263 coverSearchDistMin = 2.0;
264 coverSearchDistMax = 10.0;
272 coverSearchDistMin = 5.0;
273 coverSearchDistMax = 15.0;
280 rq.m_bAimAtTarget =
SCR_AICombatMoveUtils.IsAimingAndMovementPossible(rq.m_eStanceMoving, rq.m_eMovementType) &&
282 rq.m_bAimAtTargetEnd =
true;
290 case EAIThreatState.THREATENED:
292 coverSearchDistMin = 2.0;
293 coverSearchDistMax = 20.0;
294 moveDurationMax = 2.5;
301 coverSearchDistMin = 10.0;
302 coverSearchDistMax = 30.0;
311 rq.m_bAimAtTarget =
false;
312 rq.m_bAimAtTargetEnd =
true;
319 coverSearchDistMin = 0;
321 rq.m_fCoverSearchDistMin = coverSearchDistMin;
322 rq.m_fCoverSearchDistMax = coverSearchDistMax;
323 rq.m_fMoveDuration_s =
Math.RandomFloat(0.5, 1.0) * moveDurationMax;
335 if (!utility.m_CommsHandler.CanBypass())
338 utility.m_CommsHandler.AddRequest(talkRq);
344 if (!utility.m_CommsHandler.CanBypass())
347 utility.m_CommsHandler.AddRequest(talkRq);
355 AIWaypoint wp = null;
357 AIGroup group = agent.GetParentGroup();
359 wp = group.GetCurrentWaypoint();
362 SCR_EAICombatMoveDirection eDirection;
363 float coverSearchSectorHalfAngleRad;
364 vector avoidStraightPathDir;
372 eDirection = SCR_EAICombatMoveDirection.CUSTOM_POS;
376 coverSearchSectorHalfAngleRad =
Math.PI;
382 vector wpPos = wp.GetOrigin();
383 float wpRadius = wp.GetCompletionRadius();
384 bool tgtInWaypoint =
vector.DistanceXZ(wpPos, targetPos) < wpRadius;
387 if (myDistToWp > wpRadius)
391 eDirection = SCR_EAICombatMoveDirection.CUSTOM_POS;
393 avoidStraightPathDir =
vector.Zero;
395 else if (myDistToWp > 0.5 * wpRadius)
403 eDirection = SCR_EAICombatMoveDirection.CUSTOM_POS;
411 eDirection = SCR_EAICombatMoveDirection.ANYWHERE;
412 avoidStraightPathDir =
vector.Zero;
413 coverSearchSectorHalfAngleRad = -1.0;
421 eDirection = SCR_EAICombatMoveDirection.CUSTOM_POS;
428 outMovePos = movePos;
429 outDirection = eDirection;
430 outAvoidStraightPathDir = avoidStraightPathDir;
431 outCoverSearchSectorHalfAngleRad = coverSearchSectorHalfAngleRad;
452 waitTime_s = rq.m_f_UserTimer_s;
461 if (
m_State.m_bExposedInCover &&
m_State.m_fTimerRequest_s > waitTime_s)
463 float newWaitTime =
Math.RandomFloat(3.5, 7.0);
466 else if (!
m_State.m_bExposedInCover &&
m_State.m_fTimerRequest_s > waitTime_s)
468 float newWaitTime =
Math.RandomFloat(1.7, 2.5);
477 rq.m_bExposedInCover = exposed;
478 rq.m_bAimAtTarget =
true;
479 rq.m_bAimAtTargetEnd =
true;
480 rq.m_f_UserTimer_s = waitTime;
497 float cosAngle =
m_State.GetAssignedCover().CosAngleToThreat(tgtPos);
498 return (cosAngle < 0.5);
505 rq.m_eReason = SCR_EAICombatMoveReason.STANDARD;
508 rq.m_vMovePos = rq.m_vTargetPos;
509 rq.m_bTryFindCover =
true;
510 rq.m_bUseCoverSearchDirectivity =
true;
511 rq.m_bCheckCoverVisibility =
true;
512 rq.m_bFailIfNoCover =
true;
516 rq.m_eDirection = SCR_EAICombatMoveDirection.BACKWARD;
517 rq.m_fCoverSearchSectorHalfAngleRad = -1.0;
518 rq.m_bAimAtTarget =
SCR_AICombatMoveUtils.IsAimingAndMovementPossible(rq.m_eStanceMoving, rq.m_eMovementType);
519 rq.m_bAimAtTargetEnd =
true;
521 rq.m_fCoverSearchDistMin = 0;
522 rq.m_fCoverSearchDistMax = 20;
541 if (!
m_State.IsExecutingRequest())
550 return rq.m_eReason != SCR_EAICombatMoveReason.MOVE_FROM_TARGET;
557 rq.m_eReason = SCR_EAICombatMoveReason.MOVE_FROM_TARGET;
563 rq.m_eDirection = SCR_EAICombatMoveDirection.BACKWARD;
564 rq.m_fMoveDuration_s = 2.0;
565 rq.m_bAimAtTarget =
SCR_AICombatMoveUtils.IsAimingAndMovementPossible(rq.m_eStanceMoving, rq.m_eMovementType);
566 rq.m_bAimAtTargetEnd =
true;
585 case EAIThreatState.THREATENED:
599 return Math.Max(weaponMinDist + 5.0, 15.0);
640 protected static const string PORT_AVOID_STRAIGHT_PATH_DIR =
"AvoidStraightPathDir";
646 protected override bool OnUpdate(AIAgent owner,
float dt)
666 return m_Target.GetLastSeenPosition();
678 if (tgtEntity && m_CombatComp.IsTargetVisible(
m_Target))
683 vector eyePos = character.EyePosition();
689 pos = pos +
Vector(0, 2.0, 0);
695 lastSeenPos = lastSeenPos +
Vector(0, 1.8, 0);
702 if (m_bCloseRangeCombat)
712 return m_State.m_bInCover;
726 case EAIThreatState.THREATENED:
738 case EAIThreatState.THREATENED:
748 bool longWaitTime =
false;
760 if (m_bVeryLongRangeCombat)
775 if (m_State.IsExecutingRequest())
792 return m_State.m_fTimerStopped_s > stoppedWaitTime;
798 PORT_AVOID_STRAIGHT_PATH_DIR
821 protected override bool OnUpdate(AIAgent owner,
float dt)
879 if (
m_State.IsExecutingRequest())
899 return m_State.m_fTimerStopped_s > stoppedWaitTime;
ArmaReforgerScripted GetGame()
enum SCR_EAIActivityCause m_Utility
void SCR_AIBehaviorBase(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity)
override TStringArray GetVariablesIn()
vector m_vAvoidStraightPathDir
SCR_AICombatMoveLogicBase PORT_BASE_TARGET
Combat movement node for attack behavior, which is aimed at BaseTarget.
EAIThreatState m_eThreatState
void SCR_AICombatMoveRequest_Move()
class SCR_AIPolar m_Target
ref TStringArray s_aVarsIn
void SCR_AITalkRequest(ECommunicationType type, IEntity entity, vector pos, int enumSignal, bool transmitIfNoReceivers, bool transmitIfPassenger, SCR_EAITalkRequestPreset preset)
EWeaponType m_eWeaponType
proto external vector GetOrigin()
proto bool GetVariableIn(string name, out void val)
Combat move logic when doing suppressive fire.
override bool MoveToNextPosCondition()
override bool ResolveFailMoveIfNoCover()
override bool OnUpdate(AIAgent owner, float dt)
override vector ResolveRequestTargetPos()
override TStringArray GetVariablesIn()
override vector GetTargetPosition()
static const string PORT_TIME_LAST_SEEN
float m_fTargetLastSeenTime_ms
static ref TStringArray s_aVarsIn
static const float TIME_SINCE_GOOD_VISIBILITY_MIN_MS
override float ResolveStoppedWaitTime(bool inCover, EAIThreatState threat, EWeaponType weaponType)
override float GetTargetDistance()
SCR_AISuppressionVolumeBase m_SuppressionVolume
static const string PORT_VISIBLE
static const string PORT_SUPPRESSION_VOLUME
void SuppressedInCoverLogic()
static bool IsAimingAndMovingAllowedForWeapon(EWeaponType weaponType)
float m_fUpdateInterval_ms
static override bool VisibleInPalette()
vector GetTargetPosition()
void PushRequestFFAvoidance()
SCR_AIUtilityComponent m_Utility
bool OnUpdate(AIAgent owner, float dt)
SCR_AICombatComponent m_CombatComp
EAIThreatState m_eThreatState
override void OnInit(AIAgent owner)
bool ResolveFailMoveIfNoCover()
bool MoveFromTargetNewRequestCondition()
CharacterControllerComponent m_CharacterController
static void OnMovementCompleted(SCR_AIUtilityComponent utility, SCR_AICombatMoveRequestBase rq)
bool MoveFromTargetCondition()
bool MoveToNextPosCondition()
float ResolveStoppedWaitTime(bool inCover, EAIThreatState threat, EWeaponType weaponType)
SCR_AICombatMoveState m_State
bool SuppressedInCoverCondition()
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
bool FFAvoidanceCondition()
void ResolveMoveRequestMovePosAndDir(vector targetPos, out vector outMovePos, out vector outAvoidStraightPathDir, out SCR_EAICombatMoveDirection outDirection, out float outCoverSearchSectorHalfAngleRad)
static float ResolveOptimalDistance(float weaponMinDist)
vector GetAvoidStraightPathDir()
static ECharacterStance ResolveStanceOutsideCover(bool closeRange, EAIThreatState threat)
static void OnMovementStarted(SCR_AIUtilityComponent utility, SCR_AICombatMoveRequest_Move rq, vector pos, bool destinationIsCover)
const float COVER_QUERY_SECTOR_ANGLE_RAD
EWeaponType m_eWeaponType
ECharacterStance m_eStance
vector ResolveRequestTargetPos()
bool CurrentCoverUselessCondition()
void PushRequestChangeStanceInCover(bool exposed, SCR_EAICombatMoveReason reason, float waitTime)
void PushRequestLeaveUselessCover()
void PushRequestMoveFromTarget()
bool FFAvoidanceNewRequestCondition()
float GetTargetDistance()
bool m_bVeryLongRangeCombat
ScriptInvokerBase< SCR_AICombatMoveRequest_Move_MovementEvent > GetOnMovementStarted(bool createInvoker=true)
SCR_FieldOfViewSettings Attribute
array< string > TStringArray
proto native vector Vector(float x, float y, float z)