1515 * with this program. If not, see <http://www.gnu.org/licenses/>.
1616 */
1717
18- /*
19- * Comment: MAYBE need more improve the "Raptor Call".
20- */
21-
2218#include " ScriptMgr.h"
2319#include " drak_tharon_keep.h"
20+ #include " Containers.h"
2421#include " InstanceScript.h"
2522#include " ObjectAccessor.h"
2623#include " ScriptedCreature.h"
24+ #include " SpellInfo.h"
2725
28- enum Spells
26+ enum DredTexts
2927{
30- SPELL_BELLOWING_ROAR = 22686 , // fears the group, can be resisted/dispelled
31- SPELL_GRIEVOUS_BITE = 48920 ,
32- SPELL_MANGLING_SLASH = 48873 , // cast on the current tank, adds debuf
33- SPELL_FEARSOME_ROAR = 48849 ,
34- SPELL_PIERCING_SLASH = 48878 , // debuff --> Armor reduced by 75%
35- SPELL_RAPTOR_CALL = 59416 , // dummy
36- SPELL_GUT_RIP = 49710 ,
37- SPELL_REND = 13738
28+ EMOTE_SLASH = 0
3829};
3930
40- enum Misc
31+ enum DredSpells
4132{
42- ACTION_RAPTOR_KILLED = 1 ,
43- DATA_RAPTORS_KILLED = 2
33+ // Dred
34+ SPELL_BELLOWING_ROAR = 22686 ,
35+ SPELL_GRIEVOUS_BITE = 48920 ,
36+ SPELL_FEARSOME_ROAR = 48849 ,
37+ SPELL_RAPTOR_CALL = 59416 ,
38+ SPELL_MULTI_SLASH = 48856 ,
39+ SPELL_PIERCING_SLASH = 48878 ,
40+ SPELL_MANGLING_SLASH = 48873 ,
41+
42+ // Raptors
43+ SPELL_GUT_RIP = 49710 ,
44+ SPELL_REND = 13738
4445};
4546
46- enum Events
47+ enum DredEvents
4748{
48- EVENT_BELLOWING_ROAR = 1 ,
49+ EVENT_BELLOWING_ROAR = 1 ,
4950 EVENT_GRIEVOUS_BITE,
50- EVENT_MANGLING_SLASH,
5151 EVENT_FEARSOME_ROAR,
52+ EVENT_RAPTOR_CALL,
53+ EVENT_MULTI_SLASH,
5254 EVENT_PIERCING_SLASH,
53- EVENT_RAPTOR_CALL
55+ EVENT_MANGLING_SLASH
5456};
5557
56- struct boss_king_dred : public BossAI
58+ enum DredMisc
5759{
58- boss_king_dred (Creature* creature) : BossAI(creature, DATA_KING_DRED)
59- {
60- Initialize ();
61- }
60+ ACTION_RAPTOR_KILLED = 1 ,
61+ DATA_RAPTORS_KILLED = 2
62+ };
6263
63- void Initialize ()
64- {
65- raptorsKilled = 0 ;
66- }
64+ // 27483 - King Dred
65+ struct boss_king_dred : public BossAI
66+ {
67+ boss_king_dred (Creature* creature) : BossAI(creature, DATA_KING_DRED), _raptorsKilled( 0 ) { }
6768
6869 void Reset () override
6970 {
70- Initialize ();
7171 _Reset ();
72+ _raptorsKilled = 0 ;
7273 }
7374
7475 void JustEngagedWith (Unit* who) override
7576 {
7677 BossAI::JustEngagedWith (who);
7778
78- events.ScheduleEvent (EVENT_BELLOWING_ROAR, 33s);
79- events.ScheduleEvent (EVENT_GRIEVOUS_BITE, 20s);
80- events.ScheduleEvent (EVENT_MANGLING_SLASH, 18500ms);
79+ events.ScheduleEvent (EVENT_BELLOWING_ROAR, 15s, 25s);
80+ events.ScheduleEvent (EVENT_GRIEVOUS_BITE, 15s, 20s);
8181 events.ScheduleEvent (EVENT_FEARSOME_ROAR, 10s, 20s);
82- events.ScheduleEvent (EVENT_PIERCING_SLASH, 15s);
83- events.ScheduleEvent (EVENT_RAPTOR_CALL, 20s, 25s);
82+ events.ScheduleEvent (EVENT_RAPTOR_CALL, 15s, 20s);
83+ events.ScheduleEvent (EVENT_MULTI_SLASH, 18s, 22s);
84+ }
85+
86+ void OnSpellCast (SpellInfo const * spell) override
87+ {
88+ if (spell->Id == SPELL_MULTI_SLASH)
89+ Talk (EMOTE_SLASH);
90+ }
91+
92+ void SpellHit (WorldObject* /* caster*/ , SpellInfo const * spellInfo) override
93+ {
94+ if (spellInfo->Id == SPELL_MULTI_SLASH)
95+ {
96+ events.ScheduleEvent (EVENT_PIERCING_SLASH, 1s);
97+ events.ScheduleEvent (EVENT_MANGLING_SLASH, 3s);
98+ }
99+
100+ if (spellInfo->Id == SPELL_RAPTOR_CALL)
101+ {
102+ // / @todo: This is wrong. Engage nearby alive not yet engaged raptor instead
103+ float x, y, z;
104+
105+ me->GetClosePoint (x, y, z, me->GetCombatReach () / 3 , 10 .0f );
106+ me->SummonCreature (RAND (NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), x, y, z, 0 , TEMPSUMMON_DEAD_DESPAWN, 1s);
107+ }
84108 }
85109
86110 void DoAction (int32 action) override
87111 {
88112 if (action == ACTION_RAPTOR_KILLED)
89- ++raptorsKilled ;
113+ ++_raptorsKilled ;
90114 }
91115
92116 uint32 GetData (uint32 type) const override
93117 {
94118 if (type == DATA_RAPTORS_KILLED)
95- return raptorsKilled ;
119+ return _raptorsKilled ;
96120
97121 return 0 ;
98122 }
99123
100- void JustDied (Unit* /* killer*/ ) override
101- {
102- _JustDied ();
103- }
104-
105124 void UpdateAI (uint32 diff) override
106125 {
107126 if (!UpdateVictim ())
@@ -118,32 +137,29 @@ struct boss_king_dred : public BossAI
118137 {
119138 case EVENT_BELLOWING_ROAR:
120139 DoCastAOE (SPELL_BELLOWING_ROAR);
121- events.ScheduleEvent (EVENT_BELLOWING_ROAR, 33s );
140+ events.Repeat (15s, 20s );
122141 break ;
123142 case EVENT_GRIEVOUS_BITE:
124143 DoCastVictim (SPELL_GRIEVOUS_BITE);
125- events.ScheduleEvent (EVENT_GRIEVOUS_BITE, 20s);
126- break ;
127- case EVENT_MANGLING_SLASH:
128- DoCastVictim (SPELL_MANGLING_SLASH);
129- events.ScheduleEvent (EVENT_MANGLING_SLASH, 18500ms);
144+ events.Repeat (20s);
130145 break ;
131146 case EVENT_FEARSOME_ROAR:
132147 DoCastAOE (SPELL_FEARSOME_ROAR);
133- events.ScheduleEvent (EVENT_FEARSOME_ROAR, 10s, 20s);
148+ events.Repeat (10s, 20s);
149+ break ;
150+ case EVENT_RAPTOR_CALL:
151+ DoCastSelf (SPELL_RAPTOR_CALL);
152+ events.Repeat (30s);
153+ break ;
154+ case EVENT_MULTI_SLASH:
155+ DoCastSelf (SPELL_MULTI_SLASH);
156+ events.Repeat (18s, 22s);
134157 break ;
135158 case EVENT_PIERCING_SLASH:
136159 DoCastVictim (SPELL_PIERCING_SLASH);
137- events.ScheduleEvent (EVENT_PIERCING_SLASH, 15s);
138160 break ;
139- case EVENT_RAPTOR_CALL:
140- DoCastVictim (SPELL_RAPTOR_CALL);
141-
142- float x, y, z;
143-
144- me->GetClosePoint (x, y, z, me->GetCombatReach () / 3 , 10 .0f );
145- me->SummonCreature (RAND (NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), x, y, z, 0 , TEMPSUMMON_DEAD_DESPAWN, 1s);
146- events.ScheduleEvent (EVENT_RAPTOR_CALL, 20s, 25s);
161+ case EVENT_MANGLING_SLASH:
162+ DoCastVictim (SPELL_MANGLING_SLASH);
147163 break ;
148164 default :
149165 break ;
@@ -157,97 +173,87 @@ struct boss_king_dred : public BossAI
157173 }
158174
159175private:
160- uint8 raptorsKilled ;
176+ uint8 _raptorsKilled ;
161177};
162178
179+ // 26641 - Drakkari Gutripper
163180struct npc_drakkari_gutripper : public ScriptedAI
164181{
165- npc_drakkari_gutripper (Creature* creature) : ScriptedAI(creature)
182+ npc_drakkari_gutripper (Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript ()) { }
183+
184+ void Reset () override
166185 {
167- Initialize ();
168- instance = me->GetInstanceScript ();
186+ _scheduler.CancelAll ();
169187 }
170188
171- void Initialize ()
189+ void JustEngagedWith (Unit* /* who */ ) override
172190 {
173- GutRipTimer = urand (10000 , 15000 );
191+ _scheduler.Schedule (10s, 15s, [this ](TaskContext task)
192+ {
193+ DoCastVictim (SPELL_GUT_RIP);
194+ task.Repeat (10s, 15s);
195+ });
174196 }
175197
176- InstanceScript* instance;
177-
178- uint32 GutRipTimer;
179-
180- void Reset () override
198+ void JustDied (Unit* /* killer*/ ) override
181199 {
182- Initialize ();
200+ if (Creature* dred = ObjectAccessor::GetCreature (*me, _instance->GetGuidData (DATA_KING_DRED)))
201+ dred->AI ()->DoAction (ACTION_RAPTOR_KILLED);
183202 }
184203
185204 void UpdateAI (uint32 diff) override
186205 {
187206 if (!UpdateVictim ())
188207 return ;
189208
190- if (GutRipTimer <= diff)
191- {
192- DoCastVictim (SPELL_GUT_RIP, false );
193- GutRipTimer = urand (10000 , 15000 );
194- }
195- else
196- GutRipTimer -= diff;
209+ _scheduler.Update (diff);
197210
198211 DoMeleeAttackIfReady ();
199212 }
200213
201- void JustDied (Unit* /* killer*/ ) override
202- {
203- if (Creature* Dred = ObjectAccessor::GetCreature (*me, instance->GetGuidData (DATA_KING_DRED)))
204- Dred->AI ()->DoAction (ACTION_RAPTOR_KILLED);
205- }
214+ private:
215+ TaskScheduler _scheduler;
216+ InstanceScript* _instance;
206217};
207218
219+ // 26628 - Drakkari Scytheclaw
208220struct npc_drakkari_scytheclaw : public ScriptedAI
209221{
210- npc_drakkari_scytheclaw (Creature* creature) : ScriptedAI(creature)
222+ npc_drakkari_scytheclaw (Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript ()) { }
223+
224+ void Reset () override
211225 {
212- Initialize ();
213- instance = me->GetInstanceScript ();
226+ _scheduler.CancelAll ();
214227 }
215228
216- void Initialize ()
229+ void JustEngagedWith (Unit* /* who */ ) override
217230 {
218- uiRendTimer = urand (10000 , 15000 );
231+ _scheduler.Schedule (10s, 15s, [this ](TaskContext task)
232+ {
233+ DoCastVictim (SPELL_REND);
234+ task.Repeat (10s, 15s);
235+ });
219236 }
220237
221- InstanceScript* instance;
222-
223- uint32 uiRendTimer;
224-
225- void Reset () override
238+ void JustDied (Unit* /* killer*/ ) override
226239 {
227- Initialize ();
240+ if (Creature* dred = ObjectAccessor::GetCreature (*me, _instance->GetGuidData (DATA_KING_DRED)))
241+ dred->AI ()->DoAction (ACTION_RAPTOR_KILLED);
228242 }
229243
230244 void UpdateAI (uint32 diff) override
231245 {
232246 if (!UpdateVictim ())
233247 return ;
234248
235- if (uiRendTimer <= diff)
236- {
237- DoCastVictim (SPELL_REND, false );
238- uiRendTimer = urand (10000 , 15000 );
239- }
240- else
241- uiRendTimer -= diff;
249+ _scheduler.Update (diff);
242250
243251 DoMeleeAttackIfReady ();
244252 }
245253
246- void JustDied (Unit* /* killer*/ ) override
247- {
248- if (Creature* Dred = ObjectAccessor::GetCreature (*me, instance->GetGuidData (DATA_KING_DRED)))
249- Dred->AI ()->DoAction (ACTION_RAPTOR_KILLED);
250- }
254+ private:
255+ TaskScheduler _scheduler;
256+ InstanceScript* _instance;
251257};
252258
253259class achievement_king_dred : public AchievementCriteriaScript
0 commit comments