Scripts/AhnKahet: reworked InstanceScript
This commit is contained in:
@@ -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_
|
||||
|
||||
Reference in New Issue
Block a user