aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp135
1 files changed, 67 insertions, 68 deletions
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
index 04b58af2a4a..90306913534 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,28 +15,34 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Maiden_of_Virtue
-SD%Complete: 100
-SDComment:
-SDCategory: Karazhan
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "karazhan.h"
+
+enum Spells
+{
+ SPELL_REPENTANCE = 29511,
+ SPELL_HOLYFIRE = 29522,
+ SPELL_HOLYWRATH = 32445,
+ SPELL_HOLYGROUND = 29512,
+ SPELL_BERSERK = 26662
+};
-enum MaidenOfVirtue
+enum Yells
{
- SAY_AGGRO = 0,
- SAY_SLAY = 1,
- SAY_REPENTANCE = 2,
- SAY_DEATH = 3,
-
- SPELL_REPENTANCE = 29511,
- SPELL_HOLYFIRE = 29522,
- SPELL_HOLYWRATH = 32445,
- SPELL_HOLYGROUND = 29512,
- SPELL_BERSERK = 26662,
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_REPENTANCE = 2,
+ SAY_DEATH = 3
+};
+
+enum Events
+{
+ EVENT_REPENTANCE = 1,
+ EVENT_HOLYFIRE = 2,
+ EVENT_HOLYWRATH = 3,
+ EVENT_HOLYGROUND = 4,
+ EVENT_ENRAGE = 5
};
class boss_maiden_of_virtue : public CreatureScript
@@ -50,27 +55,13 @@ public:
return new boss_maiden_of_virtueAI(creature);
}
- struct boss_maiden_of_virtueAI : public ScriptedAI
+ struct boss_maiden_of_virtueAI : public BossAI
{
- boss_maiden_of_virtueAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 Repentance_Timer;
- uint32 Holyfire_Timer;
- uint32 Holywrath_Timer;
- uint32 Holyground_Timer;
- uint32 Enrage_Timer;
-
- bool Enraged;
+ boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, TYPE_MAIDEN) { }
void Reset() override
{
- Repentance_Timer = 25000 + (rand32() % 15000);
- Holyfire_Timer = 8000 + (rand32() % 17000);
- Holywrath_Timer = 15000 + (rand32() % 10000);
- Holyground_Timer = 3000;
- Enrage_Timer = 600000;
-
- Enraged = false;
+ _Reset();
}
void KilledUnit(Unit* /*Victim*/) override
@@ -82,11 +73,19 @@ public:
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
+ _JustDied();
}
void EnterCombat(Unit* /*who*/) override
{
+ _EnterCombat();
Talk(SAY_AGGRO);
+
+ events.ScheduleEvent(EVENT_REPENTANCE, urand(33, 45) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_HOLYFIRE, 12 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_HOLYWRATH, urand(15, 25) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_HOLYGROUND, 3 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_ENRAGE, 600 * IN_MILLISECONDS);
}
void UpdateAI(uint32 diff) override
@@ -94,41 +93,41 @@ public:
if (!UpdateVictim())
return;
- if (Enrage_Timer < diff && !Enraged)
- {
- DoCast(me, SPELL_BERSERK, true);
- Enraged = true;
- } else Enrage_Timer -= diff;
-
- if (Holyground_Timer <= diff)
- {
- DoCast(me, SPELL_HOLYGROUND, true); //Triggered so it doesn't interrupt her at all
- Holyground_Timer = 3000;
- } else Holyground_Timer -= diff;
-
- if (Repentance_Timer <= diff)
- {
- DoCastVictim(SPELL_REPENTANCE);
- Talk(SAY_REPENTANCE);
+ events.Update(diff);
- Repentance_Timer = urand(25000, 35000); //A little randomness on that spell
- } else Repentance_Timer -= diff;
-
- if (Holyfire_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_HOLYFIRE);
-
- Holyfire_Timer = urand(8000, 23000); //Anywhere from 8 to 23 seconds, good luck having several of those in a row!
- } else Holyfire_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (Holywrath_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_HOLYWRATH);
-
- Holywrath_Timer = urand(20000, 25000); //20-30 secs sounds nice
- } else Holywrath_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_REPENTANCE:
+ DoCastVictim(SPELL_REPENTANCE);
+ Talk(SAY_REPENTANCE);
+ events.ScheduleEvent(EVENT_REPENTANCE, urand(33, 45) * IN_MILLISECONDS);
+ break;
+ case EVENT_HOLYFIRE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true))
+ DoCast(target, SPELL_HOLYFIRE);
+ events.ScheduleEvent(EVENT_HOLYFIRE, 12 * IN_MILLISECONDS);
+ break;
+ case EVENT_HOLYWRATH:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true))
+ DoCast(target, SPELL_HOLYWRATH);
+ events.ScheduleEvent(EVENT_HOLYWRATH, urand(15, 25) * IN_MILLISECONDS);
+ break;
+ case EVENT_HOLYGROUND:
+ DoCast(me, SPELL_HOLYGROUND, true);
+ events.ScheduleEvent(EVENT_HOLYGROUND, 3 * IN_MILLISECONDS);
+ break;
+ case EVENT_ENRAGE:
+ DoCast(me, SPELL_BERSERK, true);
+ break;
+ default:
+ break;
+ }
+ }
DoMeleeAttackIfReady();
}