fix(Scripts/BlackTemple): fix crash on Shade of Akama evade (#26813)

This commit is contained in:
Andrew
2026-07-25 21:13:52 -03:00
committed by GitHub
parent 584637dc0f
commit 891b9671eb
@@ -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