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:
+9
-6
@@ -162,7 +162,7 @@ struct boss_paletressAI : public ScriptedAI
|
||||
{
|
||||
pInstance = pCreature->GetInstanceData();
|
||||
|
||||
pMemory = NULL;
|
||||
MemoryGUID = 0;
|
||||
pCreature->SetReactState(REACT_PASSIVE);
|
||||
pCreature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
|
||||
pCreature->RestoreFaction();
|
||||
@@ -171,6 +171,7 @@ struct boss_paletressAI : public ScriptedAI
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
Creature* pMemory;
|
||||
uint64 MemoryGUID;
|
||||
|
||||
bool bHealth;
|
||||
bool bDone;
|
||||
@@ -193,8 +194,9 @@ struct boss_paletressAI : public ScriptedAI
|
||||
bHealth = false;
|
||||
bDone = false;
|
||||
|
||||
if (pMemory && pMemory->isAlive())
|
||||
pMemory->RemoveFromWorld();
|
||||
if (Creature *pMemory = Unit::GetCreature(*m_creature, MemoryGUID))
|
||||
if (pMemory->isAlive())
|
||||
pMemory->RemoveFromWorld();
|
||||
}
|
||||
|
||||
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));
|
||||
break;
|
||||
case 1:
|
||||
if (pMemory && pMemory->isAlive())
|
||||
DoCast(pMemory,DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H));
|
||||
if (Creature *pMemory = Unit::GetCreature(*m_creature, MemoryGUID))
|
||||
if (pMemory->isAlive())
|
||||
DoCast(pMemory, DUNGEON_MODE(SPELL_RENEW,SPELL_RENEW_H));
|
||||
break;
|
||||
}
|
||||
uiRenewTimer = urand(15000,17000);
|
||||
@@ -297,7 +300,7 @@ struct boss_paletressAI : public ScriptedAI
|
||||
|
||||
void JustSummoned(Creature* pSummon)
|
||||
{
|
||||
pMemory = pSummon;
|
||||
MemoryGUID = pSummon->GetGUID();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+2
-6
@@ -143,7 +143,7 @@ bool GrandChampionsOutVehicle(Creature* m_creature)
|
||||
|
||||
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);
|
||||
uiWaypointPath = 0;
|
||||
@@ -151,8 +151,6 @@ struct generic_vehicleAI_toc5AI : public npc_escortAI
|
||||
pInstance = pCreature->GetInstanceData();
|
||||
}
|
||||
|
||||
Vehicle* pVehicle;
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
uint32 uiChargeTimer;
|
||||
@@ -261,11 +259,9 @@ struct generic_vehicleAI_toc5AI : public npc_escortAI
|
||||
//dosen't work at all
|
||||
if (uiShieldBreakerTimer <= uiDiff)
|
||||
{
|
||||
Vehicle *pVehicle = m_creature->GetVehicleKit();
|
||||
if (!pVehicle)
|
||||
{
|
||||
pVehicle = m_creature->GetVehicleKit();
|
||||
return;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceData();
|
||||
if(pInstance)
|
||||
{
|
||||
if (pCreature->GetMap()->IsDungeon())
|
||||
pColossus = CAST_CRE(pCreature->GetUnit(*pCreature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS)));
|
||||
}
|
||||
}
|
||||
|
||||
Creature* pColossus;
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
uint32 uiSurgeTimer;
|
||||
@@ -158,7 +151,7 @@ struct boss_drakkari_elementalAI : public ScriptedAI
|
||||
|
||||
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);
|
||||
uiSurgeTimer = 7*IN_MILISECONDS;
|
||||
bGoToColossus = false;
|
||||
@@ -173,8 +166,11 @@ struct boss_drakkari_elementalAI : public ScriptedAI
|
||||
{
|
||||
if (uiType != POINT_MOTION_TYPE)
|
||||
return;
|
||||
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true);
|
||||
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false;
|
||||
if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
|
||||
{
|
||||
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true);
|
||||
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false;
|
||||
}
|
||||
m_creature->RemoveFromWorld();
|
||||
}
|
||||
|
||||
@@ -184,12 +180,17 @@ struct boss_drakkari_elementalAI : public ScriptedAI
|
||||
if(!UpdateVictim())
|
||||
return;
|
||||
|
||||
if(!bGoToColossus && HealthBelowPct(50) && !CAST_AI(boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6))
|
||||
if(!bGoToColossus && HealthBelowPct(50))
|
||||
{
|
||||
m_creature->InterruptNonMeleeSpells(true);
|
||||
if (pColossus)
|
||||
DoCast(pColossus, SPELL_MERGE);
|
||||
bGoToColossus = true;
|
||||
if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
|
||||
{
|
||||
if (!CAST_AI(boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6))
|
||||
{
|
||||
m_creature->InterruptNonMeleeSpells(true);
|
||||
DoCast(pColossus, SPELL_MERGE);
|
||||
bGoToColossus = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (uiSurgeTimer <= diff)
|
||||
@@ -203,9 +204,8 @@ struct boss_drakkari_elementalAI : public ScriptedAI
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
if (!pColossus)
|
||||
return;
|
||||
pColossus->Kill(pColossus);
|
||||
if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
|
||||
pColossus->Kill(pColossus);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -216,8 +216,6 @@ struct npc_living_mojoAI : public ScriptedAI
|
||||
pInstance = pCreature->GetInstanceData();
|
||||
}
|
||||
|
||||
Creature* pColossus;
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
uint32 uiMojoWaveTimer;
|
||||
@@ -231,28 +229,32 @@ struct npc_living_mojoAI : public ScriptedAI
|
||||
|
||||
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.
|
||||
if (pColossus && pColossus->isAlive() && m_creature->IsInRange3d(pColossus->GetHomePosition().GetPositionX(),pColossus->GetHomePosition().GetPositionY(),pColossus->GetHomePosition().GetPositionZ(),0.0f,17.0f))
|
||||
m_creature->SetReactState(REACT_PASSIVE);
|
||||
else
|
||||
m_creature->SetReactState(REACT_AGGRESSIVE);
|
||||
if (Creature *pColossus = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
|
||||
{
|
||||
if (pColossus->isAlive() && m_creature->IsInRange3d(pColossus->GetHomePosition().GetPositionX(),pColossus->GetHomePosition().GetPositionY(),pColossus->GetHomePosition().GetPositionZ(),0.0f,17.0f))
|
||||
m_creature->SetReactState(REACT_PASSIVE);
|
||||
else
|
||||
m_creature->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* pDone_by, uint32& uiDamage)
|
||||
{
|
||||
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);
|
||||
pColossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||
pColossus->SetReactState(REACT_AGGRESSIVE);
|
||||
if (pDone_by && pDone_by->isAlive())
|
||||
pColossus->AI()->AttackStart(pDone_by);
|
||||
EnterEvadeMode();
|
||||
if (pColossus->isAlive() && !pColossus->isInCombat())
|
||||
{
|
||||
pColossus->RemoveAura(SPELL_FREEZE_ANIM);
|
||||
pColossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||
pColossus->SetReactState(REACT_AGGRESSIVE);
|
||||
if (pDone_by && pDone_by->isAlive())
|
||||
pColossus->AI()->AttackStart(pDone_by);
|
||||
EnterEvadeMode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,10 +153,14 @@ struct boss_gothikAI : public BossAI
|
||||
bool phaseTwo;
|
||||
bool thirtyPercentReached;
|
||||
|
||||
std::vector<uint64> LiveTriggerGUID;
|
||||
std::vector<uint64> DeadTriggerGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
liveTrigger.clear();
|
||||
deadTrigger.clear();
|
||||
LiveTriggerGUID.clear();
|
||||
DeadTriggerGUID.clear();
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if (instance)
|
||||
@@ -171,12 +175,12 @@ struct boss_gothikAI : public BossAI
|
||||
{
|
||||
for (uint32 i = 0; i < POS_LIVE; ++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)
|
||||
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!");
|
||||
EnterEvadeMode();
|
||||
@@ -223,8 +227,8 @@ struct boss_gothikAI : public BossAI
|
||||
|
||||
void JustDied(Unit* Killer)
|
||||
{
|
||||
liveTrigger.clear();
|
||||
deadTrigger.clear();
|
||||
LiveTriggerGUID.clear();
|
||||
DeadTriggerGUID.clear();
|
||||
_JustDied();
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
if (instance)
|
||||
@@ -238,17 +242,29 @@ struct boss_gothikAI : public BossAI
|
||||
switch(entry)
|
||||
{
|
||||
case MOB_LIVE_TRAINEE:
|
||||
DoSummon(MOB_LIVE_TRAINEE, liveTrigger[0], 1);
|
||||
DoSummon(MOB_LIVE_TRAINEE, liveTrigger[1], 1);
|
||||
DoSummon(MOB_LIVE_TRAINEE, liveTrigger[2], 1);
|
||||
{
|
||||
if (Creature *LiveTrigger0 = Unit::GetCreature(*m_creature, LiveTriggerGUID[0]))
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -256,15 +272,25 @@ struct boss_gothikAI : public BossAI
|
||||
switch(entry)
|
||||
{
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -320,7 +346,8 @@ struct boss_gothikAI : public BossAI
|
||||
if (spellId && me->isInCombat())
|
||||
{
|
||||
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;
|
||||
|
||||
GameObject* pPortals[4];
|
||||
GameObject* pKTTrigger;
|
||||
uint64 PortalsGUID[4];
|
||||
uint64 KTTriggerGUID;
|
||||
|
||||
SummonList spawns; // adds spawn by the trigger. kept in separated list (i.e. not in summons)
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
|
||||
PortalsGUID[0] = PortalsGUID[1] = PortalsGUID[2] = PortalsGUID[3] = 0;
|
||||
KTTriggerGUID = 0;
|
||||
|
||||
me->setFaction(35);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
std::map<uint64, float>::iterator itr;
|
||||
@@ -289,7 +293,7 @@ struct boss_kelthuzadAI : public BossAI
|
||||
|
||||
FindGameObjects();
|
||||
|
||||
if (pKTTrigger)
|
||||
if (GameObject *pKTTrigger = m_creature->GetMap()->GetGameObject(KTTriggerGUID))
|
||||
{
|
||||
pKTTrigger->ResetDoorOrButton();
|
||||
pKTTrigger->SetPhaseMask(1, true);
|
||||
@@ -297,10 +301,10 @@ struct boss_kelthuzadAI : public BossAI
|
||||
|
||||
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)))
|
||||
pPortals[i]->ResetDoorOrButton();
|
||||
if (!((pPortal->getLootState() == GO_READY) || (pPortal->getLootState() == GO_NOT_READY)))
|
||||
pPortal->ResetDoorOrButton();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -339,8 +343,8 @@ struct boss_kelthuzadAI : public BossAI
|
||||
FindGameObjects();
|
||||
for (uint8 i = 0; i <= 3; ++i)
|
||||
{
|
||||
if (pPortals[i])
|
||||
pPortals[i]->ResetDoorOrButton();
|
||||
if (GameObject *pPortal = m_creature->GetMap()->GetGameObject(PortalsGUID[i]))
|
||||
pPortal->ResetDoorOrButton();
|
||||
}
|
||||
DoCast(me, SPELL_KELTHUZAD_CHANNEL, false);
|
||||
DoScriptText(SAY_SUMMON_MINIONS, me);
|
||||
@@ -357,11 +361,11 @@ struct boss_kelthuzadAI : public BossAI
|
||||
|
||||
void FindGameObjects()
|
||||
{
|
||||
pPortals[0] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL01)) : NULL;
|
||||
pPortals[1] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL02)) : NULL;
|
||||
pPortals[2] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL03)) : NULL;
|
||||
pPortals[3] = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_PORTAL04)) : NULL;
|
||||
pKTTrigger = instance ? instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_TRIGGER)) : NULL;
|
||||
PortalsGUID[0] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL01) : 0;
|
||||
PortalsGUID[1] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL02) : 0;
|
||||
PortalsGUID[2] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL03) : 0;
|
||||
PortalsGUID[3] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL04) : 0;
|
||||
KTTriggerGUID = instance ? instance->GetData64(DATA_KELTHUZAD_TRIGGER) : 0;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -402,7 +406,7 @@ struct boss_kelthuzadAI : public BossAI
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_TRIGGER:
|
||||
if (pKTTrigger)
|
||||
if (GameObject *pKTTrigger = m_creature->GetMap()->GetGameObject(KTTriggerGUID))
|
||||
pKTTrigger->SetPhaseMask(2, true);
|
||||
events.PopEvent();
|
||||
break;
|
||||
@@ -444,8 +448,11 @@ struct boss_kelthuzadAI : public BossAI
|
||||
|
||||
for (uint8 i = 0; i <= 3; ++i)
|
||||
{
|
||||
if (pPortals[i] && (pPortals[i]->getLootState() == GO_READY))
|
||||
pPortals[i]->UseDoorOrButton();
|
||||
if (GameObject *pPortal = m_creature->GetMap()->GetGameObject(PortalsGUID[i]))
|
||||
{
|
||||
if (pPortal->getLootState() == GO_READY)
|
||||
pPortal->UseDoorOrButton();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,16 +104,16 @@ inline uint32 GetEruptionSection(float x, float y)
|
||||
struct instance_naxxramas : public InstanceData
|
||||
{
|
||||
instance_naxxramas(Map* pMap) : InstanceData(pMap)
|
||||
, Sapphiron(NULL), pGothikGate(NULL), HorsemenChest(NULL)
|
||||
{
|
||||
SetBossNumber(MAX_BOSS_NUMBER);
|
||||
LoadDoorData(doorData);
|
||||
LoadMinionData(minionData);
|
||||
}
|
||||
|
||||
std::set<GameObject*> HeiganEruption[4];
|
||||
GameObject* pGothikGate, *HorsemenChest;
|
||||
Creature* Sapphiron;
|
||||
std::set<uint64> HeiganEruptionGUID[4];
|
||||
uint64 GothikGateGUID;
|
||||
uint64 HorsemenChestGUID;
|
||||
uint64 SapphironGUID;
|
||||
uint64 uiFaerlina;
|
||||
uint64 uiThane;
|
||||
uint64 uiLady;
|
||||
@@ -135,7 +135,7 @@ struct instance_naxxramas : public InstanceData
|
||||
{
|
||||
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 16064: uiThane = 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());
|
||||
if (add)
|
||||
HeiganEruption[section].insert(pGo);
|
||||
HeiganEruptionGUID[section].insert(pGo->GetGUID());
|
||||
else
|
||||
HeiganEruption[section].erase(pGo);
|
||||
HeiganEruptionGUID[section].erase(pGo->GetGUID());
|
||||
return;
|
||||
}
|
||||
|
||||
switch(pGo->GetEntry())
|
||||
{
|
||||
case GO_BIRTH: if (!add && Sapphiron) Sapphiron->AI()->DoAction(DATA_SAPPHIRON_BIRTH); return;
|
||||
case GO_GOTHIK_GATE: pGothikGate = add ? pGo : NULL; break;
|
||||
case GO_HORSEMEN_CHEST: HorsemenChest = add ? pGo : NULL; break;
|
||||
case GO_HORSEMEN_CHEST_HERO: HorsemenChest = add ? pGo : NULL; break;
|
||||
case GO_BIRTH:
|
||||
if (!add && SapphironGUID)
|
||||
{
|
||||
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_PORTAL02: uiPortals[1] = pGo->GetGUID(); break;
|
||||
case GO_KELTHUZAD_PORTAL03: uiPortals[2] = pGo->GetGUID(); break;
|
||||
@@ -186,7 +192,7 @@ struct instance_naxxramas : public InstanceData
|
||||
HeiganErupt(value);
|
||||
break;
|
||||
case DATA_GOTHIK_GATE:
|
||||
if (pGothikGate)
|
||||
if (GameObject *pGothikGate = instance->GetGameObject(GothikGateGUID))
|
||||
pGothikGate->SetGoState(GOState(value));
|
||||
break;
|
||||
|
||||
@@ -253,8 +259,11 @@ struct instance_naxxramas : public InstanceData
|
||||
if (!InstanceData::SetBossState(id, state))
|
||||
return false;
|
||||
|
||||
if (id == BOSS_HORSEMEN && state == DONE && HorsemenChest)
|
||||
HorsemenChest->SetRespawnTime(HorsemenChest->GetRespawnDelay());
|
||||
if (id == BOSS_HORSEMEN && state == DONE)
|
||||
{
|
||||
if (GameObject *pHorsemenChest = instance->GetGameObject(HorsemenChestGUID))
|
||||
pHorsemenChest->SetRespawnTime(pHorsemenChest->GetRespawnDelay());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -266,10 +275,13 @@ struct instance_naxxramas : public InstanceData
|
||||
if (i == section)
|
||||
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();
|
||||
(*itr)->CastSpell(NULL, SPELL_ERUPTION);
|
||||
if (GameObject *pHeiganEruption = instance->GetGameObject(*itr))
|
||||
{
|
||||
pHeiganEruption->SendCustomAnim();
|
||||
pHeiganEruption->CastSpell(NULL, SPELL_ERUPTION);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ struct mob_tribuna_controllerAI : public ScriptedAI
|
||||
bool bMarnakActivated;
|
||||
bool bAbedneumActivated;
|
||||
|
||||
std::list<Creature*> lKaddrakGUIDList;
|
||||
std::list<uint64> KaddrakGUIDList;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
@@ -153,7 +153,7 @@ struct mob_tribuna_controllerAI : public ScriptedAI
|
||||
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_SKY_FLOOR),false);
|
||||
}
|
||||
|
||||
lKaddrakGUIDList.clear();
|
||||
KaddrakGUIDList.clear();
|
||||
}
|
||||
|
||||
void UpdateFacesList()
|
||||
@@ -189,10 +189,15 @@ struct mob_tribuna_controllerAI : public ScriptedAI
|
||||
if (uiKaddrakEncounterTimer <= diff)
|
||||
{
|
||||
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
if (!lKaddrakGUIDList.empty())
|
||||
for (std::list<Creature*>::iterator itr = lKaddrakGUIDList.begin(); itr != lKaddrakGUIDList.end(); ++itr)
|
||||
if ((*itr)->isAlive())
|
||||
(*itr)->CastSpell(pTarget, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, H_SPELL_GLARE_OF_THE_TRIBUNAL), true);
|
||||
if (!KaddrakGUIDList.empty())
|
||||
for (std::list<uint64>::const_iterator itr = KaddrakGUIDList.begin(); itr != KaddrakGUIDList.end(); ++itr)
|
||||
{
|
||||
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;
|
||||
} else uiKaddrakEncounterTimer -= diff;
|
||||
}
|
||||
|
||||
@@ -89,6 +89,7 @@ struct boss_svalaAI : public ScriptedAI
|
||||
IntroPhase Phase;
|
||||
|
||||
TempSummon* pArthas;
|
||||
uint64 ArthasGUID;
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
@@ -97,7 +98,7 @@ struct boss_svalaAI : public ScriptedAI
|
||||
Phase = IDLE;
|
||||
uiIntroTimer = 1000;
|
||||
uiIntroPhase = 0;
|
||||
pArthas = NULL;
|
||||
ArthasGUID = 0;
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED);
|
||||
@@ -113,10 +114,11 @@ struct boss_svalaAI : public ScriptedAI
|
||||
Phase = INTRO;
|
||||
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->SetFloatValue(OBJECT_FIELD_SCALE_X, 5);
|
||||
ArthasGUID = pArthas->GetGUID();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -130,6 +132,7 @@ struct boss_svalaAI : public ScriptedAI
|
||||
|
||||
if (uiIntroTimer <= diff)
|
||||
{
|
||||
Creature *pArthas = Unit::GetCreature(*m_creature, ArthasGUID);
|
||||
if (!pArthas)
|
||||
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->SetDisplayId(DATA_SVALA_DISPLAY_ID);
|
||||
pArthas->UnSummon();
|
||||
pArthas = NULL;
|
||||
((TempSummon*)pArthas)->UnSummon(); // TODO: should need a ToTempSummon()
|
||||
ArthasGUID = 0;
|
||||
Phase = FINISHED;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -158,17 +158,12 @@ struct mob_tempest_minionAI : public ScriptedAI
|
||||
mob_tempest_minionAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceData();
|
||||
uiEmalonGUID = pInstance ? pInstance->GetData64(DATA_EMALON) : 0;
|
||||
pEmalon = Unit::GetCreature(*m_creature, uiEmalonGUID);
|
||||
}
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
EventMap events;
|
||||
|
||||
uint64 uiEmalonGUID;
|
||||
Creature* pEmalon;
|
||||
|
||||
uint32 uiOverchargedTimer;
|
||||
|
||||
void Reset()
|
||||
@@ -180,10 +175,13 @@ struct mob_tempest_minionAI : public ScriptedAI
|
||||
|
||||
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);
|
||||
DoScriptText(EMOTE_MINION_RESPAWN, m_creature);
|
||||
if (pEmalon->isAlive())
|
||||
{
|
||||
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();
|
||||
events.ScheduleEvent(EVENT_SHOCK, 20000);
|
||||
|
||||
if (pEmalon && !pEmalon->getVictim() && pEmalon->AI())
|
||||
pEmalon->AI()->AttackStart(who);
|
||||
if(Creature *pEmalon = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EMALON) : 0))
|
||||
{
|
||||
if (!pEmalon->getVictim() && pEmalon->AI())
|
||||
pEmalon->AI()->AttackStart(who);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
|
||||
@@ -50,9 +50,6 @@ struct boss_erekemAI : public ScriptedAI
|
||||
uint32 uiLightningBoltTimer;
|
||||
uint32 uiEarthShieldTimer;
|
||||
|
||||
Creature* pGuard1;
|
||||
Creature* pGuard2;
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
void Reset()
|
||||
@@ -70,13 +67,16 @@ struct boss_erekemAI : public ScriptedAI
|
||||
pInstance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
pGuard1 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_1));
|
||||
if (pGuard1 && !pGuard1->isAlive())
|
||||
pGuard1->Respawn();
|
||||
|
||||
pGuard2 = pInstance->instance->GetCreature(pInstance->GetData64(DATA_EREKEM_GUARD_2));
|
||||
if (pGuard2 && !pGuard2->isAlive())
|
||||
pGuard2->Respawn();
|
||||
if (Creature *pGuard1 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_1) : 0))
|
||||
{
|
||||
if (!pGuard1->isAlive())
|
||||
pGuard1->Respawn();
|
||||
}
|
||||
if (Creature *pGuard2 = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_EREKEM_GUARD_2) : 0))
|
||||
{
|
||||
if (!pGuard2->isAlive())
|
||||
pGuard2->Respawn();
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* pWho)
|
||||
@@ -91,21 +91,17 @@ struct boss_erekemAI : public ScriptedAI
|
||||
pWho->SetInCombatWith(m_creature);
|
||||
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->AI()->AttackStart(pWho);
|
||||
}
|
||||
|
||||
if (pGuard2)
|
||||
{
|
||||
pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (!pGuard2->getVictim() && pGuard2->AI())
|
||||
pGuard2->AI()->AttackStart(pWho);
|
||||
}
|
||||
pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NON_ATTACKABLE);
|
||||
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->getVictim() && pGuard2->AI())
|
||||
pGuard2->AI()->AttackStart(pWho);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -123,8 +119,6 @@ struct boss_erekemAI : public ScriptedAI
|
||||
EnterEvadeMode();
|
||||
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)
|
||||
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
|
||||
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 (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
|
||||
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;
|
||||
}
|
||||
} 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);
|
||||
}
|
||||
|
||||
Creature* GetChainHealTarget()
|
||||
uint64 GetChainHealTargetGUID()
|
||||
{
|
||||
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))
|
||||
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))
|
||||
return pGuard2;
|
||||
return NULL;
|
||||
return pGuard2->GetGUID();
|
||||
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -44,8 +44,6 @@ struct npc_sinclariAI : public ScriptedAI
|
||||
uint8 uiPhase;
|
||||
uint32 uiTimer;
|
||||
|
||||
std::list<Creature*> GuardList;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiPhase = 0;
|
||||
@@ -54,9 +52,11 @@ struct npc_sinclariAI : public ScriptedAI
|
||||
m_creature->SetVisibility(VISIBILITY_ON);
|
||||
m_creature->SetReactState(REACT_AGGRESSIVE);
|
||||
|
||||
std::list<Creature*> GuardList;
|
||||
m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f);
|
||||
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)
|
||||
{
|
||||
@@ -66,6 +66,7 @@ struct npc_sinclariAI : public ScriptedAI
|
||||
pGuard->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 uiType, uint32 uiId)
|
||||
@@ -100,6 +101,8 @@ struct npc_sinclariAI : public ScriptedAI
|
||||
uiPhase = 2;
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
std::list<Creature*> GuardList;
|
||||
m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f);
|
||||
if (!GuardList.empty())
|
||||
for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr)
|
||||
@@ -113,7 +116,10 @@ struct npc_sinclariAI : public ScriptedAI
|
||||
uiTimer = 6000;
|
||||
uiPhase = 3;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
std::list<Creature*> GuardList;
|
||||
m_creature->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f);
|
||||
if (!GuardList.empty())
|
||||
for (std::list<Creature*>::iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr)
|
||||
@@ -127,6 +133,7 @@ struct npc_sinclariAI : public ScriptedAI
|
||||
uiTimer = 2000;
|
||||
uiPhase = 4;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
m_creature->GetMotionMaster()->MovePoint(0, MovePosition);
|
||||
uiTimer = 0;
|
||||
|
||||
Reference in New Issue
Block a user