fix(Scripts/BlackTemple): fix crash on Shade of Akama evade (#26813)
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "CreatureScript.h"
|
#include "CreatureScript.h"
|
||||||
|
#include "ObjectAccessor.h"
|
||||||
#include "ScriptedCreature.h"
|
#include "ScriptedCreature.h"
|
||||||
#include "SpellScriptLoader.h"
|
#include "SpellScriptLoader.h"
|
||||||
#include "black_temple.h"
|
#include "black_temple.h"
|
||||||
@@ -98,8 +99,8 @@ struct boss_shade_of_akama : public BossAI
|
|||||||
{
|
{
|
||||||
boss_shade_of_akama(Creature* creature) : BossAI(creature, DATA_SHADE_OF_AKAMA) { }
|
boss_shade_of_akama(Creature* creature) : BossAI(creature, DATA_SHADE_OF_AKAMA) { }
|
||||||
|
|
||||||
std::list<Creature*> channelers;
|
GuidVector channelers;
|
||||||
std::list<Creature*> generators;
|
GuidVector generators;
|
||||||
|
|
||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
@@ -114,10 +115,12 @@ struct boss_shade_of_akama : public BossAI
|
|||||||
|
|
||||||
void EnterEvadeMode(EvadeReason why) override
|
void EnterEvadeMode(EvadeReason why) override
|
||||||
{
|
{
|
||||||
for (Creature* generator : generators)
|
for (ObjectGuid const& generatorGuid : generators)
|
||||||
|
if (Creature* generator = ObjectAccessor::GetCreature(*me, generatorGuid))
|
||||||
generator->AI()->DoAction(ACTION_GENERATOR_DESPAWN_ALL);
|
generator->AI()->DoAction(ACTION_GENERATOR_DESPAWN_ALL);
|
||||||
|
|
||||||
for (Creature* channeler : channelers)
|
for (ObjectGuid const& channelerGuid : channelers)
|
||||||
|
if (Creature* channeler = ObjectAccessor::GetCreature(*me, channelerGuid))
|
||||||
channeler->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
channeler->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||||
|
|
||||||
BossAI::EnterEvadeMode(why);
|
BossAI::EnterEvadeMode(why);
|
||||||
@@ -128,7 +131,8 @@ struct boss_shade_of_akama : public BossAI
|
|||||||
BossAI::JustDied(killer);
|
BossAI::JustDied(killer);
|
||||||
me->CastSpell(me, SPELL_SHADE_OF_AKAMA_TRIGGER, true);
|
me->CastSpell(me, SPELL_SHADE_OF_AKAMA_TRIGGER, true);
|
||||||
|
|
||||||
for (Creature* generator : generators)
|
for (ObjectGuid const& generatorGuid : generators)
|
||||||
|
if (Creature* generator = ObjectAccessor::GetCreature(*me, generatorGuid))
|
||||||
generator->AI()->DoAction(ACTION_GENERATOR_DESPAWN_ALL);
|
generator->AI()->DoAction(ACTION_GENERATOR_DESPAWN_ALL);
|
||||||
|
|
||||||
if (Creature* akama = instance->GetCreature(DATA_AKAMA_SHADE))
|
if (Creature* akama = instance->GetCreature(DATA_AKAMA_SHADE))
|
||||||
@@ -141,14 +145,22 @@ struct boss_shade_of_akama : public BossAI
|
|||||||
{
|
{
|
||||||
instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS);
|
instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS);
|
||||||
|
|
||||||
me->GetCreatureListWithEntryInGrid(channelers, NPC_ASHTONGUE_CHANNELER, 40.0f);
|
std::list<Creature*> channelerList;
|
||||||
me->GetCreatureListWithEntryInGrid(generators, NPC_CREATURE_GENERATOR_AKAMA, 100.0f);
|
std::list<Creature*> generatorList;
|
||||||
|
me->GetCreatureListWithEntryInGrid(channelerList, NPC_ASHTONGUE_CHANNELER, 40.0f);
|
||||||
|
me->GetCreatureListWithEntryInGrid(generatorList, NPC_CREATURE_GENERATOR_AKAMA, 100.0f);
|
||||||
|
|
||||||
for (Creature* channeler : channelers)
|
for (Creature* channeler : channelerList)
|
||||||
|
{
|
||||||
|
channelers.push_back(channeler->GetGUID());
|
||||||
channeler->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
channeler->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||||
|
}
|
||||||
|
|
||||||
for (Creature* generator : generators)
|
for (Creature* generator : generatorList)
|
||||||
|
{
|
||||||
|
generators.push_back(generator->GetGUID());
|
||||||
generator->AI()->DoAction(ACTION_GENERATOR_START);
|
generator->AI()->DoAction(ACTION_GENERATOR_START);
|
||||||
|
}
|
||||||
|
|
||||||
ScheduleTimedEvent(1200ms, [&]
|
ScheduleTimedEvent(1200ms, [&]
|
||||||
{
|
{
|
||||||
@@ -169,7 +181,8 @@ struct boss_shade_of_akama : public BossAI
|
|||||||
me->RemoveAurasDueToSpell(SPELL_AKAMA_SOUL_CHANNEL);
|
me->RemoveAurasDueToSpell(SPELL_AKAMA_SOUL_CHANNEL);
|
||||||
scheduler.CancelAll();
|
scheduler.CancelAll();
|
||||||
|
|
||||||
for (Creature* generator : generators)
|
for (ObjectGuid const& generatorGuid : generators)
|
||||||
|
if (Creature* generator = ObjectAccessor::GetCreature(*me, generatorGuid))
|
||||||
generator->AI()->DoAction(ACTION_GENERATOR_STOP);
|
generator->AI()->DoAction(ACTION_GENERATOR_STOP);
|
||||||
|
|
||||||
if (Creature* akama = instance->GetCreature(DATA_AKAMA_SHADE))
|
if (Creature* akama = instance->GetCreature(DATA_AKAMA_SHADE))
|
||||||
@@ -222,7 +235,6 @@ struct npc_akama_shade : public ScriptedAI
|
|||||||
_sayLowHealth = false;
|
_sayLowHealth = false;
|
||||||
_died = false;
|
_died = false;
|
||||||
scheduler.CancelAll();
|
scheduler.CancelAll();
|
||||||
_generators.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MovementInform(uint32 type, uint32 point) override
|
void MovementInform(uint32 type, uint32 point) override
|
||||||
@@ -280,8 +292,9 @@ struct npc_akama_shade : public ScriptedAI
|
|||||||
else if (damage >= me->GetHealth() && !_died)
|
else if (damage >= me->GetHealth() && !_died)
|
||||||
{
|
{
|
||||||
_died = true;
|
_died = true;
|
||||||
me->GetCreatureListWithEntryInGrid(_generators, NPC_CREATURE_GENERATOR_AKAMA, 100.0f);
|
std::list<Creature*> generators;
|
||||||
for (Creature* generator : _generators)
|
me->GetCreatureListWithEntryInGrid(generators, NPC_CREATURE_GENERATOR_AKAMA, 100.0f);
|
||||||
|
for (Creature* generator : generators)
|
||||||
generator->AI()->DoAction(ACTION_GENERATOR_DESPAWN_ALL);
|
generator->AI()->DoAction(ACTION_GENERATOR_DESPAWN_ALL);
|
||||||
|
|
||||||
damage = me->GetHealth() - 1;
|
damage = me->GetHealth() - 1;
|
||||||
@@ -347,7 +360,6 @@ struct npc_akama_shade : public ScriptedAI
|
|||||||
private:
|
private:
|
||||||
bool _sayLowHealth;
|
bool _sayLowHealth;
|
||||||
bool _died;
|
bool _died;
|
||||||
std::list<Creature *> _generators;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct npc_creature_generator_akama : public ScriptedAI
|
struct npc_creature_generator_akama : public ScriptedAI
|
||||||
|
|||||||
Reference in New Issue
Block a user