mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 16:38:42 +01:00
Scripts/TheEye: updated Void Reaver to EventMap
(cherry picked from commit 8a7ae9d16c)
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* 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
|
||||
@@ -16,13 +15,6 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Void_Reaver
|
||||
SD%Complete: 90
|
||||
SDComment: Should reset if raid are out of room.
|
||||
SDCategory: Tempest Keep, The Eye
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "the_eye.h"
|
||||
@@ -43,10 +35,17 @@ enum Spells
|
||||
SPELL_BERSERK = 27680
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_POUNDING = 1,
|
||||
EVENT_ARCANE_ORB,
|
||||
EVENT_KNOCK_AWAY,
|
||||
EVENT_BERSERK
|
||||
};
|
||||
|
||||
class boss_void_reaver : public CreatureScript
|
||||
{
|
||||
public:
|
||||
|
||||
boss_void_reaver() : CreatureScript("boss_void_reaver") { }
|
||||
|
||||
struct boss_void_reaverAI : public BossAI
|
||||
@@ -58,21 +57,9 @@ class boss_void_reaver : public CreatureScript
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Pounding_Timer = 15000;
|
||||
ArcaneOrb_Timer = 3000;
|
||||
KnockAway_Timer = 30000;
|
||||
Berserk_Timer = 600000;
|
||||
|
||||
Enraged = false;
|
||||
}
|
||||
|
||||
uint32 Pounding_Timer;
|
||||
uint32 ArcaneOrb_Timer;
|
||||
uint32 KnockAway_Timer;
|
||||
uint32 Berserk_Timer;
|
||||
|
||||
bool Enraged;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
@@ -95,71 +82,84 @@ class boss_void_reaver : public CreatureScript
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
_EnterCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_POUNDING, 15000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_ORB, 3000);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, 30000);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 600000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
// Pounding
|
||||
if (Pounding_Timer <= diff)
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCastVictim(SPELL_POUNDING);
|
||||
Talk(SAY_POUNDING);
|
||||
Pounding_Timer = 15000; //cast time(3000) + cooldown time(12000)
|
||||
}
|
||||
else
|
||||
Pounding_Timer -= diff;
|
||||
// Arcane Orb
|
||||
if (ArcaneOrb_Timer <= diff)
|
||||
{
|
||||
Unit* target = NULL;
|
||||
std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
|
||||
std::vector<Unit*> target_list;
|
||||
for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
|
||||
switch (eventId)
|
||||
{
|
||||
target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
|
||||
if (!target)
|
||||
continue;
|
||||
// exclude pets & totems, 18 yard radius minimum
|
||||
if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false))
|
||||
target_list.push_back(target);
|
||||
target = NULL;
|
||||
case EVENT_POUNDING:
|
||||
DoCastVictim(SPELL_POUNDING);
|
||||
Talk(SAY_POUNDING);
|
||||
events.ScheduleEvent(EVENT_POUNDING, 15000);
|
||||
break;
|
||||
case EVENT_ARCANE_ORB:
|
||||
{
|
||||
Unit* target = NULL;
|
||||
std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
|
||||
std::vector<Unit*> target_list;
|
||||
for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr)
|
||||
{
|
||||
target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
|
||||
if (!target)
|
||||
continue;
|
||||
// exclude pets & totems, 18 yard radius minimum
|
||||
if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false))
|
||||
target_list.push_back(target);
|
||||
target = NULL;
|
||||
}
|
||||
|
||||
if (!target_list.empty())
|
||||
target = *(target_list.begin() + rand32() % target_list.size());
|
||||
else
|
||||
target = me->GetVictim();
|
||||
|
||||
if (target)
|
||||
me->CastSpell(target, SPELL_ARCANE_ORB, false, NULL, NULL);
|
||||
|
||||
events.ScheduleEvent(EVENT_ARCANE_ORB, 3000);
|
||||
break;
|
||||
}
|
||||
case EVENT_KNOCK_AWAY:
|
||||
DoCastVictim(SPELL_KNOCK_AWAY);
|
||||
// Drop 25% aggro
|
||||
if (DoGetThreat(me->GetVictim()))
|
||||
DoModifyThreatPercent(me->GetVictim(), -25);
|
||||
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, 30000);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
if (!Enraged)
|
||||
{
|
||||
DoCast(me, SPELL_BERSERK);
|
||||
Enraged = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!target_list.empty())
|
||||
target = *(target_list.begin() + rand32() % target_list.size());
|
||||
else
|
||||
target = me->GetVictim();
|
||||
|
||||
if (target)
|
||||
me->CastSpell(target, SPELL_ARCANE_ORB, false, NULL, NULL);
|
||||
ArcaneOrb_Timer = 3000;
|
||||
}
|
||||
else
|
||||
ArcaneOrb_Timer -= diff;
|
||||
// Single Target knock back, reduces aggro
|
||||
if (KnockAway_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_KNOCK_AWAY);
|
||||
//Drop 25% aggro
|
||||
if (DoGetThreat(me->GetVictim()))
|
||||
DoModifyThreatPercent(me->GetVictim(), -25);
|
||||
KnockAway_Timer = 30000;
|
||||
}
|
||||
else
|
||||
KnockAway_Timer -= diff;
|
||||
//Berserk
|
||||
if (Berserk_Timer < diff && !Enraged)
|
||||
{
|
||||
DoCast(me, SPELL_BERSERK);
|
||||
Enraged = true;
|
||||
}
|
||||
else
|
||||
Berserk_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool Enraged;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
|
||||
Reference in New Issue
Block a user