fix(Scripts/TempleOfAhnQiraj): Improve Princess Huhuran (#12747)

This commit is contained in:
Eddy Vega
2022-08-21 12:56:38 -06:00
committed by GitHub
parent fef8289c9d
commit 9d16705d9f
4 changed files with 93 additions and 116 deletions
@@ -0,0 +1,5 @@
--
-- Immune to Taunt
UPDATE `creature_template` SET `flags_extra`=`flags_extra`|256 WHERE `entry`=15509;
@@ -15,130 +15,115 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* ScriptData
SDName: Boss_Huhuran
SD%Complete: 100
SDComment:
SDCategory: Temple of Ahn'Qiraj
EndScriptData */
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "SpellScript.h" #include "SpellScript.h"
#include "SpellAuras.h"
#include "temple_of_ahnqiraj.h" #include "temple_of_ahnqiraj.h"
enum Huhuran enum Emotes
{ {
EMOTE_FRENZY_KILL = 0, EMOTE_FRENZY_KILL = 0,
EMOTE_BERSERK = 1, 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
}; };
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; enum Events
uint32 Wyvern_Timer; {
uint32 Spit_Timer; EVENT_FRENZY = 1,
uint32 PoisonBolt_Timer; EVENT_WYVERN_STING = 2,
uint32 NoxiousPoison_Timer; EVENT_ACID_SPIT = 3,
uint32 FrenzyBack_Timer; EVENT_NOXIOUS_POISON = 4,
EVENT_HARD_ENRAGE = 5
};
bool Frenzy; struct boss_huhuran : public BossAI
bool Berserk; {
boss_huhuran(Creature* creature) : BossAI(creature, DATA_HUHURAN) { }
void Reset() override void Reset() override
{ {
Frenzy_Timer = urand(25000, 35000); _Reset();
Wyvern_Timer = urand(18000, 28000); _berserk = false;
Spit_Timer = 8000; _hardEnrage = false;
PoisonBolt_Timer = 4000; }
NoxiousPoison_Timer = urand(10000, 20000);
FrenzyBack_Timer = 15000;
Frenzy = false; void EnterCombat(Unit* /*who*/) override
Berserk = false; {
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 void UpdateAI(uint32 diff) override
{ {
//Return since we have no target
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
//Frenzy_Timer events.Update(diff);
if (!Frenzy && Frenzy_Timer <= diff) while (uint32 eventid = events.ExecuteEvent())
{ {
DoCast(me, SPELL_FRENZY); switch (eventid)
{
case EVENT_FRENZY:
DoCastSelf(SPELL_FRENZY, true);
Talk(EMOTE_FRENZY_KILL); Talk(EMOTE_FRENZY_KILL);
Frenzy = true; events.RepeatEvent(urand(25000, 35000));
PoisonBolt_Timer = 3000; break;
Frenzy_Timer = urand(25000, 35000); case EVENT_WYVERN_STING:
} me->CastCustomSpell(SPELL_WYVERN_STING, SPELLVALUE_MAX_TARGETS, 10, me, true);
else Frenzy_Timer -= diff; events.RepeatEvent(urand(15000, 32000));
break;
// Wyvern Timer case EVENT_ACID_SPIT:
if (Wyvern_Timer <= diff) 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)
{ {
DoCastAOE(SPELL_WYVERNSTING); DoCastSelf(SPELL_HARD_ENRAGE, true);
Wyvern_Timer = urand(15000, 32000); _hardEnrage = true;
} }
else Wyvern_Timer -= diff; else
//Spit Timer
if (Spit_Timer <= diff)
{ {
DoCastVictim(SPELL_ACIDSPIT); DoCastAOE(SPELL_POISON_BOLT);
Spit_Timer = urand(5000, 10000);
} }
else Spit_Timer -= diff; events.RepeatEvent(3000);
break;
//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)
{
DoCastVictim(SPELL_POISONBOLT);
PoisonBolt_Timer = 3000;
} }
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(); DoMeleeAttackIfReady();
} }
private:
bool _berserk;
bool _hardEnrage;
}; };
// 26180 - Wyvern Sting // 26180 - Wyvern Sting
@@ -146,17 +131,20 @@ class spell_huhuran_wyvern_sting : public AuraScript
{ {
PrepareAuraScript(spell_huhuran_wyvern_sting); PrepareAuraScript(spell_huhuran_wyvern_sting);
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) // dispelled
{ {
if (Unit* caster = GetCaster()) if (Unit* caster = GetCaster())
{ {
caster->CastCustomSpell(SPELL_WYVERN_STING_DAMAGE, SPELLVALUE_BASE_POINT0, 3000, GetUnitOwner(), true); caster->CastCustomSpell(SPELL_WYVERN_STING_DAMAGE, SPELLVALUE_BASE_POINT0, 3000, GetUnitOwner(), true);
} }
} }
}
void Register() override 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);
} }
}; };
@@ -15,13 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* ScriptData
SDName: Instance_Temple_of_Ahnqiraj
SD%Complete: 80
SDComment:
SDCategory: Temple of Ahn'Qiraj
EndScriptData */
#include "InstanceScript.h" #include "InstanceScript.h"
#include "Player.h" #include "Player.h"
#include "ScriptMgr.h" #include "ScriptMgr.h"
@@ -55,7 +48,6 @@ public:
//If Vem is dead... //If Vem is dead...
bool IsBossDied[3]; bool IsBossDied[3];
//Storing Skeram, Vem and Kri.
ObjectGuid SkeramGUID; ObjectGuid SkeramGUID;
ObjectGuid VemGUID; ObjectGuid VemGUID;
ObjectGuid KriGUID; ObjectGuid KriGUID;
@@ -63,9 +55,7 @@ public:
ObjectGuid VeklorGUID; ObjectGuid VeklorGUID;
ObjectGuid VeknilashGUID; ObjectGuid VeknilashGUID;
ObjectGuid ViscidusGUID; ObjectGuid ViscidusGUID;
uint32 BugTrioDeathCount; uint32 BugTrioDeathCount;
uint32 CthunPhase; uint32 CthunPhase;
void Initialize() override void Initialize() override
@@ -73,9 +63,7 @@ public:
IsBossDied[0] = false; IsBossDied[0] = false;
IsBossDied[1] = false; IsBossDied[1] = false;
IsBossDied[2] = false; IsBossDied[2] = false;
BugTrioDeathCount = 0; BugTrioDeathCount = 0;
CthunPhase = 0; CthunPhase = 0;
} }
@@ -155,7 +143,6 @@ public:
case DATA_VISCIDUS: case DATA_VISCIDUS:
return ViscidusGUID; return ViscidusGUID;
} }
return ObjectGuid::Empty; return ObjectGuid::Empty;
} }
@@ -169,15 +156,12 @@ public:
else else
BugTrioDeathCount = 0; BugTrioDeathCount = 0;
break; break;
case DATA_VEKLOR_DEATH: case DATA_VEKLOR_DEATH:
IsBossDied[1] = true; IsBossDied[1] = true;
break; break;
case DATA_VEKNILASH_DEATH: case DATA_VEKNILASH_DEATH:
IsBossDied[2] = true; IsBossDied[2] = true;
break; break;
case DATA_CTHUN_PHASE: case DATA_CTHUN_PHASE:
CthunPhase = data; CthunPhase = data;
break; break;
@@ -225,7 +209,6 @@ public:
} }
} }
} }
return true; return true;
} }
}; };
@@ -71,6 +71,7 @@ enum Creatures
NPC_VEM = 15544, NPC_VEM = 15544,
NPC_KRI = 15511, NPC_KRI = 15511,
NPC_YAUJ = 15543, NPC_YAUJ = 15543,
NPC_HUHURAN = 15509,
NPC_VEKLOR = 15276, NPC_VEKLOR = 15276,
NPC_VEKNILASH = 15275, NPC_VEKNILASH = 15275,
NPC_OURO = 15517, NPC_OURO = 15517,