diff --git a/data/sql/updates/pending_db_world/rev_1660588181530868400.sql b/data/sql/updates/pending_db_world/rev_1660588181530868400.sql new file mode 100644 index 000000000..b360abfeb --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1660588181530868400.sql @@ -0,0 +1,5 @@ +-- + +-- Immune to Taunt +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|256 WHERE `entry`=15509; + diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp index 5a2d7255b..75959e85a 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp @@ -15,130 +15,115 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Huhuran -SD%Complete: 100 -SDComment: -SDCategory: Temple of Ahn'Qiraj -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" +#include "SpellAuras.h" #include "temple_of_ahnqiraj.h" -enum Huhuran +enum Emotes { EMOTE_FRENZY_KILL = 0, - EMOTE_BERSERK = 1, - - SPELL_FRENZY = 26051, - SPELL_BERSERK = 26068, - SPELL_POISONBOLT = 26052, - SPELL_NOXIOUSPOISON = 26053, - SPELL_WYVERNSTING = 26180, - SPELL_ACIDSPIT = 26050, - SPELL_WYVERN_STING_DAMAGE = 26233 + EMOTE_BERSERK = 1 }; -struct boss_huhuran : public ScriptedAI +enum Spells { - boss_huhuran(Creature* creature) : ScriptedAI(creature) { } + SPELL_FRENZY = 26051, // triggers SPELL_POISON_BOLT + SPELL_BERSERK = 26068, // triggers SPELL_POISON_BOLT + SPELL_NOXIOUS_POISON = 26053, + SPELL_WYVERN_STING = 26180, + SPELL_ACID_SPIT = 26050, + SPELL_WYVERN_STING_DAMAGE = 26233, + SPELL_POISON_BOLT = 26052, + SPELL_HARD_ENRAGE = 26662 +}; - uint32 Frenzy_Timer; - uint32 Wyvern_Timer; - uint32 Spit_Timer; - uint32 PoisonBolt_Timer; - uint32 NoxiousPoison_Timer; - uint32 FrenzyBack_Timer; +enum Events +{ + EVENT_FRENZY = 1, + EVENT_WYVERN_STING = 2, + EVENT_ACID_SPIT = 3, + EVENT_NOXIOUS_POISON = 4, + EVENT_HARD_ENRAGE = 5 +}; - bool Frenzy; - bool Berserk; +struct boss_huhuran : public BossAI +{ + boss_huhuran(Creature* creature) : BossAI(creature, DATA_HUHURAN) { } void Reset() override { - Frenzy_Timer = urand(25000, 35000); - Wyvern_Timer = urand(18000, 28000); - Spit_Timer = 8000; - PoisonBolt_Timer = 4000; - NoxiousPoison_Timer = urand(10000, 20000); - FrenzyBack_Timer = 15000; + _Reset(); + _berserk = false; + _hardEnrage = false; + } - Frenzy = false; - Berserk = false; + void EnterCombat(Unit* /*who*/) override + { + events.ScheduleEvent(EVENT_FRENZY, urand(25000, 35000)); + events.ScheduleEvent(EVENT_WYVERN_STING, urand(18000, 28000)); + events.ScheduleEvent(EVENT_ACID_SPIT, 8000); + events.ScheduleEvent(EVENT_NOXIOUS_POISON, urand(10000, 20000)); + events.ScheduleEvent(EVENT_HARD_ENRAGE, 300000); + } + + void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override + { + if (!_berserk && HealthBelowPct(30)) + { + DoCastSelf(SPELL_BERSERK, true); + me->TextEmote(EMOTE_BERSERK); + _berserk = true; + } } void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; - //Frenzy_Timer - if (!Frenzy && Frenzy_Timer <= diff) + events.Update(diff); + while (uint32 eventid = events.ExecuteEvent()) { - DoCast(me, SPELL_FRENZY); - Talk(EMOTE_FRENZY_KILL); - Frenzy = true; - PoisonBolt_Timer = 3000; - Frenzy_Timer = urand(25000, 35000); - } - else Frenzy_Timer -= diff; - - // Wyvern Timer - if (Wyvern_Timer <= diff) - { - DoCastAOE(SPELL_WYVERNSTING); - Wyvern_Timer = urand(15000, 32000); - } - else Wyvern_Timer -= diff; - - //Spit Timer - if (Spit_Timer <= diff) - { - DoCastVictim(SPELL_ACIDSPIT); - Spit_Timer = urand(5000, 10000); - } - else Spit_Timer -= diff; - - //NoxiousPoison_Timer - if (NoxiousPoison_Timer <= diff) - { - DoCastVictim(SPELL_NOXIOUSPOISON); - NoxiousPoison_Timer = urand(12000, 24000); - } - else NoxiousPoison_Timer -= diff; - - //PoisonBolt only if frenzy or berserk - if (Frenzy || Berserk) - { - if (PoisonBolt_Timer <= diff) + switch (eventid) { - DoCastVictim(SPELL_POISONBOLT); - PoisonBolt_Timer = 3000; + case EVENT_FRENZY: + DoCastSelf(SPELL_FRENZY, true); + Talk(EMOTE_FRENZY_KILL); + events.RepeatEvent(urand(25000, 35000)); + break; + case EVENT_WYVERN_STING: + me->CastCustomSpell(SPELL_WYVERN_STING, SPELLVALUE_MAX_TARGETS, 10, me, true); + events.RepeatEvent(urand(15000, 32000)); + break; + case EVENT_ACID_SPIT: + DoCastVictim(SPELL_ACID_SPIT); + events.RepeatEvent(urand(5000, 10000)); + break; + case EVENT_NOXIOUS_POISON: + DoCastRandomTarget(SPELL_NOXIOUS_POISON, 0, 100, true); + events.RepeatEvent(urand(12000, 24000)); + break; + case EVENT_HARD_ENRAGE: + if (!_hardEnrage) + { + DoCastSelf(SPELL_HARD_ENRAGE, true); + _hardEnrage = true; + } + else + { + DoCastAOE(SPELL_POISON_BOLT); + } + events.RepeatEvent(3000); + break; } - else PoisonBolt_Timer -= diff; } - - //FrenzyBack_Timer - if (Frenzy && FrenzyBack_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - Frenzy = false; - FrenzyBack_Timer = 15000; - } - else FrenzyBack_Timer -= diff; - - if (!Berserk && HealthBelowPct(31)) - { - me->InterruptNonMeleeSpells(false); - Talk(EMOTE_BERSERK); - DoCast(me, SPELL_BERSERK); - Berserk = true; - } - DoMeleeAttackIfReady(); } + private: + bool _berserk; + bool _hardEnrage; }; // 26180 - Wyvern Sting @@ -146,17 +131,20 @@ class spell_huhuran_wyvern_sting : public AuraScript { PrepareAuraScript(spell_huhuran_wyvern_sting); - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - if (Unit* caster = GetCaster()) + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) // dispelled { - caster->CastCustomSpell(SPELL_WYVERN_STING_DAMAGE, SPELLVALUE_BASE_POINT0, 3000, GetUnitOwner(), true); + if (Unit* caster = GetCaster()) + { + caster->CastCustomSpell(SPELL_WYVERN_STING_DAMAGE, SPELLVALUE_BASE_POINT0, 3000, GetUnitOwner(), true); + } } } void Register() override { - AfterEffectRemove += AuraEffectRemoveFn(spell_huhuran_wyvern_sting::HandleRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_huhuran_wyvern_sting::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); } }; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp index 28500c59f..afa17a879 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp @@ -15,13 +15,6 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Instance_Temple_of_Ahnqiraj -SD%Complete: 80 -SDComment: -SDCategory: Temple of Ahn'Qiraj -EndScriptData */ - #include "InstanceScript.h" #include "Player.h" #include "ScriptMgr.h" @@ -55,7 +48,6 @@ public: //If Vem is dead... bool IsBossDied[3]; - //Storing Skeram, Vem and Kri. ObjectGuid SkeramGUID; ObjectGuid VemGUID; ObjectGuid KriGUID; @@ -63,9 +55,7 @@ public: ObjectGuid VeklorGUID; ObjectGuid VeknilashGUID; ObjectGuid ViscidusGUID; - uint32 BugTrioDeathCount; - uint32 CthunPhase; void Initialize() override @@ -73,9 +63,7 @@ public: IsBossDied[0] = false; IsBossDied[1] = false; IsBossDied[2] = false; - BugTrioDeathCount = 0; - CthunPhase = 0; } @@ -155,7 +143,6 @@ public: case DATA_VISCIDUS: return ViscidusGUID; } - return ObjectGuid::Empty; } @@ -169,15 +156,12 @@ public: else BugTrioDeathCount = 0; break; - case DATA_VEKLOR_DEATH: IsBossDied[1] = true; break; - case DATA_VEKNILASH_DEATH: IsBossDied[2] = true; break; - case DATA_CTHUN_PHASE: CthunPhase = data; break; @@ -225,7 +209,6 @@ public: } } } - return true; } }; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h index 2137e3162..5b097f344 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h @@ -71,6 +71,7 @@ enum Creatures NPC_VEM = 15544, NPC_KRI = 15511, NPC_YAUJ = 15543, + NPC_HUHURAN = 15509, NPC_VEKLOR = 15276, NPC_VEKNILASH = 15275, NPC_OURO = 15517,