DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
Bot_Attack.c
См. документацию.
1#ifdef ROBOCLIENT
2class BotAttack extends BotStateBase
3{
4 private const int m_InputsDelayLoop = 200;
5
6 private bool m_AimOverrideVertical = false;
7 private bool m_AimOverrideHorizontal = false;
8
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;
13
14 void BotAttack(Bot bot = NULL, BotStateBase parent = NULL)
15 {
16 }
17
18 private void ActivateInputs()
19 {
20#ifdef INPUT_OVERRIDE
21 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(UAFire, 1, OverrideInputType.HOLD, false);
22 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(UADefaultAction, 1, OverrideInputType.HOLD, false);
23#endif
24 }
25
26 private void DeactivateInputs()
27 {
28#ifdef INPUT_OVERRIDE
29 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAFire);
30 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UADefaultAction);
31#endif
32 }
33
34 private void CallDeactivateInputs()
35 {
36 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(DeactivateInputs, m_InputsDelayLoop, true);
37 }
38
39 private void RemoveHorizontalAim(bool Force = false)
40 {
41 if (!m_AimOverrideHorizontal && !Force)
42 return;
43
44#ifdef INPUT_OVERRIDE
45 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAAimLeft);
46 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAAimRight);
47#endif
48 m_AimOverrideHorizontal = false;
49 }
50
51 private void RemoveVerticalAim(bool Force = false)
52 {
53 if (!m_AimOverrideVertical && !Force)
54 return;
55
56#ifdef INPUT_OVERRIDE
57 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAAimUp);
58 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UAAimDown);
59#endif
60 m_AimOverrideVertical = false;
61 }
62
63 private void HandleHorizontalAim()
64 {
65 bool hasTarget = m_Bot.m_Target && m_Bot.m_Target.IsAlive();
66 if (!hasTarget)
67 {
68 RemoveHorizontalAim();
69 return;
70 }
71
72 vector direction = vector.Direction(m_Owner.GetPosition(), m_Bot.m_Target.GetPosition());
73 direction[1] = 0;
74 direction.Normalize();
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)
77 {
78 RemoveHorizontalAim();
79 return;
80 }
81
82 int turnDirection = 1;
83 if (angle > 0)
84 turnDirection = -1;
85
86 float slowDown = 1;
87 if (Math.AbsFloat(angle) < 15)
88 slowDown = Math.AbsFloat(angle) / 15;
89 slowDown = Math.Clamp(slowDown, 0.2, 1);
90
91 int overrideInput = UAAimRight;
92 int removeOverrideInput = UAAimLeft;
93 if (turnDirection < 0)
94 {
95 overrideInput = UAAimLeft;
96 removeOverrideInput = UAAimRight;
97 }
98
99#ifdef INPUT_OVERRIDE
100 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(removeOverrideInput);
101 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(overrideInput, m_HorizontalTurnRate * slowDown, OverrideInputType.HOLD, false);
102#endif
103 m_AimOverrideHorizontal = true;
104 }
105
106 private void HandleVerticalAim()
107 {
108 if (!m_Bot.m_Target || !m_Bot.m_Target.IsAlive())
109 return;
110
111 vector cameraPos, cameraDir, cameraRot;
112 g_Game.GetPlayer().GetCurrentCameraTransform(cameraPos, cameraDir, cameraRot);
113
114 vector cameraPos2D = cameraPos;
115 cameraPos2D[1] = 0;
116
117 vector targetPos2D = m_Bot.m_Target.GetPosition();
118 targetPos2D[1] = 0;
119
120 float distToTarget = vector.DistanceSq(cameraPos2D, targetPos2D);
121
122 //Target is too far/ran away
123 if (distToTarget > 4)
124 {
125 RemoveVerticalAim();
126 return;
127 }
128
129 vector minTarget, maxTarget;
130 m_Bot.m_Target.GetPhysics().GetGeomWorldBounds(0, minTarget, maxTarget);
131
132 //Distance from camera aim to target x/z
133 float distAimToTarget = distToTarget / Math.Cos(g_Game.GetPlayer().GetCurrentCamera().GetCurrentPitch() * Math.DEG2RAD);
134
135 vector cameraAimTargetPoint = distAimToTarget * cameraDir + cameraPos;
136
137 //difference between camera aim y and target head
138 float heightDiff = cameraAimTargetPoint[1] - maxTarget[1];
139
140 if (0 < heightDiff && heightDiff < 0.15)
141 {
142 RemoveVerticalAim();
143 return;
144 }
145
146 int overrideInput = UAAimUp;
147 int removeOverrideInput = UAAimDown;
148 float turnDirection = 1;
149
150 if (heightDiff >= 0.15)
151 {
152 overrideInput = UAAimDown;
153 removeOverrideInput = UAAimUp;
154 turnDirection = -1;
155 }
156
157#ifdef INPUT_OVERRIDE
158 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(removeOverrideInput);
159 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(overrideInput, m_VerticalTurnRate, OverrideInputType.HOLD, false);
160#endif
161 m_AimOverrideVertical = true;
162 }
163
164 private void HandleAim()
165 {
166 HandleVerticalAim();
167 HandleHorizontalAim();
168 return;
169 }
170
171 override void OnEntry (BotEventBase e)
172 {
173 super.OnEntry(e);
174
175 m_InitialCheckTimeElapsed = 0;
176 m_AimOverrideVertical = false;
177 m_AimOverrideHorizontal = false;
178
179#ifdef INPUT_OVERRIDE
180 g_Game.GetPlayer().GetInputInterface().SyncedOverride_ID(UATempRaiseWeapon, 1, OverrideInputType.CLICK, false);
181#endif
182
183 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ActivateInputs, m_InputsDelayLoop, true);
184 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(CallDeactivateInputs, m_InputsDelayLoop - 100, false);
185 }
186
187 override void OnExit (BotEventBase e)
188 {
189 super.OnExit(e);
190
191 if (m_Bot.m_Target && !m_Bot.m_Target.IsAlive())
192 m_Bot.m_Target = null;
193
194#ifdef INPUT_OVERRIDE
195 g_Game.GetPlayer().GetInputInterface().SyncedRemoveOverride_ID(UATempRaiseWeapon);
196#endif
197
198 RemoveHorizontalAim(true);
199 RemoveVerticalAim(true);
200 DeactivateInputs();
201
202 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ActivateInputs);
203 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(DeactivateInputs);
204 }
205
206 override void OnUpdate (float dt)
207 {
208 super.OnUpdate(dt);
209
210 HandleAim();
211 m_InitialCheckTimeElapsed += dt;
212
213 if (!m_Owner.GetMeleeCombat().GetTargetEntity() && m_InitialCheckTimeElapsed > m_InitialCheckTime)
214 {
215 m_InitialCheckTimeElapsed = 0;
216 m_Bot.CheckForEnemies(true);
217 }
218 }
219}
220#endif
DayZGame g_Game
Определения DayZGame.c:4074
HandStateEquipped OnEntry
Определения WeaponChambering.c:292
enum ProcessDirectDamageFlags m_Owner
class WeaponChambering_Chamber_OnEntry extends WeaponChambering_Base OnExit
Определения WeaponChambering.c:352
override void OnEntry(HandEventBase e)
Определения Hand_States.c:34
override void OnExit(WeaponEventBase e)
Определения WeaponChambering.c:439
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.
proto native void OnUpdate()
Определения 3_Game/DayZ/tools/tools.c:349
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8