fix(Core/ZulGurub): Hakkar improvements (#12134)

* fix(Core/ZulGurub): Hakkar improvements

* remove debug

* code improvements

* just select the current victim for cause insanity

* remove will of hakkar <.<

* aspect of arlokk and marli should do a threat wipe

* dumb
This commit is contained in:
Nefertumm
2022-06-26 04:47:08 -03:00
committed by GitHub
parent 68d026e8ac
commit 64a0cbba5a
3 changed files with 75 additions and 22 deletions
@@ -0,0 +1,4 @@
--
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_hakkar_blood_siphon');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(24324, 'spell_hakkar_blood_siphon');
@@ -4295,6 +4295,12 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_0].MiscValueB = 844; spellInfo->Effects[EFFECT_0].MiscValueB = 844;
}); });
// Hakkar Cause Insanity
ApplySpellFix({ 24327 }, [](SpellInfo* spellInfo)
{
spellInfo->Dispel = DISPEL_NONE;
});
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{ {
SpellInfo* spellInfo = mSpellInfoMap[i]; SpellInfo* spellInfo = mSpellInfoMap[i];
@@ -25,6 +25,7 @@ Category: Zul'Gurub
#include "Player.h" #include "Player.h"
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "SpellScript.h"
#include "zulgurub.h" #include "zulgurub.h"
enum Says enum Says
@@ -37,10 +38,12 @@ enum Says
enum Spells enum Spells
{ {
SPELL_BLOOD_SIPHON = 24322, // Buggy ? SPELL_POISONOUS_BLOOD = 24321,
SPELL_BLOOD_SIPHON_HEAL = 24322,
SPELL_BLOOD_SIPHON_DMG = 24323,
SPELL_BLOOD_SIPHON = 24324,
SPELL_CORRUPTED_BLOOD = 24328, SPELL_CORRUPTED_BLOOD = 24328,
SPELL_CAUSE_INSANITY = 24327, SPELL_CAUSE_INSANITY = 24327,
SPELL_WILL_OF_HAKKAR = 24178,
SPELL_ENRAGE = 24318, SPELL_ENRAGE = 24318,
// The Aspects of all High Priests spells // The Aspects of all High Priests spells
SPELL_ASPECT_OF_JEKLIK = 24687, SPELL_ASPECT_OF_JEKLIK = 24687,
@@ -55,14 +58,13 @@ enum Events
EVENT_BLOOD_SIPHON = 1, EVENT_BLOOD_SIPHON = 1,
EVENT_CORRUPTED_BLOOD = 2, EVENT_CORRUPTED_BLOOD = 2,
EVENT_CAUSE_INSANITY = 3, EVENT_CAUSE_INSANITY = 3,
EVENT_WILL_OF_HAKKAR = 4, EVENT_ENRAGE = 4,
EVENT_ENRAGE = 5,
// The Aspects of all High Priests events // The Aspects of all High Priests events
EVENT_ASPECT_OF_JEKLIK = 6, EVENT_ASPECT_OF_JEKLIK = 5,
EVENT_ASPECT_OF_VENOXIS = 7, EVENT_ASPECT_OF_VENOXIS = 6,
EVENT_ASPECT_OF_MARLI = 8, EVENT_ASPECT_OF_MARLI = 7,
EVENT_ASPECT_OF_THEKAL = 9, EVENT_ASPECT_OF_THEKAL = 8,
EVENT_ASPECT_OF_ARLOKK = 10 EVENT_ASPECT_OF_ARLOKK = 9
}; };
class boss_hakkar : public CreatureScript class boss_hakkar : public CreatureScript
@@ -74,6 +76,16 @@ public:
{ {
boss_hakkarAI(Creature* creature) : BossAI(creature, DATA_HAKKAR) { } boss_hakkarAI(Creature* creature) : BossAI(creature, DATA_HAKKAR) { }
bool CheckInRoom() override
{
if (me->GetPositionZ() < 52.f || me->GetPositionZ() > 57.28f)
{
BossAI::EnterEvadeMode(EVADE_REASON_BOUNDARY);
return false;
}
return true;
}
void Reset() override void Reset() override
{ {
_Reset(); _Reset();
@@ -90,7 +102,6 @@ public:
events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000); events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000);
events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, 25000); events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, 25000);
events.ScheduleEvent(EVENT_CAUSE_INSANITY, 17000); events.ScheduleEvent(EVENT_CAUSE_INSANITY, 17000);
events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, 17000);
events.ScheduleEvent(EVENT_ENRAGE, 600000); events.ScheduleEvent(EVENT_ENRAGE, 600000);
if (instance->GetBossState(DATA_JEKLIK) != DONE) if (instance->GetBossState(DATA_JEKLIK) != DONE)
events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 4000); events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 4000);
@@ -107,7 +118,7 @@ public:
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (!UpdateVictim()) if (!UpdateVictim() || !CheckInRoom())
return; return;
events.Update(diff); events.Update(diff);
@@ -120,7 +131,7 @@ public:
switch (eventId) switch (eventId)
{ {
case EVENT_BLOOD_SIPHON: case EVENT_BLOOD_SIPHON:
DoCastVictim(SPELL_BLOOD_SIPHON, true); DoCastAOE(SPELL_BLOOD_SIPHON, true);
events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000); events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000);
break; break;
case EVENT_CORRUPTED_BLOOD: case EVENT_CORRUPTED_BLOOD:
@@ -128,20 +139,15 @@ public:
events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, urand(30000, 45000)); events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, urand(30000, 45000));
break; break;
case EVENT_CAUSE_INSANITY: case EVENT_CAUSE_INSANITY:
if (Unit* victim = SelectTarget(SelectTargetMethod::MaxThreat, 0)) if (Unit* victim = SelectTarget(SelectTargetMethod::MaxThreat, 0, 30.f, true))
{ {
DoCast(victim, SPELL_CAUSE_INSANITY, true); DoCast(victim, SPELL_CAUSE_INSANITY);
} }
events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000)); events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000));
break; break;
case EVENT_WILL_OF_HAKKAR:
// Xinef: Skip Tank
DoCast(SelectTarget(SelectTargetMethod::Random, 1, 100, true), SPELL_WILL_OF_HAKKAR);
events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, urand(25000, 35000));
break;
case EVENT_ENRAGE: case EVENT_ENRAGE:
if (!me->HasAura(SPELL_ENRAGE)) if (!me->HasAura(SPELL_ENRAGE))
DoCast(me, SPELL_ENRAGE); DoCastSelf(SPELL_ENRAGE);
events.ScheduleEvent(EVENT_ENRAGE, 90000); events.ScheduleEvent(EVENT_ENRAGE, 90000);
break; break;
case EVENT_ASPECT_OF_JEKLIK: case EVENT_ASPECT_OF_JEKLIK:
@@ -153,7 +159,11 @@ public:
events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 8000); events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 8000);
break; break;
case EVENT_ASPECT_OF_MARLI: case EVENT_ASPECT_OF_MARLI:
DoCastVictim(SPELL_ASPECT_OF_MARLI, true); if (Unit* victim = SelectTarget(SelectTargetMethod::MaxThreat, 0, 5.f, true))
{
DoCast(victim, SPELL_ASPECT_OF_MARLI, true);
me->GetThreatMgr().modifyThreatPercent(victim, -100.f);
}
events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 10000); events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 10000);
break; break;
case EVENT_ASPECT_OF_THEKAL: case EVENT_ASPECT_OF_THEKAL:
@@ -161,7 +171,11 @@ public:
events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 15000); events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 15000);
break; break;
case EVENT_ASPECT_OF_ARLOKK: case EVENT_ASPECT_OF_ARLOKK:
DoCastVictim(SPELL_ASPECT_OF_ARLOKK, true); if (Unit* victim = SelectTarget(SelectTargetMethod::MaxThreat, 0, 5.f, true))
{
DoCast(victim, SPELL_ASPECT_OF_ARLOKK, true);
me->GetThreatMgr().modifyThreatPercent(victim, -100.f);
}
events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, urand(10000, 15000)); events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, urand(10000, 15000));
break; break;
default: default:
@@ -228,9 +242,38 @@ public:
} }
}; };
class spell_hakkar_blood_siphon : public SpellScript
{
PrepareSpellScript(spell_hakkar_blood_siphon);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_BLOOD_SIPHON_HEAL, SPELL_BLOOD_SIPHON_DMG });
}
void OnSpellHit()
{
Unit* caster = GetCaster();
Unit* target = GetHitUnit();
if (!caster || !target)
return;
if (target->HasAura(SPELL_POISONOUS_BLOOD))
target->CastSpell(caster, SPELL_BLOOD_SIPHON_DMG, true);
else
target->CastSpell(caster, SPELL_BLOOD_SIPHON_HEAL, true);
}
void Register() override
{
OnHit += SpellHitFn(spell_hakkar_blood_siphon::OnSpellHit);
}
};
void AddSC_boss_hakkar() void AddSC_boss_hakkar()
{ {
new boss_hakkar(); new boss_hakkar();
new at_zulgurub_entrance_speech(); new at_zulgurub_entrance_speech();
new at_zulgurub_temple_speech(); new at_zulgurub_temple_speech();
RegisterSpellScript(spell_hakkar_blood_siphon);
} }