Use GUIDs instead of "global" pointers in ~all boss/instance scripts.

GUIDs are most safer than pointers and in some cases can avoid segmentation faults.

== - ==

Let me show a simple example:

We have a pointer to a creature: Creature *pCreature;

and try to search a creature and store it in the pointer:
pCreature = SearchCreature(ID);

We can check simply if the creature found or not:
if(pCreature)
- if this give true: creature found and we have a memory address which points to the creature
- if this give false: creature not found and this is a NULL pointer

Suppose that we have a valid pointer, so creature found.
We wanna use that pointer somewhere, for example in script phase 3.
But we delete the creature(from world) in phase 1.
In phase 3:
if(pCreature)
    pCreature->DoSomeShit();
The if condition gives true, but pCreature points to an _invalid_ address.
In that address maybe have "nothing" or another creature's object or a player or anything else, dont know that.

~~ - ~~

Let me show the correct way:
Creature's GUID: uint64 CreatureGUID;

search the creature and set the GUID:
Creature *pCreature = SearchCreature(ID);
CreatureGUID = pCreature ? pCreature->GetGUID() : 0; // if pCreature is NULL set the GUID to 0

So we have a GUID and not a pointer.
We can get the creature from that GUID:
Creature *pCreature = GetCreature(CreatureGUID);
and we can simply check it is valid or not(found or not):
if(pCreature)

So we deleted the creature in phase 1 and try to use it in phase 3:
Creature *pCreature = GetCreature(CreatureGUID);
And this gives NULL because GetCreature() can't find the creature which GUID is CreatureGUID.

if(pCreature) // pCreature is NULL
    pCreature->DoSomeShit(); // DoSomeShit() not called

== - ==

Remove some not used variables.
Some clean.

TODO: Should search/fix these in zones scripts.

