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

266 lines
8.3 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 "AchievementCriteriaScript.h"
#include "CreatureScript.h"
#include "ScriptedCreature.h"
#include "SpellAuras.h"
#include "SpellScriptLoader.h"
#include "drak_tharon_keep.h"
#include "SpellAuraEffects.h"
#include "SpellMgr.h"
#include "SpellScript.h"
enum Yells
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_CONSUME = 2,
SAY_EXPLODE = 3,
SAY_DEATH = 4
};
enum Spells
{
SPELL_SUMMON_INVADER_A = 49456,
SPELL_SUMMON_INVADER_B = 49457,
SPELL_SUMMON_INVADER_C = 49458,
SPELL_INFECTED_WOUND = 49637,
SPELL_CRUSH = 49639,
SPELL_CONSUME = 49380,
SPELL_CORPSE_EXPLODE = 49555,
SPELL_CORPSE_EXPLODE_DAMAGE = 49618,
SPELL_CONSUME_AURA = 49381,
};
enum Events
{
EVENT_SPELL_INFECTED_WOUND = 1,
EVENT_SPELL_CRUSH = 2,
EVENT_SPELL_CONSUME = 3,
EVENT_SPELL_CORPSE_EXPLODE = 4,
EVENT_SPAWN_INVADERS = 5,
EVENT_KILL_TALK = 6
};
class boss_trollgore : public CreatureScript
{
public:
boss_trollgore() : CreatureScript("boss_trollgore") { }
struct boss_trollgoreAI : public BossAI
{
boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE)
{
}
void Reset() override
{
BossAI::Reset();
events2.Reset();
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30s);
}
void JustEngagedWith(Unit* who) override
{
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, 6s, 10s);
events.ScheduleEvent(EVENT_SPELL_CRUSH, 3s, 5s);
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15s);
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 35s);
events.ScheduleEvent(EVENT_SPAWN_INVADERS, 20s, 30s);
me->setActive(true);
instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS);
if (who->IsPlayer())
{
Talk(SAY_AGGRO);
me->SetInCombatWithZone();
}
}
void JustDied(Unit* killer) override
{
Talk(SAY_DEATH);
BossAI::JustDied(killer);
}
void KilledUnit(Unit* /*victim*/) override
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
}
}
void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
}
void UpdateAI(uint32 diff) override
{
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_SPAWN_INVADERS:
me->CastSpell(me, SPELL_SUMMON_INVADER_A, true);
me->CastSpell(me, SPELL_SUMMON_INVADER_B, true);
me->CastSpell(me, SPELL_SUMMON_INVADER_C, true);
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30s);
break;
}
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_INFECTED_WOUND:
me->CastSpell(me->GetVictim(), SPELL_INFECTED_WOUND, false);
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, 25s, 35s);
break;
case EVENT_SPELL_CRUSH:
me->CastSpell(me->GetVictim(), SPELL_CRUSH, false);
events.ScheduleEvent(EVENT_SPELL_CRUSH, 10s, 15s);
break;
case EVENT_SPELL_CONSUME:
Talk(SAY_CONSUME);
me->CastSpell(me, SPELL_CONSUME, false);
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15s);
break;
case EVENT_SPELL_CORPSE_EXPLODE:
Talk(SAY_EXPLODE);
me->CastSpell(me, SPELL_CORPSE_EXPLODE, false);
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 15s, 19s);
break;
}
DoMeleeAttackIfReady();
}
bool CheckEvadeIfOutOfCombatArea() const override
{
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
}
private:
EventMap events2;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetDraktharonKeepAI<boss_trollgoreAI>(creature);
}
};
class spell_trollgore_consume : public SpellScript
{
PrepareSpellScript(spell_trollgore_consume);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_CONSUME_AURA });
}
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
target->CastSpell(GetCaster(), SPELL_CONSUME_AURA, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class spell_trollgore_corpse_explode_aura : public AuraScript
{
PrepareAuraScript(spell_trollgore_corpse_explode_aura);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_CORPSE_EXPLODE_DAMAGE });
}
void PeriodicTick(AuraEffect const* aurEff)
{
if (aurEff->GetTickNumber() == 2)
if (Unit* caster = GetCaster())
caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true);
}
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Creature* target = GetTarget()->ToCreature())
target->DespawnOrUnsummon(1);
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_aura::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
class spell_trollgore_invader_taunt : public SpellScript
{
PrepareSpellScript(spell_trollgore_invader_taunt);
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
target->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class achievement_consumption_junction : public AchievementCriteriaScript
{
public:
achievement_consumption_junction() : AchievementCriteriaScript("achievement_consumption_junction")
{
}
bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override
{
if (!target)
return false;
return target->GetAuraCount(sSpellMgr->GetSpellIdForDifficulty(SPELL_CONSUME_AURA, target)) < 10;
}
};
void AddSC_boss_trollgore()
{
new boss_trollgore();
RegisterSpellScript(spell_trollgore_consume);
RegisterSpellScript(spell_trollgore_corpse_explode_aura);
RegisterSpellScript(spell_trollgore_invader_taunt);
new achievement_consumption_junction();
}