/* * 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 . */ #include "AreaTriggerScript.h" #include "CreatureScript.h" #include "Player.h" #include "ScriptedCreature.h" #include "TaskScheduler.h" enum Spells { SPELL_SOUL_CORRUPTION = 25805, SPELL_CREATURE_OF_NIGHTMARE = 25806, SPELL_SWELL_OF_SOULS = 21307, }; enum Misc { ITEM_FRAGMENT = 21149, NPC_TWILIGHT_CORRUPTER = 15625 }; enum Say { SAY_RESPAWN = 0, SAY_AGGRO, SAY_KILL }; /*###### # boss_twilight_corrupter ######*/ struct boss_twilight_corrupter : public ScriptedAI { boss_twilight_corrupter(Creature* creature) : ScriptedAI(creature) { } void Reset() override { _scheduler.CancelAll(); me->RemoveAurasDueToSpell(SPELL_SWELL_OF_SOULS); } void InitializeAI() override { // Xinef: check if copy is summoned std::list cList; me->GetCreatureListWithEntryInGrid(cList, me->GetEntry(), 50.0f); for (Creature* creature : cList) { if (creature->IsAlive() && me->GetGUID() != creature->GetGUID()) { me->DespawnOrUnsummon(1); break; } } _introSpoken = false; ScriptedAI::InitializeAI(); } void MoveInLineOfSight(Unit* who) override { if (!_introSpoken && who->IsPlayer()) { _introSpoken = true; Talk(SAY_RESPAWN, who); me->SetFaction(FACTION_MONSTER); } ScriptedAI::MoveInLineOfSight(who); } void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); _scheduler .Schedule(12s, 18s, [this](TaskContext context) { DoCastRandomTarget(SPELL_CREATURE_OF_NIGHTMARE, 0, 100.f, true, false, false); context.Repeat(35s, 45s); }) .Schedule(9s, 16s, [this](TaskContext context) { DoCastVictim(SPELL_SOUL_CORRUPTION); context.Repeat(5s, 9s); }); } void KilledUnit(Unit* victim) override { if (victim->IsPlayer()) { Talk(SAY_KILL, victim); DoCastSelf(SPELL_SWELL_OF_SOULS); } } void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; _scheduler.Update(diff, [this] { DoMeleeAttackIfReady(); }); } private: bool _introSpoken; TaskScheduler _scheduler; }; /*###### # at_twilight_grove ######*/ class at_twilight_grove : public AreaTriggerScript { public: at_twilight_grove() : AreaTriggerScript("at_twilight_grove") { } bool OnTrigger(Player* player, const AreaTrigger* /*at*/) override { if (player->HasQuestForItem(ITEM_FRAGMENT) && !player->HasItemCount(ITEM_FRAGMENT)) player->SummonCreature(NPC_TWILIGHT_CORRUPTER, -10328.16f, -489.57f, 49.95f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 240000); return false; }; }; void AddSC_duskwood() { RegisterCreatureAI(boss_twilight_corrupter); new at_twilight_grove(); }