EverWrath/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp

274 lines
9.6 KiB
C++

/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "CreatureScript.h"
#include "ScriptedCreature.h"
#include "SpellScriptLoader.h"
#include "drak_tharon_keep.h"
#include "SpellScript.h"
enum Yells
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_FLESH = 2,
SAY_SKELETON = 3,
SAY_DEATH = 4
};
enum Spells
{
SPELL_CURSE_OF_LIFE = 49527,
SPELL_SHADOW_VOLLEY = 49528,
// flesh spells
SPELL_EYE_BEAM = 49544,
SPELL_LIGHTNING_BREATH = 49537,
SPELL_POISON_CLOUD = 49548,
SPELL_TURN_FLESH = 49356,
SPELL_TURN_BONES = 53463,
SPELL_GIFT_OF_THARON_JA = 52509,
SPELL_DUMMY = 49551,
SPELL_FLESH_VISUAL = 52582,
SPELL_CLEAR_GIFT = 53242,
SPELL_ACHIEVEMENT_CHECK = 61863
};
enum Misc
{
ACTION_TURN_BONES = 1,
EVENT_SPELL_CURSE_OF_LIFE = 1,
EVENT_SPELL_SHADOW_VOLLEY = 3,
EVENT_SPELL_EYE_BEAM = 4,
EVENT_SPELL_LIGHTNING_BREATH = 5,
EVENT_SPELL_POISON_CLOUD = 6,
EVENT_SPELL_TURN_FLESH = 7,
EVENT_TURN_FLESH_REAL = 9,
EVENT_TURN_BONES_REAL = 10,
EVENT_KILL_TALK = 11
};
class boss_tharon_ja : public CreatureScript
{
public:
boss_tharon_ja() : CreatureScript("boss_tharon_ja") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetDraktharonKeepAI<boss_tharon_jaAI>(creature);
}
struct boss_tharon_jaAI : public BossAI
{
boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA)
{
}
void Reset() override
{
BossAI::Reset();
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
me->SetDisplayId(me->GetNativeDisplayId());
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 5s);
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 8s, 10s);
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1s);
}
void KilledUnit(Unit* /*victim*/) override
{
if (!events.HasTimeUntilEvent(EVENT_KILL_TALK))
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
}
}
void DoAction(int32 param) override
{
if (param == ACTION_TURN_BONES && me->IsAlive())
{
Talk(SAY_SKELETON);
events.Reset();
events.ScheduleEvent(EVENT_TURN_BONES_REAL, 3s);
}
}
void JustDied(Unit* killer) override
{
Talk(SAY_DEATH);
BossAI::JustDied(killer);
me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true);
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
if (me->GetDisplayId() != me->GetNativeDisplayId())
{
me->SetDisplayId(me->GetNativeDisplayId());
me->CastSpell(me, SPELL_FLESH_VISUAL, true);
}
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_CURSE_OF_LIFE:
DoCastRandomTarget(SPELL_CURSE_OF_LIFE, 0, 30.0f, false);
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13s);
break;
case EVENT_SPELL_SHADOW_VOLLEY:
DoCastAOE(SPELL_SHADOW_VOLLEY);
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 9s);
break;
case EVENT_SPELL_TURN_FLESH:
if (me->HealthBelowPct(50))
{
Talk(SAY_FLESH);
me->GetThreatMgr().ResetAllThreat();
me->CastSpell((Unit*)nullptr, SPELL_TURN_FLESH, false);
events.Reset();
events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3s);
return;
}
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1s);
break;
case EVENT_TURN_FLESH_REAL:
DoCastSelf(SPELL_DUMMY, true);
me->ResumeChasingVictim();
events.ScheduleEvent(EVENT_SPELL_EYE_BEAM, 11s);
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 3s);
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 6s);
break;
case EVENT_SPELL_EYE_BEAM:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f, true))
me->CastSpell(target, SPELL_EYE_BEAM, false);
break;
case EVENT_SPELL_LIGHTNING_BREATH:
me->CastSpell(me->GetVictim(), SPELL_LIGHTNING_BREATH, false);
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 8s);
break;
case EVENT_SPELL_POISON_CLOUD:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f, true))
me->CastSpell(target, SPELL_POISON_CLOUD, false);
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 10s);
break;
case EVENT_TURN_BONES_REAL:
me->SetDisplayId(me->GetNativeDisplayId());
me->CastSpell(me, SPELL_FLESH_VISUAL, true);
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
events.Reset();
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 1s);
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 8s, 10s);
break;
}
DoMeleeAttackIfReady();
}
};
};
class spell_tharon_ja_curse_of_life_aura : public AuraScript
{
PrepareAuraScript(spell_tharon_ja_curse_of_life_aura);
void OnPeriodic(AuraEffect const* /*aurEff*/)
{
if (GetUnitOwner()->HealthBelowPct(50))
{
PreventDefaultAction();
SetDuration(0);
}
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_tharon_ja_curse_of_life_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
}
};
class spell_tharon_ja_dummy_aura : public AuraScript
{
PrepareAuraScript(spell_tharon_ja_dummy_aura);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_FLESH_VISUAL, SPELL_GIFT_OF_THARON_JA, SPELL_TURN_BONES });
}
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
PreventDefaultAction();
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLESH_VISUAL, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_GIFT_OF_THARON_JA, true);
GetUnitOwner()->SetDisplayId(GetUnitOwner()->GetNativeDisplayId() + 1);
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
PreventDefaultAction();
GetUnitOwner()->GetThreatMgr().ResetAllThreat();
GetUnitOwner()->CastSpell((Unit*)nullptr, SPELL_TURN_BONES, false);
GetUnitOwner()->GetAI()->DoAction(ACTION_TURN_BONES);
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_tharon_ja_dummy_aura::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
OnEffectRemove += AuraEffectRemoveFn(spell_tharon_ja_dummy_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
class spell_tharon_ja_clear_gift_of_tharon_ja : public SpellScript
{
PrepareSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja);
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
target->RemoveAura(SPELL_GIFT_OF_THARON_JA);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_tharon_ja_clear_gift_of_tharon_ja::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_boss_tharon_ja()
{
new boss_tharon_ja();
RegisterSpellScript(spell_tharon_ja_curse_of_life_aura);
RegisterSpellScript(spell_tharon_ja_dummy_aura);
RegisterSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja);
}