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,