/*
* This file is part of the TrinityCore 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 General Public License as published by the
* Free Software Foundation; either version 2 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 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 .
*/
#include "ScriptMgr.h"
#include "magisters_terrace.h"
#include "MotionMaster.h"
#include "ScriptedCreature.h"
enum Yells
{
SAY_AGGRO = 0,
SAY_ENERGY = 1,
SAY_OVERLOAD = 2,
SAY_KILL = 3,
EMOTE_DISCHARGE_ENERGY = 4
//is this text for real?
//#define SAY_DEATH "What...happen...ed."
};
enum Spells
{
SPELL_CHAIN_LIGHTNING = 44318,
SPELL_OVERLOAD = 44353,
SPELL_ARCANE_SHOCK = 44319,
SPELL_SUMMON_PURE_ENERGY = 44322, // mod scale -10
H_SPELL_SUMMON_PURE_ENERGY1 = 46154, // mod scale -5
H_SPELL_SUMMON_PURE_ENERGY2 = 46159 // mod scale -5
};
enum Events
{
EVENT_ENERGY_BOLT = 1,
EVENT_ENERGY_FEEDBACK,
EVENT_CHAIN_LIGHTNING,
EVENT_OVERLOAD,
EVENT_ARCANE_SHOCK
};
enum Misc
{
INTERVAL_MODIFIER = 15,
INTERVAL_SWITCH = 6
};
class boss_vexallus : public CreatureScript
{
public:
boss_vexallus() : CreatureScript("boss_vexallus") { }
struct boss_vexallusAI : public BossAI
{
boss_vexallusAI(Creature* creature) : BossAI(creature, DATA_VEXALLUS)
{
_intervalHealthAmount = 1;
_enraged = false;
}
void Reset() override
{
_Reset();
_intervalHealthAmount = 1;
_enraged = false;
}
void KilledUnit(Unit* /*victim*/) override
{
Talk(SAY_KILL);
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 8s);
events.ScheduleEvent(EVENT_ARCANE_SHOCK, 5s);
}
void JustSummoned(Creature* summoned) override
{
if (Unit* temp = SelectTarget(SelectTargetMethod::Random, 0))
summoned->GetMotionMaster()->MoveFollow(temp, 0, 0);
summons.Summon(summoned);
}
void DamageTaken(Unit* /*who*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
if (_enraged)
return;
// 85%, 70%, 55%, 40%, 25%
if (!HealthAbovePct(100 - INTERVAL_MODIFIER * _intervalHealthAmount))
{
// increase amount, unless we're at 10%, then we switch and return
if (_intervalHealthAmount == INTERVAL_SWITCH)
{
_enraged = true;
events.Reset();
events.ScheduleEvent(EVENT_OVERLOAD, 1200ms);
return;
}
else
++_intervalHealthAmount;
Talk(SAY_ENERGY);
Talk(EMOTE_DISCHARGE_ENERGY);
if (IsHeroic())
{
DoCast(me, H_SPELL_SUMMON_PURE_ENERGY1);
DoCast(me, H_SPELL_SUMMON_PURE_ENERGY2);
}
else
DoCast(me, SPELL_SUMMON_PURE_ENERGY);
}
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CHAIN_LIGHTNING:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
DoCast(target, SPELL_CHAIN_LIGHTNING);
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 8s);
break;
case EVENT_ARCANE_SHOCK:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true))
DoCast(target, SPELL_ARCANE_SHOCK);
events.ScheduleEvent(EVENT_ARCANE_SHOCK, 8s);
break;
case EVENT_OVERLOAD:
DoCastVictim(SPELL_OVERLOAD);
events.ScheduleEvent(EVENT_OVERLOAD, 2s);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
}
private:
uint32 _intervalHealthAmount;
bool _enraged;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetMagistersTerraceAI(creature);
};
};
enum NpcPureEnergy
{
SPELL_ENERGY_BOLT = 46156,
SPELL_ENERGY_FEEDBACK = 44335,
SPELL_PURE_ENERGY_PASSIVE = 44326
};
class npc_pure_energy : public CreatureScript
{
public:
npc_pure_energy() : CreatureScript("npc_pure_energy") { }
struct npc_pure_energyAI : public ScriptedAI
{
npc_pure_energyAI(Creature* creature) : ScriptedAI(creature)
{
me->SetDisplayFromModel(1);
}
void JustDied(Unit* killer) override
{
if (killer)
killer->CastSpell(killer, SPELL_ENERGY_FEEDBACK, true);
me->RemoveAurasDueToSpell(SPELL_PURE_ENERGY_PASSIVE);
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetMagistersTerraceAI(creature);
};
};
void AddSC_boss_vexallus()
{
new boss_vexallus();
new npc_pure_energy();
}