aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-03-20 01:03:00 -0300
committerariel- <ariel-@users.noreply.github.com>2017-03-20 01:04:21 -0300
commit6f69f67f78090b0f08ae4cb74699c371d1a42d98 (patch)
treeba04ff2e307e4c466f9fb714ecfa6b67d61c7e05 /src
parent50c8672f42107678eb2250a16c80f6309e947504 (diff)
Core/Scripts: Updated Zul'Aman instance model
- Codestyle/indent fixes - Use of DoorData and ObjectData - Added GetZulamanAI for creatures - Moved bosses to BossAI
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp137
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp184
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp110
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp123
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp448
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp353
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp125
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.h43
9 files changed, 734 insertions, 799 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index 0f1bcd84025..203d1266e6a 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
@@ -86,7 +86,7 @@ class boss_akilzon : public CreatureScript
struct boss_akilzonAI : public BossAI
{
- boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZONEVENT)
+ boss_akilzonAI(Creature* creature) : BossAI(creature, BOSS_AKILZON)
{
Initialize();
}
@@ -114,6 +114,8 @@ class boss_akilzon : public CreatureScript
void EnterCombat(Unit* /*who*/) override
{
+ _EnterCombat();
+
events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 20000)); // 10 to 20 seconds (bosskillers)
events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); // 20 to 30 seconds(bosskillers)
events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(10000, 20000)); // totaly random timer. can't find any info on this
@@ -122,8 +124,6 @@ class boss_akilzon : public CreatureScript
events.ScheduleEvent(EVENT_ENRAGE, 10*MINUTE*IN_MILLISECONDS); // 10 minutes till enrage(bosskillers)
Talk(SAY_AGGRO);
- //DoZoneInCombat();
- instance->SetData(DATA_AKILZONEVENT, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) override
@@ -376,7 +376,7 @@ class boss_akilzon : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_akilzonAI>(creature);
+ return GetZulAmanAI<boss_akilzonAI>(creature);
}
};
@@ -466,7 +466,7 @@ class npc_akilzon_eagle : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return new npc_akilzon_eagleAI(creature);
+ return GetZulAmanAI<npc_akilzon_eagleAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
index 8c519f51df1..618190f750c 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
@@ -70,12 +70,11 @@ class boss_halazzi : public CreatureScript
public:
boss_halazzi() : CreatureScript("boss_halazzi") { }
- struct boss_halazziAI : public ScriptedAI
+ struct boss_halazziAI : public BossAI
{
- boss_halazziAI(Creature* creature) : ScriptedAI(creature), summons(me)
+ boss_halazziAI(Creature* creature) : BossAI(creature, BOSS_HALAZZI)
{
Initialize();
- instance = creature->GetInstanceScript();
Phase = PHASE_NONE;
FrenzyTimer = 0;
SaberlashTimer = 0;
@@ -91,8 +90,6 @@ class boss_halazzi : public CreatureScript
CheckTimer = 1000;
}
- InstanceScript* instance;
- SummonList summons;
PhaseHalazzi Phase;
uint32 FrenzyTimer;
@@ -107,9 +104,7 @@ class boss_halazzi : public CreatureScript
void Reset() override
{
- instance->SetData(DATA_HALAZZIEVENT, NOT_STARTED);
- summons.DespawnAll();
-
+ _Reset();
Initialize();
DoCast(me, SPELL_DUAL_WIELD, true);
@@ -120,7 +115,7 @@ class boss_halazzi : public CreatureScript
void EnterCombat(Unit* /*who*/) override
{
- instance->SetData(DATA_HALAZZIEVENT, IN_PROGRESS);
+ _EnterCombat();
Talk(SAY_AGGRO);
EnterPhase(PHASE_LYNX);
}
@@ -155,49 +150,49 @@ class boss_halazzi : public CreatureScript
{
switch (NextPhase)
{
- case PHASE_LYNX:
- case PHASE_ENRAGE:
- if (Phase == PHASE_MERGE)
- {
- DoCast(me, SPELL_TRANSFORM_MERGE, true);
- me->Attack(me->GetVictim(), true);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- }
- if (Creature* Lynx = ObjectAccessor::GetCreature(*me, LynxGUID))
- Lynx->DisappearAndDie();
- me->SetMaxHealth(600000);
- me->SetHealth(600000 - 150000 * TransformCount);
- FrenzyTimer = 16000;
- SaberlashTimer = 20000;
- ShockTimer = 10000;
- TotemTimer = 12000;
- break;
- case PHASE_SPLIT:
- Talk(SAY_SPLIT);
- DoCast(me, SPELL_TRANSFORM_SPLIT, true);
- break;
- case PHASE_HUMAN:
- //DoCast(me, SPELL_SUMMON_LYNX, true);
- DoSpawnCreature(NPC_SPIRIT_LYNX, 5, 5, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
- me->SetMaxHealth(400000);
- me->SetHealth(400000);
- ShockTimer = 10000;
- TotemTimer = 12000;
- break;
- case PHASE_MERGE:
- if (Unit* pLynx = ObjectAccessor::GetUnit(*me, LynxGUID))
- {
- Talk(SAY_MERGE);
- pLynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- pLynx->GetMotionMaster()->Clear();
- pLynx->GetMotionMaster()->MoveFollow(me, 0, 0);
- me->GetMotionMaster()->Clear();
- me->GetMotionMaster()->MoveFollow(pLynx, 0, 0);
- ++TransformCount;
- }
- break;
- default:
- break;
+ case PHASE_LYNX:
+ case PHASE_ENRAGE:
+ if (Phase == PHASE_MERGE)
+ {
+ DoCast(me, SPELL_TRANSFORM_MERGE, true);
+ me->Attack(me->GetVictim(), true);
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ }
+ if (Creature* Lynx = ObjectAccessor::GetCreature(*me, LynxGUID))
+ Lynx->DisappearAndDie();
+ me->SetMaxHealth(600000);
+ me->SetHealth(600000 - 150000 * TransformCount);
+ FrenzyTimer = 16000;
+ SaberlashTimer = 20000;
+ ShockTimer = 10000;
+ TotemTimer = 12000;
+ break;
+ case PHASE_SPLIT:
+ Talk(SAY_SPLIT);
+ DoCast(me, SPELL_TRANSFORM_SPLIT, true);
+ break;
+ case PHASE_HUMAN:
+ //DoCast(me, SPELL_SUMMON_LYNX, true);
+ DoSpawnCreature(NPC_SPIRIT_LYNX, 5, 5, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
+ me->SetMaxHealth(400000);
+ me->SetHealth(400000);
+ ShockTimer = 10000;
+ TotemTimer = 12000;
+ break;
+ case PHASE_MERGE:
+ if (Unit* pLynx = ObjectAccessor::GetUnit(*me, LynxGUID))
+ {
+ Talk(SAY_MERGE);
+ pLynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ pLynx->GetMotionMaster()->Clear();
+ pLynx->GetMotionMaster()->MoveFollow(me, 0, 0);
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MoveFollow(pLynx, 0, 0);
+ ++TransformCount;
+ }
+ break;
+ default:
+ break;
}
Phase = NextPhase;
}
@@ -212,7 +207,9 @@ class boss_halazzi : public CreatureScript
Talk(SAY_BERSERK);
DoCast(me, SPELL_BERSERK, true);
BerserkTimer = 60000;
- } else BerserkTimer -= diff;
+ }
+ else
+ BerserkTimer -= diff;
if (Phase == PHASE_LYNX || Phase == PHASE_ENRAGE)
{
@@ -223,13 +220,17 @@ class boss_halazzi : public CreatureScript
DoCastVictim(SPELL_SABER_LASH, true);
//me->RemoveAurasDueToSpell(41296);
SaberlashTimer = 30000;
- } else SaberlashTimer -= diff;
+ }
+ else
+ SaberlashTimer -= diff;
if (FrenzyTimer <= diff)
{
DoCast(me, SPELL_FRENZY);
FrenzyTimer = urand(10000, 15000);
- } else FrenzyTimer -= diff;
+ }
+ else
+ FrenzyTimer -= diff;
if (Phase == PHASE_LYNX)
{
@@ -238,7 +239,9 @@ class boss_halazzi : public CreatureScript
if (HealthBelowPct(25 * (3 - TransformCount)))
EnterPhase(PHASE_SPLIT);
CheckTimer = 1000;
- } else CheckTimer -= diff;
+ }
+ else
+ CheckTimer -= diff;
}
}
@@ -248,7 +251,9 @@ class boss_halazzi : public CreatureScript
{
DoCast(me, SPELL_SUMMON_TOTEM);
TotemTimer = 20000;
- } else TotemTimer -= diff;
+ }
+ else
+ TotemTimer -= diff;
if (ShockTimer <= diff)
{
@@ -260,7 +265,9 @@ class boss_halazzi : public CreatureScript
DoCast(target, SPELL_FLAMESHOCK);
ShockTimer = urand(10000, 15000);
}
- } else ShockTimer -= diff;
+ }
+ else
+ ShockTimer -= diff;
if (Phase == PHASE_HUMAN)
{
@@ -275,7 +282,9 @@ class boss_halazzi : public CreatureScript
EnterPhase(PHASE_MERGE);
}
CheckTimer = 1000;
- } else CheckTimer -= diff;
+ }
+ else
+ CheckTimer -= diff;
}
}
@@ -297,7 +306,9 @@ class boss_halazzi : public CreatureScript
}
}
CheckTimer = 1000;
- } else CheckTimer -= diff;
+ }
+ else
+ CheckTimer -= diff;
}
DoMeleeAttackIfReady();
@@ -313,14 +324,14 @@ class boss_halazzi : public CreatureScript
void JustDied(Unit* /*killer*/) override
{
- instance->SetData(DATA_HALAZZIEVENT, DONE);
+ _JustDied();
Talk(SAY_DEATH);
}
};
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_halazziAI>(creature);
+ return GetZulAmanAI<boss_halazziAI>(creature);
}
};
@@ -389,7 +400,7 @@ class npc_halazzi_lynx : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return new npc_halazzi_lynxAI(creature);
+ return GetZulAmanAI<npc_halazzi_lynxAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index 47ca15dd33d..bb1fcf55522 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
@@ -135,7 +135,8 @@ enum Spells
static float Pos_X[4] = {112.8827f, 107.8827f, 122.8827f, 127.8827f};
-static uint32 AddEntryList[8]=
+static uint8 const AddCount = 8;
+static uint32 const AddEntryList[AddCount]=
{
24240, //Alyson Antille
24241, //Thurg
@@ -226,7 +227,7 @@ struct boss_hexlord_addAI : public ScriptedAI
void UpdateAI(uint32 /*diff*/) override
{
- if (instance->GetData(DATA_HEXLORDEVENT) != IN_PROGRESS)
+ if (instance->GetBossState(BOSS_HEXLORD) != IN_PROGRESS)
{
EnterEvadeMode();
return;
@@ -240,21 +241,15 @@ class boss_hexlord_malacrass : public CreatureScript
{
public:
- boss_hexlord_malacrass()
- : CreatureScript("boss_hexlord_malacrass")
- {
- }
+ boss_hexlord_malacrass() : CreatureScript("boss_hexlord_malacrass") { }
- struct boss_hex_lord_malacrassAI : public ScriptedAI
+ struct boss_hex_lord_malacrassAI : public BossAI
{
- boss_hex_lord_malacrassAI(Creature* creature) : ScriptedAI(creature)
+ boss_hex_lord_malacrassAI(Creature* creature) : BossAI(creature, BOSS_HEXLORD)
{
Initialize();
- instance = creature->GetInstanceScript();
SelectAddEntry();
- for (uint8 i = 0; i < 4; ++i)
- AddGUID[i].Clear();
- PlayerGUID.Clear();
+
PlayerClass = CLASS_NONE;
}
@@ -268,8 +263,6 @@ class boss_hexlord_malacrass : public CreatureScript
ResetTimer = 5000;
}
- InstanceScript* instance;
-
ObjectGuid AddGUID[4];
uint32 AddEntry[4];
@@ -286,8 +279,7 @@ class boss_hexlord_malacrass : public CreatureScript
void Reset() override
{
- instance->SetData(DATA_HEXLORDEVENT, NOT_STARTED);
-
+ _Reset();
Initialize();
SpawnAdds();
@@ -298,9 +290,7 @@ class boss_hexlord_malacrass : public CreatureScript
void EnterCombat(Unit* /*who*/) override
{
- instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS);
-
- DoZoneInCombat();
+ _EnterCombat();
Talk(YELL_AGGRO);
for (uint8 i = 0; i < 4; ++i)
@@ -331,8 +321,7 @@ class boss_hexlord_malacrass : public CreatureScript
void JustDied(Unit* /*killer*/) override
{
- instance->SetData(DATA_HEXLORDEVENT, DONE);
-
+ _JustDied();
Talk(YELL_DEATH);
for (uint8 i = 0; i < 4; ++i)
@@ -345,16 +334,11 @@ class boss_hexlord_malacrass : public CreatureScript
void SelectAddEntry()
{
- std::vector<uint32> AddList;
-
- for (uint8 i = 0; i < 8; ++i)
- AddList.push_back(AddEntryList[i]);
-
- while (AddList.size() > 4)
- AddList.erase(AddList.begin() + rand32() % AddList.size());
+ std::list<uint32> addList(&AddEntryList[0], &AddEntryList[AddCount]);
+ Trinity::Containers::RandomResizeList(addList, 4);
uint8 i = 0;
- for (std::vector<uint32>::const_iterator itr = AddList.begin(); itr != AddList.end(); ++itr, ++i)
+ for (auto itr = addList.begin(); itr != addList.end(); ++itr, ++i)
AddEntry[i] = *itr;
}
@@ -362,12 +346,14 @@ class boss_hexlord_malacrass : public CreatureScript
{
for (uint8 i = 0; i < 4; ++i)
{
- Creature* creature = (ObjectAccessor::GetCreature((*me), AddGUID[i]));
+ Creature* creature = (ObjectAccessor::GetCreature(*me, AddGUID[i]));
if (!creature || !creature->IsAlive())
{
- if (creature) creature->setDeathState(DEAD);
+ if (creature)
+ creature->setDeathState(DEAD);
creature = me->SummonCreature(AddEntry[i], Pos_X[i], POS_Y, POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0);
- if (creature) AddGUID[i] = creature->GetGUID();
+ if (creature)
+ AddGUID[i] = creature->GetGUID();
}
else
{
@@ -391,7 +377,9 @@ class boss_hexlord_malacrass : public CreatureScript
return;
}
ResetTimer = 5000;
- } else ResetTimer -= diff;
+ }
+ else
+ ResetTimer -= diff;
if (CheckAddState_Timer <= diff)
{
@@ -401,14 +389,18 @@ class boss_hexlord_malacrass : public CreatureScript
temp->AI()->AttackStart(me->GetVictim());
CheckAddState_Timer = 5000;
- } else CheckAddState_Timer -= diff;
+ }
+ else
+ CheckAddState_Timer -= diff;
if (DrainPower_Timer <= diff)
{
DoCast(me, SPELL_DRAIN_POWER, true);
Talk(YELL_DRAIN_POWER);
DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear
- } else DrainPower_Timer -= diff;
+ }
+ else
+ DrainPower_Timer -= diff;
if (SpiritBolts_Timer <= diff)
{
@@ -422,7 +414,9 @@ class boss_hexlord_malacrass : public CreatureScript
SiphonSoul_Timer = 10000; // ready to drain
PlayerAbility_Timer = 99999;
}
- } else SpiritBolts_Timer -= diff;
+ }
+ else
+ SpiritBolts_Timer -= diff;
if (SiphonSoul_Timer <= diff)
{
@@ -448,14 +442,16 @@ class boss_hexlord_malacrass : public CreatureScript
PlayerAbility_Timer = urand(8000, 10000);
PlayerClass = target->getClass() - 1;
- if (PlayerClass == CLASS_DRUID-1)
+ if (PlayerClass == CLASS_DRUID - 1)
PlayerClass = CLASS_DRUID;
- else if (PlayerClass == CLASS_PRIEST-1 && target->HasSpell(15473))
+ else if (PlayerClass == CLASS_PRIEST - 1 && target->HasSpell(15473))
PlayerClass = CLASS_PRIEST; // shadow priest
SiphonSoul_Timer = 99999; // buff lasts 30 sec
}
- } else SiphonSoul_Timer -= diff;
+ }
+ else
+ SiphonSoul_Timer -= diff;
if (PlayerAbility_Timer <= diff)
{
@@ -465,7 +461,9 @@ class boss_hexlord_malacrass : public CreatureScript
UseAbility();
PlayerAbility_Timer = urand(8000, 10000);
//}
- } else PlayerAbility_Timer -= diff;
+ }
+ else
+ PlayerAbility_Timer -= diff;
DoMeleeAttackIfReady();
}
@@ -487,11 +485,11 @@ class boss_hexlord_malacrass : public CreatureScript
target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
break;
case ABILITY_TARGET_HEAL:
- target = DoSelectLowestHpFriendly(50, 0);
+ target = DoSelectLowestHpFriendly(50.f, 0);
break;
case ABILITY_TARGET_BUFF:
{
- std::list<Creature*> templist = DoFindFriendlyMissingBuff(50, PlayerAbility[PlayerClass][random].spell);
+ std::list<Creature*> templist = DoFindFriendlyMissingBuff(50.f, PlayerAbility[PlayerClass][random].spell);
if (!templist.empty())
target = *(templist.begin());
}
@@ -504,22 +502,17 @@ class boss_hexlord_malacrass : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_hex_lord_malacrassAI>(creature);
+ return GetZulAmanAI<boss_hex_lord_malacrassAI>(creature);
}
};
class boss_thurg : public CreatureScript
{
public:
-
- boss_thurg()
- : CreatureScript("boss_thurg")
- {
- }
+ boss_thurg() : CreatureScript("boss_thurg") { }
struct boss_thurgAI : public boss_hexlord_addAI
{
-
boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature)
{
Initialize();
@@ -555,13 +548,17 @@ class boss_thurg : public CreatureScript
DoCast(target, SPELL_BLOODLUST, false);
}
bloodlust_timer = 12000;
- } else bloodlust_timer -= diff;
+ }
+ else
+ bloodlust_timer -= diff;
if (cleave_timer <= diff)
{
DoCastVictim(SPELL_CLEAVE, false);
cleave_timer = 12000; //3 sec cast
- } else cleave_timer -= diff;
+ }
+ else
+ cleave_timer -= diff;
boss_hexlord_addAI::UpdateAI(diff);
}
@@ -569,18 +566,14 @@ class boss_thurg : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_thurgAI>(creature);
+ return GetZulAmanAI<boss_thurgAI>(creature);
}
};
class boss_alyson_antille : public CreatureScript
{
public:
-
- boss_alyson_antille()
- : CreatureScript("boss_alyson_antille")
- {
- }
+ boss_alyson_antille() : CreatureScript("boss_alyson_antille") { }
struct boss_alyson_antilleAI : public boss_hexlord_addAI
{
@@ -652,7 +645,9 @@ class boss_alyson_antille : public CreatureScript
DoCast(target, SPELL_DISPEL_MAGIC, false);
}
flashheal_timer = 2500;
- } else flashheal_timer -= diff;
+ }
+ else
+ flashheal_timer -= diff;
/*if (dispelmagic_timer <= diff)
{
@@ -666,7 +661,9 @@ class boss_alyson_antille : public CreatureScript
me->CastSpell(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DISPEL_MAGIC, false);
dispelmagic_timer = 12000;
- } else dispelmagic_timer -= diff;*/
+ }
+ else
+ dispelmagic_timer -= diff;*/
boss_hexlord_addAI::UpdateAI(diff);
}
@@ -674,14 +671,13 @@ class boss_alyson_antille : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_alyson_antilleAI>(creature);
+ return GetZulAmanAI<boss_alyson_antilleAI>(creature);
}
};
class boss_gazakroth : public CreatureScript
{
public:
-
boss_gazakroth() : CreatureScript("boss_gazakroth") { }
struct boss_gazakrothAI : public boss_hexlord_addAI
@@ -716,7 +712,9 @@ class boss_gazakroth : public CreatureScript
{
DoCastVictim(SPELL_FIREBOLT, false);
firebolt_timer = 0.7 * IN_MILLISECONDS;
- } else firebolt_timer -= diff;
+ }
+ else
+ firebolt_timer -= diff;
boss_hexlord_addAI::UpdateAI(diff);
}
@@ -727,18 +725,14 @@ class boss_gazakroth : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_gazakrothAI>(creature);
+ return GetZulAmanAI<boss_gazakrothAI>(creature);
}
};
class boss_lord_raadan : public CreatureScript
{
public:
-
- boss_lord_raadan()
- : CreatureScript("boss_lord_raadan")
- {
- }
+ boss_lord_raadan() : CreatureScript("boss_lord_raadan") { }
struct boss_lord_raadanAI : public boss_hexlord_addAI
{
@@ -772,13 +766,17 @@ class boss_lord_raadan : public CreatureScript
{
DoCastVictim(SPELL_THUNDERCLAP, false);
thunderclap_timer = 12000;
- } else thunderclap_timer -= diff;
+ }
+ else
+ thunderclap_timer -= diff;
if (flamebreath_timer <= diff)
{
DoCastVictim(SPELL_FLAME_BREATH, false);
flamebreath_timer = 12000;
- } else flamebreath_timer -= diff;
+ }
+ else
+ flamebreath_timer -= diff;
boss_hexlord_addAI::UpdateAI(diff);
}
@@ -786,18 +784,14 @@ class boss_lord_raadan : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_lord_raadanAI>(creature);
+ return GetZulAmanAI<boss_lord_raadanAI>(creature);
}
};
class boss_darkheart : public CreatureScript
{
public:
-
- boss_darkheart()
- : CreatureScript("boss_darkheart")
- {
- }
+ boss_darkheart() : CreatureScript("boss_darkheart") { }
struct boss_darkheartAI : public boss_hexlord_addAI
{
@@ -827,7 +821,9 @@ class boss_darkheart : public CreatureScript
{
DoCastVictim(SPELL_PSYCHIC_WAIL, false);
psychicwail_timer = 12000;
- } else psychicwail_timer -= diff;
+ }
+ else
+ psychicwail_timer -= diff;
boss_hexlord_addAI::UpdateAI(diff);
}
@@ -835,7 +831,7 @@ class boss_darkheart : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_darkheartAI>(creature);
+ return GetZulAmanAI<boss_darkheartAI>(creature);
}
};
@@ -843,11 +839,7 @@ class boss_darkheart : public CreatureScript
class boss_slither : public CreatureScript
{
public:
-
- boss_slither()
- : CreatureScript("boss_slither")
- {
- }
+ boss_slither() : CreatureScript("boss_slither") { }
struct boss_slitherAI : public boss_hexlord_addAI
{
@@ -894,7 +886,9 @@ class boss_slither : public CreatureScript
if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(victim, SPELL_VENOM_SPIT, false);
venomspit_timer = 2500;
- } else venomspit_timer -= diff;
+ }
+ else
+ venomspit_timer -= diff;
boss_hexlord_addAI::UpdateAI(diff);
}
@@ -902,18 +896,14 @@ class boss_slither : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_slitherAI>(creature);
+ return GetZulAmanAI<boss_slitherAI>(creature);
}
};
class boss_fenstalker : public CreatureScript
{
public:
-
- boss_fenstalker()
- : CreatureScript("boss_fenstalker")
- {
- }
+ boss_fenstalker() : CreatureScript("boss_fenstalker") { }
struct boss_fenstalkerAI : public boss_hexlord_addAI
{
@@ -946,7 +936,9 @@ class boss_fenstalker : public CreatureScript
if (me->GetVictim())
me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_VOLATILE_INFECTION, false);
volatileinf_timer = 12000;
- } else volatileinf_timer -= diff;
+ }
+ else
+ volatileinf_timer -= diff;
boss_hexlord_addAI::UpdateAI(diff);
}
@@ -954,18 +946,14 @@ class boss_fenstalker : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_fenstalkerAI>(creature);
+ return GetZulAmanAI<boss_fenstalkerAI>(creature);
}
};
class boss_koragg : public CreatureScript
{
public:
-
- boss_koragg()
- : CreatureScript("boss_koragg")
- {
- }
+ boss_koragg() : CreatureScript("boss_koragg") { }
struct boss_koraggAI : public boss_hexlord_addAI
{
@@ -1012,7 +1000,7 @@ class boss_koragg : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_koraggAI>(creature);
+ return GetZulAmanAI<boss_koraggAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
index 05c2c37cc94..56ce4193c5f 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
@@ -111,18 +111,13 @@ float hatcherway[2][5][3] =
class boss_janalai : public CreatureScript
{
public:
+ boss_janalai() : CreatureScript("boss_janalai") { }
- boss_janalai()
- : CreatureScript("boss_janalai")
+ struct boss_janalaiAI : public BossAI
{
- }
-
- struct boss_janalaiAI : public ScriptedAI
- {
- boss_janalaiAI(Creature* creature) : ScriptedAI(creature)
+ boss_janalaiAI(Creature* creature) : BossAI(creature, BOSS_JANALAI)
{
Initialize();
- instance = creature->GetInstanceScript();
}
void Initialize()
@@ -144,8 +139,6 @@ class boss_janalai : public CreatureScript
FireBombGUIDs[i].Clear();
}
- InstanceScript* instance;
-
uint32 FireBreathTimer;
uint32 BombTimer;
uint32 BombSequenceTimer;
@@ -163,7 +156,7 @@ class boss_janalai : public CreatureScript
void Reset() override
{
- instance->SetData(DATA_JANALAIEVENT, NOT_STARTED);
+ _Reset();
Initialize();
@@ -174,7 +167,7 @@ class boss_janalai : public CreatureScript
{
Talk(SAY_DEATH);
- instance->SetData(DATA_JANALAIEVENT, DONE);
+ _JustDied();
}
void KilledUnit(Unit* /*victim*/) override
@@ -184,10 +177,9 @@ class boss_janalai : public CreatureScript
void EnterCombat(Unit* /*who*/) override
{
- instance->SetData(DATA_JANALAIEVENT, IN_PROGRESS);
+ _EnterCombat();
Talk(SAY_AGGRO);
- // DoZoneInCombat();
}
void DamageDealt(Unit* target, uint32 &damage, DamageEffectType /*damagetype*/) override
@@ -308,7 +300,9 @@ class boss_janalai : public CreatureScript
if (BombCount == 40)
{
BombSequenceTimer = 5000;
- } else BombSequenceTimer = 100;
+ }
+ else
+ BombSequenceTimer = 100;
}
else
{
@@ -363,7 +357,9 @@ class boss_janalai : public CreatureScript
DoCast(me, SPELL_BERSERK, true);
EnrageTimer = 300000;
}
- } else EnrageTimer -= diff;
+ }
+ else
+ EnrageTimer -= diff;
if (BombTimer <= diff)
{
@@ -394,7 +390,9 @@ class boss_janalai : public CreatureScript
DoTeleportPlayer(i_pl, JanalainPos[0][0] - 5 + rand32() % 10, JanalainPos[0][1] - 5 + rand32() % 10, JanalainPos[0][2], 0);
//DoCast(Temp, SPELL_SUMMON_PLAYERS, true) // core bug, spell does not work if too far
return;
- } else BombTimer -= diff;
+ }
+ else
+ BombTimer -= diff;
if (!noeggs)
{
@@ -437,28 +435,26 @@ class boss_janalai : public CreatureScript
isFlameBreathing = true;
}
FireBreathTimer = 8000;
- } else FireBreathTimer -= diff;
+ }
+ else
+ FireBreathTimer -= diff;
}
};
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_janalaiAI>(creature);
+ return GetZulAmanAI<boss_janalaiAI>(creature);
}
};
class npc_janalai_firebomb : public CreatureScript
{
public:
-
- npc_janalai_firebomb()
- : CreatureScript("npc_janalai_firebomb")
- {
- }
+ npc_janalai_firebomb() : CreatureScript("npc_janalai_firebomb") { }
struct npc_janalai_firebombAI : public ScriptedAI
{
- npc_janalai_firebombAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_janalai_firebombAI(Creature* creature) : ScriptedAI(creature) { }
void Reset() override { }
@@ -474,24 +470,19 @@ class npc_janalai_firebomb : public CreatureScript
void MoveInLineOfSight(Unit* /*who*/) override { }
-
void UpdateAI(uint32 /*diff*/) override { }
};
CreatureAI* GetAI(Creature* creature) const override
{
- return new npc_janalai_firebombAI(creature);
+ return GetZulAmanAI<npc_janalai_firebombAI>(creature);
}
};
class npc_janalai_hatcher : public CreatureScript
{
public:
-
- npc_janalai_hatcher()
- : CreatureScript("npc_janalai_hatcher")
- {
- }
+ npc_janalai_hatcher() : CreatureScript("npc_janalai_hatcher") { }
struct npc_janalai_hatcherAI : public ScriptedAI
{
@@ -577,7 +568,7 @@ class npc_janalai_hatcher : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS))
+ if (!instance || !(instance->GetBossState(BOSS_JANALAI) == IN_PROGRESS))
{
me->DisappearAndDie();
return;
@@ -613,25 +604,23 @@ class npc_janalai_hatcher : public CreatureScript
else
me->DisappearAndDie();
- } else WaitTimer -= diff;
+ }
+ else
+ WaitTimer -= diff;
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<npc_janalai_hatcherAI>(creature);
+ return GetZulAmanAI<npc_janalai_hatcherAI>(creature);
}
};
class npc_janalai_hatchling : public CreatureScript
{
public:
-
- npc_janalai_hatchling()
- : CreatureScript("npc_janalai_hatchling")
- {
- }
+ npc_janalai_hatchling() : CreatureScript("npc_janalai_hatchling") { }
struct npc_janalai_hatchlingAI : public ScriptedAI
{
@@ -664,7 +653,7 @@ class npc_janalai_hatchling : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS))
+ if (!instance || !(instance->GetBossState(BOSS_JANALAI) == IN_PROGRESS))
{
me->DisappearAndDie();
return;
@@ -677,7 +666,9 @@ class npc_janalai_hatchling : public CreatureScript
{
DoCastVictim(SPELL_FLAMEBUFFET, false);
BuffetTimer = 10000;
- } else BuffetTimer -= diff;
+ }
+ else
+ BuffetTimer -= diff;
DoMeleeAttackIfReady();
}
@@ -685,37 +676,34 @@ class npc_janalai_hatchling : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<npc_janalai_hatchlingAI>(creature);
+ return GetZulAmanAI<npc_janalai_hatchlingAI>(creature);
}
};
class npc_janalai_egg : public CreatureScript
{
-public:
- npc_janalai_egg(): CreatureScript("npc_janalai_egg") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_janalai_eggAI(creature);
- }
+ public:
+ npc_janalai_egg(): CreatureScript("npc_janalai_egg") { }
- struct npc_janalai_eggAI : public ScriptedAI
- {
- npc_janalai_eggAI(Creature* creature) : ScriptedAI(creature){ }
+ struct npc_janalai_eggAI : public ScriptedAI
+ {
+ npc_janalai_eggAI(Creature* creature) : ScriptedAI(creature) { }
- void Reset() override { }
+ void Reset() override { }
- void UpdateAI(uint32 /*diff*/) override { }
+ void UpdateAI(uint32 /*diff*/) override { }
- void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override
- {
- if (spell->Id == SPELL_HATCH_EGG)
+ void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override
{
- DoCast(SPELL_SUMMON_HATCHLING);
+ if (spell->Id == SPELL_HATCH_EGG)
+ DoCast(SPELL_SUMMON_HATCHLING);
}
- }
- };
+ };
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetZulAmanAI<npc_janalai_eggAI>(creature);
+ }
};
void AddSC_boss_janalai()
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
index 5d3f3a8affe..9711126dfcd 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
@@ -83,15 +83,11 @@ float NalorakkWay[8][3] =
class boss_nalorakk : public CreatureScript
{
public:
+ boss_nalorakk() : CreatureScript("boss_nalorakk") { }
- boss_nalorakk()
- : CreatureScript("boss_nalorakk")
+ struct boss_nalorakkAI : public BossAI
{
- }
-
- struct boss_nalorakkAI : public ScriptedAI
- {
- boss_nalorakkAI(Creature* creature) : ScriptedAI(creature)
+ boss_nalorakkAI(Creature* creature) : BossAI(creature, BOSS_NALORAKK)
{
Initialize();
inMove = false;
@@ -101,7 +97,6 @@ class boss_nalorakk : public CreatureScript
LaceratingSlash_Timer = 0;
RendFlesh_Timer = 0;
DeafeningRoar_Timer = 0;
- instance = creature->GetInstanceScript();
}
void Initialize()
@@ -115,8 +110,6 @@ class boss_nalorakk : public CreatureScript
inBearForm = false;
}
- InstanceScript* instance;
-
uint32 BrutalSwipe_Timer;
uint32 Mangle_Timer;
uint32 Surge_Timer;
@@ -136,6 +129,8 @@ class boss_nalorakk : public CreatureScript
void Reset() override
{
+ _Reset();
+
if (MoveEvent)
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -144,62 +139,42 @@ class boss_nalorakk : public CreatureScript
waitTimer = 0;
me->SetSpeedRate(MOVE_RUN, 2);
me->SetWalk(false);
- }else
- {
- (*me).GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]);
}
-
- instance->SetData(DATA_NALORAKKEVENT, NOT_STARTED);
+ else
+ me->GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]);
Initialize();
// me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); /// @todo find the correct equipment id
}
- void SendAttacker(Unit* target)
+ void SendAttacker(Unit* target) const
{
- std::list<Creature*> templist;
- float x, y, z;
- me->GetPosition(x, y, z);
-
- {
- CellCoord pair(Trinity::ComputeCellCoord(x, y));
- Cell cell(pair);
- cell.SetNoCreate();
+ std::vector<Creature*> tempList;
- Trinity::AllFriendlyCreaturesInGrid check(me);
- Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> searcher(me, templist, check);
+ Trinity::AllFriendlyCreaturesInGrid check(me);
+ Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> searcher(me, tempList, check);
+ me->VisitNearbyGridObject(25.0f, searcher);
- TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>, GridTypeMapContainer> cSearcher(searcher);
-
- cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange());
- }
-
- if (templist.empty())
+ if (tempList.empty())
return;
- for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i)
+ for (Creature* creature : tempList)
{
- if ((*i) && me->IsWithinDistInMap((*i), 25))
- {
- (*i)->SetNoCallAssistance(true);
- (*i)->AI()->AttackStart(target);
- }
+ creature->SetNoCallAssistance(true);
+ creature->AI()->AttackStart(target);
}
}
void AttackStart(Unit* who) override
{
if (!MoveEvent)
- ScriptedAI::AttackStart(who);
+ BossAI::AttackStart(who);
}
void MoveInLineOfSight(Unit* who) override
-
{
if (!MoveEvent)
- {
- ScriptedAI::MoveInLineOfSight(who);
- }
+ BossAI::MoveInLineOfSight(who);
else
{
if (me->IsHostileTo(who))
@@ -213,8 +188,8 @@ class boss_nalorakk : public CreatureScript
{
Talk(YELL_NALORAKK_WAVE1);
- (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]);
- MovePhase ++;
+ me->GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]);
+ ++MovePhase;
inMove = true;
SendAttacker(who);
@@ -225,8 +200,8 @@ class boss_nalorakk : public CreatureScript
{
Talk(YELL_NALORAKK_WAVE2);
- (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]);
- MovePhase ++;
+ me->GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]);
+ ++MovePhase;
inMove = true;
SendAttacker(who);
@@ -237,8 +212,8 @@ class boss_nalorakk : public CreatureScript
{
Talk(YELL_NALORAKK_WAVE3);
- (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]);
- MovePhase ++;
+ me->GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]);
+ ++MovePhase;
inMove = true;
SendAttacker(who);
@@ -265,15 +240,14 @@ class boss_nalorakk : public CreatureScript
void EnterCombat(Unit* /*who*/) override
{
- instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS);
+ _EnterCombat();
Talk(YELL_AGGRO);
- DoZoneInCombat();
}
void JustDied(Unit* /*killer*/) override
{
- instance->SetData(DATA_NALORAKKEVENT, DONE);
+ _JustDied();
Talk(YELL_DEATH);
}
@@ -314,7 +288,7 @@ class boss_nalorakk : public CreatureScript
case 3:
case 4:
case 6:
- MovePhase ++;
+ ++MovePhase;
waitTimer = 1;
inMove = true;
return;
@@ -337,10 +311,12 @@ class boss_nalorakk : public CreatureScript
{
if (waitTimer <= diff)
{
- (*me).GetMotionMaster()->MovementExpired();
- (*me).GetMotionMaster()->MovePoint(MovePhase, NalorakkWay[MovePhase][0], NalorakkWay[MovePhase][1], NalorakkWay[MovePhase][2]);
+ me->GetMotionMaster()->MovementExpired();
+ me->GetMotionMaster()->MovePoint(MovePhase, NalorakkWay[MovePhase][0], NalorakkWay[MovePhase][1], NalorakkWay[MovePhase][2]);
waitTimer = 0;
- } else waitTimer -= diff;
+ }
+ else
+ waitTimer -= diff;
}
if (!UpdateVictim())
@@ -351,7 +327,9 @@ class boss_nalorakk : public CreatureScript
DoCast(me, SPELL_BERSERK, true);
Talk(YELL_BERSERK);
Berserk_Timer = 600000;
- } else Berserk_Timer -= diff;
+ }
+ else
+ Berserk_Timer -= diff;
if (ShapeShift_Timer <= diff)
{
@@ -377,7 +355,9 @@ class boss_nalorakk : public CreatureScript
ShapeShift_Timer = urand(20000, 25000); // dur 30s
inBearForm = true;
}
- } else ShapeShift_Timer -= diff;
+ }
+ else
+ ShapeShift_Timer -= diff;
if (!inBearForm)
{
@@ -385,7 +365,9 @@ class boss_nalorakk : public CreatureScript
{
DoCastVictim(SPELL_BRUTALSWIPE);
BrutalSwipe_Timer = urand(7000, 12000);
- } else BrutalSwipe_Timer -= diff;
+ }
+ else
+ BrutalSwipe_Timer -= diff;
if (Mangle_Timer <= diff)
{
@@ -395,7 +377,9 @@ class boss_nalorakk : public CreatureScript
Mangle_Timer = 1000;
}
else Mangle_Timer = urand(10000, 15000);
- } else Mangle_Timer -= diff;
+ }
+ else
+ Mangle_Timer -= diff;
if (Surge_Timer <= diff)
{
@@ -404,7 +388,9 @@ class boss_nalorakk : public CreatureScript
if (target)
DoCast(target, SPELL_SURGE);
Surge_Timer = urand(15000, 20000);
- } else Surge_Timer -= diff;
+ }
+ else
+ Surge_Timer -= diff;
}
else
{
@@ -412,19 +398,25 @@ class boss_nalorakk : public CreatureScript
{
DoCastVictim(SPELL_LACERATINGSLASH);
LaceratingSlash_Timer = urand(18000, 23000);
- } else LaceratingSlash_Timer -= diff;
+ }
+ else
+ LaceratingSlash_Timer -= diff;
if (RendFlesh_Timer <= diff)
{
DoCastVictim(SPELL_RENDFLESH);
RendFlesh_Timer = urand(5000, 10000);
- } else RendFlesh_Timer -= diff;
+ }
+ else
+ RendFlesh_Timer -= diff;
if (DeafeningRoar_Timer <= diff)
{
DoCastVictim(SPELL_DEAFENINGROAR);
DeafeningRoar_Timer = urand(15000, 20000);
- } else DeafeningRoar_Timer -= diff;
+ }
+ else
+ DeafeningRoar_Timer -= diff;
}
DoMeleeAttackIfReady();
@@ -433,7 +425,7 @@ class boss_nalorakk : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_nalorakkAI>(creature);
+ return GetZulAmanAI<boss_nalorakkAI>(creature);
}
};
@@ -441,4 +433,3 @@ void AddSC_boss_nalorakk()
{
new boss_nalorakk();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
index e3d1d7f9373..d766f3445ec 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
@@ -98,15 +98,15 @@ enum Phase
struct SpiritInfoStruct
{
uint32 entry;
- float x, y, z, orient;
+ Position pos;
};
-static SpiritInfoStruct SpiritInfo[4] =
+static SpiritInfoStruct const SpiritInfo[4] =
{
- {23878, 147.87f, 706.51f, 45.11f, 3.04f},
- {23880, 88.95f, 705.49f, 45.11f, 6.11f},
- {23877, 137.23f, 725.98f, 45.11f, 3.71f},
- {23879, 104.29f, 726.43f, 45.11f, 5.43f}
+ { 23878, { 147.87f, 706.51f, 45.11f, 3.04f } },
+ { 23880, { 88.950f, 705.49f, 45.11f, 6.11f } },
+ { 23877, { 137.23f, 725.98f, 45.11f, 3.71f } },
+ { 23879, { 104.29f, 726.43f, 45.11f, 5.43f } }
};
struct TransformStruct
@@ -115,29 +115,24 @@ struct TransformStruct
uint32 spell, unaura;
};
-static TransformStruct Transform[4] =
+static TransformStruct const Transform[4] =
{
- {YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND},
- {YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR},
- {YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE},
- {YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX}
+ { YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND },
+ { YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR },
+ { YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE },
+ { YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX }
};
class boss_zuljin : public CreatureScript
{
public:
+ boss_zuljin() : CreatureScript("boss_zuljin") { }
- boss_zuljin()
- : CreatureScript("boss_zuljin")
+ struct boss_zuljinAI : public BossAI
{
- }
-
- struct boss_zuljinAI : public ScriptedAI
- {
- boss_zuljinAI(Creature* creature) : ScriptedAI(creature), Summons(me)
+ boss_zuljinAI(Creature* creature) : BossAI(creature, BOSS_ZULJIN)
{
Initialize();
- instance = creature->GetInstanceScript();
health_20 = 0;
}
@@ -167,8 +162,6 @@ class boss_zuljin : public CreatureScript
TankGUID.Clear();
}
- InstanceScript* instance;
-
ObjectGuid SpiritGUID[4];
ObjectGuid ClawTargetGUID;
ObjectGuid TankGUID;
@@ -194,18 +187,14 @@ class boss_zuljin : public CreatureScript
uint32 Flame_Breath_Timer;
uint32 Pillar_Of_Fire_Timer;
- SummonList Summons;
-
void Reset() override
{
- instance->SetData(DATA_ZULJINEVENT, NOT_STARTED);
+ _Reset();
health_20 = me->CountPctFromMaxHealth(20);
Initialize();
- Summons.DespawnAll();
-
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 33975);
//me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674);
//me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
@@ -213,9 +202,7 @@ class boss_zuljin : public CreatureScript
void EnterCombat(Unit* /*who*/) override
{
- instance->SetData(DATA_ZULJINEVENT, IN_PROGRESS);
-
- DoZoneInCombat();
+ _EnterCombat();
Talk(YELL_INTRO);
SpawnAdds();
@@ -232,10 +219,9 @@ class boss_zuljin : public CreatureScript
void JustDied(Unit* /*killer*/) override
{
- instance->SetData(DATA_ZULJINEVENT, DONE);
+ _JustDied();
Talk(YELL_DEATH);
- Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE);
if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[3]))
Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
@@ -264,7 +250,9 @@ class boss_zuljin : public CreatureScript
DoCastVictim(SPELL_OVERPOWER, false);
Overpower_Timer = 5000;
}
- } else me->AttackerStateUpdate(me->GetVictim());
+ }
+ else
+ me->AttackerStateUpdate(me->GetVictim());
me->resetAttackTimer();
}
}
@@ -272,11 +260,9 @@ class boss_zuljin : public CreatureScript
void SpawnAdds()
{
- Creature* creature = NULL;
for (uint8 i = 0; i < 4; ++i)
{
- creature = me->SummonCreature(SpiritInfo[i].entry, SpiritInfo[i].x, SpiritInfo[i].y, SpiritInfo[i].z, SpiritInfo[i].orient, TEMPSUMMON_DEAD_DESPAWN, 0);
- if (creature)
+ if (Creature* creature = me->SummonCreature(SpiritInfo[i].entry, SpiritInfo[i].pos, TEMPSUMMON_DEAD_DESPAWN, 0))
{
creature->CastSpell(creature, SPELL_SPIRIT_AURA, true);
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -302,68 +288,60 @@ class boss_zuljin : public CreatureScript
}
}
- void JustSummoned(Creature* summon) override
- {
- Summons.Summon(summon);
- }
-
- void SummonedCreatureDespawn(Creature* summon) override
- {
- Summons.Despawn(summon);
- }
-
void EnterPhase(uint32 NextPhase)
{
switch (NextPhase)
{
- case 0:
- break;
- case 1:
- case 2:
- case 3:
- case 4:
- DoTeleportTo(CENTER_X, CENTER_Y, CENTER_Z, 100);
- DoResetThreat();
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
- me->RemoveAurasDueToSpell(Transform[Phase].unaura);
- DoCast(me, Transform[Phase].spell);
- Talk(Transform[Phase].text);
- if (Phase > 0)
- {
- if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[Phase - 1]))
- Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
- }
- if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[NextPhase - 1]))
- Temp->CastSpell(me, SPELL_SIPHON_SOUL, false); // should m cast on temp
- if (NextPhase == 2)
- {
- me->GetMotionMaster()->Clear();
- DoCast(me, SPELL_ENERGY_STORM, true); // enemy aura
- for (uint8 i = 0; i < 4; ++i)
+ case 0:
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ DoTeleportTo(CENTER_X, CENTER_Y, CENTER_Z, 100);
+ DoResetThreat();
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ me->RemoveAurasDueToSpell(Transform[Phase].unaura);
+ DoCast(me, Transform[Phase].spell);
+ Talk(Transform[Phase].text);
+ if (Phase > 0)
+ {
+ if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[Phase - 1]))
+ Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
+ }
+ if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[NextPhase - 1]))
+ Temp->CastSpell(me, SPELL_SIPHON_SOUL, false); // should m cast on temp
+
+ if (NextPhase == 2)
{
- Creature* Vortex = DoSpawnCreature(CREATURE_FEATHER_VORTEX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
- if (Vortex)
+ me->GetMotionMaster()->Clear();
+ DoCast(me, SPELL_ENERGY_STORM, true); // enemy aura
+ for (uint8 i = 0; i < 4; ++i)
{
- Vortex->CastSpell(Vortex, SPELL_CYCLONE_PASSIVE, true);
- Vortex->CastSpell(Vortex, SPELL_CYCLONE_VISUAL, true);
- Vortex->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- Vortex->SetSpeedRate(MOVE_RUN, 1.0f);
- Vortex->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
- DoZoneInCombat(Vortex);
+ Creature* Vortex = DoSpawnCreature(CREATURE_FEATHER_VORTEX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
+ if (Vortex)
+ {
+ Vortex->CastSpell(Vortex, SPELL_CYCLONE_PASSIVE, true);
+ Vortex->CastSpell(Vortex, SPELL_CYCLONE_VISUAL, true);
+ Vortex->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Vortex->SetSpeedRate(MOVE_RUN, 1.0f);
+ Vortex->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
+ DoZoneInCombat(Vortex);
+ }
}
}
- }
- else
- AttackStart(me->GetVictim());
- if (NextPhase == 3)
- {
- me->RemoveAurasDueToSpell(SPELL_ENERGY_STORM);
- Summons.DespawnEntry(CREATURE_FEATHER_VORTEX);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- }
- break;
- default:
- break;
+ else
+ AttackStart(me->GetVictim());
+
+ if (NextPhase == 3)
+ {
+ me->RemoveAurasDueToSpell(SPELL_ENERGY_STORM);
+ summons.DespawnEntry(CREATURE_FEATHER_VORTEX);
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ }
+ break;
+ default:
+ break;
}
Phase = NextPhase;
}
@@ -384,91 +362,156 @@ class boss_zuljin : public CreatureScript
DoCast(me, SPELL_BERSERK, true);
Talk(YELL_BERSERK);
Berserk_Timer = 60000;
- } else Berserk_Timer -= diff;
+ }
+ else
+ Berserk_Timer -= diff;
switch (Phase)
{
- case 0:
- if (Intro_Timer)
- {
- if (Intro_Timer <= diff)
+ case 0:
+ if (Intro_Timer)
{
- Talk(YELL_AGGRO);
- Intro_Timer = 0;
- } else Intro_Timer -= diff;
- }
+ if (Intro_Timer <= diff)
+ {
+ Talk(YELL_AGGRO);
+ Intro_Timer = 0;
+ }
+ else
+ Intro_Timer -= diff;
+ }
- if (Whirlwind_Timer <= diff)
- {
- DoCast(me, SPELL_WHIRLWIND);
- Whirlwind_Timer = urand(15000, 20000);
- } else Whirlwind_Timer -= diff;
+ if (Whirlwind_Timer <= diff)
+ {
+ DoCast(me, SPELL_WHIRLWIND);
+ Whirlwind_Timer = urand(15000, 20000);
+ }
+ else
+ Whirlwind_Timer -= diff;
- if (Grievous_Throw_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_GRIEVOUS_THROW, false);
- Grievous_Throw_Timer = 10000;
- } else Grievous_Throw_Timer -= diff;
- break;
-
- case 1:
- if (Creeping_Paralysis_Timer <= diff)
- {
- DoCast(me, SPELL_CREEPING_PARALYSIS);
- Creeping_Paralysis_Timer = 20000;
- } else Creeping_Paralysis_Timer -= diff;
+ if (Grievous_Throw_Timer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ DoCast(target, SPELL_GRIEVOUS_THROW, false);
+ Grievous_Throw_Timer = 10000;
+ }
+ else
+ Grievous_Throw_Timer -= diff;
+ break;
- if (Overpower_Timer <= diff)
- {
- // implemented in DoMeleeAttackIfReady()
- Overpower_Timer = 0;
- } else Overpower_Timer -= diff;
- break;
+ case 1:
+ if (Creeping_Paralysis_Timer <= diff)
+ {
+ DoCast(me, SPELL_CREEPING_PARALYSIS);
+ Creeping_Paralysis_Timer = 20000;
+ }
+ else
+ Creeping_Paralysis_Timer -= diff;
- case 2:
- return;
+ if (Overpower_Timer <= diff)
+ {
+ // implemented in DoMeleeAttackIfReady()
+ Overpower_Timer = 0;
+ }
+ else
+ Overpower_Timer -= diff;
+ break;
- case 3:
- if (Claw_Rage_Timer <= diff)
- {
- if (!TankGUID)
+ case 2:
+ return;
+
+ case 3:
+ if (Claw_Rage_Timer <= diff)
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (!TankGUID)
{
- if (me->GetVictim())
- TankGUID = me->EnsureVictim()->GetGUID();
- me->SetSpeedRate(MOVE_RUN, 5.0f);
- AttackStart(target); // change victim
- Claw_Rage_Timer = 0;
- Claw_Loop_Timer = 500;
- Claw_Counter = 0;
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ if (me->GetVictim())
+ TankGUID = me->EnsureVictim()->GetGUID();
+
+ me->SetSpeedRate(MOVE_RUN, 5.0f);
+ AttackStart(target); // change victim
+ Claw_Rage_Timer = 0;
+ Claw_Loop_Timer = 500;
+ Claw_Counter = 0;
+ }
}
+ else if (!Claw_Rage_Timer) // do not do this when Lynx_Rush
+ {
+ if (Claw_Loop_Timer <= diff)
+ {
+ Unit* target = me->GetVictim();
+ if (!target || !target->isTargetableForAttack())
+ target = ObjectAccessor::GetUnit(*me, TankGUID);
+ if (!target || !target->isTargetableForAttack())
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0);
+ if (target)
+ {
+ AttackStart(target);
+ if (me->IsWithinMeleeRange(target))
+ {
+ DoCast(target, SPELL_CLAW_RAGE_DAMAGE, true);
+ ++Claw_Counter;
+ if (Claw_Counter == 12)
+ {
+ Claw_Rage_Timer = urand(15000, 20000);
+ me->SetSpeedRate(MOVE_RUN, 1.2f);
+ AttackStart(ObjectAccessor::GetUnit(*me, TankGUID));
+ TankGUID.Clear();
+ return;
+ }
+ else
+ Claw_Loop_Timer = 500;
+ }
+ }
+ else
+ {
+ EnterEvadeMode(); // if (target)
+ return;
+ }
+ }
+ else Claw_Loop_Timer -= diff;
+ } //if (TankGUID)
}
- else if (!Claw_Rage_Timer) // do not do this when Lynx_Rush
+ else
+ Claw_Rage_Timer -= diff;
+
+ if (Lynx_Rush_Timer <= diff)
{
- if (Claw_Loop_Timer <= diff)
+ if (!TankGUID)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ TankGUID = me->EnsureVictim()->GetGUID();
+ me->SetSpeedRate(MOVE_RUN, 5.0f);
+ AttackStart(target); // change victim
+ Lynx_Rush_Timer = 0;
+ Claw_Counter = 0;
+ }
+ }
+ else if (!Lynx_Rush_Timer)
{
Unit* target = me->GetVictim();
- if (!target || !target->isTargetableForAttack()) target = ObjectAccessor::GetUnit(*me, TankGUID);
- if (!target || !target->isTargetableForAttack()) target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (!target || !target->isTargetableForAttack())
{
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0);
AttackStart(target);
+ }
+ if (target)
+ {
if (me->IsWithinMeleeRange(target))
{
- DoCast(target, SPELL_CLAW_RAGE_DAMAGE, true);
+ DoCast(target, SPELL_LYNX_RUSH_DAMAGE, true);
++Claw_Counter;
- if (Claw_Counter == 12)
+ if (Claw_Counter == 9)
{
- Claw_Rage_Timer = urand(15000, 20000);
+ Lynx_Rush_Timer = urand(15000, 20000);
me->SetSpeedRate(MOVE_RUN, 1.2f);
AttackStart(ObjectAccessor::GetUnit(*me, TankGUID));
TankGUID.Clear();
- return;
}
else
- Claw_Loop_Timer = 500;
+ AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
}
}
else
@@ -476,82 +519,41 @@ class boss_zuljin : public CreatureScript
EnterEvadeMode(); // if (target)
return;
}
- } else Claw_Loop_Timer -= diff;
- } //if (TankGUID)
- } else Claw_Rage_Timer -= diff;
+ } //if (TankGUID)
+ }
+ else
+ Lynx_Rush_Timer -= diff;
+ break;
+ case 4:
+ if (Flame_Whirl_Timer <= diff)
+ {
+ DoCast(me, SPELL_FLAME_WHIRL);
+ Flame_Whirl_Timer = 12000;
+ }
+ else
+ Flame_Whirl_Timer -= diff;
- if (Lynx_Rush_Timer <= diff)
- {
- if (!TankGUID)
+ if (Pillar_Of_Fire_Timer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- TankGUID = me->EnsureVictim()->GetGUID();
- me->SetSpeedRate(MOVE_RUN, 5.0f);
- AttackStart(target); // change victim
- Lynx_Rush_Timer = 0;
- Claw_Counter = 0;
- }
+ DoCast(target, SPELL_SUMMON_PILLAR);
+ Pillar_Of_Fire_Timer = 10000;
}
- else if (!Lynx_Rush_Timer)
- {
- Unit* target = me->GetVictim();
- if (!target || !target->isTargetableForAttack())
- {
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- AttackStart(target);
- }
- if (target)
- {
- if (me->IsWithinMeleeRange(target))
- {
- DoCast(target, SPELL_LYNX_RUSH_DAMAGE, true);
- ++Claw_Counter;
- if (Claw_Counter == 9)
- {
- Lynx_Rush_Timer = urand(15000, 20000);
- me->SetSpeedRate(MOVE_RUN, 1.2f);
- AttackStart(ObjectAccessor::GetUnit(*me, TankGUID));
- TankGUID.Clear();
- }
- else
- AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
- }
- }
- else
- {
- EnterEvadeMode(); // if (target)
- return;
- }
- } //if (TankGUID)
- } else Lynx_Rush_Timer -= diff;
-
- break;
- case 4:
- if (Flame_Whirl_Timer <= diff)
- {
- DoCast(me, SPELL_FLAME_WHIRL);
- Flame_Whirl_Timer = 12000;
- }Flame_Whirl_Timer -= diff;
+ else
+ Pillar_Of_Fire_Timer -= diff;
- if (Pillar_Of_Fire_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_SUMMON_PILLAR);
- Pillar_Of_Fire_Timer = 10000;
- } else Pillar_Of_Fire_Timer -= diff;
-
- if (Flame_Breath_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- me->SetInFront(target);
- DoCast(me, SPELL_FLAME_BREATH);
- Flame_Breath_Timer = 10000;
- } else Flame_Breath_Timer -= diff;
- break;
-
- default:
- break;
+ if (Flame_Breath_Timer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ me->SetInFront(target);
+ DoCast(me, SPELL_FLAME_BREATH);
+ Flame_Breath_Timer = 10000;
+ }
+ else
+ Flame_Breath_Timer -= diff;
+ break;
+ default:
+ break;
}
if (!TankGUID)
@@ -561,18 +563,14 @@ class boss_zuljin : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_zuljinAI>(creature);
+ return GetZulAmanAI<boss_zuljinAI>(creature);
}
};
class npc_zuljin_vortex : public CreatureScript
{
public:
-
- npc_zuljin_vortex()
- : CreatureScript("npc_zuljin_vortex")
- {
- }
+ npc_zuljin_vortex() : CreatureScript("npc_zuljin_vortex") { }
struct npc_zuljin_vortexAI : public ScriptedAI
{
@@ -598,7 +596,7 @@ class npc_zuljin_vortex : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return new npc_zuljin_vortexAI(creature);
+ return GetZulAmanAI<npc_zuljin_vortexAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
index 836db4f6ce6..f0eb8ef7911 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
@@ -31,7 +31,6 @@ EndScriptData */
enum Misc
{
- MAX_ENCOUNTER = 7,
RAND_VENDOR = 2,
WORLDSTATE_SHOW_TIMER = 3104,
WORLDSTATE_TIME_TO_SACRIFICE = 3106
@@ -43,277 +42,246 @@ enum Misc
struct SHostageInfo
{
uint32 npc, go; // FIXME go Not used
- float x, y, z, o;
+ Position pos;
};
-static SHostageInfo HostageInfo[] =
+static SHostageInfo const HostageInfo[] =
{
- {23790, 186648, -57, 1343, 40.77f, 3.2f}, // bear
- {23999, 187021, 400, 1414, 74.36f, 3.3f}, // eagle
- {24001, 186672, -35, 1134, 18.71f, 1.9f}, // dragonhawk
- {24024, 186667, 413, 1117, 6.32f, 3.1f} // lynx
+ { 23790, 186648, { -57.f, 1343.f, 40.77f, 3.2f } }, // bear
+ { 23999, 187021, { 400.f, 1414.f, 74.36f, 3.3f } }, // eagle
+ { 24001, 186672, { -35.f, 1134.f, 18.71f, 1.9f } }, // dragonhawk
+ { 24024, 186667, { 413.f, 1117.f, 6.32f, 3.1f } } // lynx
};
-Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};
+Position const HarrisonJonesLoc = { 120.687f, 1674.0f, 42.0217f, 1.59044f };
+
+static DoorData const doorData[] =
+{
+ { GO_HEXLORD_ENTRANCE, BOSS_NALORAKK, DOOR_TYPE_PASSAGE },
+ { GO_HEXLORD_ENTRANCE, BOSS_AKILZON, DOOR_TYPE_PASSAGE },
+ { GO_HEXLORD_ENTRANCE, BOSS_JANALAI, DOOR_TYPE_PASSAGE },
+ { GO_HEXLORD_ENTRANCE, BOSS_HALAZZI, DOOR_TYPE_PASSAGE },
+ { GO_DOOR_AKILZON, BOSS_AKILZON, DOOR_TYPE_ROOM },
+ { GO_LYNX_TEMPLE_ENTRANCE, BOSS_HALAZZI, DOOR_TYPE_ROOM },
+ { GO_LYNX_TEMPLE_EXIT, BOSS_HALAZZI, DOOR_TYPE_ROOM },
+ { GO_HEXLORD_ENTRANCE, BOSS_HEXLORD, DOOR_TYPE_ROOM },
+ { GO_WOODEN_DOOR, BOSS_HEXLORD, DOOR_TYPE_PASSAGE },
+ { GO_DOOR_ZULJIN, BOSS_ZULJIN, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM } // END
+};
+
+static ObjectData const creatureData[] =
+{
+ { NPC_HARRISON_JONES, NPC_HARRISON_JONES },
+ { NPC_NALORAKK, BOSS_NALORAKK },
+ { NPC_AKILZON, BOSS_AKILZON },
+ { NPC_JANALAI, BOSS_JANALAI },
+ { NPC_HALAZZI, BOSS_HALAZZI },
+ { NPC_HEXLORD, BOSS_HEXLORD },
+ { NPC_ZULJIN, BOSS_ZULJIN },
+ { 0, 0 } // END
+
+};
+
+static ObjectData const gameObjectData[] =
+{
+ { GO_MASSIVE_GATE, GO_MASSIVE_GATE },
+ { GO_HARKORS_SATCHEL, GO_HARKORS_SATCHEL },
+ { GO_TANZARS_TRUNK, GO_TANZARS_TRUNK },
+ { GO_ASHLIS_BAG, GO_ASHLIS_BAG },
+ { GO_KRAZS_PACKAGE, GO_KRAZS_PACKAGE },
+ { GO_STRANGE_GONG, GO_STRANGE_GONG },
+ { 0, 0 } // END
+};
class instance_zulaman : public InstanceMapScript
{
public:
- instance_zulaman()
- : InstanceMapScript("instance_zulaman", 568)
- {
- }
+ instance_zulaman() : InstanceMapScript(ZulamanScriptName, 568) { }
struct instance_zulaman_InstanceMapScript : public InstanceScript
{
instance_zulaman_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+ SetBossNumber(MAX_ENCOUNTER);
+ LoadDoorData(doorData);
+ LoadObjectData(creatureData, gameObjectData);
QuestTimer = 0;
QuestMinute = 0;
- BossKilled = 0;
ChestLooted = 0;
for (uint8 i = 0; i < RAND_VENDOR; ++i)
RandVendor[i] = NOT_STARTED;
- m_auiEncounter[DATA_GONGEVENT] = NOT_STARTED;
+ GongEvent = NOT_STARTED;
}
- ObjectGuid HarkorsSatchelGUID;
- ObjectGuid TanzarsTrunkGUID;
- ObjectGuid AshlisBagGUID;
- ObjectGuid KrazsPackageGUID;
- ObjectGuid StrangeGongGUID;
- ObjectGuid HarrisonJonesGUID;
-
- ObjectGuid HexLordGateGUID;
- ObjectGuid ZulJinGateGUID;
- ObjectGuid MassiveGateGUID;
- ObjectGuid AkilzonDoorGUID;
- ObjectGuid ZulJinDoorGUID;
- ObjectGuid HalazziDoorGUID;
-
uint32 QuestTimer;
- uint16 BossKilled;
- uint16 QuestMinute;
- uint16 ChestLooted;
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- uint32 RandVendor[RAND_VENDOR];
+ uint32 QuestMinute;
+ uint32 ChestLooted;
- bool IsEncounterInProgress() const override
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
- }
+ EncounterState RandVendor[RAND_VENDOR];
+ EncounterState GongEvent;
void OnPlayerEnter(Player* /*player*/) override
{
- if (!HarrisonJonesGUID)
+ if (!GetGuidData(NPC_HARRISON_JONES))
instance->SummonCreature(NPC_HARRISON_JONES, HarrisonJonesLoc);
}
- void OnCreatureCreate(Creature* creature) override
+ void OnGameObjectCreate(GameObject* go) override
{
- switch (creature->GetEntry())
+ InstanceScript::OnGameObjectCreate(go);
+
+ switch (go->GetEntry())
{
- case NPC_HARRISON_JONES:
- HarrisonJonesGUID = creature->GetGUID();
+ case GO_MASSIVE_GATE:
+ if (GongEvent == DONE)
+ go->SetGoState(GO_STATE_ACTIVE);
break;
- case NPC_JANALAI:
- case NPC_ZULJIN:
- case NPC_HEXLORD:
- case NPC_HALAZZI:
- case NPC_NALORAKK:
default:
break;
}
}
- void OnGameObjectCreate(GameObject* go) override
- {
- switch (go->GetEntry())
- {
- case GO_DOOR_HALAZZI: HalazziDoorGUID = go->GetGUID(); break;
- case GO_GATE_ZULJIN: ZulJinGateGUID = go->GetGUID(); break;
- case GO_GATE_HEXLORD: HexLordGateGUID = go->GetGUID(); break;
- case GO_MASSIVE_GATE: MassiveGateGUID = go->GetGUID(); break;
- case GO_DOOR_AKILZON: AkilzonDoorGUID = go->GetGUID(); break;
- case GO_DOOR_ZULJIN: ZulJinDoorGUID = go->GetGUID(); break;
-
- case GO_HARKORS_SATCHEL: HarkorsSatchelGUID = go->GetGUID(); break;
- case GO_TANZARS_TRUNK: TanzarsTrunkGUID = go->GetGUID(); break;
- case GO_ASHLIS_BAG: AshlisBagGUID = go->GetGUID(); break;
- case GO_KRAZS_PACKAGE: KrazsPackageGUID = go->GetGUID(); break;
- case GO_STRANGE_GONG: StrangeGongGUID = go->GetGUID(); break;
- default: break;
- }
- CheckInstanceStatus();
- }
-
void SummonHostage(uint8 num)
{
if (!QuestMinute)
return;
- Map::PlayerList const &PlayerList = instance->GetPlayers();
- if (PlayerList.isEmpty())
+ Map::PlayerList const& playerList = instance->GetPlayers();
+ if (playerList.isEmpty())
return;
- Map::PlayerList::const_iterator i = PlayerList.begin();
- if (Player* i_pl = i->GetSource())
+ if (Player* player = playerList.getFirst()->GetSource())
{
- if (Unit* Hostage = i_pl->SummonCreature(HostageInfo[num].npc, HostageInfo[num].x, HostageInfo[num].y, HostageInfo[num].z, HostageInfo[num].o, TEMPSUMMON_DEAD_DESPAWN, 0))
+ if (Unit* hostage = player->SummonCreature(HostageInfo[num].npc, HostageInfo[num].pos, TEMPSUMMON_DEAD_DESPAWN, 0))
{
- Hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- Hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
}
}
- void CheckInstanceStatus()
+ void WriteSaveDataMore(std::ostringstream& oss) override
{
- if (BossKilled >= DATA_HALAZZIEVENT)
- HandleGameObject(HexLordGateGUID, true);
-
- if (BossKilled >= DATA_HEXLORDEVENT)
- HandleGameObject(ZulJinGateGUID, true);
+ oss << "S " << uint32(GongEvent) << ' '
+ << uint32(ChestLooted) << ' '
+ << uint32(QuestMinute) << ' ';
}
- std::string GetSaveData() override
+ void ReadSaveDataMore(std::istringstream& iss) override
{
- OUT_SAVE_INST_DATA;
-
- std::ostringstream ss;
- ss << "S " << BossKilled << ' ' << ChestLooted << ' ' << QuestMinute;
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return ss.str();
- }
-
- void Load(const char* load) override
- {
- if (!load)
- return;
-
- std::istringstream ss(load);
- //TC_LOG_ERROR("scripts", "Zul'aman loaded, %s.", ss.str().c_str());
char dataHead; // S
- uint16 data1, data2, data3;
- ss >> dataHead >> data1 >> data2 >> data3;
- //TC_LOG_ERROR("scripts", "Zul'aman loaded, %d %d %d.", data1, data2, data3);
+ uint32 data1, data2, data3;
+ iss >> dataHead >> data1 >> data2 >> data3;
+
if (dataHead == 'S')
{
- BossKilled = data1;
+ GongEvent = EncounterState(data1);
ChestLooted = data2;
QuestMinute = data3;
- } else TC_LOG_ERROR("scripts", "Zul'aman: corrupted save data.");
+ }
+ else
+ {
+ TC_LOG_ERROR("scripts", "Zul'aman: corrupted save data.");
+ return;
+ }
+
+ if (GongEvent == IN_PROGRESS)
+ GongEvent = NOT_STARTED;
}
void SetData(uint32 type, uint32 data) override
{
switch (type)
{
- case DATA_GONGEVENT:
- m_auiEncounter[DATA_GONGEVENT] = data;
- if (data == IN_PROGRESS)
+ case DATA_GONGEVENT:
+ GongEvent = EncounterState(data);
+ if (GongEvent == IN_PROGRESS)
+ SaveToDB();
+ else if (GongEvent == DONE)
+ QuestMinute = 21;
+ break;
+ case DATA_CHESTLOOTED:
+ ++ChestLooted;
SaveToDB();
- else if (data == DONE)
- QuestMinute = 21;
- break;
- case DATA_NALORAKKEVENT:
- m_auiEncounter[DATA_NALORAKKEVENT] = data;
- if (data == DONE)
- {
- if (QuestMinute)
+ break;
+ case TYPE_RAND_VENDOR_1:
+ case TYPE_RAND_VENDOR_2:
+ RandVendor[type - TYPE_RAND_VENDOR_1] = EncounterState(data);
+ break;
+ }
+ }
+
+ bool SetBossState(uint32 id, EncounterState state) override
+ {
+ if (!InstanceScript::SetBossState(id, state))
+ return false;
+
+ switch (id)
+ {
+ case BOSS_NALORAKK:
+ if (state == DONE)
{
- QuestMinute += 15;
- DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
+ if (QuestMinute)
+ {
+ QuestMinute += 15;
+ DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
+ }
+ SummonHostage(0);
}
- SummonHostage(0);
- }
- break;
- case DATA_AKILZONEVENT:
- m_auiEncounter[DATA_AKILZONEVENT] = data;
- HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS);
- if (data == DONE)
- {
- if (QuestMinute)
+ break;
+ case BOSS_AKILZON:
+ if (state == DONE)
{
- QuestMinute += 10;
- DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
+ if (QuestMinute)
+ {
+ QuestMinute += 10;
+ DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
+ }
+ SummonHostage(1);
}
- SummonHostage(1);
- }
- break;
- case DATA_JANALAIEVENT:
- m_auiEncounter[DATA_JANALAIEVENT] = data;
- if (data == DONE)
- SummonHostage(2);
- break;
- case DATA_HALAZZIEVENT:
- m_auiEncounter[DATA_HALAZZIEVENT] = data;
- HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS);
- if (data == DONE) SummonHostage(3);
- break;
- case DATA_HEXLORDEVENT:
- m_auiEncounter[DATA_HEXLORDEVENT] = data;
- if (data == IN_PROGRESS)
- HandleGameObject(HexLordGateGUID, false);
- else if (data == NOT_STARTED)
- CheckInstanceStatus();
- break;
- case DATA_ZULJINEVENT:
- m_auiEncounter[DATA_ZULJINEVENT] = data;
- HandleGameObject(ZulJinDoorGUID, data != IN_PROGRESS);
- break;
- case DATA_CHESTLOOTED:
- ++ChestLooted;
- SaveToDB();
- break;
- case TYPE_RAND_VENDOR_1:
- RandVendor[0] = data;
- break;
- case TYPE_RAND_VENDOR_2:
- RandVendor[1] = data;
- break;
+ break;
+ case BOSS_JANALAI:
+ if (state == DONE)
+ SummonHostage(2);
+ break;
+ case BOSS_HALAZZI:
+ if (state == DONE)
+ SummonHostage(3);
+ break;
}
- if (data == DONE)
+ if (state == DONE)
{
- ++BossKilled;
- if (QuestMinute && BossKilled >= DATA_HALAZZIEVENT)
+ if (QuestMinute && id == BOSS_HALAZZI)
{
QuestMinute = 0;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
}
- CheckInstanceStatus();
SaveToDB();
}
+
+ return true;
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
- case DATA_GONGEVENT: return m_auiEncounter[DATA_GONGEVENT];
- case DATA_NALORAKKEVENT: return m_auiEncounter[DATA_NALORAKKEVENT];
- case DATA_AKILZONEVENT: return m_auiEncounter[DATA_AKILZONEVENT];
- case DATA_JANALAIEVENT: return m_auiEncounter[DATA_JANALAIEVENT];
- case DATA_HALAZZIEVENT: return m_auiEncounter[DATA_HALAZZIEVENT];
- case DATA_HEXLORDEVENT: return m_auiEncounter[DATA_HEXLORDEVENT];
- case DATA_ZULJINEVENT: return m_auiEncounter[DATA_ZULJINEVENT];
- case DATA_CHESTLOOTED: return ChestLooted;
- case TYPE_RAND_VENDOR_1: return RandVendor[0];
- case TYPE_RAND_VENDOR_2: return RandVendor[1];
- default: return 0;
+ case DATA_GONGEVENT:
+ return uint32(GongEvent);
+ case DATA_CHESTLOOTED:
+ return ChestLooted;
+ case TYPE_RAND_VENDOR_1:
+ case TYPE_RAND_VENDOR_2:
+ return RandVendor[type - TYPE_RAND_VENDOR_1];
}
+
+ return 0;
}
void Update(uint32 diff) override
@@ -324,30 +292,18 @@ class instance_zulaman : public InstanceMapScript
{
QuestMinute--;
SaveToDB();
- QuestTimer += 60000;
+ QuestTimer += 1 * MINUTE * IN_MILLISECONDS;
if (QuestMinute)
{
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
- } else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
+ }
+ else
+ DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
}
QuestTimer -= diff;
}
}
-
- ObjectGuid GetGuidData(uint32 type) const override
- {
- switch (type)
- {
- case GO_STRANGE_GONG:
- return StrangeGongGUID;
- case GO_MASSIVE_GATE:
- return MassiveGateGUID;
- }
-
- return ObjectGuid::Empty;
- }
-
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
@@ -360,4 +316,3 @@ void AddSC_instance_zulaman()
{
new instance_zulaman();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
index b0f51537c58..f23a9fab812 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
@@ -54,10 +54,7 @@ class npc_forest_frog : public CreatureScript
{
public:
- npc_forest_frog()
- : CreatureScript("npc_forest_frog")
- {
- }
+ npc_forest_frog() : CreatureScript("npc_forest_frog") { }
struct npc_forest_frogAI : public ScriptedAI
{
@@ -72,32 +69,38 @@ class npc_forest_frog : public CreatureScript
void EnterCombat(Unit* /*who*/) override { }
- void DoSpawnRandom()
+ void DoSpawnRandom() const
{
- uint32 cEntry = 0;
- switch (rand32() % 10)
- {
- case 0: cEntry = 24397; break; //Mannuth
- case 1: cEntry = 24403; break; //Deez
- case 2: cEntry = 24404; break; //Galathryn
- case 3: cEntry = 24405; break; //Adarrah
- case 4: cEntry = 24406; break; //Fudgerick
- case 5: cEntry = 24407; break; //Darwen
- case 6: cEntry = 24445; break; //Mitzi
- case 7: cEntry = 24448; break; //Christian
- case 8: cEntry = 24453; break; //Brennan
- case 9: cEntry = 24455; break; //Hollee
- }
+ uint32 cEntry = RAND(
+ 24397, //Mannuth
+ 24403, //Deez
+ 24404, //Galathryn
+ 24405, //Adarrah
+ 24406, //Fudgerick
+ 24407, //Darwen
+ 24445, //Mitzi
+ 24448, //Christian
+ 24453, //Brennan
+ 24455); //Hollee
if (!instance->GetData(TYPE_RAND_VENDOR_1))
- if (rand32() % 10 == 1) cEntry = 24408; //Gunter
- if (!instance->GetData(TYPE_RAND_VENDOR_2))
- if (rand32() % 10 == 1) cEntry = 24409; //Kyren
-
- if (cEntry) me->UpdateEntry(cEntry);
+ {
+ if (roll_chance_i(10))
+ {
+ cEntry = 24408; //Gunter
+ instance->SetData(TYPE_RAND_VENDOR_1, DONE);
+ }
+ }
+ else if (!instance->GetData(TYPE_RAND_VENDOR_2))
+ {
+ if (roll_chance_i(10))
+ {
+ cEntry = 24409; //Kyren
+ instance->SetData(TYPE_RAND_VENDOR_2, DONE);
+ }
+ }
- if (cEntry == 24408) instance->SetData(TYPE_RAND_VENDOR_1, DONE);
- if (cEntry == 24409) instance->SetData(TYPE_RAND_VENDOR_2, DONE);
+ me->UpdateEntry(cEntry);
}
void SpellHit(Unit* caster, const SpellInfo* spell) override
@@ -105,15 +108,17 @@ class npc_forest_frog : public CreatureScript
if (spell->Id == SPELL_REMOVE_AMANI_CURSE && caster->GetTypeId() == TYPEID_PLAYER && me->GetEntry() == NPC_FOREST_FROG)
{
//increase or decrease chance of mojo?
- if (rand32() % 99 == 50) DoCast(caster, SPELL_PUSH_MOJO, true);
- else DoSpawnRandom();
+ if (roll_chance_i(1))
+ DoCast(caster, SPELL_PUSH_MOJO, true);
+ else
+ DoSpawnRandom();
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<npc_forest_frogAI>(creature);
+ return GetZulAmanAI<npc_forest_frogAI>(creature);
}
};
@@ -123,8 +128,8 @@ class npc_forest_frog : public CreatureScript
#define GOSSIP_HOSTAGE1 "I am glad to help you."
-static uint32 HostageEntry[] = {23790, 23999, 24024, 24001};
-static uint32 ChestEntry[] = {186648, 187021, 186672, 186667};
+static uint32 const HostageEntry[] = {23790, 23999, 24024, 24001};
+static uint32 const ChestEntry[] = {186648, 187021, 186672, 186667};
class npc_zulaman_hostage : public CreatureScript
{
@@ -150,8 +155,7 @@ class npc_zulaman_hostage : public CreatureScript
creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- InstanceScript* instance = creature->GetInstanceScript();
- if (instance)
+ if (InstanceScript* instance = creature->GetInstanceScript())
{
//uint8 progress = instance->GetData(DATA_CHESTLOOTED);
instance->SetData(DATA_CHESTLOOTED, 0);
@@ -236,9 +240,7 @@ class npc_harrison_jones : public CreatureScript
{
public:
- npc_harrison_jones() : CreatureScript("npc_harrison_jones")
- {
- }
+ npc_harrison_jones() : CreatureScript("npc_harrison_jones") { }
struct npc_harrison_jonesAI : public ScriptedAI
{
@@ -252,14 +254,12 @@ class npc_harrison_jones : public CreatureScript
{
_gongEvent = 0;
_gongTimer = 0;
- uiTargetGUID = 0;
}
InstanceScript* instance;
uint8 _gongEvent;
uint32 _gongTimer;
- uint64 uiTargetGUID;
void Reset() override
{
@@ -318,14 +318,14 @@ class npc_harrison_jones : public CreatureScript
_gongTimer = 4000;
break;
case GONG_EVENT_3:
- if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetGuidData(GO_STRANGE_GONG)))
+ if (GameObject* gong = instance->GetGameObject(GO_STRANGE_GONG))
gong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
_gongEvent = GONG_EVENT_4;
_gongTimer = 105000;
break;
case GONG_EVENT_4:
me->RemoveAura(SPELL_BANGING_THE_GONG);
- if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetGuidData(GO_STRANGE_GONG)))
+ if (GameObject* gong = instance->GetGameObject(GO_STRANGE_GONG))
gong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
// trigger or gong will need to be scripted to set IN_PROGRESS after enough hits.
@@ -359,39 +359,32 @@ class npc_harrison_jones : public CreatureScript
_gongEvent = GONG_EVENT_7;
break;
case GONG_EVENT_7:
- if (!uiTargetGUID)
+ {
+ std::vector<Creature*> targetList;
+ GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f);
+ for (Creature* target : targetList)
{
- std::list<Creature*> targetList;
- GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f);
- if (!targetList.empty())
+ if (target->GetPositionX() > 120)
+ {
+ target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR));
+ target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ target->SetReactState(REACT_PASSIVE);
+ target->AI()->SetData(0, 1);
+ }
+ else
{
- for (std::list<Creature*>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
- {
- if (Creature* ptarget = *itr)
- {
- if (ptarget->GetPositionX() > 120)
- {
- ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR));
- ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- ptarget->SetReactState(REACT_PASSIVE);
- ptarget->AI()->SetData(0, 1);
- }
- else
- {
- ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- ptarget->SetReactState(REACT_PASSIVE);
- ptarget->AI()->SetData(0, 2);
- }
- }
- }
+ target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ target->SetReactState(REACT_PASSIVE);
+ target->AI()->SetData(0, 2);
}
}
- if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetGuidData(GO_MASSIVE_GATE)))
+ if (GameObject* gate = instance->GetGameObject(GO_MASSIVE_GATE))
gate->SetGoState(GO_STATE_ACTIVE);
_gongTimer = 2000;
_gongEvent = GONG_EVENT_8;
break;
+ }
case GONG_EVENT_8:
DoCast(me, SPELL_STEALTH);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
@@ -420,14 +413,14 @@ class npc_harrison_jones : public CreatureScript
}
}
else
- _gongTimer -= diff;
+ _gongTimer -= diff;
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<npc_harrison_jonesAI>(creature);
+ return GetZulAmanAI<npc_harrison_jonesAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
index 37f8370d49c..919c5653279 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
@@ -19,37 +19,42 @@
#ifndef DEF_ZULAMAN_H
#define DEF_ZULAMAN_H
+#define ZulamanScriptName "instance_zulaman"
#define DataHeader "ZA"
enum DataTypes
{
- DATA_GONGEVENT = 0,
- DATA_NALORAKKEVENT = 1,
- DATA_AKILZONEVENT = 2,
- DATA_JANALAIEVENT = 3,
- DATA_HALAZZIEVENT = 4,
- DATA_HEXLORDEVENT = 5,
- DATA_ZULJINEVENT = 6,
- DATA_CHESTLOOTED = 7,
- TYPE_RAND_VENDOR_1 = 8,
- TYPE_RAND_VENDOR_2 = 9
+ BOSS_NALORAKK = 0,
+ BOSS_AKILZON = 1,
+ BOSS_JANALAI = 2,
+ BOSS_HALAZZI = 3,
+ BOSS_HEXLORD = 4,
+ BOSS_ZULJIN = 5,
+ MAX_ENCOUNTER,
+
+ DATA_GONGEVENT,
+ DATA_CHESTLOOTED,
+ TYPE_RAND_VENDOR_1,
+ TYPE_RAND_VENDOR_2
};
enum CreatureIds
{
NPC_HARRISON_JONES = 24358,
+ NPC_NALORAKK = 23576,
+ NPC_AKILZON = 23574,
NPC_JANALAI = 23578,
- NPC_ZULJIN = 23863,
- NPC_HEXLORD = 24239,
NPC_HALAZZI = 23577,
- NPC_NALORAKK = 23576
+ NPC_HEXLORD = 24239,
+ NPC_ZULJIN = 23863
};
enum GameobjectIds
{
- GO_DOOR_HALAZZI = 186303,
- GO_GATE_ZULJIN = 186304,
- GO_GATE_HEXLORD = 186305,
+ GO_LYNX_TEMPLE_EXIT = 186303,
+ GO_LYNX_TEMPLE_ENTRANCE = 186304,
+ GO_HEXLORD_ENTRANCE = 186305,
+ GO_WOODEN_DOOR = 186306,
GO_MASSIVE_GATE = 186728,
GO_DOOR_AKILZON = 186858,
GO_DOOR_ZULJIN = 186859,
@@ -60,4 +65,10 @@ enum GameobjectIds
GO_STRANGE_GONG = 187359
};
+template <class AI>
+inline AI* GetZulAmanAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, ZulamanScriptName);
+}
+
#endif