aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkaelima <jeppo_meyer@msn.com>2011-05-13 00:15:32 +0200
committerkaelima <jeppo_meyer@msn.com>2011-05-13 00:15:32 +0200
commit82dcb31eeec24b4be24243b5e95164305759efa7 (patch)
tree9e07fb8552339bb42cd561703402c2c6e1119e64 /src
parent6b794f65f30323a66689c3a76f67c1a87c098ced (diff)
Scripts/Doomlord Kazzak: Fix spell Mark of Kazzak, further cleanup and fix sqls added with this commit.
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/boss_doomlord_kazzak.cpp114
1 files changed, 76 insertions, 38 deletions
diff --git a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
index 20512a448b6..101fbe549bd 100644
--- a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
+++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
@@ -16,13 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Doomlord_Kazzak
-SD%Complete: 70
-SDComment: Using incorrect spell for Mark of Kazzak
-SDCategory: Hellfire Peninsula
-EndScriptData */
-
#include "ScriptPCH.h"
enum Yells
@@ -43,12 +36,13 @@ enum Spells
SPELL_THUNDERCLAP = 36706,
SPELL_VOIDBOLT = 39329,
SPELL_MARKOFKAZZAK = 32960,
+ SPELL_MARKOFKAZZAK_DAMAGE = 32961,
SPELL_ENRAGE = 32964,
SPELL_CAPTURESOUL = 32966,
SPELL_TWISTEDREFLECTION = 21063
};
-enum Events
+enum _events
{
EVENT_SHADOW_VOLLEY = 1,
EVENT_CLEAVE = 2,
@@ -72,14 +66,14 @@ class boss_doomlord_kazzak : public CreatureScript
void Reset()
{
- events.Reset();
- events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(6000, 10000));
- events.ScheduleEvent(EVENT_CLEAVE, 7000);
- events.ScheduleEvent(EVENT_THUNDERCLAP, urand(14000, 18000));
- events.ScheduleEvent(EVENT_VOIDBOLT, 30000);
- events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25000);
- events.ScheduleEvent(EVENT_ENRAGE, 60000);
- events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33000);
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(6000, 10000));
+ _events.ScheduleEvent(EVENT_CLEAVE, 7000);
+ _events.ScheduleEvent(EVENT_THUNDERCLAP, urand(14000, 18000));
+ _events.ScheduleEvent(EVENT_VOIDBOLT, 30000);
+ _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25000);
+ _events.ScheduleEvent(EVENT_ENRAGE, 60000);
+ _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33000);
}
void JustRespawned()
@@ -87,7 +81,7 @@ class boss_doomlord_kazzak : public CreatureScript
Talk(SAY_INTRO);
}
- void EnterCombat(Unit * /*who*/)
+ void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
}
@@ -103,78 +97,122 @@ class boss_doomlord_kazzak : public CreatureScript
Talk(SAY_KILL);
}
- void JustDied(Unit * /*victim*/)
+ void JustDied(Unit* /*victim*/)
{
Talk(SAY_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
- //Return since we have no target
+ // Return since we have no target
if (!UpdateVictim())
return;
-
- events.Update(diff);
+
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING))
return;
-
- while (uint32 eventId = events.ExecuteEvent())
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_SHADOW_VOLLEY:
DoCastVictim(SPELL_SHADOWVOLLEY);
- events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(4000, 6000));
+ _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(4000, 6000));
break;
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
- events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 12000));
+ _events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 12000));
break;
case EVENT_THUNDERCLAP:
DoCastVictim(SPELL_THUNDERCLAP);
- events.ScheduleEvent(EVENT_THUNDERCLAP, urand(10000, 14000));
+ _events.ScheduleEvent(EVENT_THUNDERCLAP, urand(10000, 14000));
break;
case EVENT_VOIDBOLT:
DoCastVictim(SPELL_VOIDBOLT);
- events.ScheduleEvent(EVENT_VOIDBOLT, urand(15000, 18000));
+ _events.ScheduleEvent(EVENT_VOIDBOLT, urand(15000, 18000));
break;
case EVENT_MARK_OF_KAZZAK:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
if (target->GetPower(POWER_MANA))
DoCast(target, SPELL_MARKOFKAZZAK);
- events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20000);
+ _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20000);
break;
case EVENT_ENRAGE:
Talk(EMOTE_FRENZY);
DoCast(me, SPELL_ENRAGE);
- events.ScheduleEvent(EVENT_ENRAGE, 30000);
+ _events.ScheduleEvent(EVENT_ENRAGE, 30000);
break;
case EVENT_TWISTED_REFLECTION:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_TWISTEDREFLECTION);
- events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15000);
+ std::list<Unit*> targetList;
+ {
+ const std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList();
+ for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
+ if ((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER && (*itr)->getTarget()->getPowerType() == POWER_MANA)
+ targetList.push_back((*itr)->getTarget());
+ }
+
+ std::list<Unit*>::iterator itr = targetList.begin();
+ advance(itr, urand(0, targetList.size()-1));
+ DoCast(*itr, SPELL_TWISTEDREFLECTION);
+ _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15000);
break;
default:
break;
}
}
-
+
DoMeleeAttackIfReady();
}
private:
- EventMap events;
-
+ EventMap _events;
};
- CreatureAI *GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const
{
return new boss_doomlordkazzakAI (creature);
}
};
+class spell_doomlord_kazzak_mark_of_kazzak : public SpellScriptLoader
+{
+ public:
+ spell_doomlord_kazzak_mark_of_kazzak() : SpellScriptLoader("spell_doomlord_kazzak_mark_of_kazzak") { }
+
+ class spell_doomlord_kazzak_mark_of_kazzak_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_doomlord_kazzak_mark_of_kazzak_AuraScript);
+
+ void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ PreventDefaultAction();
+
+ int32 curmana = GetHitUnit()->GetPower(POWER_MANA);
+ int32 maxmana = GetHitUnit()->GetMaxPower(POWER_MANA);
+
+ // If mana is above 5 procent, drain. Otherwise cast 32961 (player on self with Doomlord Kazzak as casterguid)
+ if (curmana * 100 > maxmana * 5)
+ GetHitUnit()->ModifyPower(POWER_MANA, -5);
+ else
+ GetHitUnit()->CastSpell(GetHitUnit(), SPELL_MARKOFKAZZAK_DAMAGE, true, NULL, NULL, GetCasterGUID());
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_doomlord_kazzak_mark_of_kazzak_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_doomlord_kazzak_mark_of_kazzak_AuraScript();
+ }
+};
+
void AddSC_boss_doomlordkazzak()
{
new boss_doomlord_kazzak();
+ new spell_doomlord_kazzak_mark_of_kazzak();
}