Skip to content

Commit 7e03a1c

Browse files
authored
Scripts/Drak'Tharon Keep: Modernize scripts (#30993)
1 parent 4a90264 commit 7e03a1c

File tree

5 files changed

+211
-204
lines changed

5 files changed

+211
-204
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
--
2+
DELETE FROM `creature_text` WHERE `CreatureID` = 27483;
3+
INSERT INTO `creature_text` (`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES
4+
(27483,0,0,'%s raises his talons menacingly!',41,0,100,0,0,0,26745,0,'King Dred EMOTE_SLASH');

src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp

Lines changed: 111 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -15,93 +15,112 @@
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

159175
private:
160-
uint8 raptorsKilled;
176+
uint8 _raptorsKilled;
161177
};
162178

179+
// 26641 - Drakkari Gutripper
163180
struct 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
208220
struct 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

253259
class achievement_king_dred : public AchievementCriteriaScript

0 commit comments

Comments
 (0)