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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user