aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorclick <click@gonnamakeyou.com>2011-06-30 19:11:35 +0200
committerclick <click@gonnamakeyou.com>2011-06-30 19:11:35 +0200
commit97e6d34f49429edd23069e0b0ffb39d964f4e8ae (patch)
tree6b0fe6472d770125a7baeb94b0f6e83821ee09dd /src
parente9aa72cc7b09999a1cbb6df994396ae8823657f6 (diff)
Scripts/ZulGurub: Convert Venoxis over to use BossAI
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp30
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp368
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp32
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h22
9 files changed, 289 insertions, 191 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 7f506af0525..6f86b9677a3 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
@@ -111,7 +111,7 @@ class boss_arlokk : public CreatureScript
void JustReachedHome()
{
if (m_pInstance)
- m_pInstance->SetData(TYPE_ARLOKK, NOT_STARTED);
+ m_pInstance->SetData(DATA_ARLOKK, NOT_STARTED);
//we should be summoned, so despawn
me->DespawnOrUnsummon();
@@ -125,7 +125,7 @@ class boss_arlokk : public CreatureScript
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (m_pInstance)
- m_pInstance->SetData(TYPE_ARLOKK, DONE);
+ m_pInstance->SetData(DATA_ARLOKK, DONE);
}
void DoSummonPhanters()
@@ -273,10 +273,10 @@ class go_gong_of_bethekk : public GameObjectScript
{
if (InstanceScript* m_pInstance = pGo->GetInstanceScript())
{
- if (m_pInstance->GetData(TYPE_ARLOKK) == DONE || m_pInstance->GetData(TYPE_ARLOKK) == IN_PROGRESS)
+ if (m_pInstance->GetData(DATA_ARLOKK) == DONE || m_pInstance->GetData(DATA_ARLOKK) == IN_PROGRESS)
return true;
- m_pInstance->SetData(TYPE_ARLOKK, IN_PROGRESS);
+ m_pInstance->SetData(DATA_ARLOKK, IN_PROGRESS);
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
index 16cd74ba0f3..b7f493b738e 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
@@ -158,7 +158,7 @@ class boss_hakkar : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_JEKLIK) != DONE)
+ if (m_pInstance->GetData(DATA_JEKLIK) != DONE)
{
if (AspectOfJeklik_Timer <= diff)
{
@@ -175,7 +175,7 @@ class boss_hakkar : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_VENOXIS) != DONE)
+ if (m_pInstance->GetData(DATA_VENOXIS) != DONE)
{
if (AspectOfVenoxis_Timer <= diff)
{
@@ -192,7 +192,7 @@ class boss_hakkar : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_MARLI) != DONE)
+ if (m_pInstance->GetData(DATA_MARLI) != DONE)
{
if (AspectOfMarli_Timer <= diff)
{
@@ -210,7 +210,7 @@ class boss_hakkar : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_THEKAL) != DONE)
+ if (m_pInstance->GetData(DATA_THEKAL) != DONE)
{
if (AspectOfThekal_Timer <= diff)
{
@@ -227,7 +227,7 @@ class boss_hakkar : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_ARLOKK) != DONE)
+ if (m_pInstance->GetData(DATA_ARLOKK) != DONE)
{
if (AspectOfArlokk_Timer <= diff)
{
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
index f64fd167c06..21b513739a5 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
@@ -99,7 +99,7 @@ class boss_jeklik : public CreatureScript
DoScriptText(SAY_DEATH, me);
if (m_pInstance)
- m_pInstance->SetData(TYPE_JEKLIK, DONE);
+ m_pInstance->SetData(DATA_JEKLIK, DONE);
}
void UpdateAI(const uint32 diff)
@@ -276,7 +276,7 @@ class mob_batrider : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_JEKLIK) == DONE)
+ if (m_pInstance->GetData(DATA_JEKLIK) == DONE)
{
me->setDeathState(JUST_DIED);
me->RemoveCorpse();
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index 59b305b974a..cf1e8e9ab62 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -258,7 +258,7 @@ class boss_mandokir : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_OHGAN) == DONE)
+ if (m_pInstance->GetData(DATA_OHGAN) == DONE)
{
if (!RaptorDead)
{
@@ -312,7 +312,7 @@ class mob_ohgan : public CreatureScript
void JustDied(Unit* /*Killer*/)
{
if (m_pInstance)
- m_pInstance->SetData(TYPE_OHGAN, DONE);
+ m_pInstance->SetData(DATA_OHGAN, DONE);
}
void UpdateAI (const uint32 diff)
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
index da6f41d4ca0..26d7a52f09c 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
@@ -92,7 +92,7 @@ class boss_marli : public CreatureScript
{
DoScriptText(SAY_DEATH, me);
if (m_pInstance)
- m_pInstance->SetData(TYPE_MARLI, DONE);
+ m_pInstance->SetData(DATA_MARLI, DONE);
}
void UpdateAI(const uint32 diff)
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
index cd6294d1751..1b5beea9c35 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
@@ -112,13 +112,13 @@ class boss_thekal : public CreatureScript
{
DoScriptText(SAY_DEATH, me);
if (m_pInstance)
- m_pInstance->SetData(TYPE_THEKAL, DONE);
+ m_pInstance->SetData(DATA_THEKAL, DONE);
}
void JustReachedHome()
{
if (m_pInstance)
- m_pInstance->SetData(TYPE_THEKAL, NOT_STARTED);
+ m_pInstance->SetData(DATA_THEKAL, NOT_STARTED);
}
void UpdateAI(const uint32 diff)
@@ -131,7 +131,7 @@ class boss_thekal : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_LORKHAN) == SPECIAL)
+ if (m_pInstance->GetData(DATA_LORKHAN) == SPECIAL)
{
//Resurrect LorKhan
if (Unit* pLorKhan = Unit::GetUnit((*me), m_pInstance->GetData64(DATA_LORKHAN)))
@@ -141,11 +141,11 @@ class boss_thekal : public CreatureScript
pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pLorKhan->SetFullHealth();
- m_pInstance->SetData(TYPE_LORKHAN, DONE);
+ m_pInstance->SetData(DATA_LORKHAN, DONE);
}
}
- if (m_pInstance->GetData(TYPE_ZATH) == SPECIAL)
+ if (m_pInstance->GetData(DATA_ZATH) == SPECIAL)
{
//Resurrect Zath
Unit* pZath = Unit::GetUnit((*me), m_pInstance->GetData64(DATA_ZATH));
@@ -156,7 +156,7 @@ class boss_thekal : public CreatureScript
pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pZath->SetFullHealth();
- m_pInstance->SetData(TYPE_ZATH, DONE);
+ m_pInstance->SetData(DATA_ZATH, DONE);
}
}
}
@@ -186,7 +186,7 @@ class boss_thekal : public CreatureScript
me->AttackStop();
if (m_pInstance)
- m_pInstance->SetData(TYPE_THEKAL, SPECIAL);
+ m_pInstance->SetData(DATA_THEKAL, SPECIAL);
WasDead=true;
}
@@ -303,7 +303,7 @@ class mob_zealot_lorkhan : public CreatureScript
FakeDeath = false;
if (m_pInstance)
- m_pInstance->SetData(TYPE_LORKHAN, NOT_STARTED);
+ m_pInstance->SetData(DATA_LORKHAN, NOT_STARTED);
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -371,7 +371,7 @@ class mob_zealot_lorkhan : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_THEKAL) == SPECIAL)
+ if (m_pInstance->GetData(DATA_THEKAL) == SPECIAL)
{
//Resurrect Thekal
if (Unit* pThekal = Unit::GetUnit((*me), m_pInstance->GetData64(DATA_THEKAL)))
@@ -383,7 +383,7 @@ class mob_zealot_lorkhan : public CreatureScript
}
}
- if (m_pInstance->GetData(TYPE_ZATH) == SPECIAL)
+ if (m_pInstance->GetData(DATA_ZATH) == SPECIAL)
{
//Resurrect Zath
if (Unit* pZath = Unit::GetUnit((*me), m_pInstance->GetData64(DATA_ZATH)))
@@ -410,7 +410,7 @@ class mob_zealot_lorkhan : public CreatureScript
me->AttackStop();
if (m_pInstance)
- m_pInstance->SetData(TYPE_LORKHAN, SPECIAL);
+ m_pInstance->SetData(DATA_LORKHAN, SPECIAL);
FakeDeath = true;
}
@@ -465,7 +465,7 @@ class mob_zealot_zath : public CreatureScript
FakeDeath = false;
if (m_pInstance)
- m_pInstance->SetData(TYPE_ZATH, NOT_STARTED);
+ m_pInstance->SetData(DATA_ZATH, NOT_STARTED);
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -524,7 +524,7 @@ class mob_zealot_zath : public CreatureScript
{
if (m_pInstance)
{
- if (m_pInstance->GetData(TYPE_LORKHAN) == SPECIAL)
+ if (m_pInstance->GetData(DATA_LORKHAN) == SPECIAL)
{
//Resurrect LorKhan
if (Unit* pLorKhan = Unit::GetUnit((*me), m_pInstance->GetData64(DATA_LORKHAN)))
@@ -536,7 +536,7 @@ class mob_zealot_zath : public CreatureScript
}
}
- if (m_pInstance->GetData(TYPE_THEKAL) == SPECIAL)
+ if (m_pInstance->GetData(DATA_THEKAL) == SPECIAL)
{
//Resurrect Thekal
if (Unit* pThekal = Unit::GetUnit((*me), m_pInstance->GetData64(DATA_THEKAL)))
@@ -563,7 +563,7 @@ class mob_zealot_zath : public CreatureScript
me->AttackStop();
if (m_pInstance)
- m_pInstance->SetData(TYPE_ZATH, SPECIAL);
+ m_pInstance->SetData(DATA_ZATH, SPECIAL);
FakeDeath = true;
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
index a22bc45c753..6fce36605a9 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
@@ -16,182 +16,285 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Venoxis
-SD%Complete: 100
-SDComment:
-SDCategory: Zul'Gurub
-EndScriptData */
-
-#include "ScriptPCH.h"
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "Spell.h"
#include "zulgurub.h"
-#define SAY_TRANSFORM -1309000
-#define SAY_DEATH -1309001
+/*
+ * TODO:
+ * - Fix timers (research)
+ * - Fix SAI for the summoned parasitic trigger
+ * - Generic cleanups
+ */
+
+enum Texts
+{
+ SAY_VENOXIS_TRANSFORM = 1, // Let the coils of hate unfurl!
+ SAY_VENOXIS_DEATH = 2, // Ssserenity.. at lassst!
+};
+
+enum Spells
+{
+ // troll form
+ SPELL_THRASH = 3391,
+ SPELL_DISPEL_MAGIC = 23859,
+ SPELL_RENEW = 23895,
+ SPELL_HOLY_NOVA = 23858,
+ SPELL_HOLY_FIRE = 23860,
+ SPELL_HOLY_WRATH = 23979,
+
+ // snake form
+ SPELL_POISON_CLOUD = 23861,
+ SPELL_VENOM_SPIT = 23862,
+
+ SPELL_PARASITIC_SERPENT = 23865,
+ SPELL_SUMMON_PARASITIC_SERPENT = 23866,
+ SPELL_PARASITIC_SERPENT_TRIGGER = 23868,
+
+ // used when swapping event-stages
+ SPELL_VENOXIS_TRANSFORM = 23849, // 50% health - shapechange to cobra
+ SPELL_FRENZY = 8269, // 20% health - frenzy
+};
+
+enum NPCs
+{
+ NPC_PARASITIC_SERPENT = 14884,
+};
+
+enum Events
+{
+ // troll form
+ EVENT_THRASH = 1,
+ EVENT_DISPEL_MAGIC = 2,
+ EVENT_RENEW = 3,
+ EVENT_HOLY_NOVA = 4,
+ EVENT_HOLY_FIRE = 5,
+ EVENT_HOLY_WRATH = 6,
+
+ // phase-changing
+ EVENT_TRANSFORM = 7,
+
+ // snake form events
+ EVENT_POISON_CLOUD = 8,
+ EVENT_VENOM_SPIT = 9,
+ EVENT_PARASITIC_SERPENT = 10,
+ EVENT_FRENZY = 11,
+};
-#define SPELL_HOLY_FIRE 23860
-#define SPELL_HOLY_WRATH 28883 //Not sure if this or 23979
-#define SPELL_VENOMSPIT 23862
-#define SPELL_HOLY_NOVA 23858
-#define SPELL_POISON_CLOUD 23861
-#define SPELL_SNAKE_FORM 23849
-#define SPELL_RENEW 23895
-#define SPELL_BERSERK 23537
-#define SPELL_DISPELL 23859
+enum Phases
+{
+ PHASE_ONE = 1, // troll form
+ PHASE_TWO = 2, // snake form
+};
class boss_venoxis : public CreatureScript
{
public:
+ boss_venoxis() : CreatureScript("boss_venoxis") {}
- boss_venoxis()
- : CreatureScript("boss_venoxis")
+ struct boss_venoxisAI : public BossAI
{
- }
+ boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS)
+ {
+ }
- struct boss_venoxisAI : public ScriptedAI
- {
- boss_venoxisAI(Creature* c) : ScriptedAI(c)
+ void Reset()
{
- m_pInstance = c->GetInstanceScript();
+ events.Reset();
+ summons.DespawnAll();
+
+ // make sure this boss is properly reset
+ instance->SetBossState(DATA_VENOXIS, NOT_STARTED);
+
+ // remove all spells and auras from previous attempts
+ me->RemoveAllAuras();
+
+ // set some internally used variables to their defaults
+ _inMeleeRange = 0;
+ _transformed = false;
+ _frenzied = false;
+
+ events.SetPhase(PHASE_ONE);
}
- InstanceScript *m_pInstance;
+ void EnterCombat(Unit* /*who*/)
+ {
+ instance->SetBossState(DATA_VENOXIS, IN_PROGRESS);
- uint32 HolyFire_Timer;
- uint32 HolyWrath_Timer;
- uint32 VenomSpit_Timer;
- uint32 Renew_Timer;
- uint32 PoisonCloud_Timer;
- uint32 HolyNova_Timer;
- uint32 Dispell_Timer;
- uint32 TargetInRange;
+ // Always running events
+ events.ScheduleEvent(EVENT_THRASH, 5000);
- bool PhaseTwo;
- bool InBerserk;
+ // Phase one events (regular form)
+ events.ScheduleEvent(EVENT_HOLY_NOVA, 5000, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_DISPEL_MAGIC, 35000, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_HOLY_FIRE, 10000, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_RENEW, 30000, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_HOLY_WRATH, 60000, 0, PHASE_ONE);
- void Reset()
+ events.SetPhase(PHASE_ONE);
+
+ // Set zone in combat
+ DoZoneInCombat();
+ }
+
+ void JustSummoned(Creature* summon)
{
- HolyFire_Timer = 10000;
- HolyWrath_Timer = 60500;
- VenomSpit_Timer = 5500;
- Renew_Timer = 30500;
- PoisonCloud_Timer = 2000;
- HolyNova_Timer = 5000;
- Dispell_Timer = 35000;
- TargetInRange = 0;
-
- PhaseTwo = false;
- InBerserk= false;
+ summons.Summon(summon);
+ switch (summon->GetEntry())
+ {
+ case NPC_PARASITIC_SERPENT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ summon->CastSpell(target, SPELL_PARASITIC_SERPENT_TRIGGER, true);
+ break;
+ default:
+ break;
+ }
+
+ if (me->isInCombat())
+ DoZoneInCombat(summon);
}
- void EnterCombat(Unit* /*who*/)
+ void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{
+ // check if venoxis is ready to transform
+ if (!_transformed && !HealthAbovePct(50))
+ {
+ _transformed = true;
+ // schedule the event that changes our phase
+ events.ScheduleEvent(EVENT_TRANSFORM, 100);
+ }
+ // we're losing health, bad, go frenzy
+ else if (!_frenzied && !HealthAbovePct(20))
+ {
+ _frenzied = true;
+ events.ScheduleEvent(EVENT_FRENZY, 100);
+ }
}
- void JustDied(Unit* /*Killer*/)
+ void JustDied(Unit* /*killer*/)
{
- DoScriptText(SAY_DEATH, me);
- if (m_pInstance)
- m_pInstance->SetData(TYPE_VENOXIS, DONE);
+ Talk(SAY_VENOXIS_DEATH);
+ // venoxis is dead, mark him as such for the instance
+ instance->SetBossState(DATA_VENOXIS, DONE);
+ me->RemoveAllAuras();
}
void UpdateAI(const uint32 diff)
{
- if (!UpdateVictim())
+ if (!UpdateVictim())
return;
- if (HealthAbovePct(50))
+ events.Update(diff);
+
+ // return back to main code if we're still casting
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch(eventId)
{
- if (Dispell_Timer <= diff)
- {
- DoCast(me, SPELL_DISPELL);
- Dispell_Timer = 15000 + rand()%15000;
- } else Dispell_Timer -= diff;
-
- if (Renew_Timer <= diff)
- {
+ // thrash is available in all phases
+ case EVENT_THRASH:
+ DoCast(me, SPELL_THRASH, true);
+ events.ScheduleEvent(EVENT_THRASH, urand(10000,20000));
+ break;
+
+ // troll form spells and actions (first part)
+ case EVENT_DISPEL_MAGIC:
+ DoCast(me, SPELL_DISPEL_MAGIC);
+ events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000,20000), 0, PHASE_ONE);
+ break;
+ case EVENT_RENEW:
DoCast(me, SPELL_RENEW);
- Renew_Timer = 20000 + rand()%10000;
- } else Renew_Timer -= diff;
-
- if (HolyWrath_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_HOLY_WRATH);
- HolyWrath_Timer = 15000 + rand()%10000;
- } else HolyWrath_Timer -= diff;
-
- if (HolyNova_Timer <= diff)
- {
- TargetInRange = 0;
- for (uint8 i = 0; i < 10; ++i)
- {
- if (Unit* pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO, i))
- if (me->IsWithinMeleeRange(pTarget))
- ++TargetInRange;
- }
+ events.ScheduleEvent(EVENT_RENEW, urand(25000,30000), 0, PHASE_ONE);
+ break;
+ case EVENT_HOLY_NOVA:
+ _inMeleeRange = 0;
- if (TargetInRange > 1)
+ for (uint8 i = 0; i < 10 ; ++i)
{
- DoCast(me->getVictim(), SPELL_HOLY_NOVA);
- HolyNova_Timer = 1000;
- }
- else
- {
- HolyNova_Timer = 2000;
+ if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, i))
+ // check if target is within melee-distance
+ if (me->IsWithinMeleeRange(target))
+ ++_inMeleeRange;
}
- } else HolyNova_Timer -= diff;
+ // trigger spellcast only if we have 3 or more targets to affect
+ if (_inMeleeRange >= 3)
+ DoCast(me->getVictim(), SPELL_HOLY_NOVA);
- if (HolyFire_Timer < diff && TargetInRange < 3)
- {
- if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(pTarget, SPELL_HOLY_FIRE);
+ events.ScheduleEvent(EVENT_HOLY_NOVA, urand(45000,75000), 0, PHASE_ONE);
+ break;
+ case EVENT_HOLY_FIRE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_HOLY_FIRE);
+ events.ScheduleEvent(EVENT_HOLY_FIRE, urand(45000,60000), 0, PHASE_ONE);
+ break;
+ case EVENT_HOLY_WRATH:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_HOLY_WRATH);
+ events.ScheduleEvent(EVENT_HOLY_WRATH, urand(45000,60000), 0, PHASE_ONE);
+ break;
- HolyFire_Timer = 8000;
- } else HolyFire_Timer -= diff;
- }
- else
- {
- if (!PhaseTwo)
- {
- DoScriptText(SAY_TRANSFORM, me);
- me->InterruptNonMeleeSpells(false);
- DoCast(me, SPELL_SNAKE_FORM);
- me->SetFloatValue(OBJECT_FIELD_SCALE_X, 2.00f);
- const CreatureTemplate *cinfo = me->GetCreatureInfo();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 25)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 25)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- DoResetThreat();
- PhaseTwo = true;
- }
+ //
+ // snake form spells and actions
+ //
- if (PhaseTwo && PoisonCloud_Timer <= diff)
- {
+ case EVENT_VENOM_SPIT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_VENOM_SPIT);
+ events.ScheduleEvent(EVENT_VENOM_SPIT, urand(5000,15000), 0, PHASE_TWO);
+ break;
+ case EVENT_POISON_CLOUD:
DoCast(me->getVictim(), SPELL_POISON_CLOUD);
- PoisonCloud_Timer = 15000;
- }PoisonCloud_Timer -=diff;
+ events.ScheduleEvent(EVENT_POISON_CLOUD, urand(15000,20000), 0, PHASE_TWO);
+ break;
+ case EVENT_PARASITIC_SERPENT:
+ // currently disabled, needs SAI
+ /*
+ DoCast(me, SPELL_SUMMON_PARASITIC_SERPENT);
+ events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 15000, 0, PHASE_TWO);
+ */
+ break;
+ case EVENT_FRENZY:
+ // frenzy at 20% health
+ DoCast(me, SPELL_FRENZY, true);
+ break;
+
+ //
+ // shape and phase-changing
+ //
- if (PhaseTwo && VenomSpit_Timer <= diff)
- {
- if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(pTarget, SPELL_VENOMSPIT);
+ case EVENT_TRANSFORM:
+ // shapeshift at 50% health
+ DoCast(me, SPELL_VENOXIS_TRANSFORM);
+ Talk(SAY_VENOXIS_TRANSFORM);
+ DoResetThreat();
- VenomSpit_Timer = 15000 + rand()%5000;
- } else VenomSpit_Timer -= diff;
+ // phase two events (snakeform)
+ events.ScheduleEvent(EVENT_VENOM_SPIT, 5000, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_POISON_CLOUD, 10000, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 30000, 0, PHASE_TWO);
- if (PhaseTwo && HealthBelowPct(11))
- {
- if (!InBerserk)
- {
- me->InterruptNonMeleeSpells(false);
- DoCast(me, SPELL_BERSERK);
- InBerserk = true;
- }
- }
+ // transformed, start phase two
+ events.SetPhase(PHASE_TWO);
+
+ break;
+ default:
+ break;
}
- DoMeleeAttackIfReady();
+ }
+
+ DoMeleeAttackIfReady();
}
+
+ private:
+ uint8 _inMeleeRange;
+ bool _transformed;
+ bool _frenzied;
};
CreatureAI* GetAI(Creature* creature) const
@@ -204,4 +307,3 @@ void AddSC_boss_venoxis()
{
new boss_venoxis();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index f14204ea72b..0da63d38f83 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -78,35 +78,35 @@ class instance_zulgurub : public InstanceMapScript
{
switch(uiType)
{
- case TYPE_ARLOKK:
+ case DATA_ARLOKK:
m_auiEncounter[0] = uiData;
break;
- case TYPE_JEKLIK:
+ case DATA_JEKLIK:
m_auiEncounter[1] = uiData;
break;
- case TYPE_VENOXIS:
+ case DATA_VENOXIS:
m_auiEncounter[2] = uiData;
break;
- case TYPE_MARLI:
+ case DATA_MARLI:
m_auiEncounter[3] = uiData;
break;
- case TYPE_THEKAL:
+ case DATA_THEKAL:
m_auiEncounter[4] = uiData;
break;
- case TYPE_LORKHAN:
+ case DATA_LORKHAN:
m_auiEncounter[5] = uiData;
break;
- case TYPE_ZATH:
+ case DATA_ZATH:
m_auiEncounter[6] = uiData;
break;
- case TYPE_OHGAN:
+ case DATA_OHGAN:
m_auiEncounter[7] = uiData;
break;
}
@@ -116,21 +116,21 @@ class instance_zulgurub : public InstanceMapScript
{
switch(uiType)
{
- case TYPE_ARLOKK:
+ case DATA_ARLOKK:
return m_auiEncounter[0];
- case TYPE_JEKLIK:
+ case DATA_JEKLIK:
return m_auiEncounter[1];
- case TYPE_VENOXIS:
+ case DATA_VENOXIS:
return m_auiEncounter[2];
- case TYPE_MARLI:
+ case DATA_MARLI:
return m_auiEncounter[3];
- case TYPE_THEKAL:
+ case DATA_THEKAL:
return m_auiEncounter[4];
- case TYPE_LORKHAN:
+ case DATA_LORKHAN:
return m_auiEncounter[5];
- case TYPE_ZATH:
+ case DATA_ZATH:
return m_auiEncounter[6];
- case TYPE_OHGAN:
+ case DATA_OHGAN:
return m_auiEncounter[7];
}
return 0;
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index ef70090ebdb..53dfbd9e93d 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -19,23 +19,19 @@
#ifndef DEF_ZULGURUB_H
#define DEF_ZULGURUB_H
-enum eTypes
+enum DataTypes
{
MAX_ENCOUNTERS = 8,
- TYPE_ARLOKK = 1,
- TYPE_JEKLIK = 2,
- TYPE_VENOXIS = 3,
- TYPE_MARLI = 4,
- TYPE_OHGAN = 5,
- TYPE_THEKAL = 6,
- TYPE_ZATH = 7,
- TYPE_LORKHAN = 8,
-
+ DATA_ARLOKK = 1,
+ DATA_JEKLIK = 2,
+ DATA_VENOXIS = 3,
+ DATA_MARLI = 4,
+ DATA_OHGAN = 5,
+ DATA_THEKAL = 6,
+ DATA_ZATH = 7,
+ DATA_LORKHAN = 8,
DATA_JINDO = 10,
- DATA_LORKHAN = 11,
- DATA_THEKAL = 12,
- DATA_ZATH = 13
};
#endif