Scripts/AhnKahet: reworked InstanceScript

This commit is contained in:
joschiwald
2013-08-21 19:43:46 +02:00
parent 1e89ae1960
commit a383885f5c
12 changed files with 496 additions and 557 deletions
+13 -3
View File
@@ -22,8 +22,6 @@
#include "ZoneScript.h"
#include "World.h"
#include "ObjectMgr.h"
//#include "GameObject.h"
//#include "Map.h"
#define OUT_SAVE_INST_DATA TC_LOG_DEBUG(LOG_FILTER_TSCR, "Saving Instance Data for Instance %s (Map %d, Instance Id %d)", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
#define OUT_SAVE_INST_DATA_COMPLETE TC_LOG_DEBUG(LOG_FILTER_TSCR, "Saving Instance Data for Instance %s (Map %d, Instance Id %d) completed.", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
@@ -235,4 +233,16 @@ class InstanceScript : public ZoneScript
MinionInfoMap minions;
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
};
#endif
template<class AI, class T>
AI* GetInstanceAI(T* obj, char const* scriptName)
{
if (InstanceMap* instance = obj->GetMap()->ToInstanceMap())
if (instance->GetInstanceScript())
if (instance->GetScriptId() == sObjectMgr->GetScriptId(scriptName))
return new AI(obj);
return NULL;
}
#endif // TRINITY_INSTANCE_DATA_H
@@ -18,33 +18,71 @@
#ifndef AHNKAHET_H_
#define AHNKAHET_H_
enum Data64
#define AhnKahetScriptName "instance_ahnkahet"
uint32 const EncounterCount = 5;
enum DataTypes
{
DATA_ELDER_NADOX,
DATA_PRINCE_TALDARAM,
DATA_JEDOGA_SHADOWSEEKER,
DATA_HERALD_VOLAZJ,
DATA_AMANITAR,
DATA_SPHERE1,
DATA_SPHERE2,
DATA_PRINCE_TALDARAM_PLATFORM,
DATA_PL_JEDOGA_TARGET,
DATA_ADD_JEDOGA_OPFER,
DATA_ADD_JEDOGA_INITIAND
// Encounter States/Boss GUIDs
DATA_ELDER_NADOX = 0,
DATA_PRINCE_TALDARAM = 1,
DATA_JEDOGA_SHADOWSEEKER = 2,
DATA_AMANITAR = 3,
DATA_HERALD_VOLAZJ = 4,
// Additional Data
DATA_SPHERE_1 = 5,
DATA_SPHERE_2 = 6,
DATA_PRINCE_TALDARAM_PLATFORM = 7,
DATA_PL_JEDOGA_TARGET = 8,
DATA_ADD_JEDOGA_OPFER = 9,
DATA_ADD_JEDOGA_INITIAND = 10,
DATA_JEDOGA_TRIGGER_SWITCH = 11,
DATA_JEDOGA_RESET_INITIANDS = 12,
DATA_ALL_INITIAND_DEAD = 13
};
enum Data
enum CreatureIds
{
DATA_ELDER_NADOX_EVENT,
DATA_PRINCE_TALDARAM_EVENT,
DATA_JEDOGA_SHADOWSEEKER_EVENT,
DATA_HERALD_VOLAZJ_EVENT,
DATA_AMANITAR_EVENT,
DATA_SPHERE1_EVENT,
DATA_SPHERE2_EVENT,
DATA_JEDOGA_TRIGGER_SWITCH,
DATA_JEDOGA_RESET_INITIANDS,
DATA_ALL_INITIAND_DEAD
NPC_ELDER_NADOX = 29309,
NPC_PRINCE_TALDARAM = 29308,
NPC_JEDOGA_SHADOWSEEKER = 29310,
NPC_AMANITAR = 30258,
NPC_HERALD_VOLAZJ = 29311,
// Elder Nadox
NPC_AHNKAHAR_GUARDIAN = 30176,
NPC_AHNKAHAR_SWARMER = 30178,
// Jedoga Shadowseeker
NPC_INITIAND = 30114,
NPC_JEDOGA_CONTROLLER = 30181,
// Amanitar
NPC_HEALTHY_MUSHROOM = 30391,
NPC_POISONOUS_MUSHROOM = 30435,
// Herald Volazj
//NPC_TWISTED_VISAGE_1 = 30621,
//NPC_TWISTED_VISAGE_2 = 30622,
//NPC_TWISTED_VISAGE_3 = 30623,
//NPC_TWISTED_VISAGE_4 = 30624,
NPC_TWISTED_VISAGE = 30625
};
enum GameObjectIds
{
GO_PRINCE_TALDARAM_GATE = 192236,
GO_PRINCE_TALDARAM_PLATFORM = 193564,
GO_SPHERE_1 = 193093,
GO_SPHERE_2 = 193094
};
template<class AI>
AI* GetAhnKahetAI(Creature* creature)
{
return GetInstanceAI<AI>(creature, AhnKahetScriptName);
}
#endif // AHNKAHET_H_
@@ -35,8 +35,6 @@ enum Spells
enum Creatures
{
NPC_HEALTHY_MUSHROOM = 30391,
NPC_POISONOUS_MUSHROOM = 30435,
NPC_TRIGGER = 19656
};
@@ -52,129 +50,112 @@ enum Events
class boss_amanitar : public CreatureScript
{
public:
boss_amanitar() : CreatureScript("boss_amanitar") { }
public:
boss_amanitar() : CreatureScript("boss_amanitar") { }
struct boss_amanitarAI : public BossAI
{
boss_amanitarAI(Creature* creature) : BossAI(creature, DATA_AMANITAR) { }
void Reset() OVERRIDE
struct boss_amanitarAI : public BossAI
{
_Reset();
boss_amanitarAI(Creature* creature) : BossAI(creature, DATA_AMANITAR) { }
me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
summons.DespawnAll();
if (instance)
void Reset() OVERRIDE
{
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MINI);
instance->SetData(DATA_AMANITAR_EVENT, NOT_STARTED);
_Reset();
me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
}
}
void JustDied(Unit* /*Killer*/) OVERRIDE
{
if (instance)
void EnterCombat(Unit* /*who*/) OVERRIDE
{
_EnterCombat();
events.ScheduleEvent(EVENT_ROOT, urand(5, 9) * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BASH, urand(10, 14) * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BOLT, urand(15, 20) * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_MINI, urand(12, 18) * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SPAWN, 5 * IN_MILLISECONDS);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
_JustDied();
instance->SetData(DATA_AMANITAR_EVENT, DONE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MINI);
summons.DespawnAll();
}
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
_EnterCombat();
events.ScheduleEvent(EVENT_ROOT, urand(5, 9) * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BASH, urand(10, 14) * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BOLT, urand(15, 20) * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_MINI, urand(12, 18) * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SPAWN, 5 * IN_MILLISECONDS);
me->SetInCombatWithZone();
if (instance)
instance->SetData(DATA_AMANITAR_EVENT, IN_PROGRESS);
}
void SpawnAdds()
{
uint8 u = 0;
for (uint8 i = 0; i < 30; ++i)
void SpawnAdds()
{
Position pos;
me->GetPosition(&pos);
me->GetRandomNearPosition(pos, 30.0f);
pos.m_positionZ = me->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), MAX_HEIGHT) + 2.0f;
uint8 u = 0;
if (Creature* trigger = me->SummonCreature(NPC_TRIGGER, pos))
for (uint8 i = 0; i < 30; ++i)
{
Creature* temp1 = trigger->FindNearestCreature(NPC_HEALTHY_MUSHROOM, 4.0f, true);
Creature* temp2 = trigger->FindNearestCreature(NPC_POISONOUS_MUSHROOM, 4.0f, true);
if (temp1 || temp2)
Position pos;
me->GetPosition(&pos);
me->GetRandomNearPosition(pos, 30.0f);
pos.m_positionZ = me->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), MAX_HEIGHT) + 2.0f;
if (Creature* trigger = me->SummonCreature(NPC_TRIGGER, pos))
{
trigger->DisappearAndDie();
}
else
{
u = 1 - u;
trigger->DisappearAndDie();
me->SummonCreature(u > 0 ? NPC_POISONOUS_MUSHROOM : NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60 * IN_MILLISECONDS);
Creature* temp1 = trigger->FindNearestCreature(NPC_HEALTHY_MUSHROOM, 4.0f, true);
Creature* temp2 = trigger->FindNearestCreature(NPC_POISONOUS_MUSHROOM, 4.0f, true);
if (temp1 || temp2)
{
trigger->DisappearAndDie();
}
else
{
u = 1 - u;
trigger->DisappearAndDie();
me->SummonCreature(u > 0 ? NPC_POISONOUS_MUSHROOM : NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60 * IN_MILLISECONDS);
}
}
}
}
}
void UpdateAI(uint32 diff) OVERRIDE
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
void UpdateAI(uint32 diff) OVERRIDE
{
switch (eventId)
{
case EVENT_SPAWN:
SpawnAdds();
events.ScheduleEvent(EVENT_SPAWN, 20 * IN_MILLISECONDS);
break;
case EVENT_MINI:
DoCast(SPELL_MINI);
events.ScheduleEvent(EVENT_MINI, urand(25, 30) * IN_MILLISECONDS);
break;
case EVENT_ROOT:
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_ENTANGLING_ROOTS, true);
events.ScheduleEvent(EVENT_ROOT, urand(10, 15) * IN_MILLISECONDS);
break;
case EVENT_BASH:
DoCastVictim(SPELL_BASH);
events.ScheduleEvent(EVENT_BASH, urand(7, 12) * IN_MILLISECONDS);
break;
case EVENT_BOLT:
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_VENOM_BOLT_VOLLEY, true);
events.ScheduleEvent(EVENT_BOLT, urand(18, 22) * IN_MILLISECONDS);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
};
if (!UpdateVictim())
return;
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return new boss_amanitarAI(creature);
}
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SPAWN:
SpawnAdds();
events.ScheduleEvent(EVENT_SPAWN, 20 * IN_MILLISECONDS);
break;
case EVENT_MINI:
DoCast(SPELL_MINI);
events.ScheduleEvent(EVENT_MINI, urand(25, 30) * IN_MILLISECONDS);
break;
case EVENT_ROOT:
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_ENTANGLING_ROOTS, true);
events.ScheduleEvent(EVENT_ROOT, urand(10, 15) * IN_MILLISECONDS);
break;
case EVENT_BASH:
DoCastVictim(SPELL_BASH);
events.ScheduleEvent(EVENT_BASH, urand(7, 12) * IN_MILLISECONDS);
break;
case EVENT_BOLT:
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_VENOM_BOLT_VOLLEY, true);
events.ScheduleEvent(EVENT_BOLT, urand(18, 22) * IN_MILLISECONDS);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return GetAhnKahetAI<boss_amanitarAI>(creature);
}
};
class npc_amanitar_mushrooms : public CreatureScript
@@ -41,12 +41,6 @@ enum Spells
SPELL_GUARDIAN_AURA = 56151
};
enum Creatures
{
NPC_AHNKAHAR_SWARMER = 30178,
NPC_AHNKAHAR_GUARDIAN = 30176
};
enum Events
{
EVENT_PLAGUE = 1,
@@ -62,38 +56,22 @@ class boss_elder_nadox : public CreatureScript
public:
boss_elder_nadox() : CreatureScript("boss_elder_nadox") { }
struct boss_elder_nadoxAI : public ScriptedAI
struct boss_elder_nadoxAI : public BossAI
{
boss_elder_nadoxAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
instance = creature->GetInstanceScript();
}
bool GuardianDied;
uint8 AmountHealthModifier;
InstanceScript* instance;
SummonList summons;
EventMap events;
boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX) { }
void Reset() OVERRIDE
{
events.Reset();
summons.DespawnAll();
_Reset();
AmountHealthModifier = 1;
GuardianDied = false;
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
_EnterCombat();
Talk(SAY_AGGRO);
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_PLAGUE, 13 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SUMMON_SWARMER, 10 * IN_MILLISECONDS);
@@ -104,12 +82,6 @@ class boss_elder_nadox : public CreatureScript
}
}
void JustSummoned(Creature* summon) OVERRIDE
{
summons.Summon(summon);
summon->AI()->DoZoneInCombat();
}
void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) OVERRIDE
{
if (summon->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
@@ -124,19 +96,16 @@ class boss_elder_nadox : public CreatureScript
return 0;
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
void KilledUnit(Unit* who) OVERRIDE
{
Talk(SAY_SLAY);
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
_JustDied();
Talk(SAY_DEATH);
summons.DespawnAll();
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -185,11 +154,15 @@ class boss_elder_nadox : public CreatureScript
DoMeleeAttackIfReady();
}
private:
bool GuardianDied;
uint8 AmountHealthModifier;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return new boss_elder_nadoxAI(creature);
return GetAhnKahetAI<boss_elder_nadoxAI>(creature);
}
};
@@ -41,12 +41,6 @@ enum Spells
SPELL_INSANITY_PHASING_5 = 57512
};
enum Creatures
{
NPC_TWISTED_VISAGE = 30625
};
enum Yells
{
SAY_AGGRO = 0,
@@ -157,7 +151,7 @@ public:
if (instance)
{
instance->SetData(DATA_HERALD_VOLAZJ, NOT_STARTED);
instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
}
@@ -180,7 +174,7 @@ public:
if (instance)
{
instance->SetData(DATA_HERALD_VOLAZJ, IN_PROGRESS);
instance->SetBossState(DATA_HERALD_VOLAZJ, IN_PROGRESS);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
}
}
@@ -302,7 +296,7 @@ public:
Talk(SAY_DEATH);
if (instance)
instance->SetData(DATA_HERALD_VOLAZJ, DONE);
instance->SetBossState(DATA_HERALD_VOLAZJ, DONE);
Summons.DespawnAll();
ResetPlayersPhaseMask();
@@ -46,11 +46,6 @@ enum Spells
SPELL_THUNDERSHOCK_H = 60029 // 30Y
};
enum Creatures
{
NPC_JEDOGA_CONTROLLER = 30181
};
const Position JedogaPosition[2] =
{
{372.330994f, -705.278015f, -0.624178f, 5.427970f},
@@ -109,7 +104,7 @@ public:
if (instance)
{
if (!bFirstTime)
instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, FAIL);
instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL);
instance->SetData64(DATA_PL_JEDOGA_TARGET, 0);
instance->SetData64(DATA_ADD_JEDOGA_OPFER, 0);
@@ -127,7 +122,7 @@ public:
Talk(TEXT_AGGRO);
me->SetInCombatWithZone();
instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, IN_PROGRESS);
instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, IN_PROGRESS);
}
void AttackStart(Unit* who) OVERRIDE
@@ -150,7 +145,7 @@ public:
{
Talk(TEXT_DEATH);
if (instance)
instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, DONE);
instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, DONE);
}
void DoAction(int32 action) OVERRIDE
@@ -168,7 +163,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
{
if (!instance || !who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
return;
@@ -179,7 +173,7 @@ public:
bPreDone = true;
}
if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS || !bOnGround)
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS || !bOnGround)
return;
if (!me->GetVictim() && me->CanCreatureAttack(who))
@@ -229,7 +223,7 @@ public:
{
AttackStart(target);
instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS)
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
EnterCombat(target);
}
else if (!me->IsInCombat())
@@ -252,7 +246,8 @@ public:
me->GetMotionMaster()->MovePoint(0, JedogaPosition[0]);
instance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 1);
if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) OpferRufen();
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS)
OpferRufen();
bOnGround = false;
uiOpFerTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
@@ -289,7 +284,7 @@ public:
if (!instance)
return;
if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && instance->GetData(DATA_ALL_INITIAND_DEAD))
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && instance->GetData(DATA_ALL_INITIAND_DEAD))
MoveDown();
if (bOpFerok && !bOnGround && !bCanDown) Opfern();
@@ -372,7 +367,7 @@ public:
bWalking = false;
bCheckTimer = 2*IN_MILLISECONDS;
if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS)
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
{
me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
@@ -414,13 +409,11 @@ public:
void EnterCombat(Unit* who) OVERRIDE
{
if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who)
return;
}
void AttackStart(Unit* victim) OVERRIDE
{
if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !victim)
if ((instance && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !victim)
return;
ScriptedAI::AttackStart(victim);
@@ -429,7 +422,7 @@ public:
void MoveInLineOfSight(Unit* who) OVERRIDE
{
if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who)
if ((instance && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !who)
return;
ScriptedAI::MoveInLineOfSight(who);
@@ -482,14 +475,14 @@ public:
}
if (!bWalking)
{
if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && me->HasAura(SPELL_SPHERE_VISUAL))
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && me->HasAura(SPELL_SPHERE_VISUAL))
{
me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS && !me->HasAura(SPELL_SPHERE_VISUAL))
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS && !me->HasAura(SPELL_SPHERE_VISUAL))
{
DoCast(me, SPELL_SPHERE_VISUAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
@@ -561,7 +554,7 @@ public:
if (!bRemoved && me->GetPositionX() > 440.0f)
{
if (instance->GetData(DATA_PRINCE_TALDARAM_EVENT) == DONE)
if (instance->GetBossState(DATA_PRINCE_TALDARAM) == DONE)
{
me->InterruptNonMeleeSpells(true);
bRemoved = true;
@@ -585,7 +578,7 @@ public:
me->InterruptNonMeleeSpells(true);
bCasted2 = false;
}
if (!bRemoved2 && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == DONE)
if (!bRemoved2 && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == DONE)
{
me->InterruptNonMeleeSpells(true);
bRemoved2 = true;
@@ -69,11 +69,6 @@ enum CombatPhase
VANISHED,
FEEDING
};
enum GameObjects
{
GO_SPHERE1 = 193093,
GO_SPHERE2 = 193094
};
class boss_taldaram : public CreatureScript
{
@@ -113,13 +108,13 @@ public:
uiPhaseTimer = 0;
uiEmbraceTarget = 0;
if (instance)
instance->SetData(DATA_PRINCE_TALDARAM_EVENT, NOT_STARTED);
instance->SetBossState(DATA_PRINCE_TALDARAM, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_PRINCE_TALDARAM_EVENT, IN_PROGRESS);
instance->SetBossState(DATA_PRINCE_TALDARAM, IN_PROGRESS);
Talk(SAY_AGGRO);
}
@@ -267,7 +262,7 @@ public:
Talk(SAY_DEATH);
if (instance)
instance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE);
instance->SetBossState(DATA_PRINCE_TALDARAM, DONE);
}
void KilledUnit(Unit* victim) OVERRIDE
@@ -287,21 +282,10 @@ public:
bool CheckSpheres()
{
if (!instance)
return false;
uint64 uiSphereGuids[2];
uiSphereGuids[0] = instance->GetData64(DATA_SPHERE1);
uiSphereGuids[1] = instance->GetData64(DATA_SPHERE2);
for (uint8 i=0; i < 2; ++i)
{
GameObject* pSpheres = instance->instance->GetGameObject(uiSphereGuids[i]);
if (!pSpheres)
for (uint8 i = 0; i < 2; ++i)
if (!instance->GetData(DATA_SPHERE_1 + i))
return false;
if (pSpheres->GetGoState() != GO_STATE_ACTIVE)
return false;
}
RemovePrison();
return true;
}
@@ -332,7 +316,7 @@ public:
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return new boss_taldaramAI(creature);
return GetAhnKahetAI<boss_taldaramAI>(creature);
}
};
@@ -390,39 +374,38 @@ public:
class prince_taldaram_sphere : public GameObjectScript
{
public:
prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { }
public:
prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { }
bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
{
InstanceScript* instance = go->GetInstanceScript();
if (!instance)
return true;
Creature* pPrinceTaldaram = Unit::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM));
if (pPrinceTaldaram && pPrinceTaldaram->IsAlive())
bool OnGossipHello(Player* /*player*/, GameObject* go)
{
// maybe these are hacks :(
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
go->SetGoState(GO_STATE_ACTIVE);
InstanceScript* instance = go->GetInstanceScript();
if (!instance)
return false;
switch (go->GetEntry())
Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM));
if (PrinceTaldaram && PrinceTaldaram->IsAlive())
{
case GO_SPHERE1:
instance->SetData(DATA_SPHERE1_EVENT, IN_PROGRESS);
pPrinceTaldaram->AI()->Talk(SAY_1);
break;
// maybe these are hacks :(
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
go->SetGoState(GO_STATE_ACTIVE);
case GO_SPHERE2:
instance->SetData(DATA_SPHERE2_EVENT, IN_PROGRESS);
pPrinceTaldaram->AI()->Talk(SAY_1);
break;
switch (go->GetEntry())
{
case GO_SPHERE_1:
instance->SetData(DATA_SPHERE_1, IN_PROGRESS);
PrinceTaldaram->AI()->Talk(SAY_1);
break;
case GO_SPHERE_2:
instance->SetData(DATA_SPHERE_2, IN_PROGRESS);
PrinceTaldaram->AI()->Talk(SAY_1);
break;
}
CAST_AI(boss_taldaram::boss_taldaramAI, PrinceTaldaram->AI())->CheckSpheres();
}
CAST_AI(boss_taldaram::boss_taldaramAI, pPrinceTaldaram->AI())->CheckSpheres();
return true;
}
return true;
}
};
void AddSC_boss_taldaram()
@@ -20,321 +20,313 @@
#include "InstanceScript.h"
#include "ahnkahet.h"
/* Ahn'kahet encounters:
0 - Elder Nadox
1 - Prince Taldaram
2 - Jedoga Shadowseeker
3 - Herald Volazj
4 - Amanitar (Heroic only)
*/
#define MAX_ENCOUNTER 5
enum Achievements
DoorData const doorData[] =
{
ACHIEV_VOLUNTEER_WORK = 2056
{ GO_PRINCE_TALDARAM_GATE, DATA_PRINCE_TALDARAM, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
class instance_ahnkahet : public InstanceMapScript
{
public:
instance_ahnkahet() : InstanceMapScript("instance_ahnkahet", 619) { }
public:
instance_ahnkahet() : InstanceMapScript(AhnKahetScriptName, 619) { }
struct instance_ahnkahet_InstanceScript : public InstanceScript
{
instance_ahnkahet_InstanceScript(Map* map) : InstanceScript(map) {}
uint64 Elder_Nadox;
uint64 Prince_Taldaram;
uint64 Jedoga_Shadowseeker;
uint64 Herald_Volazj;
uint64 Amanitar;
uint64 Prince_TaldaramSpheres[2];
uint64 Prince_TaldaramPlatform;
uint64 Prince_TaldaramGate;
std::set<uint64> InitiandGUIDs;
uint64 JedogaSacrifices;
uint64 JedogaTarget;
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint32 spheres[2];
uint8 InitiandCnt;
uint8 switchtrigger;
std::string str_data;
void Initialize() OVERRIDE
struct instance_ahnkahet_InstanceScript : public InstanceScript
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
InitiandGUIDs.clear();
Elder_Nadox =0;
Prince_Taldaram =0;
Jedoga_Shadowseeker =0;
Herald_Volazj =0;
Amanitar =0;
spheres[0] = NOT_STARTED;
spheres[1] = NOT_STARTED;
InitiandCnt = 0;
switchtrigger = 0;
JedogaSacrifices = 0;
JedogaTarget = 0;
}
bool IsEncounterInProgress() const OVERRIDE
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
return false;
}
void OnCreatureCreate(Creature* creature) OVERRIDE
{
switch (creature->GetEntry())
instance_ahnkahet_InstanceScript(Map* map) : InstanceScript(map)
{
case 29309: Elder_Nadox = creature->GetGUID(); break;
case 29308: Prince_Taldaram = creature->GetGUID(); break;
case 29310: Jedoga_Shadowseeker = creature->GetGUID(); break;
case 29311: Herald_Volazj = creature->GetGUID(); break;
case 30258: Amanitar = creature->GetGUID(); break;
case 30114: InitiandGUIDs.insert(creature->GetGUID()); break;
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
ElderNadoxGUID = 0;
PrinceTaldaramGUID = 0;
JedogaShadowseekerGUID = 0;
AmanitarGUID = 0;
HeraldVolazjGUID = 0;
PrinceTaldaramPlatformGUID = 0;
JedogaSacrifices = 0;
JedogaTarget = 0;
SwitchTrigger = 0;
InitiandGUIDs.clear();
memset(SpheresState, 0, 2 * sizeof(uint64));
}
}
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
void OnCreatureCreate(Creature* creature) OVERRIDE
{
case 193564:
Prince_TaldaramPlatform = go->GetGUID();
if (m_auiEncounter[1] == DONE)
HandleGameObject(0, true, go);
break;
case 193093:
Prince_TaldaramSpheres[0] = go->GetGUID();
if (spheres[0] == IN_PROGRESS)
{
go->SetGoState(GO_STATE_ACTIVE);
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case 193094:
Prince_TaldaramSpheres[1] = go->GetGUID();
if (spheres[1] == IN_PROGRESS)
{
go->SetGoState(GO_STATE_ACTIVE);
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case 192236:
Prince_TaldaramGate = go->GetGUID(); // Web gate past Prince Taldaram
if (m_auiEncounter[1] == DONE)
HandleGameObject(0, true, go);
break;
}
}
void SetData64(uint32 idx, uint64 guid) OVERRIDE
{
switch (idx)
{
case DATA_ADD_JEDOGA_OPFER:
JedogaSacrifices = guid;
break;
case DATA_PL_JEDOGA_TARGET:
JedogaTarget = guid;
break;
}
}
uint64 GetData64(uint32 identifier) const OVERRIDE
{
switch (identifier)
{
case DATA_ELDER_NADOX: return Elder_Nadox;
case DATA_PRINCE_TALDARAM: return Prince_Taldaram;
case DATA_JEDOGA_SHADOWSEEKER: return Jedoga_Shadowseeker;
case DATA_HERALD_VOLAZJ: return Herald_Volazj;
case DATA_AMANITAR: return Amanitar;
case DATA_SPHERE1: return Prince_TaldaramSpheres[0];
case DATA_SPHERE2: return Prince_TaldaramSpheres[1];
case DATA_PRINCE_TALDARAM_PLATFORM: return Prince_TaldaramPlatform;
case DATA_ADD_JEDOGA_INITIAND:
switch (creature->GetEntry())
{
std::vector<uint64> vInitiands;
vInitiands.clear();
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (cr && cr->IsAlive())
vInitiands.push_back(*itr);
}
if (vInitiands.empty())
return 0;
uint8 j = urand(0, vInitiands.size() -1);
return vInitiands[j];
case NPC_ELDER_NADOX:
ElderNadoxGUID = creature->GetGUID();
break;
case NPC_PRINCE_TALDARAM:
PrinceTaldaramGUID = creature->GetGUID();
break;
case NPC_JEDOGA_SHADOWSEEKER:
JedogaShadowseekerGUID = creature->GetGUID();
break;
case NPC_AMANITAR:
AmanitarGUID = creature->GetGUID();
break;
case NPC_HERALD_VOLAZJ:
HeraldVolazjGUID = creature->GetGUID();
break;
case NPC_INITIAND:
InitiandGUIDs.insert(creature->GetGUID());
break;
default:
break;
}
case DATA_ADD_JEDOGA_OPFER: return JedogaSacrifices;
case DATA_PL_JEDOGA_TARGET: return JedogaTarget;
}
return 0;
}
void SetData(uint32 type, uint32 data) OVERRIDE
{
switch (type)
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
case DATA_ELDER_NADOX_EVENT:
m_auiEncounter[0] = data;
break;
case DATA_PRINCE_TALDARAM_EVENT:
if (data == DONE)
HandleGameObject(Prince_TaldaramGate, true);
m_auiEncounter[1] = data;
break;
case DATA_JEDOGA_SHADOWSEEKER_EVENT:
m_auiEncounter[2] = data;
if (data == DONE)
switch (go->GetEntry())
{
case GO_PRINCE_TALDARAM_PLATFORM:
PrinceTaldaramPlatformGUID = go->GetGUID();
if (GetBossState(DATA_PRINCE_TALDARAM) == DONE)
HandleGameObject(0, true, go);
break;
case GO_SPHERE_1:
if (SpheresState[0])
{
go->SetGoState(GO_STATE_ACTIVE);
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_SPHERE_2:
if (SpheresState[1])
{
go->SetGoState(GO_STATE_ACTIVE);
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_PRINCE_TALDARAM_GATE:
AddDoor(go, true);
break;
default:
break;
}
}
void OnGameObjectRemove(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
{
case GO_PRINCE_TALDARAM_GATE:
AddDoor(go, false);
break;
default:
break;
}
}
void SetData(uint32 type, uint32 data) OVERRIDE
{
switch (type)
{
case DATA_SPHERE_1:
case DATA_SPHERE_2:
SpheresState[type - DATA_SPHERE_1] = data;
break;
case DATA_JEDOGA_TRIGGER_SWITCH:
SwitchTrigger = data;
break;
case DATA_JEDOGA_RESET_INITIANDS:
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
if (Creature* creature = instance->GetCreature(*itr))
{
creature->Respawn();
if (!creature->IsInEvadeMode())
creature->AI()->EnterEvadeMode();
}
}
break;
default:
break;
}
}
uint32 GetData(uint32 type) const OVERRIDE
{
switch (type)
{
case DATA_SPHERE_1:
case DATA_SPHERE_2:
return SpheresState[type - DATA_SPHERE_1];
case DATA_ALL_INITIAND_DEAD:
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (!cr || cr->IsAlive())
return 0;
}
return 1;
case DATA_JEDOGA_TRIGGER_SWITCH:
return SwitchTrigger;
default:
break;
}
return 0;
}
void SetData64(uint32 type, uint64 guid) OVERRIDE
{
switch (type)
{
case DATA_ADD_JEDOGA_OPFER:
JedogaSacrifices = guid;
break;
case DATA_PL_JEDOGA_TARGET:
JedogaTarget = guid;
break;
default:
break;
}
}
uint64 GetData64(uint32 type) const OVERRIDE
{
switch (type)
{
case DATA_ELDER_NADOX:
return ElderNadoxGUID;
case DATA_PRINCE_TALDARAM:
return PrinceTaldaramGUID;
case DATA_JEDOGA_SHADOWSEEKER:
return JedogaShadowseekerGUID;
case DATA_AMANITAR:
return AmanitarGUID;
case DATA_HERALD_VOLAZJ:
return HeraldVolazjGUID;
case DATA_PRINCE_TALDARAM_PLATFORM:
return PrinceTaldaramPlatformGUID;
case DATA_ADD_JEDOGA_INITIAND:
{
std::vector<uint64> vInitiands;
vInitiands.clear();
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (cr && cr->IsAlive())
vInitiands.push_back(*itr);
}
if (vInitiands.empty())
return 0;
return Trinity::Containers::SelectRandomContainerElement(vInitiands);
}
case DATA_ADD_JEDOGA_OPFER:
return JedogaSacrifices;
case DATA_PL_JEDOGA_TARGET:
return JedogaTarget;
default:
break;
}
return 0;
}
bool SetBossState(uint32 type, EncounterState state) OVERRIDE
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case DATA_JEDOGA_SHADOWSEEKER:
if (state == DONE)
{
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
cr->SetVisible(false);
cr->setDeathState(JUST_DIED);
cr->RemoveCorpse();
if (Creature* cr = instance->GetCreature(*itr))
cr->DespawnOrUnsummon();
}
}
}
break;
case DATA_HERALD_VOLAZJ_EVENT:
m_auiEncounter[3] = data;
break;
case DATA_AMANITAR_EVENT:
m_auiEncounter[4] = data;
break;
case DATA_SPHERE1_EVENT:
spheres[0] = data;
break;
case DATA_SPHERE2_EVENT:
spheres[1] = data;
break;
case DATA_JEDOGA_TRIGGER_SWITCH:
switchtrigger = data;
break;
case DATA_JEDOGA_RESET_INITIANDS:
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
break;
default:
break;
}
return true;
}
std::string GetSaveData() OVERRIDE
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "A K " << GetBossSaveData() << SpheresState[0] << ' ' << SpheresState[1];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(char const* str) OVERRIDE
{
if (!str)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(str);
char dataHead1, dataHead2;
std::istringstream loadStream(str);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'A' && dataHead2 == 'K')
{
for (uint32 i = 0; i < EncounterCount; ++i)
{
Creature* cr = instance->GetCreature(*itr);
if (cr)
{
cr->Respawn();
if (!cr->IsInEvadeMode()) cr->AI()->EnterEvadeMode();
}
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
break;
}
if (data == DONE)
SaveToDB();
}
uint32 GetData(uint32 type) const OVERRIDE
{
switch (type)
{
case DATA_ELDER_NADOX_EVENT: return m_auiEncounter[0];
case DATA_PRINCE_TALDARAM_EVENT: return m_auiEncounter[1];
case DATA_JEDOGA_SHADOWSEEKER_EVENT: return m_auiEncounter[2];
case DATA_HERALD_VOLAZJ: return m_auiEncounter[3];
case DATA_AMANITAR_EVENT: return m_auiEncounter[4];
case DATA_SPHERE1_EVENT: return spheres[0];
case DATA_SPHERE2_EVENT: return spheres[1];
case DATA_ALL_INITIAND_DEAD:
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (!cr || (cr && cr->IsAlive()))
return 0;
}
return 1;
case DATA_JEDOGA_TRIGGER_SWITCH: return switchtrigger;
}
return 0;
}
loadStream >> SpheresState[0];
loadStream >> SpheresState[1];
}
else
OUT_LOAD_INST_DATA_FAIL;
std::string GetSaveData() OVERRIDE
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "A K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
<< m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' '
<< spheres[0] << ' ' << spheres[1];
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in) OVERRIDE
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
OUT_LOAD_INST_DATA_COMPLETE;
}
OUT_LOAD_INST_DATA(in);
protected:
uint64 ElderNadoxGUID;
uint64 PrinceTaldaramGUID;
uint64 JedogaShadowseekerGUID;
uint64 AmanitarGUID;
uint64 HeraldVolazjGUID;
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3, data4, data5, data6;
uint64 PrinceTaldaramPlatformGUID;
uint64 JedogaSacrifices;
uint64 JedogaTarget;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5 >> data6;
std::set<uint64> InitiandGUIDs;
if (dataHead1 == 'A' && dataHead2 == 'K')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
m_auiEncounter[4] = data4;
uint8 SpheresState[2];
uint8 SwitchTrigger;
};
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
spheres[0] = data5;
spheres[1] = data6;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
return new instance_ahnkahet_InstanceScript(map);
}
};
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
return new instance_ahnkahet_InstanceScript(map);
}
};
void AddSC_instance_ahnkahet()
{
new instance_ahnkahet();
new instance_ahnkahet();
}
@@ -18,9 +18,6 @@
#ifndef AZJOL_NERUB_H_
#define AZJOL_NERUB_H_
#include "Map.h"
#include "Creature.h"
#define AzjolNerubScriptName "instance_azjol_nerub"
uint32 const EncounterCount = 3;
@@ -60,11 +57,7 @@ enum GameObjectIds
template<class AI>
AI* GetAzjolNerubAI(Creature* creature)
{
if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
if (instance->GetInstanceScript())
if (instance->GetScriptId() == sObjectMgr->GetScriptId(AzjolNerubScriptName))
return new AI(creature);
return NULL;
return GetInstanceAI<AI>(creature, AzjolNerubScriptName);
}
#endif // AZJOL_NERUB_H_
@@ -18,9 +18,6 @@
#ifndef DRAK_THARON_KEEP_H_
#define DRAK_THARON_KEEP_H_
#include "Map.h"
#include "Creature.h"
#define DrakTharonKeepScriptName "instance_drak_tharon_keep"
uint32 const EncounterCount = 4;
@@ -89,11 +86,7 @@ enum GameObjectIds
template<class AI>
AI* GetDrakTharonKeepAI(Creature* creature)
{
if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
if (instance->GetInstanceScript())
if (instance->GetScriptId() == sObjectMgr->GetScriptId(DrakTharonKeepScriptName))
return new AI(creature);
return NULL;
return GetInstanceAI<AI>(creature, DrakTharonKeepScriptName);
}
#endif // DRAK_THARON_KEEP_H_
@@ -18,9 +18,6 @@
#ifndef HALLS_OF_LIGHTNING_H_
#define HALLS_OF_LIGHTNING_H_
#include "Map.h"
#include "Creature.h"
#define HoLScriptName "instance_halls_of_lightning"
uint32 const EncounterCount = 4;
@@ -54,11 +51,7 @@ enum GameObjectIds
template<class AI>
AI* GetHallsOfLightningAI(Creature* creature)
{
if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
if (instance->GetInstanceScript())
if (instance->GetScriptId() == sObjectMgr->GetScriptId(HoLScriptName))
return new AI(creature);
return NULL;
return GetInstanceAI<AI>(creature, HoLScriptName);
}
#endif // HALLS_OF_LIGHTNING_H_
@@ -88,11 +88,7 @@ enum GameObjectIds
template<class AI>
AI* GetBlackTempleAI(Creature* creature)
{
if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
if (instance->GetInstanceScript())
if (instance->GetScriptId() == sObjectMgr->GetScriptId(BTScriptName))
return new AI(creature);
return NULL;
return GetInstanceAI<AI>(creature, BTScriptName);
}
#endif // BLACK_TEMPLE_H_