24 protected override void OnInit(AIAgent owner)
26 m_Utility = SCR_AIUtilityComponent.Cast(owner.FindComponent(SCR_AIUtilityComponent));
50 rq.m_eUnitType = SCR_EAICombatMoveUnitType.GROUND_VEHICLE;
58 float currentTime_ms =
GetGame().GetWorld().GetWorldTime();
77 if (executedBehavior && !executedBehavior.m_bUseCombatMove)
99 AIControlComponent driverControlComp = AIControlComponent.Cast(driverEntity.
FindComponent(AIControlComponent));
101 if (!driverControlComp)
104 AIAgent driverAgent = driverControlComp.GetAIAgent();
109 m_DriverUtility = SCR_AIUtilityComponent.Cast(driverAgent.FindComponent(SCR_AIUtilityComponent));
137 vector turretLimitsHoriz_Rad, turretLimitsVert_Rad;
140 turretLimitsHoriz_Rad =
Vector(-180, 180, 0);
141 turretLimitsHoriz_Rad =
Math.DEG2RAD * turretLimitsHoriz_Rad;
142 turretLimitsVert_Rad =
Math.DEG2RAD * turretLimitsVert_Rad;
145 vector dirToTargetLocalXZ = targetPosLocal;
146 dirToTargetLocalXZ[1] = 0;
147 dirToTargetLocalXZ.Normalize();
148 float angleDirToTarget_Rad =
Math.Atan2(dirToTargetLocalXZ[0], 1.0);
151 vector safeTurretLimitsHoriz_Rad = 0.5 * turretLimitsHoriz_Rad;
152 return (angleDirToTarget_Rad > safeTurretLimitsHoriz_Rad[0]) && (angleDirToTarget_Rad < safeTurretLimitsHoriz_Rad[1]);
211 else if (!m_DriverState.IsExecutingRequest())
223 if (!m_WeaponManagerComponent)
227 m_WeaponManagerComponent.GetCurrentMuzzleTransform(mat);
228 vector muzzlePos = mat[3];
229 vector muzzleDir = mat[2].Normalized();
231 vector targetDir = (targetPos - muzzlePos).Normalized();
252 if (!m_DriverState.IsExecutingRequest())
261 return rq.m_eReason != SCR_EAICombatMoveReason.MOVE_FROM_TARGET;
269 rq.m_eReason = SCR_EAICombatMoveReason.MOVE_FROM_TARGET;
272 rq.m_eDirection = SCR_EAICombatMoveDirection.BACKWARD;
274 rq.m_bAimAtTarget =
false;
275 rq.m_bAimAtTargetEnd =
false;
287 rq.m_eReason = SCR_EAICombatMoveReason.STANDARD;
292 rq.m_bTryFindCover =
false;
293 rq.m_bUseCoverSearchDirectivity =
false;
294 rq.m_bCheckCoverVisibility =
false;
303 case EAIThreatState.THREATENED:
315 rq.m_bAimAtTarget =
false;
316 rq.m_bAimAtTargetEnd =
false;
317 rq.m_bFailIfNoCover =
false;
319 rq.m_fMoveDuration_s =
Math.RandomFloat(0.5, 1.0) * moveDurationMax;
324 rq.GetOnCompleted().Insert(OnMovementCompleted);
334 AIWaypoint wp = null;
335 AIAgent agent = m_DriverUtility.GetAIAgent();
336 AIGroup group = agent.GetParentGroup();
338 wp = group.GetCurrentWaypoint();
341 SCR_EAICombatMoveDirection eDirection;
346 eDirection = SCR_EAICombatMoveDirection.FORWARD;
351 vector wpPos = wp.GetOrigin();
352 float wpRadius = wp.GetCompletionRadius();
353 bool tgtInWaypoint =
vector.DistanceXZ(wpPos, targetPos) < wpRadius;
354 float myDistToWp =
vector.DistanceXZ(wpPos, m_MyEntity.GetOrigin());
356 if (myDistToWp > wpRadius)
360 eDirection = SCR_EAICombatMoveDirection.CUSTOM_POS;
362 else if (myDistToWp > 0.5 * wpRadius)
370 eDirection = SCR_EAICombatMoveDirection.FORWARD;
376 eDirection = SCR_EAICombatMoveDirection.ANYWHERE;
384 eDirection = SCR_EAICombatMoveDirection.FORWARD;
388 outMovePos = movePos;
389 outDirection = eDirection;
398 return m_Utility.m_CombatComponent.IsFriendlyInAim();
404 if (!m_DriverState.IsExecutingRequest())
413 return rq.m_eReason != SCR_EAICombatMoveReason.FF_AVOIDANCE;
421 rq.m_eReason = SCR_EAICombatMoveReason.FF_AVOIDANCE;
426 if (prevRequest && prevRequest.m_eReason == SCR_EAICombatMoveReason.FF_AVOIDANCE)
428 rq.m_eDirection = prevRequest.m_eDirection;
432 if (
Math.RandomIntInclusive(0, 1) == 1)
433 rq.m_eDirection = SCR_EAICombatMoveDirection.RIGHT;
435 rq.m_eDirection = SCR_EAICombatMoveDirection.LEFT;
440 rq.m_bAimAtTarget =
false;
441 rq.m_bAimAtTargetEnd =
false;
456 if (tgtEntity && m_CombatComp.IsTargetVisible(
m_Target))
461 vector eyePos = character.EyePosition();
467 pos = pos +
Vector(0, 2.0, 0);
473 lastSeenPos = lastSeenPos +
Vector(0, 1.8, 0);
485 case EAIThreatState.THREATENED:
505 if (m_DriverState.IsExecutingRequest())
514 return m_DriverState.m_fTimerStopped_s > stoppedWaitTime;
520 protected static float ResolveOptimalDistance(
float weaponMinDist)
522 return Math.Max(weaponMinDist + 5.0, 200);
527 protected static void OnMovementStarted(SCR_AIUtilityComponent utility,
SCR_AICombatMoveRequest_Move rq, vector pos,
bool destinationIsCover)
529 if (!utility.m_CommsHandler.CanBypass())
532 utility.m_CommsHandler.AddRequest(talkRq);
536 protected static void OnMovementCompleted(SCR_AIUtilityComponent utility, SCR_AICombatMoveRequestBase rq)
538 if (!utility.m_CommsHandler.CanBypass())
541 utility.m_CommsHandler.AddRequest(talkRq);
599 rq.m_eReason = SCR_EAICombatMoveReason.STANDARD;
602 rq.m_eDirection = SCR_EAICombatMoveDirection.FORWARD;
603 rq.m_fMoveDuration_s = 3;
604 rq.m_bAimAtTarget =
false;
605 rq.m_bAimAtTargetEnd =
false;
ArmaReforgerScripted GetGame()
enum SCR_EAIActivityCause m_Utility
void SCR_AIBehaviorBase(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity)
SCR_AICombatMoveLogicBase PORT_BASE_TARGET
Combat movement node for attack behavior, which is aimed at BaseTarget.
const float REVERSE_MOVE_DURATION_S
bool FFAvoidanceCondition()
float ResolveStoppedWaitTime(EAIThreatState threat)
const float MAX_MOVE_DURATION_TO_TARGET_THREATENED_S
void PushRequestMoveFromTarget()
override TStringArray GetVariablesIn()
void ResolveMoveRequestMovePosAndDir(vector targetPos, out vector outMovePos, out SCR_EAICombatMoveDirection outDirection)
const float MIN_ENGAGEMENT_DISTANCE_TO_TARGET_SQ
bool FFAvoidanceNewRequestCondition()
bool MoveFromTargetNewRequestCondition()
bool MoveToNextPosCondition()
bool MoveFromTargetCondition()
decides if we should move backwards from target
void PushRequestFFAvoidance()
vector ResolveRequestTargetPos()
EAIThreatState m_eThreatState
const float MAX_MOVE_DURATION_TO_TARGET_S
const float WEAPON_MIN_DIST
float GetTargetDistance()
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)
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
proto bool GetVariableIn(string name, out void val)
bool TargetOutsideLimitsNewRequestCondition()
bool TargetOutsideLimitsCondition()
static ref TStringArray s_aVarsIn
SCR_AISuppressionVolumeBase m_SuppressionVolume
override bool UpdateCombatMoveLogic()
static const string PORT_SUPPRESSION_VOLUME
override TStringArray GetVariablesIn()
void PushRequestRotateToTarget()
Base class for combat movement logic executed by turret operator of vehicle.
SCR_CompartmentAccessComponent m_CompartmentAccessComponent
bool TargetWithinTurretSafeHorizontalLimits(vector targetPos)
static override bool VisibleInPalette()
bool UpdateDriver(AIAgent owner)
BaseWeaponManagerComponent m_WeaponManagerComponent
SCR_AIUtilityComponent m_Utility
bool UpdateCombatMoveLogic()
Logic of the child class.
override void OnInit(AIAgent owner)
TurretComponent m_TurretComponent
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
void ApplyNewRequest(notnull SCR_AICombatMoveRequestBase rq)
Applies combat move request to driver's mind.
SCR_AICombatMoveState m_DriverState
SCR_AIUtilityComponent m_DriverUtility
float m_fUpdateInterval_ms
SCR_AICombatComponent m_CombatComp
ScriptInvokerBase< SCR_AICombatMoveRequest_Move_MovementEvent > GetOnMovementStarted(bool createInvoker=true)
enum EPhysicsLayerPresets Vehicle
SCR_FieldOfViewSettings Attribute
array< string > TStringArray
proto native vector Vector(float x, float y, float z)