TrinityCore
Loading...
Searching...
No Matches
hyjal_trash.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "ScriptMgr.h"
19#include "hyjal.h"
20#include "hyjal_trash.h"
21#include "hyjalAI.h"
22#include "InstanceScript.h"
23#include "MotionMaster.h"
24#include "ObjectAccessor.h"
25#include "TemporarySummon.h"
26
49
55
56float HordeWPs[8][3]=//basic waypoints from spawn to leader
57{
58 {5492.91f, -2404.61f, 1462.63f},
59 {5531.76f, -2460.87f, 1469.55f},
60 {5554.58f, -2514.66f, 1476.12f},
61 {5554.16f, -2567.23f, 1479.90f},
62 {5540.67f, -2625.99f, 1480.89f},
63 {5508.16f, -2659.20f, 1480.15f}, //random rush starts from here
64 {5489.62f, -2704.05f, 1482.18f},
65 {5457.04f, -2726.26f, 1485.10f}
66};
67float AllianceWPs[8][3]=//basic waypoints from spawn to leader
68{
69 {4896.08f, -1576.35f, 1333.65f},
70 {4898.68f, -1615.02f, 1329.48f},
71 {4907.12f, -1667.08f, 1321.00f},
72 {4963.18f, -1699.35f, 1340.51f},
73 {4989.16f, -1716.67f, 1335.74f}, //first WP in the base, after the gate
74 {5026.27f, -1736.89f, 1323.02f},
75 {5037.77f, -1770.56f, 1324.36f},
76 {5067.23f, -1789.95f, 1321.17f}
77};
78
79float FrostWyrmWPs[3][3]=//waypoints for the frost wyrms in horde base
80{
81 {5580.82f, -2628.83f, 1528.28f},
82 {5550.90f, -2667.16f, 1505.45f},
83 {5459.64f, -2725.91f, 1484.83f}
84};
85
86float GargoyleWPs[3][3]=//waypoints for the gargoyles in horde base
87{
88 {5533.66f, -2634.32f, 1495.33f},
89 {5517.88f, -2712.05f, 1490.54f},
90 {5459.64f, -2725.91f, 1484.83f}
91};
92
93float FlyPathWPs[3][3]=//waypoints for the gargoyls and frost wyrms in horde base in wave 1/3
94{
95 {5531.96f, -2772.83f, 1516.68f},
96 {5498.32f, -2734.84f, 1497.01f},
97 {5456.67f, -2725.48f, 1493.08f}
98};
99
100float AllianceOverrunWP[55][3]=//waypoints in the alliance base used in the end in the cleaning wave
101{
102 {4976.37f, -1708.02f, 1339.43f}, //0spawn
103 {4994.83f, -1725.52f, 1333.25f}, //1 start
104 {4982.92f, -1753.7f, 1330.69f}, //2 end
105 {4996.75f, -1721.47f, 1332.95f}, //3 start
106 {5015.74f, -1755.05f, 1322.49f}, //4
107 {4998.68f, -1773.44f, 1329.59f}, //5
108 {4994.83f, -1725.52f, 1333.25f}, //6 start
109 {5022.8f, -1735.46f, 1323.53f}, //7
110 {5052.15f, -1729.02f, 1320.88f}, //8
111 {5082.43f, -1726.29f, 1327.87f}, //9
112 {4994.83f, -1725.52f, 1333.25f}, //10 start
113 {5018.92f, -1751.14f, 1322.19f}, //11
114 {5040.09f, -1792.09f, 1322.1f}, //12
115 {4994.83f, -1725.52f, 1333.25f}, //13 start
116 {5023.47f, -1748.1f, 1322.51f}, //14
117 {5013.43f, -1842.39f, 1322.07f}, //15
118 {4994.83f, -1725.52f, 1333.25f}, //16 start
119 {5020.8f, -1756.86f, 1322.2f}, //17
120 {5019.53f, -1824.6f, 1321.96f}, //18
121 {5043.42f, -1853.75f, 1324.52f}, //19
122 {5053.02f, -1864.13f, 1330.36f}, //20
123 {5062.49f, -1852.47f, 1330.49f}, //21
124 {5015.27f, -1738.77f, 1324.83f}, //35//start 22
125 {5027.97f, -1775.25f, 1321.87f}, //34 23
126 {5015.94f, -1821.24f, 1321.86f}, //33 24
127 {4983.25f, -1857.4f, 1320.48f}, //32 25
128 {4981.51f, -1883.7f, 1322.34f}, //31 26
129 {5002.33f, -1893.98f, 1325.88f}, //30 27
130 {5049.32f, -1886.54f, 1331.69f}, //29 28
131 {5089.68f, -1846.88f, 1328.99f}, //28 29
132 {5127.90f, -1825.14f, 1335.58f}, //27 30
133 {5163.27f, -1789.08f, 1337.04f}, //26 31
134 {5138.97f, -1755.88f, 1334.57f}, //25 32
135 {5096.63f, -1742.22f, 1329.61f}, //24 33
136 {5065.81f, -1729.43f, 1325.66f}, //23 34
137 {5049.32f, -1726.31f, 1320.64f}, //22 start
138 {5081.07f, -1902.10f, 1346.36f}, //36 abo start
139 {5107.65f, -1912.03f, 1356.49f}, //37
140 {5132.83f, -1927.07f, 1362.42f}, //38
141 {5147.78f, -1954.41f, 1365.98f}, //39
142 {5164.96f, -1966.48f, 1367.04f}, //40
143 {5189.04f, -1961.06f, 1367.90f}, //41
144 {5212.27f, -1975.30f, 1365.58f}, //42
145 {5221.82f, -1994.18f, 1364.97f}, //43 end1
146 {5202.23f, -1994.94f, 1367.59f}, //44 end2
147 {5279.94f, -2049.68f, 1311.38f}, //45 garg1
148 {5289.15f, -2219.06f, 1291.12f}, //46 garg2
149 {5202.07f, -2136.10f, 1305.07f}, //47 garg3
150 {5071.52f, -2425.63f, 1454.48f}, //48 garg4
151 {5120.65f, -2467.92f, 1463.93f}, //49 garg5
152 {5283.04f, -2043.26f, 1300.11f}, //50 garg target1
153 {5313.22f, -2207.60f, 1290.06f}, //51 garg target2
154 {5180.41f, -2121.87f, 1292.62f}, //52 garg target3
155 {5088.68f, -2432.04f, 1441.73f}, //53 garg target4
156 {5111.26f, -2454.73f, 1449.63f}//54 garg target5
157
158};
159
160float HordeOverrunWP[21][3]=//waypoints in the horde base used in the end in the cleaning wave
161{
162 {5490.72f, -2702.94f, 1482.14f}, //0 start
163 {5469.77f, -2741.34f, 1486.95f},
164 {5439.47f, -2771.02f, 1494.59f},
165 {5408.85f, -2811.92f, 1505.68f},
166 {5423.87f, -2857.80f, 1515.55f},
167 {5428.19f, -2898.15f, 1524.61f},
168 {5394.59f, -2930.05f, 1528.23f},
169 {5351.11f, -2935.80f, 1532.24f},
170 {5312.37f, -2959.06f, 1536.21f},
171 {5264.93f, -2989.80f, 1545.70f},
172 {5256.63f, -3056.16f, 1559.24f},
173 {5267.32f, -3119.55f, 1575.36f},
174 {5305.61f, -3139.88f, 1586.38f},
175 {5330.56f, -3135.37f, 1588.58f},
176 {5365.87f, -3139.78f, 1583.96f},
177 {5389.39f, -3163.57f, 1582.57f}, //15 end
178 {5500.86f, -2669.89f, 1481.04f}, //16 start
179 {5472.08f, -2715.14f, 1483.55f},
180 {5450.11f, -2721.47f, 1485.61f},
181 {5433.25f, -2712.93f, 1493.02f}, //19 end 1
182 {5429.91f, -2718.44f, 1493.42f}//20 end 2
183};
184
186{
187 instance = creature->GetInstanceScript();
188 IsEvent = false;
189 Delay = 0;
190 LastOverronPos = 0;
191 IsOverrun = false;
192 OverrunType = 0;
193 SetupOverrun = false;
194 faction = 0;
195 useFlyPath = false;
196 damageTaken = 0;
197 memset(DummyTarget, 0, sizeof(DummyTarget));
198 Reset();
199}
200
201void hyjal_trashAI::DamageTaken(Unit* done_by, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/)
202{
203 if (!done_by || done_by->GetTypeId() == TYPEID_PLAYER || done_by->IsPet())
204 {
205 damageTaken += damage;
206 instance->SetData(DATA_RAIDDAMAGE, damage);//store raid's damage
207 }
208}
209
211{
212 if (IsOverrun && !SetupOverrun)
213 {
214 SetupOverrun = true;
215 if (faction == 0)
216 {
217 if (me->GetEntry() == GARGOYLE)
218 {
219 DummyTarget[0] = AllianceOverrunWP[50+OverrunType][0]; //+OverrunType 0 - 4
222 }
223 if (me->GetEntry() == ABOMINATION)
224 {
225 for (uint8 i = 0; i < 4; ++i)
226 AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]);
227 switch (OverrunType)
228 {
229 case 0:
230 AddWaypoint(4, AllianceOverrunWP[22][0]+irand(-3, 3), AllianceOverrunWP[22][1]+irand(-3, 3), AllianceOverrunWP[22][2], true);
231 AddWaypoint(5, AllianceOverrunWP[23][0]+irand(-3, 3), AllianceOverrunWP[23][1]+irand(-3, 3), AllianceOverrunWP[23][2], true);
232 AddWaypoint(6, AllianceOverrunWP[24][0]+irand(-3, 3), AllianceOverrunWP[24][1]+irand(-3, 3), AllianceOverrunWP[24][2], true);
233 AddWaypoint(7, AllianceOverrunWP[25][0]+irand(-3, 3), AllianceOverrunWP[25][1]+irand(-3, 3), AllianceOverrunWP[25][2], true);
234 AddWaypoint(8, AllianceOverrunWP[26][0]+irand(-3, 3), AllianceOverrunWP[26][1]+irand(-3, 3), AllianceOverrunWP[26][2], true);
235 AddWaypoint(9, AllianceOverrunWP[27][0]+irand(-3, 3), AllianceOverrunWP[27][1]+irand(-3, 3), AllianceOverrunWP[27][2], true);
236 AddWaypoint(10, AllianceOverrunWP[28][0]+irand(-3, 3), AllianceOverrunWP[28][1]+irand(-3, 3), AllianceOverrunWP[28][2], true);
237
238 AddWaypoint(11, AllianceOverrunWP[36][0]+irand(-3, 3), AllianceOverrunWP[36][1]+irand(-3, 3), AllianceOverrunWP[36][2], true);
239 AddWaypoint(12, AllianceOverrunWP[37][0]+irand(-3, 3), AllianceOverrunWP[37][1]+irand(-3, 3), AllianceOverrunWP[37][2], true);
240 AddWaypoint(13, AllianceOverrunWP[38][0]+irand(-3, 3), AllianceOverrunWP[38][1]+irand(-3, 3), AllianceOverrunWP[38][2], true);
241 AddWaypoint(14, AllianceOverrunWP[39][0]+irand(-3, 3), AllianceOverrunWP[39][1]+irand(-3, 3), AllianceOverrunWP[39][2], true);
242 AddWaypoint(15, AllianceOverrunWP[40][0]+irand(-3, 3), AllianceOverrunWP[40][1]+irand(-3, 3), AllianceOverrunWP[40][2], true);
243 AddWaypoint(16, AllianceOverrunWP[41][0]+irand(-3, 3), AllianceOverrunWP[41][1]+irand(-3, 3), AllianceOverrunWP[41][2], true);
244 AddWaypoint(17, AllianceOverrunWP[42][0]+irand(-3, 3), AllianceOverrunWP[42][1]+irand(-3, 3), AllianceOverrunWP[42][2], true);
245 AddWaypoint(18, AllianceOverrunWP[43][0]+irand(-3, 3), AllianceOverrunWP[43][1]+irand(-3, 3), AllianceOverrunWP[43][2], true);
246 me->SetHomePosition(AllianceOverrunWP[43][0]+irand(-3, 3), AllianceOverrunWP[43][1]+irand(-3, 3), AllianceOverrunWP[43][2], 0);
247 SetDespawnAtEnd(false);
248 LastOverronPos = 18;
249 Start(true);
250 break;
251 case 1:
252 AddWaypoint(4, AllianceOverrunWP[22][0]+irand(-3, 3), AllianceOverrunWP[22][1]+irand(-3, 3), AllianceOverrunWP[22][2], true);
253 AddWaypoint(5, AllianceOverrunWP[23][0]+irand(-3, 3), AllianceOverrunWP[23][1]+irand(-3, 3), AllianceOverrunWP[23][2], true);
254 AddWaypoint(6, AllianceOverrunWP[24][0]+irand(-3, 3), AllianceOverrunWP[24][1]+irand(-3, 3), AllianceOverrunWP[24][2], true);
255 AddWaypoint(7, AllianceOverrunWP[25][0]+irand(-3, 3), AllianceOverrunWP[25][1]+irand(-3, 3), AllianceOverrunWP[25][2], true);
256 AddWaypoint(8, AllianceOverrunWP[26][0]+irand(-3, 3), AllianceOverrunWP[26][1]+irand(-3, 3), AllianceOverrunWP[26][2], true);
257 AddWaypoint(9, AllianceOverrunWP[27][0]+irand(-3, 3), AllianceOverrunWP[27][1]+irand(-3, 3), AllianceOverrunWP[27][2], true);
258 AddWaypoint(10, AllianceOverrunWP[28][0]+irand(-3, 3), AllianceOverrunWP[28][1]+irand(-3, 3), AllianceOverrunWP[28][2], true);
259
260 AddWaypoint(11, AllianceOverrunWP[36][0]+irand(-3, 3), AllianceOverrunWP[36][1]+irand(-3, 3), AllianceOverrunWP[36][2], true);
261 AddWaypoint(12, AllianceOverrunWP[37][0]+irand(-3, 3), AllianceOverrunWP[37][1]+irand(-3, 3), AllianceOverrunWP[37][2], true);
262 AddWaypoint(13, AllianceOverrunWP[38][0]+irand(-3, 3), AllianceOverrunWP[38][1]+irand(-3, 3), AllianceOverrunWP[38][2], true);
263 AddWaypoint(14, AllianceOverrunWP[39][0]+irand(-3, 3), AllianceOverrunWP[39][1]+irand(-3, 3), AllianceOverrunWP[39][2], true);
264 AddWaypoint(15, AllianceOverrunWP[40][0]+irand(-3, 3), AllianceOverrunWP[40][1]+irand(-3, 3), AllianceOverrunWP[40][2], true);
265 AddWaypoint(16, AllianceOverrunWP[41][0]+irand(-3, 3), AllianceOverrunWP[41][1]+irand(-3, 3), AllianceOverrunWP[41][2], true);
266 AddWaypoint(17, AllianceOverrunWP[42][0]+irand(-3, 3), AllianceOverrunWP[42][1]+irand(-3, 3), AllianceOverrunWP[42][2], true);
267 AddWaypoint(18, AllianceOverrunWP[44][0]+irand(-3, 3), AllianceOverrunWP[44][1]+irand(-3, 3), AllianceOverrunWP[44][2], true);
268 me->SetHomePosition(AllianceOverrunWP[44][0]+irand(-3, 3), AllianceOverrunWP[44][1]+irand(-3, 3), AllianceOverrunWP[44][2], 0);
269 SetDespawnAtEnd(false);
270 LastOverronPos = 18;
271 Start(true);
272 break;
273 default:
274 for (uint8 i = 22; i < 36; ++i)
275 AddWaypoint(i-18, AllianceOverrunWP[i][0]+irand(-3, 3), AllianceOverrunWP[i][1]+irand(-3, 3), AllianceOverrunWP[i][2], true);
276
277 SetDespawnAtEnd(true);
278 LastOverronPos = 17;
279 Start(true);
280 break;
281 }
282 }
283 if (me->GetEntry() == GHOUL)
284 {
285 for (uint8 i = 0; i < 4; ++i)
286 AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]);
287 switch (OverrunType)
288 {
289 case 0:
290 AddWaypoint(4, AllianceOverrunWP[1][0]+irand(-3, 3), AllianceOverrunWP[1][1]+irand(-3, 3), AllianceOverrunWP[1][2], true);
291 AddWaypoint(5, AllianceOverrunWP[2][0]+irand(-3, 3), AllianceOverrunWP[2][1]+irand(-3, 3), AllianceOverrunWP[2][2], true);
293 SetDespawnAtEnd(false);
294 LastOverronPos = 5;
295 Start(true);
296 break;
297 case 1:
298 AddWaypoint(4, AllianceOverrunWP[3][0]+irand(-3, 3), AllianceOverrunWP[3][1]+irand(-3, 3), AllianceOverrunWP[3][2], true);
299 AddWaypoint(5, AllianceOverrunWP[4][0]+irand(-3, 3), AllianceOverrunWP[4][1]+irand(-3, 3), AllianceOverrunWP[4][2], true);
300 AddWaypoint(6, AllianceOverrunWP[5][0]+irand(-3, 3), AllianceOverrunWP[5][1]+irand(-3, 3), AllianceOverrunWP[5][2], true);
302 SetDespawnAtEnd(false);
303 LastOverronPos = 6;
304 Start(true);
305 break;
306 case 2:
307 AddWaypoint(4, AllianceOverrunWP[6][0]+irand(-3, 3), AllianceOverrunWP[6][1]+irand(-3, 3), AllianceOverrunWP[6][2], true);
308 AddWaypoint(5, AllianceOverrunWP[7][0]+irand(-3, 3), AllianceOverrunWP[7][1]+irand(-3, 3), AllianceOverrunWP[7][2], true);
309 AddWaypoint(6, AllianceOverrunWP[8][0]+irand(-3, 3), AllianceOverrunWP[8][1]+irand(-3, 3), AllianceOverrunWP[8][2], true);
310 AddWaypoint(7, AllianceOverrunWP[9][0]+irand(-3, 3), AllianceOverrunWP[9][1]+irand(-3, 3), AllianceOverrunWP[9][2], true);
312 SetDespawnAtEnd(false);
313 LastOverronPos = 7;
314 Start(true);
315 break;
316 case 3:
317 AddWaypoint(4, AllianceOverrunWP[10][0]+irand(-3, 3), AllianceOverrunWP[10][1]+irand(-3, 3), AllianceOverrunWP[10][2], true);
318 AddWaypoint(5, AllianceOverrunWP[11][0]+irand(-3, 3), AllianceOverrunWP[11][1]+irand(-3, 3), AllianceOverrunWP[11][2], true);
319 AddWaypoint(6, AllianceOverrunWP[12][0]+irand(-3, 3), AllianceOverrunWP[12][1]+irand(-3, 3), AllianceOverrunWP[12][2], true);
320 me->SetHomePosition(AllianceOverrunWP[12][0]+irand(-3, 3), AllianceOverrunWP[12][1]+irand(-3, 3), AllianceOverrunWP[12][2], 0);
321 SetDespawnAtEnd(false);
322 LastOverronPos = 6;
323 Start(true);
324 break;
325 case 4:
326 AddWaypoint(4, AllianceOverrunWP[13][0]+irand(-3, 3), AllianceOverrunWP[13][1]+irand(-3, 3), AllianceOverrunWP[13][2], true);
327 AddWaypoint(5, AllianceOverrunWP[14][0]+irand(-3, 3), AllianceOverrunWP[14][1]+irand(-3, 3), AllianceOverrunWP[14][2], true);
328 AddWaypoint(6, AllianceOverrunWP[15][0]+irand(-3, 3), AllianceOverrunWP[15][1]+irand(-3, 3), AllianceOverrunWP[15][2], true);
329 me->SetHomePosition(AllianceOverrunWP[15][0]+irand(-3, 3), AllianceOverrunWP[15][1]+irand(-3, 3), AllianceOverrunWP[15][2], 0);
330 SetDespawnAtEnd(false);
331 LastOverronPos = 6;
332 Start(true);
333 break;
334 case 5:
335 AddWaypoint(4, AllianceOverrunWP[16][0]+irand(-3, 3), AllianceOverrunWP[16][1]+irand(-3, 3), AllianceOverrunWP[16][2], true);
336 AddWaypoint(5, AllianceOverrunWP[17][0]+irand(-3, 3), AllianceOverrunWP[17][1]+irand(-3, 3), AllianceOverrunWP[17][2], true);
337 AddWaypoint(6, AllianceOverrunWP[18][0]+irand(-3, 3), AllianceOverrunWP[18][1]+irand(-3, 3), AllianceOverrunWP[18][2], true);
338 AddWaypoint(7, AllianceOverrunWP[19][0]+irand(-3, 3), AllianceOverrunWP[19][1]+irand(-3, 3), AllianceOverrunWP[19][2], true);
339 AddWaypoint(8, AllianceOverrunWP[20][0]+irand(-3, 3), AllianceOverrunWP[20][1]+irand(-3, 3), AllianceOverrunWP[20][2], true);
340 AddWaypoint(9, AllianceOverrunWP[21][0]+irand(-3, 3), AllianceOverrunWP[21][1]+irand(-3, 3), AllianceOverrunWP[21][2], true);
341 me->SetHomePosition(AllianceOverrunWP[21][0]+irand(-3, 3), AllianceOverrunWP[21][1]+irand(-3, 3), AllianceOverrunWP[21][2], 0);
342 SetDespawnAtEnd(false);
343 LastOverronPos = 9;
344 Start(true);
345 break;
346 default:
347 for (uint8 i = 22; i < 36; ++i)
348 AddWaypoint(i-18, AllianceOverrunWP[i][0]+irand(-3, 3), AllianceOverrunWP[i][1]+irand(-3, 3), AllianceOverrunWP[i][2], true);
349 SetDespawnAtEnd(true);
350 LastOverronPos = 17;
351 Start(true);
352 break;
353 }
354 }
355 }
356 if (faction == 1)
357 {
358 if (me->GetEntry() == GHOUL)
359 {
360 for (uint8 i = 0; i < 6; ++i)
361 AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]);
362 switch (OverrunType)
363 {
364 case 0:
365 AddWaypoint(5, HordeOverrunWP[16][0]+irand(-10, 10), HordeOverrunWP[16][1]+irand(-10, 10), HordeOverrunWP[16][2], true);
366 AddWaypoint(6, HordeOverrunWP[17][0]+irand(-10, 10), HordeOverrunWP[17][1]+irand(-10, 10), HordeOverrunWP[17][2], true);
367 AddWaypoint(7, HordeOverrunWP[18][0], HordeOverrunWP[18][1], HordeOverrunWP[18][2], true);
368 AddWaypoint(8, HordeOverrunWP[19][0], HordeOverrunWP[19][1], HordeOverrunWP[19][2], true);
370 SetDespawnAtEnd(false);
371 LastOverronPos = 8;
372 Start(true);
373 break;
374 case 1:
375 AddWaypoint(5, HordeOverrunWP[16][0]+irand(-10, 10), HordeOverrunWP[16][1]+irand(-10, 10), HordeOverrunWP[16][2], true);
376 AddWaypoint(6, HordeOverrunWP[17][0]+irand(-10, 10), HordeOverrunWP[17][1]+irand(-10, 10), HordeOverrunWP[17][2], true);
377 AddWaypoint(7, HordeOverrunWP[18][0], HordeOverrunWP[18][1], HordeOverrunWP[18][2], true);
378 AddWaypoint(8, HordeOverrunWP[20][0], HordeOverrunWP[20][1], HordeOverrunWP[20][2], true);
380 SetDespawnAtEnd(false);
381 LastOverronPos = 8;
382 Start(true);
383 break;
384 default:
385 for (uint8 i = 0; i < 16; ++i)
386 AddWaypoint(i+6, HordeOverrunWP[i][0]+irand(-10, 10), HordeOverrunWP[i][1]+irand(-10, 10), HordeOverrunWP[i][2], true);
387 SetDespawnAtEnd(true);
388 LastOverronPos = 21;
389 Start(true);
390 break;
391 }
392 }
393 if (me->GetEntry() == ABOMINATION)
394 {
395 for (uint8 i = 0; i < 6; ++i)
396 AddWaypoint(i, HordeWPs[i][0]+irand(-10, 10), HordeWPs[i][1]+irand(-10, 10), HordeWPs[i][2], true);
397 for (uint8 i = 0; i < 16; ++i)
398 AddWaypoint(i+6, HordeOverrunWP[i][0]+irand(-10, 10), HordeOverrunWP[i][1]+irand(-10, 10), HordeOverrunWP[i][2], true);
399 SetDespawnAtEnd(true);
400 LastOverronPos = 21;
401 Start(true);
402 }
403 }
404 }
405}
406
408{
409 if (IsEvent && !me->isWorldBoss())
410 instance->SetData(DATA_TRASH, 0);//signal trash is dead
411
414}
415
417{
418public:
419 npc_giant_infernal() : CreatureScript("npc_giant_infernal") { }
420
422 {
424 {
425 instance = creature->GetInstanceScript();
426 meteor = false;//call once!
427 CanMove = false;
428 Delay = rand32() % 30000;
432 go = false;
433 Initialize();
434 }
435
437 {
438 spawnTimer = 2000;
439 FlameBuffetTimer = 2000;
440 imol = false;
441 }
442
443 bool meteor;
445 bool go;
448 bool imol;
449
450 void Reset() override
451 {
452 Initialize();
453 }
454
455 void JustEngagedWith(Unit* /*who*/) override { }
456
457 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
458 {
459 if (waypointId == 0 && !IsOverrun)
460 {
461 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall
462 {
464 if (target && target->IsAlive())
465 AddThreat(target, 0.0f);
466 }
467 }
468 }
469
470 void UpdateAI(uint32 diff) override
471 {
472 if (Delay <= diff)
473 {
474 Delay=0;
475 }
476 else
477 {
478 Delay -= diff;
479 return;
480 }
481 if (!meteor)
482 {
483 if (Creature* trigger = me->SummonCreature(NPC_WORLD_TRIGGER_TINY, me->GetPositionWithOffset({ 8.0f, 8.0f, frand(25.0f, 35.0f), 0.0f }), TEMPSUMMON_TIMED_DESPAWN, 1s))
484 {
485 trigger->SetDisableGravity(true);
486 trigger->CastSpell(me, SPELL_METEOR, true);
487 }
489 meteor = true;
490 } else if (!CanMove){
491 if (spawnTimer <= diff)
492 {
496 CanMove = true;
498 {
500 if (target && target->IsAlive())
501 AddThreat(target, 0.0f);
503 //do overrun
504 }
505 } else spawnTimer -= diff;
506 }
507 if (!CanMove)return;
509 if (IsEvent || IsOverrun)
510 EscortAI::UpdateAI(diff);
511 if (IsEvent)
512 {
513 if (!go)
514 {
515 go = true;
516 AddWaypoint(0, HordeWPs[7][0]+irand(-3, 3), HordeWPs[7][1]+irand(-3, 3), HordeWPs[7][2], true);//HordeWPs[7] infront of thrall
517 Start(true);
518 SetDespawnAtEnd(false);
519 }
520 }
521
522 if (!UpdateVictim())
523 return;
524 if (!imol)
525 {
527 imol = true;
528 }
529 if (FlameBuffetTimer <= diff)
530 {
532 FlameBuffetTimer = 7000;
533 } else FlameBuffetTimer -= diff;
535 }
536 };
537
538 CreatureAI* GetAI(Creature* creature) const override
539 {
540 return GetHyjalAI<npc_giant_infernalAI>(creature);
541 }
542};
543
545{
546public:
547 npc_abomination() : CreatureScript("npc_abomination") { }
548
549 CreatureAI* GetAI(Creature* creature) const override
550 {
551 return GetHyjalAI<npc_abominationAI>(creature);
552 }
553
555 {
557 {
558 instance = creature->GetInstanceScript();
559 go = false;
560 Initialize();
561 }
562
564 {
565 KnockDownTimer = 10000;
566 }
567
568 bool go;
570 void Reset() override
571 {
572 Initialize();
573 }
574
575 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
576 {
577 if (waypointId == 7 && !IsOverrun)
578 {
579 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall
580 {
582 if (target && target->IsAlive())
583 AddThreat(target, 0.0f);
584 }
585 else
586 {
588 if (target && target->IsAlive())
589 AddThreat(target, 0.0f);
590 }
591 }
592 if (waypointId == LastOverronPos && IsOverrun)
593 {
594 if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
595 {
597 }
598 }
599 }
600
601 void JustEngagedWith(Unit* /*who*/) override { }
602
603 void UpdateAI(uint32 diff) override
604 {
606 if (IsEvent || IsOverrun)
607 EscortAI::UpdateAI(diff);
608 if (IsEvent)
609 {
610 if (!go)
611 {
612 go = true;
613 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs
614 {
615 for (uint8 i = 0; i < 8; ++i)
616 AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2], true);
617 Start(false);
618 SetDespawnAtEnd(false);
619 }else//use alliance WPs
620 {
621 for (uint8 i = 0; i < 8; ++i)
622 AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2], true);
623 Start(false);
624 SetDespawnAtEnd(false);
625 }
626 }
627 }
630 if (!UpdateVictim())
631 return;
632 if (KnockDownTimer <= diff)
633 {
635 KnockDownTimer = 15000 + rand32() % 10000;
636 } else KnockDownTimer -= diff;
638 }
639 };
640
641};
642
644{
645public:
646 npc_ghoul() : CreatureScript("npc_ghoul") { }
647
648 CreatureAI* GetAI(Creature* creature) const override
649 {
650 return GetHyjalAI<npc_ghoulAI>(creature);
651 }
652
654 {
655 npc_ghoulAI(Creature* creature) : hyjal_trashAI(creature)
656 {
657 instance = creature->GetInstanceScript();
658 go = false;
659 Initialize();
660 }
661
663 {
664 FrenzyTimer = 5000 + rand32() % 5000;
665 MoveTimer = 2000;
666 RandomMove = false;
667 }
668
669 bool go;
673 void Reset() override
674 {
675 Initialize();
676 }
677
678 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
679 {
680 if (waypointId == 7 && !IsOverrun)
681 {
682 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall
683 {
685 if (target && target->IsAlive())
686 AddThreat(target, 0.0f);
687 }
688 else
689 {
691 if (target && target->IsAlive())
692 AddThreat(target, 0.0f);
693 }
694 }
695 if (waypointId == LastOverronPos && IsOverrun)
696 {
698 if ((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
699 {
701 }
702 }
703 }
704
705 void JustEngagedWith(Unit* /*who*/) override { }
706
707 void UpdateAI(uint32 diff) override
708 {
710 if (IsEvent || IsOverrun)
711 EscortAI::UpdateAI(diff);
712 if (IsEvent)
713 {
714 if (!go)
715 {
716 go = true;
717 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs
718 {
719 for (uint8 i = 0; i < 8; ++i)
720 AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2], true);
721 Start(false);
722 SetDespawnAtEnd(false);
723 }else//use alliance WPs
724 {
725 for (uint8 i = 0; i < 8; ++i)
726 AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2], true);
727 Start(false);
728 SetDespawnAtEnd(false);
729 }
730 }
731 }
732 if (FrenzyTimer <= diff)
733 {
735 FrenzyTimer = 15000 + rand32() % 15000;
736 } else FrenzyTimer -= diff;
737 if (!UpdateVictim())
738 return;
739
741 }
742 };
743
744};
745
747{
748public:
749 npc_necromancer() : CreatureScript("npc_necromancer") { }
750
751 CreatureAI* GetAI(Creature* creature) const override
752 {
753 return GetHyjalAI<npc_necromancerAI>(creature);
754 }
755
757 {
759 {
760 instance = creature->GetInstanceScript();
761 go = false;
762 Initialize();
763 }
764
766 {
767 ShadowBoltTimer = 1000 + rand32() % 5000;
768 }
769
771 bool go;
773
774 void Reset() override
775 {
776 Initialize();
778 }
779
780 void JustSummoned(Creature* summon) override
781 {
782 Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30, true);
783 if (target)
784 summon->Attack(target, false);
785 summons.Summon(summon);
786 }
787
788 void SummonedCreatureDespawn(Creature* summon) override
789 {
790 summons.Despawn(summon);
791 }
792
793 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
794 {
795 if (waypointId == 7 && !IsOverrun)
796 {
797 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall
798 {
800 if (target && target->IsAlive())
801 AddThreat(target, 0.0f);
802 }
803 else
804 {
806 if (target && target->IsAlive())
807 AddThreat(target, 0.0f);
808 }
809 }
810 }
811
812 void KilledUnit(Unit* /*victim*/) override
813 {
815 switch (urand(0, 2))
816 {
817 case 0:
818 DoSpawnCreature(17902, 3, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60s);
819 DoSpawnCreature(17902, -3, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60s);
820 break;
821 case 1:
822 DoSpawnCreature(17903, 3, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60s);
823 DoSpawnCreature(17903, -3, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60s);
824 break;
825 case 2:
826 DoSpawnCreature(RAND(17902, 17903), 3, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60s);
827 break;
828 }
829 }
830
831 void JustEngagedWith(Unit* /*who*/) override { }
832
833 void JustDied(Unit* killer) override
834 {
837 }
838
839 void UpdateAI(uint32 diff) override
840 {
842
843 if (IsEvent || IsOverrun)
844 EscortAI::UpdateAI(diff);
845
846 if (IsEvent)
847 {
848 if (!go)
849 {
850 go = true;
851 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs
852 {
853 for (uint8 i = 0; i < 8; ++i)
854 AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2], true);
855 Start(true);
856 SetDespawnAtEnd(false);
857 }else//use alliance WPs
858 {
859 for (uint8 i = 0; i < 8; ++i)
860 AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2], true);
861 Start(true);
862 SetDespawnAtEnd(false);
863 }
864 }
865 }
866
867 if (!UpdateVictim())
868 return;
869
870 if (ShadowBoltTimer <= diff)
871 {
873 ShadowBoltTimer = 20000 + rand32() % 10000;
874 } else ShadowBoltTimer -= diff;
875
877 }
878 };
879
880};
881
883{
884public:
885 npc_banshee() : CreatureScript("npc_banshee") { }
886
887 CreatureAI* GetAI(Creature* creature) const override
888 {
889 return GetHyjalAI<npc_bansheeAI>(creature);
890 }
891
893 {
894 npc_bansheeAI(Creature* creature) : hyjal_trashAI(creature)
895 {
896 instance = creature->GetInstanceScript();
897 go = false;
898 Initialize();
899 }
900
902 {
903 CourseTimer = 20000 + rand32() % 5000;
904 WailTimer = 15000 + rand32() % 5000;
905 ShellTimer = 50000 + rand32() % 10000;
906 }
907
908 bool go;
912
913 void Reset() override
914 {
915 Initialize();
916 }
917
918 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
919 {
920 if (waypointId == 7 && !IsOverrun)
921 {
922 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall
923 {
925 if (target && target->IsAlive())
926 AddThreat(target, 0.0f);
927 }
928 else
929 {
931 if (target && target->IsAlive())
932 AddThreat(target, 0.0f);
933 }
934 }
935 }
936
937 void KilledUnit(Unit* /*victim*/) override
938 {
940 }
941
942 void JustDied(Unit* killer) override
943 {
946 }
947
948 void JustEngagedWith(Unit* /*who*/) override { }
949
950 void UpdateAI(uint32 diff) override
951 {
953 if (IsEvent || IsOverrun)
954 EscortAI::UpdateAI(diff);
955 if (IsEvent)
956 {
957 if (!go)
958 {
959 go = true;
960 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs
961 {
962 for (uint8 i = 0; i < 8; ++i)
963 AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2], true);
964 Start(false);
965 SetDespawnAtEnd(false);
966 }else//use alliance WPs
967 {
968 for (uint8 i = 0; i < 8; ++i)
969 AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2], true);
970 Start(false);
971 SetDespawnAtEnd(false);
972 }
973 }
974 }
975 if (!UpdateVictim())
976 return;
977 if (CourseTimer <= diff)
978 {
980 CourseTimer = 20000 + rand32() % 5000;
981 } else CourseTimer -= diff;
982 if (WailTimer <= diff)
983 {
985 WailTimer = 15000 + rand32() % 5000;
986 } else WailTimer -= diff;
987 if (ShellTimer <= diff)
988 {
990 ShellTimer = 50000 + rand32() % 10000;
991 } else ShellTimer -= diff;
993 }
994 };
995
996};
997
999{
1000public:
1001 npc_crypt_fiend() : CreatureScript("npc_crypt_fiend") { }
1002
1003 CreatureAI* GetAI(Creature* creature) const override
1004 {
1005 return GetHyjalAI<npc_crypt_fiendAI>(creature);
1006 }
1007
1009 {
1011 {
1012 instance = creature->GetInstanceScript();
1013 go = false;
1014 Initialize();
1015 }
1016
1018 {
1019 WebTimer = 20000 + rand32() % 5000;
1020 }
1021
1022 bool go;
1024
1025 void Reset() override
1026 {
1027 Initialize();
1028 }
1029
1030 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
1031 {
1032 if (waypointId == 7 && !IsOverrun)
1033 {
1034 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall
1035 {
1037 if (target && target->IsAlive())
1038 AddThreat(target, 0.0f);
1039 }
1040 else
1041 {
1043 if (target && target->IsAlive())
1044 AddThreat(target, 0.0f);
1045 }
1046 }
1047 }
1048
1049 void JustEngagedWith(Unit* /*who*/) override { }
1050
1051 void UpdateAI(uint32 diff) override
1052 {
1054 if (IsEvent || IsOverrun)
1055 EscortAI::UpdateAI(diff);
1056 if (IsEvent)
1057 {
1058 if (!go)
1059 {
1060 go = true;
1061 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs
1062 {
1063 for (uint8 i = 0; i < 8; ++i)
1064 AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2], true);
1065 Start(false);
1066 SetDespawnAtEnd(false);
1067 }else//use alliance WPs
1068 {
1069 for (uint8 i = 0; i < 8; ++i)
1070 AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2], true);
1071 Start(false);
1072 SetDespawnAtEnd(false);
1073 }
1074 }
1075 }
1076 if (!UpdateVictim())
1077 return;
1078 if (WebTimer <= diff)
1079 {
1081 WebTimer = 20000 + rand32() % 5000;
1082 } else WebTimer -= diff;
1084 }
1085 };
1086
1087};
1088
1090{
1091public:
1092 npc_fel_stalker() : CreatureScript("npc_fel_stalker") { }
1093
1094 CreatureAI* GetAI(Creature* creature) const override
1095 {
1096 return GetHyjalAI<npc_fel_stalkerAI>(creature);
1097 }
1098
1100 {
1102 {
1103 instance = creature->GetInstanceScript();
1104 go = false;
1105 Initialize();
1106 }
1107
1109 {
1110 ManaBurnTimer = 9000 + rand32() % 5000;
1111 }
1112
1113 bool go;
1115
1116 void Reset() override
1117 {
1118 Initialize();
1119 }
1120
1121 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
1122 {
1123 if (waypointId == 7 && !IsOverrun)
1124 {
1125 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall
1126 {
1128 if (target && target->IsAlive())
1129 AddThreat(target, 0.0f);
1130 }
1131 else
1132 {
1134 if (target && target->IsAlive())
1135 AddThreat(target, 0.0f);
1136 }
1137 }
1138 }
1139
1140 void JustEngagedWith(Unit* /*who*/) override { }
1141
1142 void UpdateAI(uint32 diff) override
1143 {
1145 if (IsEvent || IsOverrun)
1146 EscortAI::UpdateAI(diff);
1147 if (IsEvent)
1148 {
1149 if (!go)
1150 {
1151 go = true;
1152 if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs
1153 {
1154 for (uint8 i = 0; i < 8; ++i)
1155 AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2], true);
1156 Start(false);
1157 SetDespawnAtEnd(false);
1158 }else//use alliance WPs
1159 {
1160 for (uint8 i = 0; i < 8; ++i)
1161 AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2], true);
1162 Start(false);
1163 SetDespawnAtEnd(false);
1164 }
1165 }
1166 }
1167 if (!UpdateVictim())
1168 return;
1169 if (ManaBurnTimer <= diff)
1170 {
1172 ManaBurnTimer = 9000 + rand32() % 5000;
1173 } else ManaBurnTimer -= diff;
1175 }
1176 };
1177
1178};
1179
1181{
1182public:
1183 npc_frost_wyrm() : CreatureScript("npc_frost_wyrm") { }
1184
1185 CreatureAI* GetAI(Creature* creature) const override
1186 {
1187 return GetHyjalAI<npc_frost_wyrmAI>(creature);
1188 }
1189
1191 {
1193 {
1194 Initialize();
1195 instance = creature->GetInstanceScript();
1196 go = false;
1197 }
1198
1200 {
1201 FrostBreathTimer = 5000;
1202 MoveTimer = 0;
1203 }
1204
1205 bool go;
1208
1209 void Reset() override
1210 {
1211 Initialize();
1212 }
1213
1214 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
1215 {
1216 if (waypointId == 2 && !IsOverrun)
1217 {
1219 if (target && target->IsAlive())
1220 {
1221 AddThreat(target, 0.0f);
1222 DoCast(target, SPELL_FROST_BREATH, true);
1223 }
1224 }
1225 }
1226
1227 void JustDied(Unit* /*killer*/) override
1228 {
1229 if (IsEvent)
1230 instance->SetData(DATA_TRASH, 0);//signal trash is dead
1231
1232 float x, y, z;
1233 me->GetPosition(x, y, z);
1234 me->UpdateGroundPositionZ(x, y, z);
1235 me->GetMotionMaster()->MovePoint(0, x, y, z);
1236 me->UpdatePosition(x, y, z, 0);
1237 }
1238
1239 void JustEngagedWith(Unit* /*who*/) override { }
1240
1241 void UpdateAI(uint32 diff) override
1242 {
1244
1245 if (IsEvent || IsOverrun)
1246 {
1247 ENSURE_AI(hyjal_trashAI, me->AI())->SetActiveAttacker(false);
1248 EscortAI::UpdateAI(diff);
1249 }
1250
1251 if (IsEvent)
1252 {
1253 if (!go)
1254 {
1255
1256 if (!useFlyPath)
1257 {
1258 for (uint8 i = 0; i < 3; ++i)
1259 AddWaypoint(i, FrostWyrmWPs[i][0], FrostWyrmWPs[i][1], FrostWyrmWPs[i][2], true);
1260 }
1261 else
1262 {//fly path FlyPathWPs
1263 for (uint8 i = 0; i < 3; ++i)
1264 AddWaypoint(i, FlyPathWPs[i][0]+irand(-10, 10), FlyPathWPs[i][1]+irand(-10, 10), FlyPathWPs[i][2], true);
1265 }
1266 go = true;
1267 Start(false);
1268 SetDespawnAtEnd(false);
1269 }
1270 }
1271
1272 if (!UpdateVictim())
1273 return;
1274
1275 if (!me->IsWithinDist(me->GetVictim(), 25))
1276 {
1277 if (MoveTimer <= diff)
1278 {
1280 MoveTimer = 2000;
1281 }
1282 else
1283 MoveTimer -= diff;
1284 }
1285
1286 if (FrostBreathTimer <= diff)
1287 {
1288 if (!me->IsWithinDist(me->GetVictim(), 25))
1289 {
1291 me->StopMoving();
1292 me->GetMotionMaster()->Clear();
1293 FrostBreathTimer = 4000;
1294 }
1295 }
1296 else
1297 FrostBreathTimer -= diff;
1298 }
1299 };
1300};
1301
1303{
1304public:
1305 npc_gargoyle() : CreatureScript("npc_gargoyle") { }
1306
1307 CreatureAI* GetAI(Creature* creature) const override
1308 {
1309 return GetHyjalAI<npc_gargoyleAI>(creature);
1310 }
1311
1313 {
1315 {
1316 instance = creature->GetInstanceScript();
1317 go = false;
1318 for (uint8 i = 0; i < 3; ++i)
1319 DummyTarget[i] = 0;
1320 Initialize();
1321 }
1322
1324 {
1325 forcemove = true;
1326 Zpos = 10.0f;
1327 StrikeTimer = 2000 + rand32() % 5000;
1328 MoveTimer = 0;
1329 }
1330
1331 bool go;
1334 float Zpos;
1336
1337 void Reset() override
1338 {
1339 Initialize();
1340 }
1341
1342 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
1343 {
1344 if (waypointId == 2 && !IsOverrun)
1345 {
1347 if (target && target->IsAlive())
1348 {
1349 AddThreat(target, 0.0f);
1350 DoCast(target, SPELL_GARGOYLE_STRIKE, true);
1351 }
1352 }
1353 }
1354
1355 void JustDied(Unit* killer) override
1356 {
1357 float x, y, z;
1358 me->GetPosition(x, y, z);
1359 me->UpdateGroundPositionZ(x, y, z);
1360 me->GetMotionMaster()->MovePoint(0, x, y, z);
1361 me->UpdatePosition(x, y, z, 0);
1363 }
1364
1365 void UpdateAI(uint32 diff) override
1366 {
1368
1369 if (IsEvent || IsOverrun)
1370 {
1371 ENSURE_AI(hyjal_trashAI, me->AI())->SetActiveAttacker(false);
1372 EscortAI::UpdateAI(diff);
1373 }
1374
1375 if (IsEvent)
1376 {
1377 if (!go)
1378 {
1379 if (!useFlyPath)
1380 {
1381 for (uint8 i = 0; i < 3; ++i)
1382 AddWaypoint(i, GargoyleWPs[i][0]+irand(-10, 10), GargoyleWPs[i][1]+irand(-10, 10), GargoyleWPs[i][2], true);
1383 }else{//fly path FlyPathWPs
1384 for (uint8 i = 0; i < 3; ++i)
1385 AddWaypoint(i, FlyPathWPs[i][0]+irand(-10, 10), FlyPathWPs[i][1]+irand(-10, 10), FlyPathWPs[i][2], true);
1386 }
1387 go = true;
1388 Start(false);
1389 SetDespawnAtEnd(false);
1390 }
1391 }
1392
1393 if (IsOverrun && !UpdateVictim())
1394 {
1395 if (faction == 0)//alliance
1396 {
1397 if (StrikeTimer <= diff)
1398 {
1400 StrikeTimer = 2000 + rand32() % 1000;
1401 } else StrikeTimer -= diff;
1402 }
1403 }
1404
1405 if (!UpdateVictim())
1406 return;
1407
1408 if (!me->IsWithinDist(me->GetVictim(), 20) || forcemove)
1409 {
1410 if (forcemove)
1411 {
1412 forcemove = false;
1414 me->Attack(target, false);
1415 }
1416 if (MoveTimer <= diff)
1417 {
1418 float x, y, z;
1419 me->EnsureVictim()->GetPosition(x, y, z);
1420 me->GetMotionMaster()->MovePoint(0, x, y, z + Zpos);
1421 Zpos -= 1.0f;
1422 if (Zpos <= 0)
1423 Zpos = 0;
1424 MoveTimer = 2000;
1425 }
1426 else
1427 MoveTimer -= diff;
1428 }
1429
1430 if (StrikeTimer <= diff)
1431 {
1432 if (me->IsWithinDist(me->GetVictim(), 20))
1433 {
1435 me->StopMoving();
1436 me->GetMotionMaster()->Clear();
1437 StrikeTimer = 2000 + rand32() % 1000;
1438 }
1439 else
1440 StrikeTimer = 0;
1441 }
1442 else
1443 StrikeTimer -= diff;
1444 }
1445 };
1446};
1447
1449{
1450public:
1451 alliance_rifleman() : CreatureScript("alliance_rifleman") { }
1452
1453 CreatureAI* GetAI(Creature* creature) const override
1454 {
1455 return GetHyjalAI<alliance_riflemanAI>(creature);
1456 }
1457
1459 {
1461 {
1462 Initialize();
1463 SetCombatMovement(false);
1464 }
1465
1467 {
1468 ExplodeTimer = 5000 + rand32() % 5000;
1469 }
1470
1472
1473 void JustDied(Unit* /*killer*/) override
1474 {
1475 }
1476
1477 void Reset() override
1478 {
1479 Initialize();
1480 }
1481
1482 void MoveInLineOfSight(Unit* who) override
1483
1484 {
1485 if (!who || me->GetVictim())
1486 return;
1487
1488 if (me->IsValidAttackTarget(who))
1489 {
1490 //float attackRadius = me->GetAttackDistance(who);
1491 if (me->IsWithinDistInMap(who, 30))
1492 AttackStart(who);
1493 }
1494 }
1495
1496 void JustEngagedWith(Unit* /*who*/) override
1497 {
1498 }
1499
1500 void UpdateAI(uint32 diff) override
1501 {
1502 //Check if we have a target
1503 if (!UpdateVictim())
1504 return;
1505 if (ExplodeTimer <= diff)
1506 {
1507 if (!me->IsWithinDistInMap(me->GetVictim(), 30))
1508 {
1510 return;
1511 }
1512 CastSpellExtraArgs args;
1513 args.AddSpellMod(SPELLVALUE_BASE_POINT0, 500 + rand32() % 700);
1515 ExplodeTimer = 5000 + rand32() % 5000;
1516 } else ExplodeTimer -= diff;
1518 }
1519 };
1520
1521};
1522
1524{
1525 new npc_giant_infernal();
1526 new npc_abomination();
1527 new npc_ghoul();
1528 new npc_necromancer();
1529 new npc_banshee();
1530 new npc_crypt_fiend();
1531 new npc_fel_stalker();
1532 new npc_frost_wyrm();
1533 new npc_gargoyle();
1534 new alliance_rifleman();
1535}
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition Define.h:135
uint32_t uint32
Definition Define.h:133
@ TEMPSUMMON_TIMED_DESPAWN
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
Spells
Definition PlayerAI.cpp:32
int32 irand(int32 min, int32 max)
Definition Random.cpp:35
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
uint32 rand32()
Definition Random.cpp:70
@ EMOTE_ONESHOT_ATTACK_UNARMED
@ UNIT_DYNFLAG_LOOTABLE
@ SPELLVALUE_BASE_POINT0
#define ENSURE_AI(a, b)
Definition UnitAI.h:28
@ UNIT_FLAG_NON_ATTACKABLE
@ UNIT_FLAG_UNINTERACTIBLE
DamageEffectType
Definition Unit.h:352
@ UNIT_FIELD_NATIVEDISPLAYID
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:293
bool isWorldBoss() const
void SetDisplayId(uint32 modelId) override
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:154
virtual ObjectGuid GetGuidData(uint32 type) const override
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
virtual void RemoveDynamicFlag(uint32 flag)
Definition Object.h:90
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:249
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
virtual void Reset()
Definition UnitAI.h:145
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void StopMoving(bool force=false)
Definition Unit.cpp:10312
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool IsPet() const
Definition Unit.h:884
bool IsAlive() const
Definition Unit.h:1234
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
Unit * EnsureVictim() const
Definition Unit.h:861
void SetEmoteState(Emote emote)
Definition Unit.h:967
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:12890
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:5535
Unit * GetVictim() const
Definition Unit.h:859
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition Object.cpp:2856
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1992
void UpdateGroundPositionZ(float x, float y, float &z) const
Definition Object.cpp:1405
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1192
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition Object.cpp:1187
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:55
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
@ GARGOYLE
Definition hyjal.h:63
@ ABOMINATION
Definition hyjal.h:59
@ GHOUL
Definition hyjal.h:60
@ NPC_WORLD_TRIGGER_TINY
Definition hyjal.h:78
@ DATA_TRASH
Definition hyjal.h:39
@ DATA_RAIDDAMAGE
Definition hyjal.h:43
@ DATA_THRALL
Definition hyjal.h:37
@ DATA_JAINAPROUDMOORE
Definition hyjal.h:36
@ DATA_ALLIANCE_RETREAT
Definition hyjal.h:41
@ DATA_HORDE_RETREAT
Definition hyjal.h:42
#define MINRAIDDAMAGE
Definition hyjal.h:118
float FlyPathWPs[3][3]
void AddSC_hyjal_trash()
float FrostWyrmWPs[3][3]
@ SPELL_WEB
@ SPELL_RAISE_DEAD_3
@ SPELL_IMMOLATION
@ SPELL_FROST_BREATH
@ MODEL_INVIS
@ SPELL_BANSHEE_WAIL
@ SPELL_BANSHEE_CURSE
@ SPELL_RAISE_DEAD_2
@ SPELL_GARGOYLE_STRIKE
@ SPELL_RAISE_DEAD_1
@ SPELL_SHADOW_BOLT
@ SPELL_METEOR
@ SPELL_DISEASE_CLOUD
@ SPELL_FRENZY
@ SPELL_ANTI_MAGIC_SHELL
@ SPELL_KNOCKDOWN
@ SPELL_FLAME_BUFFET
@ SPELL_EXPLODING_SHOT
@ SPELL_MANA_BURN
float AllianceOverrunWP[55][3]
float AllianceWPs[8][3]
float GargoyleWPs[3][3]
float HordeWPs[8][3]
float HordeOverrunWP[21][3]
HyjalCreatureText
@ TRASH_SAY_DEATH
@ TRASH_SAY_SLAY
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
void Start(bool isActiveAttacker=true, ObjectGuid playerGUID=ObjectGuid::Empty, Quest const *quest=nullptr, bool instantRespawn=false, bool canLoopPath=false)
void AddWaypoint(uint32 id, float x, float y, float z, bool run)
void SetDespawnAtEnd(bool despawn)
void UpdateAI(uint32 diff) override
Position GetPositionWithOffset(Position const &offset) const
Definition Position.cpp:60
void GetPosition(float &x, float &y) const
Definition Position.h:84
void AttackStart(Unit *) override
void SetCombatMovement(bool allowMovement)
Creature * DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, uint32 type, Milliseconds despawntime)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void MoveInLineOfSight(Unit *who) override
void UpdateAI(uint32 diff) override
void DamageTaken(Unit *done_by, uint32 &damage, DamageEffectType, SpellInfo const *) override
uint32 LastOverronPos
Definition hyjal_trash.h:38
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
float DummyTarget[3]
Definition hyjal_trash.h:45
uint32 damageTaken
Definition hyjal_trash.h:44
InstanceScript * instance
Definition hyjal_trash.h:35
uint32 OverrunType
Definition hyjal_trash.h:41
hyjal_trashAI(Creature *creature)
void WaypointReached(uint32 waypointId, uint32) override
npc_abominationAI(Creature *creature)
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *) override
void JustDied(Unit *killer) override
void WaypointReached(uint32 waypointId, uint32) override
void KilledUnit(Unit *) override
void UpdateAI(uint32 diff) override
npc_bansheeAI(Creature *creature)
void WaypointReached(uint32 waypointId, uint32) override
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
void WaypointReached(uint32 waypointId, uint32) override
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
void WaypointReached(uint32 waypointId, uint32) override
void UpdateAI(uint32 diff) override
npc_frost_wyrmAI(Creature *creature)
void JustEngagedWith(Unit *) override
npc_gargoyleAI(Creature *creature)
void JustDied(Unit *killer) override
void WaypointReached(uint32 waypointId, uint32) override
void UpdateAI(uint32 diff) override
void UpdateAI(uint32 diff) override
void Reset() override
void JustEngagedWith(Unit *) override
void WaypointReached(uint32 waypointId, uint32) override
npc_ghoulAI(Creature *creature)
void UpdateAI(uint32 diff) override
void WaypointReached(uint32 waypointId, uint32) override
void JustSummoned(Creature *summon) override
npc_necromancerAI(Creature *creature)
void WaypointReached(uint32 waypointId, uint32) override
void JustDied(Unit *killer) override
void JustEngagedWith(Unit *) override
void SummonedCreatureDespawn(Creature *summon) override
void UpdateAI(uint32 diff) override