diff options
author | offl <11556157+offl@users.noreply.github.com> | 2025-09-05 00:13:36 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-04 23:13:36 +0200 |
commit | d5921303b7b7013c14e26c81de99ef3a0a171c5f (patch) | |
tree | 3f6932de645f539608b2597624df3c18d05dfee2 | |
parent | ac1c9b862cceebe4aa9110b1e31775e6d00606a0 (diff) |
Scripts/RazorfenDowns: Modernize scripts (#31145)
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 |