aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2025_09_04_01_world.sql18
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp222
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp126
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp149
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp114
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h3
6 files changed, 340 insertions, 292 deletions
diff --git a/sql/updates/world/3.3.5/2025_09_04_01_world.sql b/sql/updates/world/3.3.5/2025_09_04_01_world.sql
new file mode 100644
index 00000000000..051b6f4e7a6
--- /dev/null
+++ b/sql/updates/world/3.3.5/2025_09_04_01_world.sql
@@ -0,0 +1,18 @@
+--
+DELETE FROM `creature_text` WHERE `CreatureID` = 7358;
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(7358,0,0,"You'll never leave this place alive.",14,0,100,0,0,5825,6187,0,"amnennar SAY_AGGRO"),
+(7358,1,0,"Too easy.",12,0,100,0,0,5826,6188,0,"amnennar SAY_SLAY"),
+(7358,2,0,"I am the hand of the Lich King!",14,0,100,0,0,5827,6192,0,"amnennar SAY_HEALTH_75"),
+(7358,3,0,"To me, my servants!",14,0,100,0,0,5828,6189,0,"amnennar SAY_SUMMON_60"),
+(7358,4,0,"Come, spirits - attend your master!",14,0,100,0,0,5829,6190,0,"amnennar SAY_SUMMON_30"),
+(7358,5,0,"%s begins to summon wraiths out of the freezing cold air!",16,0,100,0,0,0,4483,0,"amnennar EMOTE_SUMMON");
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 12660;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,12660,0,0,31,0,3,8585,0,0,0,0,"","Group 0: Spell 'Banish Frost Spectres' (Effect 0) targets creature 'Frost Spectre'");
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` = 8585 AND `source_type` = 0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(8585,0,0,0,37,0,100,0,0,0,0,0,0,116,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Frost Spectre - On AI Initialize - Set Corpse Delay"),
+(8585,0,1,0,8,0,100,0,12660,0,0,0,0,11,3617,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Frost Spectre - On Spellhit 'Banish Frost Spectres' - Cast 'Quiet Suicide'");
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
index 0de301752bd..0cd9910122f 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
@@ -15,147 +15,171 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/*
+ * Timers requires update
+ * Guardians are despawned in core, that should not happen here
+ */
+
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "razorfen_downs.h"
-enum Say
+enum AmnennarTexts
{
- SAY_AGGRO = 0,
- SAY_SUMMON60 = 1,
- SAY_SUMMON30 = 2,
- SAY_HP = 3,
- SAY_KILL = 4
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_HEALTH_75 = 2,
+ SAY_SUMMON_60 = 3,
+ SAY_SUMMON_30 = 4,
+ EMOTE_SUMMON = 5
};
-enum Spells
+enum AmnennarSpells
{
- SPELL_AMNENNARSWRATH = 13009,
- SPELL_FROSTBOLT = 15530,
- SPELL_FROST_NOVA = 15531,
- SPELL_FROST_SPECTRES = 12642
+ SPELL_AMNENNARS_WRATH = 13009,
+ SPELL_FROSTBOLT = 15530,
+ SPELL_FROST_NOVA = 15531,
+ SPELL_SUMMON_FROST_SPECTRES = 12642,
+ SPELL_BANISH_FROST_SPECTRES = 12660
};
-enum Events
+enum AmnennarEvents
{
- EVENT_AMNENNARSWRATH = 1,
- EVENT_FROSTBOLT = 2,
- EVENT_FROST_NOVA = 3
+ EVENT_AMNENNARS_WRATH = 1,
+ EVENT_FROSTBOLT,
+ EVENT_FROST_NOVA,
+
+ EVENT_HEALTH_75,
+ EVENT_HEALTH_60,
+ EVENT_HEALTH_30
};
-class boss_amnennar_the_coldbringer : public CreatureScript
+enum AmnennarPhases : uint8
{
-public:
- boss_amnennar_the_coldbringer() : CreatureScript("boss_amnennar_the_coldbringer") { }
+ PHASE_NONE = 0,
+ PHASE_HEALTH_75,
+ PHASE_HEALTH_60,
+ PHASE_HEALTH_30
+};
- struct boss_amnennar_the_coldbringerAI : public BossAI
+// 7358 - Amnennar the Coldbringer
+struct boss_amnennar_the_coldbringer : public BossAI
+{
+ boss_amnennar_the_coldbringer(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER), _phase(PHASE_NONE) { }
+
+ void Reset() override
{
- boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER)
- {
- Initialize();
- }
+ _Reset();
+ _phase = PHASE_NONE;
+ }
- void Initialize()
- {
- hp60Spectrals = false;
- hp30Spectrals = false;
- hp50 = false;
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.ScheduleEvent(EVENT_AMNENNARS_WRATH, 8s);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 0s);
+ events.ScheduleEvent(EVENT_FROST_NOVA, 10s, 15s);
+ Talk(SAY_AGGRO);
+ }
- void Reset() override
+ void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
+ {
+ if (_phase < PHASE_HEALTH_75 && me->HealthBelowPctDamaged(75, damage))
{
- _Reset();
- Initialize();
+ _phase++;
+ events.ScheduleEvent(EVENT_HEALTH_75, 0s);
}
- void JustEngagedWith(Unit* who) override
+ if (_phase < PHASE_HEALTH_60 && me->HealthBelowPctDamaged(60, damage))
{
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_AMNENNARSWRATH, 8s);
- events.ScheduleEvent(EVENT_FROSTBOLT, 1s);
- events.ScheduleEvent(EVENT_FROST_NOVA, 10s, 15s);
- Talk(SAY_AGGRO);
+ _phase++;
+ events.ScheduleEvent(EVENT_HEALTH_60, 0s);
}
- void KilledUnit(Unit* who) override
+ if (_phase < PHASE_HEALTH_30 && me->HealthBelowPctDamaged(30, damage))
{
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_KILL);
+ _phase++;
+ events.ScheduleEvent(EVENT_HEALTH_30, 0s);
}
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- }
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ // Despawn is handled by spell, don't store anything
+ void JustSummoned(Creature* /*summon*/) override { }
- events.Update(diff);
+ void EnterEvadeMode(EvadeReason why) override
+ {
+ DoCastSelf(SPELL_BANISH_FROST_SPECTRES, true);
+ BossAI::EnterEvadeMode(why);
+ }
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ DoCastSelf(SPELL_BANISH_FROST_SPECTRES, true);
+ }
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_AMNENNARSWRATH:
- DoCastVictim(SPELL_AMNENNARSWRATH);
- events.ScheduleEvent(EVENT_AMNENNARSWRATH, 12s);
- break;
- case EVENT_FROSTBOLT:
- DoCastVictim(SPELL_FROSTBOLT);
- events.ScheduleEvent(EVENT_FROSTBOLT, 8s);
- break;
- case EVENT_FROST_NOVA:
- DoCast(me, SPELL_FROST_NOVA);
- events.ScheduleEvent(EVENT_FROST_NOVA, 15s);
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- if (!hp60Spectrals && HealthBelowPct(60))
- {
- Talk(SAY_SUMMON60);
- DoCastVictim(SPELL_FROST_SPECTRES);
- hp60Spectrals = true;
- }
+ events.Update(diff);
- if (!hp50 && HealthBelowPct(50))
- {
- Talk(SAY_HP);
- hp50 = true;
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (!hp30Spectrals && HealthBelowPct(30))
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- Talk(SAY_SUMMON30);
- DoCastVictim(SPELL_FROST_SPECTRES);
- hp30Spectrals = true;
+ case EVENT_AMNENNARS_WRATH:
+ DoCastVictim(SPELL_AMNENNARS_WRATH);
+ events.Repeat(12s);
+ break;
+ case EVENT_FROSTBOLT:
+ DoCastVictim(SPELL_FROSTBOLT);
+ events.Repeat(8s);
+ break;
+ case EVENT_FROST_NOVA:
+ DoCastSelf(SPELL_FROST_NOVA);
+ events.Repeat(15s);
+ break;
+
+ case EVENT_HEALTH_75:
+ Talk(SAY_HEALTH_75);
+ break;
+ case EVENT_HEALTH_60:
+ Talk(EMOTE_SUMMON);
+ Talk(SAY_SUMMON_60);
+ DoCastSelf(SPELL_SUMMON_FROST_SPECTRES);
+ break;
+ case EVENT_HEALTH_30:
+ Talk(EMOTE_SUMMON);
+ Talk(SAY_SUMMON_30);
+ DoCastSelf(SPELL_SUMMON_FROST_SPECTRES);
+ break;
+ default:
+ break;
}
- DoMeleeAttackIfReady();
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
- private:
- bool hp60Spectrals;
- bool hp30Spectrals;
- bool hp50;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetRazorfenDownsAI<boss_amnennar_the_coldbringerAI>(creature);
+ DoMeleeAttackIfReady();
}
+
+private:
+ uint8 _phase;
};
void AddSC_boss_amnennar_the_coldbringer()
{
- new boss_amnennar_the_coldbringer();
+ RegisterRazorfenDownsCreatureAI(boss_amnennar_the_coldbringer);
}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp
index fa29f1984db..beddbdc8a49 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp
@@ -19,89 +19,113 @@
#include "ScriptedCreature.h"
#include "razorfen_downs.h"
-enum Say
+enum GluttonTexts
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
- SAY_HP50 = 2,
- SAY_HP15 = 3
+ SAY_HEALTH_50 = 2,
+ SAY_HEALTH_15 = 3
};
-enum Spells
+enum GluttonSpells
{
+ SPELL_THRASH_15 = 8876,
SPELL_DISEASE_CLOUD = 12627,
+ SPELL_THRASH_35 = 12787,
SPELL_FRENZY = 12795
};
-class boss_glutton : public CreatureScript
+enum GluttonEvents
{
-public:
- boss_glutton() : CreatureScript("boss_glutton") { }
+ EVENT_HEALTH_50 = 1,
+ EVENT_HEALTH_15
+};
+
+enum GluttonPhases : uint8
+{
+ PHASE_NONE = 0,
+ PHASE_HEALTH_50,
+ PHASE_HEALTH_15
+};
- struct boss_gluttonAI : public BossAI
+// 8567 - Glutton
+struct boss_glutton : public BossAI
+{
+ boss_glutton(Creature* creature) : BossAI(creature, DATA_GLUTTON), _phase(PHASE_NONE) { }
+
+ void Reset() override
{
- boss_gluttonAI(Creature* creature) : BossAI(creature, DATA_GLUTTON)
- {
- hp50 = false;
- hp15 = false;
- }
+ _Reset();
+ _phase = PHASE_NONE;
+ DoCastSelf(SPELL_THRASH_15);
+ DoCastSelf(SPELL_DISEASE_CLOUD);
+ }
- void Reset() override
- {
- _Reset();
- hp50 = false;
- hp15 = false;
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+ }
- void JustEngagedWith(Unit* who) override
+ void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
+ {
+ if (_phase < PHASE_HEALTH_50 && me->HealthBelowPctDamaged(50, damage))
{
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
+ _phase++;
+ events.ScheduleEvent(EVENT_HEALTH_50, 0s);
}
- void KilledUnit(Unit* /*victim*/) override
+ if (_phase < PHASE_HEALTH_15 && me->HealthBelowPctDamaged(15, damage))
{
- Talk(SAY_SLAY);
+ _phase++;
+ events.ScheduleEvent(EVENT_HEALTH_15, 0s);
}
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- }
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(SAY_SLAY);
+ }
- void UpdateAI(uint32 /*diff*/) override
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- if (!hp50 && HealthBelowPct(50))
- {
- Talk(SAY_HP50);
- hp50 = true;
- }
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (!hp15 && HealthBelowPct(15))
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- Talk(SAY_HP15);
- DoCast(me, SPELL_FRENZY);
- hp15 = true;
+ case EVENT_HEALTH_50:
+ Talk(SAY_HEALTH_50);
+ me->RemoveAurasDueToSpell(SPELL_THRASH_15);
+ DoCastSelf(SPELL_THRASH_35);
+ break;
+ case EVENT_HEALTH_15:
+ Talk(SAY_HEALTH_15);
+ DoCastSelf(SPELL_FRENZY);
+ break;
+ default:
+ break;
}
- DoMeleeAttackIfReady();
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
- private:
- bool hp50;
- bool hp15;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetRazorfenDownsAI<boss_gluttonAI>(creature);
+ DoMeleeAttackIfReady();
}
+
+private:
+ uint8 _phase;
};
void AddSC_boss_glutton()
{
- new boss_glutton();
+ RegisterRazorfenDownsCreatureAI(boss_glutton);
}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
index fc642366dfd..f0164d32181 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
@@ -15,11 +15,15 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/*
+ * Timers requires update
+ */
+
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "razorfen_downs.h"
-enum Say
+enum MordreshTexts
{
SAY_OOC_1 = 0,
SAY_OOC_2 = 1,
@@ -27,113 +31,102 @@ enum Say
SAY_AGGRO = 3
};
-enum Spells
+enum MordreshSpells
{
SPELL_FIREBALL = 12466,
SPELL_FIRE_NOVA = 12470
};
-enum Events
+enum MordreshEvents
{
EVENT_OOC_1 = 1,
- EVENT_OOC_2 = 2,
- EVENT_OOC_3 = 3,
- EVENT_OOC_4 = 4,
- EVENT_FIREBALL = 5,
- EVENT_FIRE_NOVA = 6
+ EVENT_OOC_2,
+ EVENT_OOC_3,
+ EVENT_OOC_4,
+
+ EVENT_FIREBALL,
+ EVENT_FIRE_NOVA
};
-class boss_mordresh_fire_eye : public CreatureScript
+// 7357 - Mordresh Fire Eye
+struct boss_mordresh_fire_eye : public BossAI
{
-public:
- boss_mordresh_fire_eye() : CreatureScript("boss_mordresh_fire_eye") { }
+ boss_mordresh_fire_eye(Creature* creature) : BossAI(creature, DATA_MORDRESH_FIRE_EYE) { }
- struct boss_mordresh_fire_eyeAI : public BossAI
+ void Reset() override
{
- boss_mordresh_fire_eyeAI(Creature* creature) : BossAI(creature, DATA_MORDRESH_FIRE_EYE) { }
-
- void Reset() override
- {
- _Reset();
- events.ScheduleEvent(EVENT_OOC_1, 10s);
- }
+ _Reset();
+ events.ScheduleEvent(EVENT_OOC_1, 10s);
+ }
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.Reset();
- Talk(SAY_AGGRO);
- events.ScheduleEvent(EVENT_FIREBALL, 100ms);
- events.ScheduleEvent(EVENT_FIRE_NOVA, 8s, 12s);
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.Reset();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_FIREBALL, 0s);
+ events.ScheduleEvent(EVENT_FIRE_NOVA, 8s, 12s);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- }
+ void UpdateAI(uint32 diff) override
+ {
+ events.Update(diff);
- void UpdateAI(uint32 diff) override
+ if (!UpdateVictim())
{
- events.Update(diff);
-
- if (!UpdateVictim())
- {
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_OOC_1:
- Talk(SAY_OOC_1);
- events.ScheduleEvent(EVENT_OOC_2, 8s);
- break;
- case EVENT_OOC_2:
- Talk(SAY_OOC_2);
- events.ScheduleEvent(EVENT_OOC_3, 3s);
- break;
- case EVENT_OOC_3:
- me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
- events.ScheduleEvent(EVENT_OOC_4, 6s);
- break;
- case EVENT_OOC_4:
- Talk(SAY_OOC_3);
- events.ScheduleEvent(EVENT_OOC_1, 14s);
- break;
- }
- }
- return;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_FIREBALL:
- DoCastVictim(SPELL_FIREBALL);
- events.ScheduleEvent(EVENT_FIREBALL, 2400ms, 3800ms);
+ case EVENT_OOC_1:
+ Talk(SAY_OOC_1);
+ events.ScheduleEvent(EVENT_OOC_2, 8s);
+ break;
+ case EVENT_OOC_2:
+ Talk(SAY_OOC_2);
+ events.ScheduleEvent(EVENT_OOC_3, 3s);
+ break;
+ case EVENT_OOC_3:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
+ events.ScheduleEvent(EVENT_OOC_4, 6s);
break;
- case EVENT_FIRE_NOVA:
- DoCast(me, SPELL_FIRE_NOVA);
- events.ScheduleEvent(EVENT_FIRE_NOVA, 11s, 16s);
+ case EVENT_OOC_4:
+ Talk(SAY_OOC_3);
+ events.ScheduleEvent(EVENT_OOC_1, 14s);
break;
}
+ }
+ return;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FIREBALL:
+ DoCastVictim(SPELL_FIREBALL);
+ events.Repeat(2400ms, 3800ms);
+ break;
+ case EVENT_FIRE_NOVA:
+ DoCastSelf(SPELL_FIRE_NOVA);
+ events.Repeat(11s, 16s);
+ break;
+ default:
+ break;
}
- DoMeleeAttackIfReady();
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetRazorfenDownsAI<boss_mordresh_fire_eyeAI>(creature);
+ DoMeleeAttackIfReady();
}
};
void AddSC_boss_mordresh_fire_eye()
{
- new boss_mordresh_fire_eye();
+ RegisterRazorfenDownsCreatureAI(boss_mordresh_fire_eye);
}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
index 70ada5662e7..02399c70b0a 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
@@ -15,96 +15,82 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/*
+ * Timers requires update
+ */
+
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "razorfen_downs.h"
-enum Spells
+enum TutenkashSpells
{
- SPELL_THRASH = 8876,
- SPELL_WEB_SPRAY = 12252,
- SPELL_VIRULENT_POISON = 12254,
- SPELL_CURSE_OF_TUTENKASH = 12255
+ SPELL_VIRULENT_POISON = 12254,
+ SPELL_THRASH = 8876,
+ SPELL_WEB_SPRAY = 12252,
+ SPELL_CURSE_OF_TUTENKASH = 12255
};
-enum Events
+enum TutenkashEvents
{
- EVENT_WEB_SPRAY = 1,
- EVENT_CURSE_OF_TUTENKASH = 2
+ EVENT_WEB_SPRAY = 1,
+ EVENT_CURSE_OF_TUTENKASH
};
-class boss_tuten_kash : public CreatureScript
+// 7355 - Tuten'kash
+struct boss_tuten_kash : public BossAI
{
-public:
- boss_tuten_kash() : CreatureScript("boss_tuten_kash") { }
+ boss_tuten_kash(Creature* creature) : BossAI(creature, DATA_TUTEN_KASH) { }
- struct boss_tuten_kashAI : public BossAI
+ void Reset() override
{
- boss_tuten_kashAI(Creature* creature) : BossAI(creature, DATA_TUTEN_KASH) { }
+ _Reset();
+ DoCastSelf(SPELL_VIRULENT_POISON);
+ DoCastSelf(SPELL_THRASH);
+ }
- void Reset() override
- {
- _Reset();
- if (!me->HasAura(SPELL_THRASH))
- DoCast(me, SPELL_THRASH);
- if (!me->HasAura(SPELL_VIRULENT_POISON))
- DoCast(me, SPELL_VIRULENT_POISON);
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.ScheduleEvent(EVENT_WEB_SPRAY, 10s, 20s);
+ events.ScheduleEvent(EVENT_CURSE_OF_TUTENKASH, 10s, 15s);
+ }
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_WEB_SPRAY, 3s, 5s);
- events.ScheduleEvent(EVENT_CURSE_OF_TUTENKASH, 9s, 14s);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- }
+ events.Update(diff);
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- events.Update(diff);
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_WEB_SPRAY:
+ DoCastSelf(SPELL_WEB_SPRAY);
+ events.Repeat(15s, 25s);
+ break;
+ case EVENT_CURSE_OF_TUTENKASH:
+ DoCastSelf(SPELL_CURSE_OF_TUTENKASH);
+ events.Repeat(15s, 25s);
+ break;
+ default:
+ break;
+ }
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_WEB_SPRAY:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, false))
- {
- if (!target->HasAura(SPELL_WEB_SPRAY))
- DoCast(target, SPELL_WEB_SPRAY);
- }
- events.ScheduleEvent(EVENT_WEB_SPRAY, 6s, 8s);
- break;
- case EVENT_CURSE_OF_TUTENKASH:
- DoCast(me, SPELL_CURSE_OF_TUTENKASH);
- events.ScheduleEvent(EVENT_CURSE_OF_TUTENKASH, 15s, 25s);
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
- DoMeleeAttackIfReady();
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetRazorfenDownsAI<boss_tuten_kashAI>(creature);
+ DoMeleeAttackIfReady();
}
};
void AddSC_boss_tuten_kash()
{
- new boss_tuten_kash();
+ RegisterRazorfenDownsCreatureAI(boss_tuten_kash);
}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
index 1552b273406..61b5ac994c4 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
@@ -69,4 +69,7 @@ inline AI* GetRazorfenDownsAI(T* obj)
return GetInstanceAI<AI>(obj, RFDScriptName);
}
+#define RegisterRazorfenDownsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetRazorfenDownsAI)
+#define RegisterRazorfenDownsGameObjectAI(ai_name) RegisterGameObjectAIWithFactory(ai_name, GetRazorfenDownsAI)
+
#endif