15
15
* with this program. If not, see <http://www.gnu.org/licenses/>.
16
16
*/
17
17
18
+ /*
19
+ * Pathing for Brood of Anzu is NYI (try to remove extra flag to ignore pathfinding when paths will be implemented)
20
+ * Birds-helpers are NYI
21
+ */
22
+
18
23
#include " ScriptMgr.h"
19
24
#include " ScriptedCreature.h"
20
25
#include " sethekk_halls.h"
21
26
22
27
enum AnzuTexts
23
28
{
24
- SAY_SUMMON_BROOD = 0 ,
25
- SAY_SPELL_BOMB = 1
29
+ SAY_INTRO_1 = 0 ,
30
+ SAY_INTRO_2 = 1 ,
31
+ SAY_SUMMON = 2 ,
32
+ SAY_BOMB = 3
26
33
};
27
34
28
35
enum AnzuSpells
29
36
{
37
+ SPELL_SHADOWFORM = 37816 ,
38
+
30
39
SPELL_PARALYZING_SCREECH = 40184 ,
31
40
SPELL_SPELL_BOMB = 40303 ,
32
41
SPELL_CYCLONE_OF_FEATHERS = 40321 ,
@@ -38,7 +47,12 @@ enum AnzuEvents
38
47
EVENT_PARALYZING_SCREECH = 1 ,
39
48
EVENT_SPELL_BOMB,
40
49
EVENT_CYCLONE_OF_FEATHERS,
41
- EVENT_SUMMON
50
+ EVENT_SUMMON_1,
51
+ EVENT_SUMMON_2,
52
+
53
+ EVENT_INTRO_1,
54
+ EVENT_INTRO_2,
55
+ EVENT_INTRO_3
42
56
};
43
57
44
58
enum AnzuPhases : uint8
@@ -48,7 +62,12 @@ enum AnzuPhases : uint8
48
62
PHASE_HEALTH_33
49
63
};
50
64
51
- Position const PosSummonBrood[7 ] =
65
+ enum AnzuMisc
66
+ {
67
+ NPC_BROOD_OF_ANZU = 23132
68
+ };
69
+
70
+ static Position const PosSummonBrood[] =
52
71
{
53
72
{ -118 .1717f , 284 .5299f , 121 .2287f , 2 .775074f },
54
73
{ -98 .15528f , 293 .4469f , 109 .2385f , 0 .174533f },
@@ -62,87 +81,142 @@ Position const PosSummonBrood[7] =
62
81
// 23035 - Anzu
63
82
struct boss_anzu : public BossAI
64
83
{
65
- boss_anzu (Creature* creature) : BossAI(creature, DATA_ANZU), _phase(PHASE_NONE) { }
84
+ boss_anzu (Creature* creature) : BossAI(creature, DATA_ANZU), _phase(PHASE_NONE), _deadBroodCount(0 ) { }
85
+
86
+ void JustAppeared () override
87
+ {
88
+ events.ScheduleEvent (EVENT_INTRO_1, 0s);
89
+ }
66
90
67
91
void Reset () override
68
92
{
69
- // _Reset();
70
- events.Reset ();
93
+ _Reset ();
71
94
_phase = PHASE_NONE;
95
+ _deadBroodCount = 0 ;
96
+ me->SetReactState (REACT_AGGRESSIVE);
72
97
}
73
98
74
99
void JustEngagedWith (Unit* who) override
75
100
{
76
101
BossAI::JustEngagedWith (who);
77
- events.ScheduleEvent (EVENT_PARALYZING_SCREECH, 14s);
78
- events.ScheduleEvent (EVENT_CYCLONE_OF_FEATHERS, 5s);
102
+ events.ScheduleEvent (EVENT_PARALYZING_SCREECH, 15s, 25s);
103
+ events.ScheduleEvent (EVENT_SPELL_BOMB, 20s, 30s);
104
+ events.ScheduleEvent (EVENT_CYCLONE_OF_FEATHERS, 10s, 15s);
79
105
}
80
106
81
107
void DamageTaken (Unit* /* killer*/ , uint32& damage, DamageEffectType /* damageType*/ , SpellInfo const * /* spellInfo = nullptr*/ ) override
82
108
{
83
109
if (_phase < PHASE_HEALTH_66 && me->HealthBelowPctDamaged (66 , damage))
84
110
{
85
111
_phase++;
86
- Talk (SAY_SUMMON_BROOD);
87
- events.ScheduleEvent (EVENT_SUMMON, 3s);
112
+ events.ScheduleEvent (EVENT_SUMMON_1, 0s);
88
113
}
89
114
90
115
if (_phase < PHASE_HEALTH_33 && me->HealthBelowPctDamaged (33 , damage))
91
116
{
92
117
_phase++;
93
- Talk (SAY_SUMMON_BROOD);
94
- events.ScheduleEvent (EVENT_SUMMON, 3s);
118
+ events.ScheduleEvent (EVENT_SUMMON_1, 0s);
119
+ }
120
+ }
121
+
122
+ void SummonedCreatureDies (Creature* /* summon*/ , Unit* /* killer*/ ) override
123
+ {
124
+ _deadBroodCount++;
125
+
126
+ if (_deadBroodCount == std::size (PosSummonBrood))
127
+ {
128
+ me->RemoveAurasDueToSpell (SPELL_BANISH_SELF);
129
+ _deadBroodCount = 0 ;
95
130
}
96
131
}
97
132
98
133
void UpdateAI (uint32 diff) override
99
134
{
100
135
if (!UpdateVictim ())
136
+ {
137
+ events.Update (diff);
138
+
139
+ while (uint32 eventId = events.ExecuteEvent ())
140
+ {
141
+ switch (eventId)
142
+ {
143
+ case EVENT_INTRO_1:
144
+ Talk (SAY_INTRO_1);
145
+ DoCastSelf (SPELL_SHADOWFORM);
146
+ events.ScheduleEvent (EVENT_INTRO_2, 6s);
147
+ break ;
148
+ case EVENT_INTRO_2:
149
+ Talk (SAY_INTRO_2);
150
+ events.ScheduleEvent (EVENT_INTRO_3, 4s);
151
+ break ;
152
+ case EVENT_INTRO_3:
153
+ me->RemoveAurasDueToSpell (SPELL_SHADOWFORM);
154
+ me->SetImmuneToAll (false );
155
+ break ;
156
+ default :
157
+ break ;
158
+ }
159
+ }
101
160
return ;
161
+ }
102
162
103
163
events.Update (diff);
104
164
165
+ if (me->HasUnitState (UNIT_STATE_CASTING))
166
+ return ;
167
+
105
168
while (uint32 eventId = events.ExecuteEvent ())
106
169
{
107
170
switch (eventId)
108
171
{
109
172
case EVENT_PARALYZING_SCREECH:
110
- DoCastVictim (SPELL_PARALYZING_SCREECH);
111
- events.Repeat (25s);
112
- break ;
113
- case EVENT_CYCLONE_OF_FEATHERS:
114
- if (Unit* target = SelectTarget (SelectTargetMethod::Random, 0 ))
115
- DoCast (target, SPELL_CYCLONE_OF_FEATHERS);
116
- events.Repeat (21s);
117
- break ;
118
- case EVENT_SUMMON:
119
- // TODO: Add pathing for Brood of Anzu
120
- for (uint8 i = 0 ; i < 7 ; i++)
121
- me->SummonCreature (NPC_BROOD_OF_ANZU, PosSummonBrood[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46s);
122
-
123
- DoCastSelf (SPELL_BANISH_SELF);
124
- events.ScheduleEvent (EVENT_SPELL_BOMB, 12s);
173
+ DoCastSelf (SPELL_PARALYZING_SCREECH);
174
+ events.Repeat (25s, 35s);
125
175
break ;
126
176
case EVENT_SPELL_BOMB:
127
177
if (Unit* target = SelectTarget (SelectTargetMethod::Random, 0 ))
128
178
{
129
179
if (target->GetPowerType () == POWER_MANA)
130
180
{
131
181
DoCast (target, SPELL_SPELL_BOMB);
132
- Talk (SAY_SPELL_BOMB , target);
182
+ Talk (SAY_BOMB , target);
133
183
}
134
184
}
185
+ events.Repeat (20s, 30s);
186
+ break ;
187
+ case EVENT_CYCLONE_OF_FEATHERS:
188
+ if (Unit* target = SelectTarget (SelectTargetMethod::Random, 0 ))
189
+ DoCast (target, SPELL_CYCLONE_OF_FEATHERS);
190
+ events.Repeat (20s, 25s);
191
+ break ;
192
+ case EVENT_SUMMON_1:
193
+ me->SetReactState (REACT_PASSIVE);
194
+ Talk (SAY_SUMMON);
195
+
196
+ _deadBroodCount = 0 ;
197
+ for (Position const & summonPos : PosSummonBrood)
198
+ me->SummonCreature (NPC_BROOD_OF_ANZU, summonPos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46s);
199
+
200
+ events.ScheduleEvent (EVENT_SUMMON_2, 3s);
201
+ break ;
202
+ case EVENT_SUMMON_2:
203
+ me->SetReactState (REACT_AGGRESSIVE);
204
+ DoCastSelf (SPELL_BANISH_SELF);
135
205
break ;
136
206
default :
137
207
break ;
138
208
}
209
+
210
+ if (me->HasUnitState (UNIT_STATE_CASTING))
211
+ return ;
139
212
}
140
213
141
214
DoMeleeAttackIfReady ();
142
215
}
143
216
144
217
private:
145
218
uint8 _phase;
219
+ uint8 _deadBroodCount;
146
220
};
147
221
148
222
void AddSC_boss_anzu ()
0 commit comments