2class BotAttack
extends BotStateBase
4 private const int m_InputsDelayLoop = 200;
6 private bool m_AimOverrideVertical =
false;
7 private bool m_AimOverrideHorizontal =
false;
9 private const float m_HorizontalTurnRate = 0.5;
10 private const float m_VerticalTurnRate = 0.25;
11 private const float m_InitialCheckTime = 1;
12 private float m_InitialCheckTimeElapsed = 0;
14 void BotAttack(Bot bot = NULL, BotStateBase parent = NULL)
18 private void ActivateInputs()
21 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(UAFire, 1, OverrideInputType.HOLD,
false);
22 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(UADefaultAction, 1, OverrideInputType.HOLD,
false);
26 private void DeactivateInputs()
29 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAFire);
30 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UADefaultAction);
34 private void CallDeactivateInputs()
39 private void RemoveHorizontalAim(
bool Force =
false)
41 if (!m_AimOverrideHorizontal && !Force)
45 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAAimLeft);
46 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAAimRight);
48 m_AimOverrideHorizontal =
false;
51 private void RemoveVerticalAim(
bool Force =
false)
53 if (!m_AimOverrideVertical && !Force)
57 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAAimUp);
58 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAAimDown);
60 m_AimOverrideVertical =
false;
63 private void HandleHorizontalAim()
65 bool hasTarget = m_Bot.m_Target && m_Bot.m_Target.IsAlive();
68 RemoveHorizontalAim();
72 vector direction = vector.Direction(
m_Owner.GetPosition(), m_Bot.m_Target.GetPosition());
75 float angle = Math.RAD2DEG * Math.Atan2(
m_Owner.GetDirection()[0] * direction[2] -
m_Owner.GetDirection()[2] * direction[0], vector.Dot(
m_Owner.GetDirection(), direction));
76 if (Math.AbsFloat(angle) < 3)
78 RemoveHorizontalAim();
82 int turnDirection = 1;
87 if (Math.AbsFloat(angle) < 15)
88 slowDown = Math.AbsFloat(angle) / 15;
89 slowDown = Math.Clamp(slowDown, 0.2, 1);
91 int overrideInput = UAAimRight;
92 int removeOverrideInput = UAAimLeft;
93 if (turnDirection < 0)
95 overrideInput = UAAimLeft;
96 removeOverrideInput = UAAimRight;
100 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(removeOverrideInput);
101 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(overrideInput, m_HorizontalTurnRate * slowDown, OverrideInputType.HOLD,
false);
103 m_AimOverrideHorizontal =
true;
106 private void HandleVerticalAim()
108 if (!m_Bot.m_Target || !m_Bot.m_Target.IsAlive())
111 vector cameraPos, cameraDir, cameraRot;
112 g_Game.GetPlayer().GetCurrentCameraTransform(cameraPos, cameraDir, cameraRot);
114 vector cameraPos2D = cameraPos;
117 vector targetPos2D = m_Bot.m_Target.GetPosition();
120 float distToTarget = vector.
DistanceSq(cameraPos2D, targetPos2D);
123 if (distToTarget > 4)
129 vector minTarget, maxTarget;
130 m_Bot.m_Target.GetPhysics().GetGeomWorldBounds(0, minTarget, maxTarget);
133 float distAimToTarget = distToTarget / Math.Cos(
g_Game.GetPlayer().GetCurrentCamera().GetCurrentPitch() * Math.DEG2RAD);
135 vector cameraAimTargetPoint = distAimToTarget * cameraDir + cameraPos;
138 float heightDiff = cameraAimTargetPoint[1] - maxTarget[1];
140 if (0 < heightDiff && heightDiff < 0.15)
146 int overrideInput = UAAimUp;
147 int removeOverrideInput = UAAimDown;
148 float turnDirection = 1;
150 if (heightDiff >= 0.15)
152 overrideInput = UAAimDown;
153 removeOverrideInput = UAAimUp;
158 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(removeOverrideInput);
159 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(overrideInput, m_VerticalTurnRate, OverrideInputType.HOLD,
false);
161 m_AimOverrideVertical =
true;
164 private void HandleAim()
167 HandleHorizontalAim();
171 override void OnEntry (BotEventBase e)
175 m_InitialCheckTimeElapsed = 0;
176 m_AimOverrideVertical =
false;
177 m_AimOverrideHorizontal =
false;
180 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(UATempRaiseWeapon, 1, OverrideInputType.CLICK,
false);
187 override void OnExit (BotEventBase e)
191 if (m_Bot.m_Target && !m_Bot.m_Target.IsAlive())
192 m_Bot.m_Target = null;
195 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UATempRaiseWeapon);
198 RemoveHorizontalAim(
true);
199 RemoveVerticalAim(
true);
211 m_InitialCheckTimeElapsed += dt;
213 if (!
m_Owner.GetMeleeCombat().GetTargetEntity() && m_InitialCheckTimeElapsed > m_InitialCheckTime)
215 m_InitialCheckTimeElapsed = 0;
216 m_Bot.CheckForEnemies(
true);
HandStateEquipped OnEntry
enum ProcessDirectDamageFlags m_Owner
class WeaponChambering_Chamber_OnEntry extends WeaponChambering_Base OnExit
override void OnEntry(HandEventBase e)
override void OnExit(WeaponEventBase e)
static proto native float DistanceSq(vector v1, vector v2)
Returns the square distance between tips of two 3D vectors.
proto float Normalize()
Normalizes vector. Returns length.