--HG--
branch : trunk
This commit is contained in:
Anubisss
2010-03-27 13:54:38 +01:00
parent 099ef2a9b6
commit be739e9900
35 changed files with 517 additions and 444 deletions
@@ -41,13 +41,9 @@ struct boss_moira_bronzebeardAI : public ScriptedAI
uint32 MindBlast_Timer; uint32 MindBlast_Timer;
uint32 ShadowWordPain_Timer; uint32 ShadowWordPain_Timer;
uint32 Smite_Timer; uint32 Smite_Timer;
Unit* PlayerHolder;
Unit* Target;
bool Heal;
void Reset() void Reset()
{ {
Target = NULL;
Heal_Timer = 12000; //These times are probably wrong Heal_Timer = 12000; //These times are probably wrong
MindBlast_Timer = 16000; MindBlast_Timer = 16000;
ShadowWordPain_Timer = 2000; ShadowWordPain_Timer = 2000;
@@ -107,10 +107,6 @@ struct boss_doomrelAI : public ScriptedAI
uint32 CurseOfWeakness_Timer; uint32 CurseOfWeakness_Timer;
uint32 DemonArmor_Timer; uint32 DemonArmor_Timer;
bool Voidwalkers; bool Voidwalkers;
int Rand;
int RandX;
int RandY;
Creature* Summoned;
void Reset() void Reset()
{ {
@@ -46,7 +46,6 @@ struct boss_gythAI : public ScriptedAI
bool SummonedRend; bool SummonedRend;
bool bAggro; bool bAggro;
bool RootSelf; bool RootSelf;
Creature *SummonedCreature;
void Reset() void Reset()
{ {
@@ -47,7 +47,6 @@ struct boss_overlordwyrmthalakAI : public ScriptedAI
uint32 Cleave_Timer; uint32 Cleave_Timer;
uint32 Knockaway_Timer; uint32 Knockaway_Timer;
bool Summoned; bool Summoned;
Creature *SummonedCreature;
void Reset() void Reset()
{ {
@@ -101,9 +100,9 @@ struct boss_overlordwyrmthalakAI : public ScriptedAI
{ {
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0, 100, true); Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0, 100, true);
if (SummonedCreature = m_creature->SummonCreature(9216,ADD_1X,ADD_1Y,ADD_1Z,ADD_1O,TEMPSUMMON_TIMED_DESPAWN,300000)) if (Creature *SummonedCreature = m_creature->SummonCreature(9216,ADD_1X,ADD_1Y,ADD_1Z,ADD_1O,TEMPSUMMON_TIMED_DESPAWN,300000))
SummonedCreature->AI()->AttackStart(pTarget); SummonedCreature->AI()->AttackStart(pTarget);
if (SummonedCreature = m_creature->SummonCreature(9268,ADD_2X,ADD_2Y,ADD_2Z,ADD_2O,TEMPSUMMON_TIMED_DESPAWN,300000)) if (Creature *SummonedCreature = m_creature->SummonCreature(9268,ADD_2X,ADD_2Y,ADD_2Z,ADD_2O,TEMPSUMMON_TIMED_DESPAWN,300000))
SummonedCreature->AI()->AttackStart(pTarget); SummonedCreature->AI()->AttackStart(pTarget);
Summoned = true; Summoned = true;
} }
@@ -45,12 +45,13 @@ struct instance_deadmines : public ScriptedInstance
{ {
instance_deadmines(Map* pMap) : ScriptedInstance(pMap) { Initialize(); }; instance_deadmines(Map* pMap) : ScriptedInstance(pMap) { Initialize(); };
GameObject* IronCladDoor; uint64 IronCladDoorGUID;
GameObject* DefiasCannon; uint64 DefiasCannonGUID;
GameObject* DoorLever; uint64 DoorLeverGUID;
Creature* DefiasPirate1; uint64 DefiasPirate1GUID;
Creature* DefiasPirate2; uint64 DefiasPirate2GUID;
Creature* DefiasCompanion; uint64 DefiasCompanionGUID;
uint32 State; uint32 State;
uint32 CannonBlast_Timer; uint32 CannonBlast_Timer;
uint32 PiratesDelay_Timer; uint32 PiratesDelay_Timer;
@@ -58,16 +59,24 @@ struct instance_deadmines : public ScriptedInstance
void Initialize() void Initialize()
{ {
IronCladDoor = NULL; IronCladDoorGUID = 0;
DefiasCannon = NULL; DefiasCannonGUID = 0;
DoorLever = NULL; DoorLeverGUID = 0;
DefiasPirate1GUID = 0;
DefiasPirate2GUID = 0;
DefiasCompanionGUID = 0;
State = CANNON_NOT_USED; State = CANNON_NOT_USED;
uiSmiteChestGUID = 0; uiSmiteChestGUID = 0;
} }
virtual void Update(uint32 diff) virtual void Update(uint32 diff)
{ {
if (!IronCladDoor || !DefiasCannon || !DoorLever) if (!IronCladDoorGUID || !DefiasCannonGUID || !DoorLeverGUID)
return;
GameObject *pIronCladDoor = instance->GetGameObject(IronCladDoorGUID);
if (!pIronCladDoor)
return; return;
switch (State) switch (State)
@@ -75,9 +84,9 @@ struct instance_deadmines : public ScriptedInstance
case CANNON_GUNPOWDER_USED: case CANNON_GUNPOWDER_USED:
CannonBlast_Timer = DATA_CANNON_BLAST_TIMER; CannonBlast_Timer = DATA_CANNON_BLAST_TIMER;
// it's a hack - Mr. Smite should do that but his too far away // it's a hack - Mr. Smite should do that but his too far away
IronCladDoor->SetName("Mr. Smite"); pIronCladDoor->SetName("Mr. Smite");
IronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, 0); pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, 0);
DoPlaySound(IronCladDoor, SOUND_MR_SMITE_ALARM1); DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM1);
State = CANNON_BLAST_INITIATED; State = CANNON_BLAST_INITIATED;
break; break;
case CANNON_BLAST_INITIATED: case CANNON_BLAST_INITIATED:
@@ -88,8 +97,8 @@ struct instance_deadmines : public ScriptedInstance
ShootCannon(); ShootCannon();
BlastOutDoor(); BlastOutDoor();
LeverStucked(); LeverStucked();
IronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, 0); pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, 0);
DoPlaySound(IronCladDoor, SOUND_MR_SMITE_ALARM2); DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM2);
State = PIRATES_ATTACK; State = PIRATES_ATTACK;
} else CannonBlast_Timer -= diff; } else CannonBlast_Timer -= diff;
break; break;
@@ -105,19 +114,32 @@ struct instance_deadmines : public ScriptedInstance
void SummonCreatures() void SummonCreatures()
{ {
DefiasPirate1 = IronCladDoor->SummonCreature(657,IronCladDoor->GetPositionX() - 2,IronCladDoor->GetPositionY()-7,IronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); if (GameObject *pIronCladDoor = instance->GetGameObject(IronCladDoorGUID))
DefiasPirate2 = IronCladDoor->SummonCreature(657,IronCladDoor->GetPositionX() + 3,IronCladDoor->GetPositionY()-6,IronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); {
DefiasCompanion = IronCladDoor->SummonCreature(3450,IronCladDoor->GetPositionX() + 2,IronCladDoor->GetPositionY()-6,IronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000); Creature *DefiasPirate1 = pIronCladDoor->SummonCreature(657,pIronCladDoor->GetPositionX() - 2,pIronCladDoor->GetPositionY()-7,pIronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
Creature *DefiasPirate2 = pIronCladDoor->SummonCreature(657,pIronCladDoor->GetPositionX() + 3,pIronCladDoor->GetPositionY()-6,pIronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
Creature *DefiasCompanion = pIronCladDoor->SummonCreature(3450,pIronCladDoor->GetPositionX() + 2,pIronCladDoor->GetPositionY()-6,pIronCladDoor->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
DefiasPirate1GUID = DefiasPirate1->GetGUID();
DefiasPirate2GUID = DefiasPirate2->GetGUID();
DefiasCompanionGUID = DefiasCompanion->GetGUID();
}
} }
void MoveCreaturesInside() void MoveCreaturesInside()
{ {
if (!DefiasPirate1 || !DefiasPirate2 || !DefiasCompanion) if (!DefiasPirate1GUID || !DefiasPirate2GUID || !DefiasCompanionGUID)
return; return;
MoveCreatureInside(DefiasPirate1); Creature *pDefiasPirate1 = instance->GetCreature(DefiasPirate1GUID);
MoveCreatureInside(DefiasPirate2); Creature *pDefiasPirate2 = instance->GetCreature(DefiasPirate2GUID);
MoveCreatureInside(DefiasCompanion); Creature *pDefiasCompanion = instance->GetCreature(DefiasCompanionGUID);
if (!pDefiasPirate1 || !pDefiasPirate2 || !pDefiasCompanion)
return;
MoveCreatureInside(pDefiasPirate1);
MoveCreatureInside(pDefiasPirate2);
MoveCreatureInside(pDefiasCompanion);
} }
void MoveCreatureInside(Creature* pCreature) void MoveCreatureInside(Creature* pCreature)
@@ -128,37 +150,36 @@ struct instance_deadmines : public ScriptedInstance
void ShootCannon() void ShootCannon()
{ {
DefiasCannon->SetGoState(GO_STATE_ACTIVE); if (GameObject *pDefiasCannon = instance->GetGameObject(DefiasCannonGUID))
DoPlaySound(DefiasCannon, SOUND_CANNONFIRE); {
pDefiasCannon->SetGoState(GO_STATE_ACTIVE);
DoPlaySound(pDefiasCannon, SOUND_CANNONFIRE);
}
} }
void BlastOutDoor() void BlastOutDoor()
{ {
IronCladDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); if (GameObject *pIronCladDoor = instance->GetGameObject(IronCladDoorGUID))
DoPlaySound(IronCladDoor, SOUND_DESTROYDOOR); {
pIronCladDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
DoPlaySound(pIronCladDoor, SOUND_DESTROYDOOR);
}
} }
void LeverStucked() void LeverStucked()
{ {
DoorLever->SetUInt32Value(GAMEOBJECT_FLAGS, 4); if (GameObject *pDoorLever = instance->GetGameObject(DoorLeverGUID))
pDoorLever->SetUInt32Value(GAMEOBJECT_FLAGS, 4);
} }
void OnGameObjectCreate(GameObject* pGo, bool add) void OnGameObjectCreate(GameObject* pGo, bool add)
{ {
switch(pGo->GetEntry()) switch(pGo->GetEntry())
{ {
case GO_IRONCLAD_DOOR: case GO_IRONCLAD_DOOR: IronCladDoorGUID = pGo->GetGUID(); break;
IronCladDoor = pGo; case GO_DEFIAS_CANNON: DefiasCannonGUID = pGo->GetGUID(); break;
break; case GO_DOOR_LEVER: DoorLeverGUID = pGo->GetGUID(); break;
case GO_DEFIAS_CANNON: case GO_MR_SMITE_CHEST: uiSmiteChestGUID = pGo->GetGUID(); break;
DefiasCannon = pGo;
break;
case GO_DOOR_LEVER:
DoorLever = pGo;
break;
case GO_MR_SMITE_CHEST:
uiSmiteChestGUID = pGo->GetGUID();
break;
} }
} }
@@ -166,7 +187,7 @@ struct instance_deadmines : public ScriptedInstance
{ {
if (type == EVENT_STATE) if (type == EVENT_STATE)
{ {
if (DefiasCannon && IronCladDoor) if (DefiasCannonGUID && IronCladDoorGUID)
State=data; State=data;
} }
} }
@@ -98,7 +98,7 @@ struct boss_ragnarosAI : public ScriptedAI
uint32 Erruption_Timer; uint32 Erruption_Timer;
uint32 Submerge_Timer; uint32 Submerge_Timer;
uint32 Attack_Timer; uint32 Attack_Timer;
Creature *Summoned;
bool HasYelledMagmaBurst; bool HasYelledMagmaBurst;
bool HasSubmergedOnce; bool HasSubmergedOnce;
bool WasBanished; bool WasBanished;
@@ -499,19 +499,19 @@ struct npc_dark_rider_of_acherusAI : public ScriptedAI
uint32 PhaseTimer; uint32 PhaseTimer;
uint32 Phase; uint32 Phase;
bool Intro; bool Intro;
Unit *Target; uint64 TargetGUID;
void Reset() void Reset()
{ {
PhaseTimer = 4000; PhaseTimer = 4000;
Phase = 0; Phase = 0;
Intro = false; Intro = false;
Target = NULL; TargetGUID = 0;
} }
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
{ {
if (!Intro) if (!Intro || !TargetGUID)
return; return;
if (PhaseTimer <= diff) if (PhaseTimer <= diff)
@@ -524,7 +524,8 @@ struct npc_dark_rider_of_acherusAI : public ScriptedAI
Phase = 1; Phase = 1;
break; break;
case 1: case 1:
DoCast(Target, DESPAWN_HORSE, true); if (Unit *pTarget = Unit::GetUnit(*m_creature, TargetGUID))
DoCast(pTarget, DESPAWN_HORSE, true);
PhaseTimer = 3000; PhaseTimer = 3000;
Phase = 2; Phase = 2;
break; break;
@@ -548,11 +549,11 @@ struct npc_dark_rider_of_acherusAI : public ScriptedAI
if (!who) if (!who)
return; return;
Target = who; TargetGUID = who->GetGUID();
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->SetSpeed(MOVE_RUN, 0.4f); m_creature->SetSpeed(MOVE_RUN, 0.4f);
m_creature->GetMotionMaster()->MoveChase(Target); m_creature->GetMotionMaster()->MoveChase(who);
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, Target->GetGUID()); m_creature->SetUInt64Value(UNIT_FIELD_TARGET, TargetGUID);
Intro = true; Intro = true;
} }
@@ -62,8 +62,6 @@ struct boss_darkmaster_gandlingAI : public ScriptedAI
uint32 Curse_Timer; uint32 Curse_Timer;
uint32 Teleport_Timer; uint32 Teleport_Timer;
Creature *Summoned;
void Reset() void Reset()
{ {
ArcaneMissiles_Timer = 4500; ArcaneMissiles_Timer = 4500;
@@ -121,6 +119,7 @@ struct boss_darkmaster_gandlingAI : public ScriptedAI
if (DoGetThreat(pTarget)) if (DoGetThreat(pTarget))
DoModifyThreatPercent(pTarget, -100); DoModifyThreatPercent(pTarget, -100);
Creature *Summoned = NULL;
switch(rand()%6) switch(rand()%6)
{ {
case 0: case 0:
@@ -89,7 +89,6 @@ struct boss_baron_rivendareAI : public ScriptedAI
uint32 MortalStrike_Timer; uint32 MortalStrike_Timer;
// uint32 RaiseDead_Timer; // uint32 RaiseDead_Timer;
uint32 SummonSkeletons_Timer; uint32 SummonSkeletons_Timer;
Creature *Summoned;
void Reset() void Reset()
{ {
@@ -112,7 +111,7 @@ struct boss_baron_rivendareAI : public ScriptedAI
void JustSummoned(Creature* summoned) void JustSummoned(Creature* summoned)
{ {
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
summoned->AI()->AttackStart(pTarget); summoned->AI()->AttackStart(pTarget);
} }
void JustDied(Unit* Killer) void JustDied(Unit* Killer)
@@ -44,14 +44,6 @@ struct instance_sunken_temple : public ScriptedInstance
Initialize(); Initialize();
}; };
GameObject* AtalaiStatue1;
GameObject* AtalaiStatue2;
GameObject* AtalaiStatue3;
GameObject* AtalaiStatue4;
GameObject* AtalaiStatue5;
GameObject* AtalaiStatue6;
GameObject* AtalaiIdol;
uint64 GOAtalaiStatue1; uint64 GOAtalaiStatue1;
uint64 GOAtalaiStatue2; uint64 GOAtalaiStatue2;
uint64 GOAtalaiStatue3; uint64 GOAtalaiStatue3;
@@ -59,6 +51,7 @@ struct instance_sunken_temple : public ScriptedInstance
uint64 GOAtalaiStatue5; uint64 GOAtalaiStatue5;
uint64 GOAtalaiStatue6; uint64 GOAtalaiStatue6;
uint64 GOAtalaiIdol; uint64 GOAtalaiIdol;
uint32 State; uint32 State;
bool s1; bool s1;
@@ -77,14 +70,9 @@ struct instance_sunken_temple : public ScriptedInstance
GOAtalaiStatue5 = 0; GOAtalaiStatue5 = 0;
GOAtalaiStatue6 = 0; GOAtalaiStatue6 = 0;
GOAtalaiIdol = 0; GOAtalaiIdol = 0;
State = 0; State = 0;
AtalaiStatue1 = NULL;
AtalaiStatue2 = NULL;
AtalaiStatue3 = NULL;
AtalaiStatue4 = NULL;
AtalaiStatue5 = NULL;
AtalaiStatue6 = NULL;
AtalaiIdol = NULL;
s1 = false; s1 = false;
s2 = false; s2 = false;
s3 = false; s3 = false;
@@ -94,39 +82,18 @@ struct instance_sunken_temple : public ScriptedInstance
} }
void OnGameObjectCreate(GameObject* pGo, bool add) void OnGameObjectCreate(GameObject* pGo, bool add)
{ {
switch(pGo->GetEntry()) switch(pGo->GetEntry())
{ {
case GO_ATALAI_STATUE1: case GO_ATALAI_STATUE1: GOAtalaiStatue1 = pGo->GetGUID(); break;
AtalaiStatue1 = pGo; case GO_ATALAI_STATUE2: GOAtalaiStatue2 = pGo->GetGUID(); break;
GOAtalaiStatue1 = pGo->GetGUID(); case GO_ATALAI_STATUE3: GOAtalaiStatue3 = pGo->GetGUID(); break;
break; case GO_ATALAI_STATUE4: GOAtalaiStatue4 = pGo->GetGUID(); break;
case GO_ATALAI_STATUE2: case GO_ATALAI_STATUE5: GOAtalaiStatue5 = pGo->GetGUID(); break;
AtalaiStatue2 = pGo; case GO_ATALAI_STATUE6: GOAtalaiStatue6 = pGo->GetGUID(); break;
GOAtalaiStatue2 = pGo->GetGUID(); case GO_ATALAI_IDOL: GOAtalaiIdol = pGo->GetGUID(); break;
break; }
case GO_ATALAI_STATUE3: }
AtalaiStatue3 = pGo;
GOAtalaiStatue3 = pGo->GetGUID();
break;
case GO_ATALAI_STATUE4:
AtalaiStatue4 = pGo;
GOAtalaiStatue4 = pGo->GetGUID();
break;
case GO_ATALAI_STATUE5:
AtalaiStatue5 = pGo;
GOAtalaiStatue5 = pGo->GetGUID();
break;
case GO_ATALAI_STATUE6:
AtalaiStatue6 = pGo;
GOAtalaiStatue6 = pGo->GetGUID();
break;
case GO_ATALAI_IDOL:
AtalaiIdol = pGo;
GOAtalaiIdol = pGo->GetGUID();
break;
}
};
virtual void Update(uint32 diff) // correct order goes form 1-6 virtual void Update(uint32 diff) // correct order goes form 1-6
{ {
@@ -135,7 +102,8 @@ struct instance_sunken_temple : public ScriptedInstance
case GO_ATALAI_STATUE1: case GO_ATALAI_STATUE1:
if(!s1 && !s2 && !s3 && !s4 && !s5 && !s6) if(!s1 && !s2 && !s3 && !s4 && !s5 && !s6)
{ {
UseStatue(AtalaiStatue1); if (GameObject *pAtalaiStatue1 = instance->GetGameObject(GOAtalaiStatue1))
UseStatue(pAtalaiStatue1);
s1 = true; s1 = true;
State = 0; State = 0;
}; };
@@ -143,7 +111,8 @@ struct instance_sunken_temple : public ScriptedInstance
case GO_ATALAI_STATUE2: case GO_ATALAI_STATUE2:
if(s1 && !s2 && !s3 && !s4 && !s5 && !s6) if(s1 && !s2 && !s3 && !s4 && !s5 && !s6)
{ {
UseStatue(AtalaiStatue2); if (GameObject *pAtalaiStatue2 = instance->GetGameObject(GOAtalaiStatue2))
UseStatue(pAtalaiStatue2);
s2 = true; s2 = true;
State = 0; State = 0;
}; };
@@ -151,7 +120,8 @@ struct instance_sunken_temple : public ScriptedInstance
case GO_ATALAI_STATUE3: case GO_ATALAI_STATUE3:
if(s1 && s2 && !s3 && !s4 && !s5 && !s6) if(s1 && s2 && !s3 && !s4 && !s5 && !s6)
{ {
UseStatue(AtalaiStatue3); if (GameObject *pAtalaiStatue3 = instance->GetGameObject(GOAtalaiStatue3))
UseStatue(pAtalaiStatue3);
s3 = true; s3 = true;
State = 0; State = 0;
}; };
@@ -159,7 +129,8 @@ struct instance_sunken_temple : public ScriptedInstance
case GO_ATALAI_STATUE4: case GO_ATALAI_STATUE4:
if(s1 && s2 && s3 && !s4 && !s5 && !s6) if(s1 && s2 && s3 && !s4 && !s5 && !s6)
{ {
UseStatue(AtalaiStatue4); if (GameObject *pAtalaiStatue4 = instance->GetGameObject(GOAtalaiStatue4))
UseStatue(pAtalaiStatue4);
s4 = true; s4 = true;
State = 0; State = 0;
} }
@@ -167,7 +138,8 @@ struct instance_sunken_temple : public ScriptedInstance
case GO_ATALAI_STATUE5: case GO_ATALAI_STATUE5:
if(s1 && s2 && s3 && s4 && !s5 && !s6) if(s1 && s2 && s3 && s4 && !s5 && !s6)
{ {
UseStatue(AtalaiStatue5); if (GameObject *pAtalaiStatue5 = instance->GetGameObject(GOAtalaiStatue5))
UseStatue(pAtalaiStatue5);
s5 = true; s5 = true;
State = 0; State = 0;
} }
@@ -175,7 +147,8 @@ struct instance_sunken_temple : public ScriptedInstance
case GO_ATALAI_STATUE6: case GO_ATALAI_STATUE6:
if(s1 && s2 && s3 && s4 && s5 && !s6) if(s1 && s2 && s3 && s4 && s5 && !s6)
{ {
UseLastStatue(AtalaiStatue6); if (GameObject *pAtalaiStatue6 = instance->GetGameObject(GOAtalaiStatue6))
UseStatue(pAtalaiStatue6);
s6 = true; s6 = true;
State = 0; State = 0;
} }
@@ -183,11 +156,13 @@ struct instance_sunken_temple : public ScriptedInstance
} }
}; };
void UseStatue(GameObject* pGo) void UseStatue(GameObject* pGo)
{ {
pGo->SummonGameObject(GO_ATALAI_LIGHT1,pGo->GetPositionX(),pGo->GetPositionY(),pGo->GetPositionZ(),0,0,0,0,0,0); pGo->SummonGameObject(GO_ATALAI_LIGHT1,pGo->GetPositionX(),pGo->GetPositionY(),pGo->GetPositionZ(),0,0,0,0,0,0);
pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 4); pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 4);
} }
/*
void UseLastStatue(GameObject* pGo) void UseLastStatue(GameObject* pGo)
{ {
AtalaiStatue1->SummonGameObject(GO_ATALAI_LIGHT2,AtalaiStatue1->GetPositionX(),AtalaiStatue1->GetPositionY(),AtalaiStatue1->GetPositionZ(),0,0,0,0,0,100000); AtalaiStatue1->SummonGameObject(GO_ATALAI_LIGHT2,AtalaiStatue1->GetPositionX(),AtalaiStatue1->GetPositionY(),AtalaiStatue1->GetPositionZ(),0,0,0,0,0,100000);
@@ -198,6 +173,7 @@ struct instance_sunken_temple : public ScriptedInstance
AtalaiStatue6->SummonGameObject(GO_ATALAI_LIGHT2,AtalaiStatue6->GetPositionX(),AtalaiStatue6->GetPositionY(),AtalaiStatue6->GetPositionZ(),0,0,0,0,0,100000); AtalaiStatue6->SummonGameObject(GO_ATALAI_LIGHT2,AtalaiStatue6->GetPositionX(),AtalaiStatue6->GetPositionY(),AtalaiStatue6->GetPositionZ(),0,0,0,0,0,100000);
pGo->SummonGameObject(148838,-488.997,96.61,-189.019,-1.52,0,0,0,0,100000); pGo->SummonGameObject(148838,-488.997,96.61,-189.019,-1.52,0,0,0,0,100000);
} }
*/
void SetData(uint32 type, uint32 data) void SetData(uint32 type, uint32 data)
{ {
@@ -73,7 +73,6 @@ struct boss_brutallusAI : public ScriptedAI
} }
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
Unit* Madrigosa;
uint32 SlashTimer; uint32 SlashTimer;
uint32 BurnTimer; uint32 BurnTimer;
@@ -102,8 +101,6 @@ struct boss_brutallusAI : public ScriptedAI
IsIntro = false; IsIntro = false;
Enraged = false; Enraged = false;
DoCast(m_creature, SPELL_DUAL_WIELD, true); DoCast(m_creature, SPELL_DUAL_WIELD, true);
if (pInstance) if (pInstance)
@@ -142,17 +139,15 @@ struct boss_brutallusAI : public ScriptedAI
ScriptedAI::EnterEvadeMode(); ScriptedAI::EnterEvadeMode();
} }
void StartIntro() void StartIntro()
{ {
if (!Intro || IsIntro) if (!Intro || IsIntro)
return; return;
error_log("Start Intro"); error_log("Start Intro");
Madrigosa = Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_MADRIGOSA)); Creature *Madrigosa = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_MADRIGOSA) : 0);
if (Madrigosa) if (Madrigosa)
{ {
((Creature*)Madrigosa)->Respawn(); Madrigosa->Respawn();
Madrigosa->setActive(true); Madrigosa->setActive(true);
IsIntro = true; IsIntro = true;
Madrigosa->SetMaxHealth(m_creature->GetMaxHealth()); Madrigosa->SetMaxHealth(m_creature->GetMaxHealth());
@@ -166,7 +161,6 @@ struct boss_brutallusAI : public ScriptedAI
error_log("Madrigosa was not found"); error_log("Madrigosa was not found");
EndIntro(); EndIntro();
} }
} }
void EndIntro() void EndIntro()
@@ -186,6 +180,7 @@ struct boss_brutallusAI : public ScriptedAI
void DoIntro() void DoIntro()
{ {
Creature *Madrigosa = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_MADRIGOSA) : 0);
if (!Madrigosa) if (!Madrigosa)
return; return;
@@ -286,13 +281,15 @@ struct boss_brutallusAI : public ScriptedAI
{ {
if (IntroFrostBoltTimer <= diff) if (IntroFrostBoltTimer <= diff)
{ {
if (Madrigosa) if (Creature *Madrigosa = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_MADRIGOSA) : 0))
{ {
Madrigosa->CastSpell(m_creature, SPELL_INTRO_FROSTBOLT, true); Madrigosa->CastSpell(m_creature, SPELL_INTRO_FROSTBOLT, true);
IntroFrostBoltTimer = 2000; IntroFrostBoltTimer = 2000;
} }
} else IntroFrostBoltTimer -= diff; } else IntroFrostBoltTimer -= diff;
} }
if (!UpdateVictim())
return;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
@@ -307,7 +307,7 @@ struct boss_kalecgos_kjAI : public ScriptedAI
pInstance = c->GetInstanceData(); pInstance = c->GetInstanceData();
} }
GameObject* Orb[4]; uint64 OrbGUID[4];
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint8 OrbsEmpowered; uint8 OrbsEmpowered;
uint8 EmpowerCount; uint8 EmpowerCount;
@@ -316,7 +316,7 @@ struct boss_kalecgos_kjAI : public ScriptedAI
void InitializeAI(){ void InitializeAI(){
for (uint8 i = 0; i < 4; ++i) for (uint8 i = 0; i < 4; ++i)
Orb[i] = NULL; OrbGUID[i] = 0;
FindOrbs(); FindOrbs();
OrbsEmpowered = 0; OrbsEmpowered = 0;
EmpowerCount = 0; EmpowerCount = 0;
@@ -347,8 +347,8 @@ struct boss_kalecgos_kjAI : public ScriptedAI
return; return;
uint8 i = 0; uint8 i = 0;
for (std::list<GameObject*>::iterator itr = orbList.begin(); itr != orbList.end(); ++itr, ++i){ for (std::list<GameObject*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr, ++i){
Orb[i] = pInstance ? pInstance->instance->GetGameObject(pInstance->GetData64((*itr)->GetGUID())) : NULL; OrbGUID[i] = pInstance ? (*itr)->GetGUID() : 0;
} }
} }
@@ -356,24 +356,29 @@ struct boss_kalecgos_kjAI : public ScriptedAI
{ {
m_creature->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES); m_creature->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
for (uint8 i = 0; i < 4; ++i) for (uint8 i = 0; i < 4; ++i)
if (Orb[i]) Orb[i]->SetUInt32Value(GAMEOBJECT_FACTION, 0); if (GameObject *pOrb = m_creature->GetMap()->GetGameObject(OrbGUID[i]))
pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 0);
} }
void EmpowerOrb(bool all) void EmpowerOrb(bool all)
{ {
if (!Orb[OrbsEmpowered]) if (!OrbGUID[OrbsEmpowered])
return; return;
uint8 random = urand(0,3); uint8 random = urand(0,3);
if (all) if (all)
{ {
m_creature->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES); m_creature->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
for (uint8 i = 0; i < 4; ++i) for (uint8 i = 0; i < 4; ++i)
{ {
if (!Orb[i]) return; GameObject *pOrb = m_creature->GetMap()->GetGameObject(OrbGUID[i]);
Orb[i]->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES); if (!pOrb)
Orb[i]->SetUInt32Value(GAMEOBJECT_FACTION, 35); return;
Orb[i]->setActive(true);
Orb[i]->Refresh(); pOrb->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES);
pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 35);
pOrb->setActive(true);
pOrb->Refresh();
} }
} }
else else
@@ -392,12 +397,15 @@ struct boss_kalecgos_kjAI : public ScriptedAI
} }
} }
}*/ }*/
if(Orb[random]) if(OrbGUID[random])
{ {
Orb[random]->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES); if (GameObject* pOrb = m_creature->GetMap()->GetGameObject(OrbGUID[random]))
Orb[random]->SetUInt32Value(GAMEOBJECT_FACTION, 35); {
Orb[random]->setActive(true); pOrb->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES);
Orb[random]->Refresh(); pOrb->SetUInt32Value(GAMEOBJECT_FACTION, 35);
pOrb->setActive(true);
pOrb->Refresh();
}
} }
++OrbsEmpowered; ++OrbsEmpowered;
} }
@@ -440,8 +448,6 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
SummonList Summons; SummonList Summons;
Creature* Kalec;
Unit* randomPlayer;
uint8 Phase; uint8 Phase;
uint8 ActiveTimers; uint8 ActiveTimers;
@@ -486,8 +492,6 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI
IsWaiting = false; IsWaiting = false;
OrbActivated = false; OrbActivated = false;
if(pInstance)
Kalec = CAST_CRE(Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KALECGOS_KJ)));
ChangeTimers(false, 0); ChangeTimers(false, 0);
} }
@@ -595,9 +599,9 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI
switch(t) switch(t)
{ {
case TIMER_KALEC_JOIN: case TIMER_KALEC_JOIN:
if (Kalec) if (Creature *pKalec = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_KALECGOS_KJ) : 0))
{ {
DoScriptText(SAY_KALECGOS_JOIN, Kalec); DoScriptText(SAY_KALECGOS_JOIN, pKalec);
IsKalecJoined = true; IsKalecJoined = true;
TimerIsDeactiveted[TIMER_KALEC_JOIN] = true; TimerIsDeactiveted[TIMER_KALEC_JOIN] = true;
} }
@@ -613,14 +617,15 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI
case TIMER_LEGION_LIGHTNING: case TIMER_LEGION_LIGHTNING:
if (!m_creature->IsNonMeleeSpellCasted(false)) if (!m_creature->IsNonMeleeSpellCasted(false))
{ {
Unit *RandomPlayer;
m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY); m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY);
for (uint8 z = 0; z < 6; ++z) for (uint8 z = 0; z < 6; ++z)
{ {
randomPlayer = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); RandomPlayer = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (!randomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; if (RandomPlayer && !RandomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
} }
if (randomPlayer) if (RandomPlayer)
DoCast(randomPlayer, SPELL_LEGION_LIGHTNING, false); DoCast(RandomPlayer, SPELL_LEGION_LIGHTNING, false);
else else
error_log("try to cast SPELL_LEGION_LIGHTNING on invalid target"); error_log("try to cast SPELL_LEGION_LIGHTNING on invalid target");
Timer[TIMER_LEGION_LIGHTNING] = (Phase == PHASE_SACRIFICE) ? 18000 : 30000; // 18 seconds in PHASE_SACRIFICE Timer[TIMER_LEGION_LIGHTNING] = (Phase == PHASE_SACRIFICE) ? 18000 : 30000; // 18 seconds in PHASE_SACRIFICE
@@ -686,15 +691,15 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI
} }
break; break;
case TIMER_ORBS_EMPOWER: //Phase 3 case TIMER_ORBS_EMPOWER: //Phase 3
if (Kalec) if (Creature *pKalec = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_KALECGOS_KJ) : 0))
{ {
switch (Phase) switch (Phase)
{ {
case PHASE_SACRIFICE: case PHASE_SACRIFICE:
CAST_AI(boss_kalecgos_kjAI, Kalec->AI())->EmpowerOrb(true); CAST_AI(boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(true);
break; break;
default: default:
CAST_AI(boss_kalecgos_kjAI, Kalec->AI())->EmpowerOrb(false); CAST_AI(boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(false);
break; break;
} }
} }
@@ -707,7 +712,7 @@ struct boss_kiljaedenAI : public Scripted_NoMovementAI
for (uint8 z = 0; z < 6; ++z) for (uint8 z = 0; z < 6; ++z)
{ {
pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (!pTarget->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; if (pTarget && !pTarget->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
} }
if (pTarget) if (pTarget)
{ {
@@ -788,7 +793,6 @@ struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI
} }
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
Creature* KalecKJ;
SummonList Summons; SummonList Summons;
bool SummonedDeceivers; bool SummonedDeceivers;
@@ -800,8 +804,6 @@ struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI
void InitializeAI() void InitializeAI()
{ {
if(pInstance)
KalecKJ = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_KALECGOS_KJ));
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->addUnitState(UNIT_STAT_STUNNED); m_creature->addUnitState(UNIT_STAT_STUNNED);
@@ -812,8 +814,8 @@ struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI
void Reset() void Reset()
{ {
Phase = PHASE_DECEIVERS; Phase = PHASE_DECEIVERS;
if (KalecKJ) if (Creature *pKalecKJ = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_KALECGOS_KJ) : 0))
CAST_AI(boss_kalecgos_kjAI, KalecKJ->AI())->ResetOrbs(); CAST_AI(boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs();
DeceiverDeathCount = 0; DeceiverDeathCount = 0;
SummonedDeceivers = false; SummonedDeceivers = false;
KiljaedenDeath = false; KiljaedenDeath = false;
@@ -374,7 +374,6 @@ struct npc_muru_portalAI : public Scripted_NoMovementAI
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
SummonList Summons; SummonList Summons;
Creature* Muru;
bool SummonSentinel; bool SummonSentinel;
bool InAction; bool InAction;
@@ -224,8 +224,6 @@ struct boss_hex_lord_malacrassAI : public ScriptedAI
uint32 PlayerClass; uint32 PlayerClass;
Unit* SoulDrainTarget;
void Reset() void Reset()
{ {
if (pInstance) if (pInstance)
@@ -77,6 +77,7 @@ struct boss_arlokkAI : public ScriptedAI
uint32 m_uiSummonCount; uint32 m_uiSummonCount;
Unit* m_pMarkedTarget; Unit* m_pMarkedTarget;
uint64 MarkedTargetGUID;
bool m_bIsPhaseTwo; bool m_bIsPhaseTwo;
bool m_bIsVanished; bool m_bIsVanished;
@@ -96,7 +97,7 @@ struct boss_arlokkAI : public ScriptedAI
m_bIsPhaseTwo = false; m_bIsPhaseTwo = false;
m_bIsVanished = false; m_bIsVanished = false;
m_pMarkedTarget = NULL; MarkedTargetGUID = 0;
m_creature->SetDisplayId(MODEL_ID_NORMAL); m_creature->SetDisplayId(MODEL_ID_NORMAL);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -129,8 +130,8 @@ struct boss_arlokkAI : public ScriptedAI
void DoSummonPhanters() void DoSummonPhanters()
{ {
if (m_pMarkedTarget) if (Unit *pMarkedTarget = Unit::GetUnit(*m_creature, MarkedTargetGUID))
DoScriptText(SAY_FEAST_PANTHER, m_creature, m_pMarkedTarget); DoScriptText(SAY_FEAST_PANTHER, m_creature, pMarkedTarget);
m_creature->SummonCreature(NPC_ZULIAN_PROWLER, -11532.7998, -1649.6734, 41.4800, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); m_creature->SummonCreature(NPC_ZULIAN_PROWLER, -11532.7998, -1649.6734, 41.4800, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
m_creature->SummonCreature(NPC_ZULIAN_PROWLER, -11532.9970, -1606.4840, 41.2979, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); m_creature->SummonCreature(NPC_ZULIAN_PROWLER, -11532.9970, -1606.4840, 41.2979, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
@@ -138,8 +139,8 @@ struct boss_arlokkAI : public ScriptedAI
void JustSummoned(Creature* pSummoned) void JustSummoned(Creature* pSummoned)
{ {
if (m_pMarkedTarget) if (Unit *pMarkedTarget = Unit::GetUnit(*m_creature, MarkedTargetGUID))
pSummoned->AI()->AttackStart(m_pMarkedTarget); pSummoned->AI()->AttackStart(pMarkedTarget);
++m_uiSummonCount; ++m_uiSummonCount;
} }
@@ -161,12 +162,15 @@ struct boss_arlokkAI : public ScriptedAI
if (m_uiMark_Timer <= uiDiff) if (m_uiMark_Timer <= uiDiff)
{ {
m_pMarkedTarget = SelectUnit(SELECT_TARGET_RANDOM,0); Unit *pMarkedTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
if (m_pMarkedTarget) if (pMarkedTarget)
DoCast(m_pMarkedTarget, SPELL_MARK); {
DoCast(pMarkedTarget, SPELL_MARK);
MarkedTargetGUID = pMarkedTarget->GetGUID();
}
else else
error_log("TSCR: boss_arlokk could not accuire m_pMarkedTarget."); error_log("TSCR: boss_arlokk could not accuire pMarkedTarget.");
m_uiMark_Timer = 15000; m_uiMark_Timer = 15000;
} }
@@ -34,7 +34,6 @@ struct boss_hazzarahAI : public ScriptedAI
uint32 ManaBurn_Timer; uint32 ManaBurn_Timer;
uint32 Sleep_Timer; uint32 Sleep_Timer;
uint32 Illusions_Timer; uint32 Illusions_Timer;
Creature* Illusion;
void Reset() void Reset()
{ {
@@ -78,7 +77,7 @@ struct boss_hazzarahAI : public ScriptedAI
if (!pTarget) if (!pTarget)
return; return;
Illusion = m_creature->SummonCreature(15163,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000); Creature *Illusion = m_creature->SummonCreature(15163,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000);
if (Illusion) if (Illusion)
Illusion->AI()->AttackStart(pTarget); Illusion->AI()->AttackStart(pTarget);
} }
@@ -55,7 +55,6 @@ struct boss_marliAI : public ScriptedAI
uint32 Transform_Timer; uint32 Transform_Timer;
uint32 TransformBack_Timer; uint32 TransformBack_Timer;
Creature *Spider;
bool Spawned; bool Spawned;
bool PhaseTwo; bool PhaseTwo;
@@ -112,6 +111,8 @@ struct boss_marliAI : public ScriptedAI
if (!pTarget) if (!pTarget)
return; return;
Creature *Spider = NULL;
Spider = m_creature->SummonCreature(15041,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); Spider = m_creature->SummonCreature(15041,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if (Spider) if (Spider)
Spider->AI()->AttackStart(pTarget); Spider->AI()->AttackStart(pTarget);
@@ -134,7 +135,7 @@ struct boss_marliAI : public ScriptedAI
if (!pTarget) if (!pTarget)
return; return;
Spider = m_creature->SummonCreature(15041,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); Creature *Spider = m_creature->SummonCreature(15041,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if (Spider) if (Spider)
Spider->AI()->AttackStart(pTarget); Spider->AI()->AttackStart(pTarget);
SpawnSpider_Timer = 12000 + rand()%5000; SpawnSpider_Timer = 12000 + rand()%5000;
@@ -44,7 +44,6 @@ struct boss_ayamissAI : public ScriptedAI
pInstance = c->GetInstanceData(); pInstance = c->GetInstanceData();
} }
Unit *pTarget;
uint32 STINGERSPRAY_Timer; uint32 STINGERSPRAY_Timer;
uint32 POISONSTINGER_Timer; uint32 POISONSTINGER_Timer;
uint32 SUMMONSWARMER_Timer; uint32 SUMMONSWARMER_Timer;
@@ -54,7 +53,6 @@ struct boss_ayamissAI : public ScriptedAI
void Reset() void Reset()
{ {
pTarget = NULL;
STINGERSPRAY_Timer = 30000; STINGERSPRAY_Timer = 30000;
POISONSTINGER_Timer = 30000; POISONSTINGER_Timer = 30000;
SUMMONSWARMER_Timer = 60000; SUMMONSWARMER_Timer = 60000;
@@ -66,8 +64,6 @@ struct boss_ayamissAI : public ScriptedAI
void EnterCombat(Unit *who) void EnterCombat(Unit *who)
{ {
pTarget = who;
if (pInstance) if (pInstance)
pInstance->SetData(DATA_AYAMISS_EVENT, IN_PROGRESS); pInstance->SetData(DATA_AYAMISS_EVENT, IN_PROGRESS);
} }
@@ -62,8 +62,6 @@ struct boss_skeramAI : public ScriptedAI
uint32 Blink_Timer; uint32 Blink_Timer;
uint32 Invisible_Timer; uint32 Invisible_Timer;
Creature *Image1, *Image2;
bool Images75; bool Images75;
bool Images50; bool Images50;
bool Images25; bool Images25;
@@ -260,7 +258,7 @@ struct boss_skeramAI : public ScriptedAI
Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
Image1 = m_creature->SummonCreature(15263, i1->x, i1->y, i1->z, i1->r, TEMPSUMMON_CORPSE_DESPAWN, 30000); Creature *Image1 = m_creature->SummonCreature(15263, i1->x, i1->y, i1->z, i1->r, TEMPSUMMON_CORPSE_DESPAWN, 30000);
if (Image1) if (Image1)
{ {
Image1->SetMaxHealth(m_creature->GetMaxHealth() / 5); Image1->SetMaxHealth(m_creature->GetMaxHealth() / 5);
@@ -270,7 +268,7 @@ struct boss_skeramAI : public ScriptedAI
CAST_AI(boss_skeramAI, Image1->AI())->IsImage = true; CAST_AI(boss_skeramAI, Image1->AI())->IsImage = true;
} }
Image2 = m_creature->SummonCreature(15263,i2->x, i2->y, i2->z, i2->r, TEMPSUMMON_CORPSE_DESPAWN, 30000); Creature *Image2 = m_creature->SummonCreature(15263,i2->x, i2->y, i2->z, i2->r, TEMPSUMMON_CORPSE_DESPAWN, 30000);
if (Image2) if (Image2)
{ {
Image2->SetMaxHealth(m_creature->GetMaxHealth() / 5); Image2->SetMaxHealth(m_creature->GetMaxHealth() / 5);
@@ -80,24 +80,25 @@ struct aqsentinelAI : public ScriptedAI
abselected = 0; // just initialization of variable abselected = 0; // just initialization of variable
} }
Creature *nearby[3]; uint64 NearbyGUID[3];
void ClearBuddyList() void ClearBuddyList()
{ {
nearby[0] = nearby[1] = nearby[2] = NULL; NearbyGUID[0] = NearbyGUID[1] = NearbyGUID[2] = 0;
} }
void AddBuddyToList(Creature *c) void AddBuddyToList(uint64 CreatureGUID)
{ {
if (c==m_creature) if (CreatureGUID == m_creature->GetGUID())
return; return;
for (int i=0; i<3; ++i) for (int i=0; i<3; ++i)
{ {
if (nearby[i] == c) if (NearbyGUID[i] == CreatureGUID)
return; return;
if (!nearby[i]) if (!NearbyGUID[i])
{ {
nearby[i] = c; NearbyGUID[i] = CreatureGUID;
return; return;
} }
} }
@@ -107,23 +108,23 @@ struct aqsentinelAI : public ScriptedAI
{ {
aqsentinelAI *cai = CAST_AI(aqsentinelAI, (c)->AI()); aqsentinelAI *cai = CAST_AI(aqsentinelAI, (c)->AI());
for (int i=0; i<3; ++i) for (int i=0; i<3; ++i)
if (nearby[i] && nearby[i]!=c) if (NearbyGUID[i] && NearbyGUID[i] != c->GetGUID())
cai->AddBuddyToList(nearby[i]); cai->AddBuddyToList(NearbyGUID[i]);
cai->AddBuddyToList(m_creature); cai->AddBuddyToList(m_creature->GetGUID());
} }
void SendMyListToBuddies() void SendMyListToBuddies()
{ {
for (int i=0; i<3; ++i) for (int i=0; i<3; ++i)
if (nearby[i]) if (Creature *pNearby = Unit::GetCreature(*m_creature, NearbyGUID[i]))
GiveBuddyMyList(nearby[i]); GiveBuddyMyList(pNearby);
} }
void CallBuddiesToAttack(Unit *who) void CallBuddiesToAttack(Unit *who)
{ {
for (int i=0; i<3; ++i) for (int i=0; i<3; ++i)
{ {
Creature *c = nearby[i]; Creature *c = Unit::GetCreature(*m_creature, NearbyGUID[i]);
if (c) if (c)
{ {
if (!c->isInCombat()) if (!c->isInCombat())
@@ -145,7 +146,7 @@ struct aqsentinelAI : public ScriptedAI
return; return;
for (std::list<Creature*>::iterator iter = assistList.begin(); iter != assistList.end(); ++iter) for (std::list<Creature*>::iterator iter = assistList.begin(); iter != assistList.end(); ++iter)
AddBuddyToList((*iter)); AddBuddyToList((*iter)->GetGUID());
} }
int pickAbilityRandom(bool *chosenAbilities) int pickAbilityRandom(bool *chosenAbilities)
@@ -175,11 +176,16 @@ struct aqsentinelAI : public ScriptedAI
int bli; int bli;
for (bli = 0; bli < 3; ++bli) for (bli = 0; bli < 3; ++bli)
{ {
if (!nearby[bli]) if (!NearbyGUID[bli])
break; break;
AddSentinelsNear(nearby[bli]);
CAST_AI(aqsentinelAI, nearby[bli]->AI())->gatherOthersWhenAggro = false; Creature *pNearby = Unit::GetCreature(*m_creature, NearbyGUID[bli]);
CAST_AI(aqsentinelAI, nearby[bli]->AI())->selectAbility(pickAbilityRandom(chosenAbilities)); if(!pNearby)
break;
AddSentinelsNear(pNearby);
CAST_AI(aqsentinelAI, pNearby->AI())->gatherOthersWhenAggro = false;
CAST_AI(aqsentinelAI, pNearby->AI())->selectAbility(pickAbilityRandom(chosenAbilities));
} }
/*if (bli < 3) /*if (bli < 3)
DoYell("I dont have enough buddies.", LANG_NEUTRAL, 0);*/ DoYell("I dont have enough buddies.", LANG_NEUTRAL, 0);*/
@@ -197,10 +203,13 @@ struct aqsentinelAI : public ScriptedAI
{ {
for (int i=0; i<3; ++i) for (int i=0; i<3; ++i)
{ {
if (!nearby[i]) if (!NearbyGUID[i])
continue; continue;
if (nearby[i]->isDead()) if (Creature *pNearby = Unit::GetCreature(*m_creature, NearbyGUID[i]))
nearby[i]->Respawn(); {
if (pNearby->isDead())
pNearby->Respawn();
}
} }
} }
ClearBuddyList(); ClearBuddyList();
@@ -225,7 +234,7 @@ struct aqsentinelAI : public ScriptedAI
{ {
for (int ni=0; ni<3; ++ni) for (int ni=0; ni<3; ++ni)
{ {
Creature *sent = nearby[ni]; Creature *sent = Unit::GetCreature(*m_creature, NearbyGUID[ni]);
if (!sent) if (!sent)
continue; continue;
if (sent->isDead()) if (sent->isDead())
@@ -162,7 +162,7 @@ struct boss_paletressAI : public ScriptedAI
{ {
pInstance = pCreature->GetInstanceData(); pInstance = pCreature->GetInstanceData();
pMemory = NULL; MemoryGUID = 0;
pCreature->SetReactState(REACT_PASSIVE); pCreature->SetReactState(REACT_PASSIVE);
pCreature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE); pCreature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
pCreature->RestoreFaction(); pCreature->RestoreFaction();
@@ -171,6 +171,7 @@ struct boss_paletressAI : public ScriptedAI
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
Creature* pMemory; Creature* pMemory;
uint64 MemoryGUID;
bool bHealth; bool bHealth;
bool bDone; bool bDone;
@@ -193,8 +194,9 @@ struct boss_paletressAI : public ScriptedAI
bHealth = false; bHealth = false;
bDone = false; bDone = false;
if (pMemory && pMemory->isAlive()) if (Creature *pMemory = Unit::GetCreature(*m_creature, MemoryGUID))
pMemory->RemoveFromWorld(); if (pMemory->isAlive())
pMemory->RemoveFromWorld();
} }
void SetData(uint32 uiId, uint32 uiValue) void SetData(uint32 uiId, uint32 uiValue)
@@ -273,8 +275,9 @@ struct boss_paletressAI : public ScriptedAI
DoCast(m_creature,DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H)); DoCast(m_creature,DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H));
break; break;
case 1: case 1:
if (pMemory && pMemory->isAlive()) if (Creature *pMemory = Unit::GetCreature(*m_creature, MemoryGUID))
DoCast(pMemory,DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H)); if (pMemory->isAlive())
DoCast(pMemory, DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H));
break; break;
} }
uiRenewTimer = urand(15000,17000); uiRenewTimer = urand(15000,17000);
@@ -297,7 +300,7 @@ struct boss_paletressAI : public ScriptedAI
void JustSummoned(Creature* pSummon) void JustSummoned(Creature* pSummon)
{ {
pMemory = pSummon; MemoryGUID = pSummon->GetGUID();
} }
}; };
@@ -143,7 +143,7 @@ bool GrandChampionsOutVehicle(Creature* m_creature)
struct generic_vehicleAI_toc5AI : public npc_escortAI struct generic_vehicleAI_toc5AI : public npc_escortAI
{ {
generic_vehicleAI_toc5AI(Creature* pCreature) : npc_escortAI(pCreature), pVehicle(pCreature->GetVehicleKit()) generic_vehicleAI_toc5AI(Creature* pCreature) : npc_escortAI(pCreature)
{ {
SetDespawnAtEnd(false); SetDespawnAtEnd(false);
uiWaypointPath = 0; uiWaypointPath = 0;
@@ -151,8 +151,6 @@ struct generic_vehicleAI_toc5AI : public npc_escortAI
pInstance = pCreature->GetInstanceData(); pInstance = pCreature->GetInstanceData();
} }
Vehicle* pVehicle;
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 uiChargeTimer; uint32 uiChargeTimer;
@@ -261,11 +259,9 @@ struct generic_vehicleAI_toc5AI : public npc_escortAI
//dosen't work at all //dosen't work at all
if (uiShieldBreakerTimer <= uiDiff) if (uiShieldBreakerTimer <= uiDiff)
{ {
Vehicle *pVehicle = m_creature->GetVehicleKit();
if (!pVehicle) if (!pVehicle)
{
pVehicle = m_creature->GetVehicleKit();
return; return;
}
if (Unit* pPassenger = pVehicle->GetPassenger(SEAT_ID_0)) if (Unit* pPassenger = pVehicle->GetPassenger(SEAT_ID_0))
{ {
@@ -141,15 +141,8 @@ struct boss_drakkari_elementalAI : public ScriptedAI
boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature) boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = pCreature->GetInstanceData(); pInstance = pCreature->GetInstanceData();
if(pInstance)
{
if (pCreature->GetMap()->IsDungeon())
pColossus = CAST_CRE(pCreature->GetUnit(*pCreature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS)));
}
} }
Creature* pColossus;
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 uiSurgeTimer; uint32 uiSurgeTimer;
@@ -158,7 +151,7 @@ struct boss_drakkari_elementalAI : public ScriptedAI
void Reset() void Reset()
{ {
if (pColossus) if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(m_creature, true); CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(m_creature, true);
uiSurgeTimer = 7*IN_MILISECONDS; uiSurgeTimer = 7*IN_MILISECONDS;
bGoToColossus = false; bGoToColossus = false;
@@ -173,8 +166,11 @@ struct boss_drakkari_elementalAI : public ScriptedAI
{ {
if (uiType != POINT_MOTION_TYPE) if (uiType != POINT_MOTION_TYPE)
return; return;
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true); if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false; {
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true);
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false;
}
m_creature->RemoveFromWorld(); m_creature->RemoveFromWorld();
} }
@@ -184,12 +180,17 @@ struct boss_drakkari_elementalAI : public ScriptedAI
if(!UpdateVictim()) if(!UpdateVictim())
return; return;
if(!bGoToColossus && HealthBelowPct(50) && !CAST_AI(boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6)) if(!bGoToColossus && HealthBelowPct(50))
{ {
m_creature->InterruptNonMeleeSpells(true); if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
if (pColossus) {
DoCast(pColossus, SPELL_MERGE); if (!CAST_AI(boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6))
bGoToColossus = true; {
m_creature->InterruptNonMeleeSpells(true);
DoCast(pColossus, SPELL_MERGE);
bGoToColossus = true;
}
}
} }
if (uiSurgeTimer <= diff) if (uiSurgeTimer <= diff)
@@ -203,9 +204,8 @@ struct boss_drakkari_elementalAI : public ScriptedAI
void JustDied(Unit* killer) void JustDied(Unit* killer)
{ {
if (!pColossus) if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
return; pColossus->Kill(pColossus);
pColossus->Kill(pColossus);
} }
}; };
@@ -216,8 +216,6 @@ struct npc_living_mojoAI : public ScriptedAI
pInstance = pCreature->GetInstanceData(); pInstance = pCreature->GetInstanceData();
} }
Creature* pColossus;
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 uiMojoWaveTimer; uint32 uiMojoWaveTimer;
@@ -231,28 +229,32 @@ struct npc_living_mojoAI : public ScriptedAI
void EnterCombat(Unit* who) void EnterCombat(Unit* who)
{ {
if (pInstance)
pColossus = m_creature->GetCreature(*m_creature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS));
//Check if the npc is near of Drakkari Colossus. //Check if the npc is near of Drakkari Colossus.
if (pColossus && pColossus->isAlive() && m_creature->IsInRange3d(pColossus->GetHomePosition().GetPositionX(),pColossus->GetHomePosition().GetPositionY(),pColossus->GetHomePosition().GetPositionZ(),0.0f,17.0f)) if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
m_creature->SetReactState(REACT_PASSIVE); {
else if (pColossus->isAlive() && m_creature->IsInRange3d(pColossus->GetHomePosition().GetPositionX(),pColossus->GetHomePosition().GetPositionY(),pColossus->GetHomePosition().GetPositionZ(),0.0f,17.0f))
m_creature->SetReactState(REACT_AGGRESSIVE); m_creature->SetReactState(REACT_PASSIVE);
else
m_creature->SetReactState(REACT_AGGRESSIVE);
}
} }
void DamageTaken(Unit* pDone_by, uint32& uiDamage) void DamageTaken(Unit* pDone_by, uint32& uiDamage)
{ {
if (m_creature->HasReactState(REACT_PASSIVE)) if (m_creature->HasReactState(REACT_PASSIVE))
{ {
if (pColossus && pColossus->isAlive() && !pColossus->isInCombat()) if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
{ {
pColossus->RemoveAura(SPELL_FREEZE_ANIM); if (pColossus->isAlive() && !pColossus->isInCombat())
pColossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); {
pColossus->SetReactState(REACT_AGGRESSIVE); pColossus->RemoveAura(SPELL_FREEZE_ANIM);
if (pDone_by && pDone_by->isAlive()) pColossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
pColossus->AI()->AttackStart(pDone_by); pColossus->SetReactState(REACT_AGGRESSIVE);
EnterEvadeMode(); if (pDone_by && pDone_by->isAlive())
pColossus->AI()->AttackStart(pDone_by);
EnterEvadeMode();
}
} }
} }
} }
+45 -18
View File
@@ -153,10 +153,14 @@ struct boss_gothikAI : public BossAI
bool phaseTwo; bool phaseTwo;
bool thirtyPercentReached; bool thirtyPercentReached;
std::vector<uint64> LiveTriggerGUID;
std::vector<uint64> DeadTriggerGUID;
void Reset() void Reset()
{ {
liveTrigger.clear(); LiveTriggerGUID.clear();
deadTrigger.clear(); DeadTriggerGUID.clear();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
if (instance) if (instance)
@@ -171,12 +175,12 @@ struct boss_gothikAI : public BossAI
{ {
for (uint32 i = 0; i < POS_LIVE; ++i) for (uint32 i = 0; i < POS_LIVE; ++i)
if (Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonLive[i])) if (Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonLive[i]))
liveTrigger.push_back(trigger); LiveTriggerGUID.push_back(trigger->GetGUID());
for (uint32 i = 0; i < POS_DEAD; ++i) for (uint32 i = 0; i < POS_DEAD; ++i)
if (Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonDead[i])) if (Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonDead[i]))
deadTrigger.push_back(trigger); DeadTriggerGUID.push_back(trigger->GetGUID());
if (liveTrigger.size() < POS_LIVE || deadTrigger.size() < POS_DEAD) if (LiveTriggerGUID.size() < POS_LIVE || DeadTriggerGUID.size() < POS_DEAD)
{ {
error_log("Script Gothik: cannot summon triggers!"); error_log("Script Gothik: cannot summon triggers!");
EnterEvadeMode(); EnterEvadeMode();
@@ -223,8 +227,8 @@ struct boss_gothikAI : public BossAI
void JustDied(Unit* Killer) void JustDied(Unit* Killer)
{ {
liveTrigger.clear(); LiveTriggerGUID.clear();
deadTrigger.clear(); DeadTriggerGUID.clear();
_JustDied(); _JustDied();
DoScriptText(SAY_DEATH, me); DoScriptText(SAY_DEATH, me);
if (instance) if (instance)
@@ -238,17 +242,29 @@ struct boss_gothikAI : public BossAI
switch(entry) switch(entry)
{ {
case MOB_LIVE_TRAINEE: case MOB_LIVE_TRAINEE:
DoSummon(MOB_LIVE_TRAINEE, liveTrigger[0], 1); {
DoSummon(MOB_LIVE_TRAINEE, liveTrigger[1], 1); if (Creature *LiveTrigger0 = Unit::GetCreature(*m_creature, LiveTriggerGUID[0]))
DoSummon(MOB_LIVE_TRAINEE, liveTrigger[2], 1); DoSummon(MOB_LIVE_TRAINEE, LiveTrigger0, 1);
if (Creature *LiveTrigger1 = Unit::GetCreature(*m_creature, LiveTriggerGUID[1]))
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger1, 1);
if (Creature *LiveTrigger2 = Unit::GetCreature(*m_creature, LiveTriggerGUID[2]))
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger2, 1);
break; break;
}
case MOB_LIVE_KNIGHT: case MOB_LIVE_KNIGHT:
DoSummon(MOB_LIVE_KNIGHT, liveTrigger[3], 1); {
DoSummon(MOB_LIVE_KNIGHT, liveTrigger[5], 1); if (Creature *LiveTrigger3 = Unit::GetCreature(*m_creature, LiveTriggerGUID[3]))
DoSummon(MOB_LIVE_KNIGHT, LiveTrigger3, 1);
if (Creature *LiveTrigger5 = Unit::GetCreature(*m_creature, LiveTriggerGUID[5]))
DoSummon(MOB_LIVE_KNIGHT, LiveTrigger5, 1);
break; break;
}
case MOB_LIVE_RIDER: case MOB_LIVE_RIDER:
DoSummon(MOB_LIVE_RIDER, liveTrigger[4], 1); {
if (Creature *LiveTrigger4 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4]))
DoSummon(MOB_LIVE_RIDER, LiveTrigger4, 1);
break; break;
}
} }
} }
else else
@@ -256,15 +272,25 @@ struct boss_gothikAI : public BossAI
switch(entry) switch(entry)
{ {
case MOB_LIVE_TRAINEE: case MOB_LIVE_TRAINEE:
DoSummon(MOB_LIVE_TRAINEE, liveTrigger[0], 1); {
DoSummon(MOB_LIVE_TRAINEE, liveTrigger[1], 1); if (Creature *LiveTrigger0 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4]))
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger0, 1);
if (Creature *LiveTrigger1 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4]))
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger1, 1);
break; break;
}
case MOB_LIVE_KNIGHT: case MOB_LIVE_KNIGHT:
DoSummon(MOB_LIVE_KNIGHT, liveTrigger[5], 1); {
if (Creature *LiveTrigger5 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4]))
DoSummon(MOB_LIVE_KNIGHT, LiveTrigger5, 1);
break; break;
}
case MOB_LIVE_RIDER: case MOB_LIVE_RIDER:
DoSummon(MOB_LIVE_RIDER, liveTrigger[4], 1); {
if (Creature *LiveTrigger4 = Unit::GetCreature(*m_creature, LiveTriggerGUID[4]))
DoSummon(MOB_LIVE_RIDER, LiveTrigger4, 1);
break; break;
}
} }
} }
} }
@@ -320,7 +346,8 @@ struct boss_gothikAI : public BossAI
if (spellId && me->isInCombat()) if (spellId && me->isInCombat())
{ {
me->HandleEmoteCommand(EMOTE_ONESHOT_SPELLCAST); me->HandleEmoteCommand(EMOTE_ONESHOT_SPELLCAST);
me->CastSpell(deadTrigger[rand()%POS_DEAD], spellId, true); if (Creature *pRandomDeadTrigger = Unit::GetCreature(*m_creature, DeadTriggerGUID[rand() % POS_DEAD]))
me->CastSpell(pRandomDeadTrigger, spellId, true);
} }
} }
@@ -267,14 +267,18 @@ struct boss_kelthuzadAI : public BossAI
std::map<uint64, float> chained; std::map<uint64, float> chained;
GameObject* pPortals[4]; uint64 PortalsGUID[4];
GameObject* pKTTrigger; uint64 KTTriggerGUID;
SummonList spawns; // adds spawn by the trigger. kept in separated list (i.e. not in summons) SummonList spawns; // adds spawn by the trigger. kept in separated list (i.e. not in summons)
void Reset() void Reset()
{ {
_Reset(); _Reset();
PortalsGUID[0] = PortalsGUID[1] = PortalsGUID[2] = PortalsGUID[3] = 0;
KTTriggerGUID = 0;
me->setFaction(35); me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
std::map<uint64, float>::iterator itr; std::map<uint64, float>::iterator itr;
@@ -289,7 +293,7 @@ struct boss_kelthuzadAI : public BossAI
FindGameObjects(); FindGameObjects();
if (pKTTrigger) if (GameObject *pKTTrigger = m_creature->GetMap()->GetGameObject(KTTriggerGUID))
{ {
pKTTrigger->ResetDoorOrButton(); pKTTrigger->ResetDoorOrButton();
pKTTrigger->SetPhaseMask(1, true); pKTTrigger->SetPhaseMask(1, true);
@@ -297,10 +301,10 @@ struct boss_kelthuzadAI : public BossAI
for (uint8 i = 0; i <= 3; ++i) for (uint8 i = 0; i <= 3; ++i)
{ {
if (pPortals[i]) if (GameObject *pPortal = m_creature->GetMap()->GetGameObject(PortalsGUID[i]))
{ {
if (!((pPortals[i]->getLootState() == GO_READY) || (pPortals[i]->getLootState() == GO_NOT_READY))) if (!((pPortal->getLootState() == GO_READY) || (pPortal->getLootState() == GO_NOT_READY)))
pPortals[i]->ResetDoorOrButton(); pPortal->ResetDoorOrButton();
} }
} }
@@ -339,8 +343,8 @@ struct boss_kelthuzadAI : public BossAI
FindGameObjects(); FindGameObjects();
for (uint8 i = 0; i <= 3; ++i) for (uint8 i = 0; i <= 3; ++i)
{ {
if (pPortals[i]) if (GameObject *pPortal = m_creature->GetMap()->GetGameObject(PortalsGUID[i]))
pPortals[i]->ResetDoorOrButton(); pPortal->ResetDoorOrButton();
} }
DoCast(me, SPELL_KELTHUZAD_CHANNEL, false); DoCast(me, SPELL_KELTHUZAD_CHANNEL, false);
DoScriptText(SAY_SUMMON_MINIONS, me); DoScriptText(SAY_SUMMON_MINIONS, me);
@@ -357,11 +361,11 @@ struct boss_kelthuzadAI : public BossAI
void FindGameObjects() void FindGameObjects()
{ {
pPortals[0] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL01)) : NULL; PortalsGUID[0] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL01) : 0;
pPortals[1] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL02)) : NULL; PortalsGUID[1] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL02) : 0;
pPortals[2] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL03)) : NULL; PortalsGUID[2] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL03) : 0;
pPortals[3] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL04)) : NULL; PortalsGUID[3] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL04) : 0;
pKTTrigger = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_TRIGGER)) : NULL; KTTriggerGUID = instance ? instance->GetData64(DATA_KELTHUZAD_TRIGGER) : 0;
} }
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
@@ -402,7 +406,7 @@ struct boss_kelthuzadAI : public BossAI
events.PopEvent(); events.PopEvent();
break; break;
case EVENT_TRIGGER: case EVENT_TRIGGER:
if (pKTTrigger) if (GameObject *pKTTrigger = m_creature->GetMap()->GetGameObject(KTTriggerGUID))
pKTTrigger->SetPhaseMask(2, true); pKTTrigger->SetPhaseMask(2, true);
events.PopEvent(); events.PopEvent();
break; break;
@@ -444,8 +448,11 @@ struct boss_kelthuzadAI : public BossAI
for (uint8 i = 0; i <= 3; ++i) for (uint8 i = 0; i <= 3; ++i)
{ {
if (pPortals[i] && (pPortals[i]->getLootState() == GO_READY)) if (GameObject *pPortal = m_creature->GetMap()->GetGameObject(PortalsGUID[i]))
pPortals[i]->UseDoorOrButton(); {
if (pPortal->getLootState() == GO_READY)
pPortal->UseDoorOrButton();
}
} }
} }
} }
@@ -104,16 +104,16 @@ inline uint32 GetEruptionSection(float x, float y)
struct instance_naxxramas : public InstanceData struct instance_naxxramas : public InstanceData
{ {
instance_naxxramas(Map* pMap) : InstanceData(pMap) instance_naxxramas(Map* pMap) : InstanceData(pMap)
, Sapphiron(NULL), pGothikGate(NULL), HorsemenChest(NULL)
{ {
SetBossNumber(MAX_BOSS_NUMBER); SetBossNumber(MAX_BOSS_NUMBER);
LoadDoorData(doorData); LoadDoorData(doorData);
LoadMinionData(minionData); LoadMinionData(minionData);
} }
std::set<GameObject*> HeiganEruption[4]; std::set<uint64> HeiganEruptionGUID[4];
GameObject* pGothikGate, *HorsemenChest; uint64 GothikGateGUID;
Creature* Sapphiron; uint64 HorsemenChestGUID;
uint64 SapphironGUID;
uint64 uiFaerlina; uint64 uiFaerlina;
uint64 uiThane; uint64 uiThane;
uint64 uiLady; uint64 uiLady;
@@ -135,7 +135,7 @@ struct instance_naxxramas : public InstanceData
{ {
switch(pCreature->GetEntry()) switch(pCreature->GetEntry())
{ {
case 15989: Sapphiron = add ? pCreature : NULL; return; case 15989: SapphironGUID = add ? pCreature->GetGUID() : 0; return;
case 15953: uiFaerlina = pCreature->GetGUID(); return; case 15953: uiFaerlina = pCreature->GetGUID(); return;
case 16064: uiThane = pCreature->GetGUID(); return; case 16064: uiThane = pCreature->GetGUID(); return;
case 16065: uiLady = pCreature->GetGUID(); return; case 16065: uiLady = pCreature->GetGUID(); return;
@@ -156,18 +156,24 @@ struct instance_naxxramas : public InstanceData
{ {
uint32 section = GetEruptionSection(pGo->GetPositionX(), pGo->GetPositionY()); uint32 section = GetEruptionSection(pGo->GetPositionX(), pGo->GetPositionY());
if (add) if (add)
HeiganEruption[section].insert(pGo); HeiganEruptionGUID[section].insert(pGo->GetGUID());
else else
HeiganEruption[section].erase(pGo); HeiganEruptionGUID[section].erase(pGo->GetGUID());
return; return;
} }
switch(pGo->GetEntry()) switch(pGo->GetEntry())
{ {
case GO_BIRTH: if (!add && Sapphiron) Sapphiron->AI()->DoAction(DATA_SAPPHIRON_BIRTH); return; case GO_BIRTH:
case GO_GOTHIK_GATE: pGothikGate = add ? pGo : NULL; break; if (!add && SapphironGUID)
case GO_HORSEMEN_CHEST: HorsemenChest = add ? pGo : NULL; break; {
case GO_HORSEMEN_CHEST_HERO: HorsemenChest = add ? pGo : NULL; break; if (Creature *pSapphiron = instance->GetCreature(SapphironGUID))
pSapphiron->AI()->DoAction(DATA_SAPPHIRON_BIRTH);
return;
}
case GO_GOTHIK_GATE: GothikGateGUID = add ? pGo->GetGUID() : 0; break;
case GO_HORSEMEN_CHEST: HorsemenChestGUID = add ? pGo->GetGUID() : 0; break;
case GO_HORSEMEN_CHEST_HERO: HorsemenChestGUID = add ? pGo->GetGUID() : 0; break;
case GO_KELTHUZAD_PORTAL01: uiPortals[0] = pGo->GetGUID(); break; case GO_KELTHUZAD_PORTAL01: uiPortals[0] = pGo->GetGUID(); break;
case GO_KELTHUZAD_PORTAL02: uiPortals[1] = pGo->GetGUID(); break; case GO_KELTHUZAD_PORTAL02: uiPortals[1] = pGo->GetGUID(); break;
case GO_KELTHUZAD_PORTAL03: uiPortals[2] = pGo->GetGUID(); break; case GO_KELTHUZAD_PORTAL03: uiPortals[2] = pGo->GetGUID(); break;
@@ -186,7 +192,7 @@ struct instance_naxxramas : public InstanceData
HeiganErupt(value); HeiganErupt(value);
break; break;
case DATA_GOTHIK_GATE: case DATA_GOTHIK_GATE:
if (pGothikGate) if (GameObject *pGothikGate = instance->GetGameObject(GothikGateGUID))
pGothikGate->SetGoState(GOState(value)); pGothikGate->SetGoState(GOState(value));
break; break;
@@ -253,8 +259,11 @@ struct instance_naxxramas : public InstanceData
if (!InstanceData::SetBossState(id, state)) if (!InstanceData::SetBossState(id, state))
return false; return false;
if (id == BOSS_HORSEMEN && state == DONE && HorsemenChest) if (id == BOSS_HORSEMEN && state == DONE)
HorsemenChest->SetRespawnTime(HorsemenChest->GetRespawnDelay()); {
if (GameObject *pHorsemenChest = instance->GetGameObject(HorsemenChestGUID))
pHorsemenChest->SetRespawnTime(pHorsemenChest->GetRespawnDelay());
}
return true; return true;
} }
@@ -266,10 +275,13 @@ struct instance_naxxramas : public InstanceData
if (i == section) if (i == section)
continue; continue;
for (std::set<GameObject*>::iterator itr = HeiganEruption[i].begin(); itr != HeiganEruption[i].end(); ++itr) for (std::set<uint64>::const_iterator itr = HeiganEruptionGUID[i].begin(); itr != HeiganEruptionGUID[i].end(); ++itr)
{ {
(*itr)->SendCustomAnim(); if (GameObject *pHeiganEruption = instance->GetGameObject(*itr))
(*itr)->CastSpell(NULL, SPELL_ERUPTION); {
pHeiganEruption->SendCustomAnim();
pHeiganEruption->CastSpell(NULL, SPELL_ERUPTION);
}
} }
} }
} }
@@ -133,7 +133,7 @@ struct mob_tribuna_controllerAI : public ScriptedAI
bool bMarnakActivated; bool bMarnakActivated;
bool bAbedneumActivated; bool bAbedneumActivated;
std::list<Creature*> lKaddrakGUIDList; std::list<uint64> KaddrakGUIDList;
void Reset() void Reset()
{ {
@@ -153,7 +153,7 @@ struct mob_tribuna_controllerAI : public ScriptedAI
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_SKY_FLOOR),false); pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_SKY_FLOOR),false);
} }
lKaddrakGUIDList.clear(); KaddrakGUIDList.clear();
} }
void UpdateFacesList() void UpdateFacesList()
@@ -189,10 +189,15 @@ struct mob_tribuna_controllerAI : public ScriptedAI
if (uiKaddrakEncounterTimer <= diff) if (uiKaddrakEncounterTimer <= diff)
{ {
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
if (!lKaddrakGUIDList.empty()) if (!KaddrakGUIDList.empty())
for (std::list<Creature*>::iterator itr = lKaddrakGUIDList.begin(); itr != lKaddrakGUIDList.end(); ++itr) for (std::list<uint64>::const_iterator itr = KaddrakGUIDList.begin(); itr != KaddrakGUIDList.end(); ++itr)
if ((*itr)->isAlive()) {
(*itr)->CastSpell(pTarget, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, H_SPELL_GLARE_OF_THE_TRIBUNAL), true); if (Creature *pKaddrak = Unit::GetCreature(*m_creature, *itr))
{
if (pKaddrak->isAlive())
pKaddrak->CastSpell(pTarget, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, H_SPELL_GLARE_OF_THE_TRIBUNAL), true);
}
}
uiKaddrakEncounterTimer = 1500; uiKaddrakEncounterTimer = 1500;
} else uiKaddrakEncounterTimer -= diff; } else uiKaddrakEncounterTimer -= diff;
} }
@@ -89,6 +89,7 @@ struct boss_svalaAI : public ScriptedAI
IntroPhase Phase; IntroPhase Phase;
TempSummon* pArthas; TempSummon* pArthas;
uint64 ArthasGUID;
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
@@ -97,7 +98,7 @@ struct boss_svalaAI : public ScriptedAI
Phase = IDLE; Phase = IDLE;
uiIntroTimer = 1000; uiIntroTimer = 1000;
uiIntroPhase = 0; uiIntroPhase = 0;
pArthas = NULL; ArthasGUID = 0;
if (pInstance) if (pInstance)
pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED); pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED);
@@ -113,10 +114,11 @@ struct boss_svalaAI : public ScriptedAI
Phase = INTRO; Phase = INTRO;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (pArthas = m_creature->SummonCreature(CREATURE_ARTHAS, 295.81, -366.16, 92.57, 1.58, TEMPSUMMON_MANUAL_DESPAWN)) if (Creature *pArthas = m_creature->SummonCreature(CREATURE_ARTHAS, 295.81, -366.16, 92.57, 1.58, TEMPSUMMON_MANUAL_DESPAWN))
{ {
pArthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); pArthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
pArthas->SetFloatValue(OBJECT_FIELD_SCALE_X, 5); pArthas->SetFloatValue(OBJECT_FIELD_SCALE_X, 5);
ArthasGUID = pArthas->GetGUID();
} }
} }
} }
@@ -130,6 +132,7 @@ struct boss_svalaAI : public ScriptedAI
if (uiIntroTimer <= diff) if (uiIntroTimer <= diff)
{ {
Creature *pArthas = Unit::GetCreature(*m_creature, ArthasGUID);
if (!pArthas) if (!pArthas)
return; return;
@@ -171,8 +174,8 @@ struct boss_svalaAI : public ScriptedAI
{ {
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetDisplayId(DATA_SVALA_DISPLAY_ID); m_creature->SetDisplayId(DATA_SVALA_DISPLAY_ID);
pArthas->UnSummon(); ((TempSummon*)pArthas)->UnSummon(); // TODO: should need a ToTempSummon()
pArthas = NULL; ArthasGUID = 0;
Phase = FINISHED; Phase = FINISHED;
} }
else else
@@ -158,17 +158,12 @@ struct mob_tempest_minionAI : public ScriptedAI
mob_tempest_minionAI(Creature *c) : ScriptedAI(c) mob_tempest_minionAI(Creature *c) : ScriptedAI(c)
{ {
pInstance = c->GetInstanceData(); pInstance = c->GetInstanceData();
uiEmalonGUID = pInstance ? pInstance->GetData64(DATA_EMALON) : 0;
pEmalon = Unit::GetCreature(*m_creature, uiEmalonGUID);
} }
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
EventMap events; EventMap events;
uint64 uiEmalonGUID;
Creature* pEmalon;
uint32 uiOverchargedTimer; uint32 uiOverchargedTimer;
void Reset() void Reset()
@@ -180,10 +175,13 @@ struct mob_tempest_minionAI : public ScriptedAI
void JustDied(Unit* Killer) void JustDied(Unit* Killer)
{ {
if (pEmalon && pEmalon->isAlive()) if(Creature *pEmalon = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EMALON) : 0))
{ {
pEmalon->SummonCreature(MOB_TEMPEST_MINION, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); if (pEmalon->isAlive())
DoScriptText(EMOTE_MINION_RESPAWN, m_creature); {
pEmalon->SummonCreature(MOB_TEMPEST_MINION, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
DoScriptText(EMOTE_MINION_RESPAWN, m_creature);
}
} }
} }
@@ -192,8 +190,11 @@ struct mob_tempest_minionAI : public ScriptedAI
DoZoneInCombat(); DoZoneInCombat();
events.ScheduleEvent(EVENT_SHOCK, 20000); events.ScheduleEvent(EVENT_SHOCK, 20000);
if (pEmalon && !pEmalon->getVictim() && pEmalon->AI()) if(Creature *pEmalon = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EMALON) : 0))
pEmalon->AI()->AttackStart(who); {
if (!pEmalon->getVictim() && pEmalon->AI())
pEmalon->AI()->AttackStart(who);
}
} }
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
@@ -50,9 +50,6 @@ struct boss_erekemAI : public ScriptedAI
uint32 uiLightningBoltTimer; uint32 uiLightningBoltTimer;
uint32 uiEarthShieldTimer; uint32 uiEarthShieldTimer;
Creature* pGuard1;
Creature* pGuard2;
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
void Reset() void Reset()
@@ -70,13 +67,16 @@ struct boss_erekemAI : public ScriptedAI
pInstance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); pInstance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED);
} }
pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1)); if (Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0))
if (pGuard1 && !pGuard1->isAlive()) {
pGuard1->Respawn(); if (!pGuard1->isAlive())
pGuard1->Respawn();
pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2)); }
if (pGuard2 && !pGuard2->isAlive()) if (Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0))
pGuard2->Respawn(); {
if (!pGuard2->isAlive())
pGuard2->Respawn();
}
} }
void AttackStart(Unit* pWho) void AttackStart(Unit* pWho)
@@ -91,21 +91,17 @@ struct boss_erekemAI : public ScriptedAI
pWho->SetInCombatWith(m_creature); pWho->SetInCombatWith(m_creature);
DoStartMovement(pWho); DoStartMovement(pWho);
if (pInstance) if (Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0))
{ {
if (pGuard1) pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE);
{ if (!pGuard1->getVictim() && pGuard1->AI())
pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE); pGuard1->AI()->AttackStart(pWho);
if (!pGuard1->getVictim() && pGuard1->AI()) }
pGuard1->AI()->AttackStart(pWho); if (Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0))
} {
pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE);
if (pGuard2) if (!pGuard2->getVictim() && pGuard2->AI())
{ pGuard2->AI()->AttackStart(pWho);
pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE);
if (!pGuard2->getVictim() && pGuard2->AI())
pGuard2->AI()->AttackStart(pWho);
}
} }
} }
} }
@@ -123,8 +119,6 @@ struct boss_erekemAI : public ScriptedAI
EnterEvadeMode(); EnterEvadeMode();
return; return;
} }
pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1));
pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2));
if (pInstance->GetData(DATA_WAVE_COUNT) == 6) if (pInstance->GetData(DATA_WAVE_COUNT) == 6)
pInstance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); pInstance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS);
@@ -144,9 +138,13 @@ struct boss_erekemAI : public ScriptedAI
//spam stormstrike in hc mode if spawns are dead //spam stormstrike in hc mode if spawns are dead
if (IsHeroic()) if (IsHeroic())
{ {
if (pGuard1 && !pGuard1->isAlive() && pGuard2 && !pGuard2->isAlive()) if (Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0))
{ {
DoCast(m_creature->getVictim(), SPELL_STORMSTRIKE); if (Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0))
{
if (!pGuard1->isAlive() && !pGuard2->isAlive())
DoCast(m_creature->getVictim(), SPELL_STORMSTRIKE);
}
} }
} }
@@ -158,10 +156,14 @@ struct boss_erekemAI : public ScriptedAI
if (uiChainHealTimer <= diff) if (uiChainHealTimer <= diff)
{ {
if (Creature *pTarget = GetChainHealTarget()) if (uint64 TargetGUID = GetChainHealTargetGUID())
{ {
DoCast(pTarget, DUNGEON_MODE(SPELL_CHAIN_HEAL, H_SPELL_CHAIN_HEAL)); if(Creature *pTarget = Unit::GetCreature(*m_creature, TargetGUID))
DoCast(pTarget, DUNGEON_MODE(SPELL_CHAIN_HEAL, H_SPELL_CHAIN_HEAL));
//If one of the adds is dead spawn heals faster //If one of the adds is dead spawn heals faster
Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0);
Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0);
uiChainHealTimer = ((pGuard1 && !pGuard1->isAlive()) || (pGuard2 && !pGuard2->isAlive()) ? 3000 : 8000) + rand()%3000; uiChainHealTimer = ((pGuard1 && !pGuard1->isAlive()) || (pGuard2 && !pGuard2->isAlive()) ? 3000 : 8000) + rand()%3000;
} }
} else uiChainHealTimer -= diff; } else uiChainHealTimer -= diff;
@@ -214,15 +216,20 @@ struct boss_erekemAI : public ScriptedAI
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), m_creature); DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), m_creature);
} }
Creature* GetChainHealTarget() uint64 GetChainHealTargetGUID()
{ {
if (HealthBelowPct(85)) if (HealthBelowPct(85))
return m_creature; return m_creature->GetGUID();
Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0);
if (pGuard1 && pGuard1->isAlive() && (pGuard1->GetHealth()*100 <= pGuard1->GetMaxHealth() * 75)) if (pGuard1 && pGuard1->isAlive() && (pGuard1->GetHealth()*100 <= pGuard1->GetMaxHealth() * 75))
return pGuard1; return pGuard1->GetGUID();
Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0);
if (pGuard2 && pGuard2->isAlive() && (pGuard2->GetHealth()*100 <= pGuard2->GetMaxHealth() * 75)) if (pGuard2 && pGuard2->isAlive() && (pGuard2->GetHealth()*100 <= pGuard2->GetMaxHealth() * 75))
return pGuard2; return pGuard2->GetGUID();
return NULL;
return 0;
} }
}; };
@@ -44,8 +44,6 @@ struct npc_sinclariAI : public ScriptedAI
uint8 uiPhase; uint8 uiPhase;
uint32 uiTimer; uint32 uiTimer;
std::list<Creature*> GuardList;
void Reset() void Reset()
{ {
uiPhase = 0; uiPhase = 0;
@@ -54,9 +52,11 @@ struct npc_sinclariAI : public ScriptedAI
m_creature->SetVisibility(VISIBILITY_ON); m_creature->SetVisibility(VISIBILITY_ON);
m_creature->SetReactState(REACT_AGGRESSIVE); m_creature->SetReactState(REACT_AGGRESSIVE);
std::list<Creature*> GuardList;
m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f);
if (!GuardList.empty()) if (!GuardList.empty())
for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) {
for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr)
{ {
if (Creature* pGuard = *itr) if (Creature* pGuard = *itr)
{ {
@@ -66,6 +66,7 @@ struct npc_sinclariAI : public ScriptedAI
pGuard->SetReactState(REACT_AGGRESSIVE); pGuard->SetReactState(REACT_AGGRESSIVE);
} }
} }
}
} }
void MovementInform(uint32 uiType, uint32 uiId) void MovementInform(uint32 uiType, uint32 uiId)
@@ -100,6 +101,8 @@ struct npc_sinclariAI : public ScriptedAI
uiPhase = 2; uiPhase = 2;
break; break;
case 2: case 2:
{
std::list<Creature*> GuardList;
m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f);
if (!GuardList.empty()) if (!GuardList.empty())
for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr)
@@ -113,7 +116,10 @@ struct npc_sinclariAI : public ScriptedAI
uiTimer = 6000; uiTimer = 6000;
uiPhase = 3; uiPhase = 3;
break; break;
}
case 3: case 3:
{
std::list<Creature*> GuardList;
m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f);
if (!GuardList.empty()) if (!GuardList.empty())
for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr)
@@ -127,6 +133,7 @@ struct npc_sinclariAI : public ScriptedAI
uiTimer = 2000; uiTimer = 2000;
uiPhase = 4; uiPhase = 4;
break; break;
}
case 4: case 4:
m_creature->GetMotionMaster()->MovePoint(0, MovePosition); m_creature->GetMotionMaster()->MovePoint(0, MovePosition);
uiTimer = 0; uiTimer = 0;
@@ -49,7 +49,7 @@ struct boss_shirrak_the_dead_watcherAI : public ScriptedAI
uint32 Carnivorousbite_Timer; uint32 Carnivorousbite_Timer;
uint32 FocusFire_Timer; uint32 FocusFire_Timer;
Unit *focusedTarget; uint64 FocusedTargetGUID;
void Reset() void Reset()
{ {
@@ -57,7 +57,7 @@ struct boss_shirrak_the_dead_watcherAI : public ScriptedAI
Attractmagic_Timer = 28000; Attractmagic_Timer = 28000;
Carnivorousbite_Timer = 10000; Carnivorousbite_Timer = 10000;
FocusFire_Timer = 17000; FocusFire_Timer = 17000;
focusedTarget = NULL; FocusedTargetGUID = 0;
} }
void EnterCombat(Unit *who) void EnterCombat(Unit *who)
@@ -72,8 +72,8 @@ struct boss_shirrak_the_dead_watcherAI : public ScriptedAI
summoned->SetLevel(m_creature->getLevel()); summoned->SetLevel(m_creature->getLevel());
summoned->addUnitState(UNIT_STAT_ROOT); summoned->addUnitState(UNIT_STAT_ROOT);
if (focusedTarget) if (Unit *pFocusedTarget = Unit::GetUnit(*m_creature, FocusedTargetGUID))
summoned->AI()->AttackStart(focusedTarget); summoned->AI()->AttackStart(pFocusedTarget);
} }
} }
@@ -127,7 +127,7 @@ struct boss_shirrak_the_dead_watcherAI : public ScriptedAI
Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1); Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER && pTarget->isAlive()) if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER && pTarget->isAlive())
{ {
focusedTarget = pTarget; FocusedTargetGUID = pTarget->GetGUID();
m_creature->SummonCreature(ENTRY_FOCUS_FIRE,pTarget->GetPositionX(),pTarget->GetPositionY(),pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,5500); m_creature->SummonCreature(ENTRY_FOCUS_FIRE,pTarget->GetPositionX(),pTarget->GetPositionY(),pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,5500);
// TODO: Find better way to handle emote // TODO: Find better way to handle emote
@@ -66,13 +66,13 @@ struct mob_voidtravelerAI : public ScriptedAI
{ {
} }
Unit *Vorpil; uint64 VorpilGUID;
uint32 move; uint32 move;
bool sacrificed; bool sacrificed;
void Reset() void Reset()
{ {
Vorpil = NULL; VorpilGUID = 0;
move = 0; move = 0;
sacrificed = false; sacrificed = false;
} }
@@ -81,13 +81,20 @@ struct mob_voidtravelerAI : public ScriptedAI
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
{ {
if (!Vorpil) if (!VorpilGUID)
{ {
m_creature->Kill(m_creature); m_creature->Kill(m_creature);
return; return;
} }
if (move <= diff) if (move <= diff)
{ {
Creature *Vorpil = Unit::GetCreature(*m_creature, VorpilGUID);
if(!Vorpil)
{
VorpilGUID = 0;
return;
}
if (sacrificed) if (sacrificed)
{ {
m_creature->AddAura(DUNGEON_MODE(SPELL_EMPOWERING_SHADOWS, H_SPELL_EMPOWERING_SHADOWS), Vorpil); m_creature->AddAura(DUNGEON_MODE(SPELL_EMPOWERING_SHADOWS, H_SPELL_EMPOWERING_SHADOWS), Vorpil);
@@ -197,7 +204,7 @@ struct boss_grandmaster_vorpilAI : public ScriptedAI
void JustSummoned(Creature *summoned) void JustSummoned(Creature *summoned)
{ {
if (summoned && summoned->GetEntry() == MOB_VOID_TRAVELER) if (summoned && summoned->GetEntry() == MOB_VOID_TRAVELER)
CAST_AI(mob_voidtravelerAI, summoned->AI())->Vorpil = m_creature; CAST_AI(mob_voidtravelerAI, summoned->AI())->VorpilGUID = m_creature->GetGUID();
} }
void KilledUnit(Unit *victim) void KilledUnit(Unit *victim)
@@ -574,7 +574,8 @@ struct mob_enchanted_elementalAI : public ScriptedAI
uint32 move; uint32 move;
uint32 phase; uint32 phase;
float x, y, z; float x, y, z;
Creature *Vashj;
uint64 VashjGUID;
void Reset() void Reset()
{ {
@@ -582,7 +583,8 @@ struct mob_enchanted_elementalAI : public ScriptedAI
m_creature->SetSpeed(MOVE_RUN,0.6);//run m_creature->SetSpeed(MOVE_RUN,0.6);//run
move = 0; move = 0;
phase = 1; phase = 1;
Vashj = NULL;
VashjGUID = 0;
for (int i = 0; i<8; ++i)//search for nearest waypoint (up on stairs) for (int i = 0; i<8; ++i)//search for nearest waypoint (up on stairs)
{ {
@@ -603,7 +605,7 @@ struct mob_enchanted_elementalAI : public ScriptedAI
} }
} }
if (pInstance) if (pInstance)
Vashj = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_LADYVASHJ)); VashjGUID = pInstance->GetData64(DATA_LADYVASHJ);
} }
void EnterCombat(Unit *who) { return; } void EnterCombat(Unit *who) { return; }
@@ -615,10 +617,8 @@ struct mob_enchanted_elementalAI : public ScriptedAI
if (!pInstance) if (!pInstance)
return; return;
if (!Vashj) if (!VashjGUID)
{
return; return;
}
if (move <= diff) if (move <= diff)
{ {
@@ -638,10 +638,13 @@ struct mob_enchanted_elementalAI : public ScriptedAI
if (m_creature->IsWithinDist3d(MIDDLE_X, MIDDLE_Y, MIDDLE_Z, 3)) if (m_creature->IsWithinDist3d(MIDDLE_X, MIDDLE_Y, MIDDLE_Z, 3))
DoCast(m_creature, SPELL_SURGE); DoCast(m_creature, SPELL_SURGE);
} }
if (!Vashj->isInCombat() || CAST_AI(boss_lady_vashjAI, Vashj->AI())->Phase != 2 || Vashj->isDead()) if (Creature *Vashj = Unit::GetCreature(*m_creature, VashjGUID))
{ {
//call Unsummon() if (!Vashj->isInCombat() || CAST_AI(boss_lady_vashjAI, Vashj->AI())->Phase != 2 || Vashj->isDead())
m_creature->Kill(m_creature); {
//call Unsummon()
m_creature->Kill(m_creature);
}
} }
move = 1000; move = 1000;
} else move -= diff; } else move -= diff;
@@ -51,15 +51,14 @@ struct instance_arcatraz : public ScriptedInstance
uint32 m_auiEncounter[MAX_ENCOUNTER]; uint32 m_auiEncounter[MAX_ENCOUNTER];
GameObject *Containment_Core_Security_Field_Alpha; uint64 Containment_Core_Security_Field_AlphaGUID;
GameObject *Containment_Core_Security_Field_Beta; uint64 Containment_Core_Security_Field_BetaGUID;
GameObject *Pod_Alpha; uint64 Pod_AlphaGUID;
GameObject *Pod_Gamma; uint64 Pod_GammaGUID;
GameObject *Pod_Beta; uint64 Pod_BetaGUID;
GameObject *Pod_Delta; uint64 Pod_DeltaGUID;
GameObject *Pod_Omega; uint64 Pod_OmegaGUID;
GameObject *Wardens_Shield; uint64 Wardens_ShieldGUID;
uint64 GoSphereGUID; uint64 GoSphereGUID;
uint64 MellicharGUID; uint64 MellicharGUID;
@@ -67,15 +66,14 @@ struct instance_arcatraz : public ScriptedInstance
{ {
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
Containment_Core_Security_Field_Alpha = NULL; Containment_Core_Security_Field_AlphaGUID = 0;
Containment_Core_Security_Field_Beta = NULL; Containment_Core_Security_Field_BetaGUID = 0;
Pod_Alpha = NULL; Pod_AlphaGUID = 0;
Pod_Beta = NULL; Pod_GammaGUID = 0;
Pod_Delta = NULL; Pod_BetaGUID = 0;
Pod_Gamma = NULL; Pod_DeltaGUID = 0;
Pod_Omega = NULL; Pod_OmegaGUID = 0;
Wardens_Shield = NULL; Wardens_ShieldGUID = 0;
GoSphereGUID = 0; GoSphereGUID = 0;
MellicharGUID = 0; MellicharGUID = 0;
} }
@@ -92,15 +90,15 @@ struct instance_arcatraz : public ScriptedInstance
{ {
switch(pGo->GetEntry()) switch(pGo->GetEntry())
{ {
case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: Containment_Core_Security_Field_Alpha = pGo; break; case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: Containment_Core_Security_Field_AlphaGUID = pGo->GetGUID(); break;
case CONTAINMENT_CORE_SECURITY_FIELD_BETA: Containment_Core_Security_Field_Beta = pGo; break; case CONTAINMENT_CORE_SECURITY_FIELD_BETA: Containment_Core_Security_Field_BetaGUID = pGo->GetGUID(); break;
case SEAL_SPHERE: GoSphereGUID = pGo->GetGUID(); break; case POD_ALPHA: Pod_AlphaGUID = pGo->GetGUID(); break;
case POD_ALPHA: Pod_Alpha = pGo; break; case POD_GAMMA: Pod_GammaGUID = pGo->GetGUID(); break;
case POD_BETA: Pod_Beta = pGo; break; case POD_BETA: Pod_BetaGUID = pGo->GetGUID(); break;
case POD_DELTA: Pod_Delta = pGo; break; case POD_DELTA: Pod_DeltaGUID = pGo->GetGUID(); break;
case POD_GAMMA: Pod_Gamma = pGo; break; case POD_OMEGA: Pod_OmegaGUID = pGo->GetGUID(); break;
case POD_OMEGA: Pod_Omega = pGo; break; case SEAL_SPHERE: GoSphereGUID = pGo->GetGUID(); break;
//case WARDENS_SHIELD: Wardens_Shield = pGo; break; //case WARDENS_SHIELD: Wardens_ShieldGUID = pGo->GetGUID(); break;
} }
} }
@@ -120,15 +118,19 @@ struct instance_arcatraz : public ScriptedInstance
case TYPE_DALLIAH: case TYPE_DALLIAH:
if (data == DONE) if (data == DONE)
if (Containment_Core_Security_Field_Beta) {
Containment_Core_Security_Field_Beta->UseDoorOrButton(); if (GameObject *pGo = instance->GetGameObject(Containment_Core_Security_Field_BetaGUID))
pGo->UseDoorOrButton();
}
m_auiEncounter[1] = data; m_auiEncounter[1] = data;
break; break;
case TYPE_SOCCOTHRATES: case TYPE_SOCCOTHRATES:
if (data == DONE) if (data == DONE)
if (Containment_Core_Security_Field_Alpha) {
Containment_Core_Security_Field_Alpha->UseDoorOrButton(); if (GameObject *pGo = instance->GetGameObject(Containment_Core_Security_Field_AlphaGUID))
pGo->UseDoorOrButton();
}
m_auiEncounter[2] = data; m_auiEncounter[2] = data;
break; break;
@@ -146,43 +148,53 @@ struct instance_arcatraz : public ScriptedInstance
case TYPE_WARDEN_1: case TYPE_WARDEN_1:
if (data == IN_PROGRESS) if (data == IN_PROGRESS)
if (Pod_Alpha) if (GameObject *pGo = instance->GetGameObject(Pod_AlphaGUID))
Pod_Alpha->UseDoorOrButton(); pGo->UseDoorOrButton();
m_auiEncounter[4] = data; m_auiEncounter[4] = data;
break; break;
case TYPE_WARDEN_2: case TYPE_WARDEN_2:
if (data == IN_PROGRESS) if (data == IN_PROGRESS)
if (Pod_Beta) {
Pod_Beta->UseDoorOrButton(); if (GameObject *pGo = instance->GetGameObject(Pod_BetaGUID))
pGo->UseDoorOrButton();
}
m_auiEncounter[5] = data; m_auiEncounter[5] = data;
break; break;
case TYPE_WARDEN_3: case TYPE_WARDEN_3:
if (data == IN_PROGRESS) if (data == IN_PROGRESS)
if (Pod_Delta) {
Pod_Delta->UseDoorOrButton(); if (GameObject *pGo = instance->GetGameObject(Pod_DeltaGUID))
pGo->UseDoorOrButton();
}
m_auiEncounter[6] = data; m_auiEncounter[6] = data;
break; break;
case TYPE_WARDEN_4: case TYPE_WARDEN_4:
if (data == IN_PROGRESS) if (data == IN_PROGRESS)
if (Pod_Gamma) {
Pod_Gamma->UseDoorOrButton(); if (GameObject *pGo = instance->GetGameObject(Pod_GammaGUID))
pGo->UseDoorOrButton();
}
m_auiEncounter[7] = data; m_auiEncounter[7] = data;
break; break;
case TYPE_WARDEN_5: case TYPE_WARDEN_5:
if (data == IN_PROGRESS) if (data == IN_PROGRESS)
if (Pod_Omega) {
Pod_Omega->UseDoorOrButton(); if (GameObject *pGo = instance->GetGameObject(Pod_OmegaGUID))
pGo->UseDoorOrButton();
}
m_auiEncounter[8] = data; m_auiEncounter[8] = data;
break; break;
case TYPE_SHIELD_OPEN: case TYPE_SHIELD_OPEN:
if (data == IN_PROGRESS) if (data == IN_PROGRESS)
if (Wardens_Shield) {
Wardens_Shield->UseDoorOrButton(); if (GameObject *pGo = instance->GetGameObject(Wardens_ShieldGUID))
pGo->UseDoorOrButton();
}
break; break;
} }
} }
@@ -191,18 +203,12 @@ struct instance_arcatraz : public ScriptedInstance
{ {
switch(type) switch(type)
{ {
case TYPE_HARBINGERSKYRISS: case TYPE_HARBINGERSKYRISS: return m_auiEncounter[3];
return m_auiEncounter[3]; case TYPE_WARDEN_1: return m_auiEncounter[4];
case TYPE_WARDEN_1: case TYPE_WARDEN_2: return m_auiEncounter[5];
return m_auiEncounter[4]; case TYPE_WARDEN_3: return m_auiEncounter[6];
case TYPE_WARDEN_2: case TYPE_WARDEN_4: return m_auiEncounter[7];
return m_auiEncounter[5]; case TYPE_WARDEN_5: return m_auiEncounter[8];
case TYPE_WARDEN_3:
return m_auiEncounter[6];
case TYPE_WARDEN_4:
return m_auiEncounter[7];
case TYPE_WARDEN_5:
return m_auiEncounter[8];
} }
return 0; return 0;
} }
@@ -211,10 +217,8 @@ struct instance_arcatraz : public ScriptedInstance
{ {
switch(data) switch(data)
{ {
case DATA_MELLICHAR: case DATA_MELLICHAR: return MellicharGUID;
return MellicharGUID; case DATA_SPHERE_SHIELD: return GoSphereGUID;
case DATA_SPHERE_SHIELD:
return GoSphereGUID;
} }
return 0; return 0;
} }