diff options
author | click <click@gonnamakeyou.com> | 2011-06-30 19:11:35 +0200 |
---|---|---|
committer | click <click@gonnamakeyou.com> | 2011-06-30 19:11:35 +0200 |
commit | 97e6d34f49429edd23069e0b0ffb39d964f4e8ae (patch) | |
tree | 6b0fe6472d770125a7baeb94b0f6e83821ee09dd | |
parent | e9aa72cc7b09999a1cbb6df994396ae8823657f6 (diff) |
Scripts/ZulGurub: Convert Venoxis over to use BossAI
10 files changed, 293 insertions, 191 deletions
diff --git a/sql/updates/world/2011_06_30_00_world_creature_text.sql b/sql/updates/world/2011_06_30_00_world_creature_text.sql new file mode 100644 index 00000000000..5f8572ca3a4 --- /dev/null +++ b/sql/updates/world/2011_06_30_00_world_creature_text.sql @@ -0,0 +1,4 @@ +DELETE FROM `script_texts` WHERE `npc_entry`=14507; +INSERT INTO `creature_text` (`entry`,`groupid`,`text`,`type`,`sound`,`comment`) VALUES +(14507,1,'Let the coils of hate unfurl!',14,8421,'venoxis SAY_VENOXIS_TRANSFORM'), +(14507,2,'Ssserenity..at lassst!',14,0,'venoxis SAY_VENOXIS_DEATH'); 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 |