fix(Scripts/Naxxramas): Thaddius casting Ball Lightning shouldn't pr… (#24624)

This commit is contained in:
Andrew
2026-02-10 00:27:42 -03:00
committed by GitHub
parent 8199d59b7e
commit 125f6cb748
@@ -92,9 +92,8 @@ enum Events
EVENT_THADDIUS_INIT = 5, EVENT_THADDIUS_INIT = 5,
EVENT_THADDIUS_ENTER_COMBAT = 6, EVENT_THADDIUS_ENTER_COMBAT = 6,
EVENT_THADDIUS_CHAIN_LIGHTNING = 7, EVENT_THADDIUS_CHAIN_LIGHTNING = 7,
EVENT_THADDIUS_BERSERK = 8, EVENT_THADDIUS_POLARITY_SHIFT = 8,
EVENT_THADDIUS_POLARITY_SHIFT = 9, EVENT_ALLOW_BALL_LIGHTNING = 9
EVENT_ALLOW_BALL_LIGHTNING = 10
}; };
enum Misc enum Misc
@@ -119,11 +118,9 @@ public:
struct boss_thaddiusAI : public BossAI struct boss_thaddiusAI : public BossAI
{ {
explicit boss_thaddiusAI(Creature* c) : BossAI(c, BOSS_THADDIUS), summons(me), ballLightningEnabled(false) explicit boss_thaddiusAI(Creature* c) : BossAI(c, BOSS_THADDIUS), ballLightningEnabled(false)
{} {}
EventMap events;
SummonList summons;
uint32 summonTimer{}; uint32 summonTimer{};
uint32 reviveTimer{}; uint32 reviveTimer{};
uint32 resetTimer{}; uint32 resetTimer{};
@@ -238,7 +235,7 @@ public:
if (resetTimer > 1000) if (resetTimer > 1000)
{ {
resetTimer = 0; resetTimer = 0;
me->CastSpell(me, SPELL_THADDIUS_SPAWN_STUN, true); DoCastSelf(SPELL_THADDIUS_SPAWN_STUN, true);
} }
return; return;
} }
@@ -247,17 +244,15 @@ public:
reviveTimer += diff; reviveTimer += diff;
if (reviveTimer >= 12000) if (reviveTimer >= 12000)
{ {
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) summons.DoForAllSummons([this](WorldObject* summon)
{ {
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr))) if (summon->GetEntry() == NPC_TESLA_COIL)
{ {
if (cr->GetEntry() == NPC_TESLA_COIL) summon->ToCreature()->AI()->Talk(EMOTE_TESLA_OVERLOAD);
{ summon->ToCreature()->CastSpell(me, SPELL_SHOCK_VISUAL, true);
cr->AI()->Talk(EMOTE_TESLA_OVERLOAD);
cr->CastSpell(me, SPELL_SHOCK_VISUAL, true);
}
} }
} });
reviveTimer = 0; reviveTimer = 0;
events.ScheduleEvent(EVENT_THADDIUS_INIT, 750ms); events.ScheduleEvent(EVENT_THADDIUS_INIT, 750ms);
} }
@@ -268,8 +263,6 @@ public:
return; return;
events.Update(diff); events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (summonTimer) // Revive if (summonTimer) // Revive
{ {
@@ -287,25 +280,19 @@ public:
{ {
me->RemoveAllAuras(); me->RemoveAllAuras();
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) summons.DoForAllSummons([](WorldObject* summon)
{ {
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr))) if (summon->GetEntry() == NPC_TESLA_COIL)
{ summon->ToCreature()->KillSelf();
if (cr->GetEntry() == NPC_TESLA_COIL) });
{
Unit::Kill(cr, cr);
}
}
}
if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_LEFT, 100.0f)) if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_LEFT, 100.0f))
{
go->SetGoState(GO_STATE_READY); go->SetGoState(GO_STATE_READY);
}
if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_RIGHT, 100.0f)) if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_RIGHT, 100.0f))
{
go->SetGoState(GO_STATE_READY); go->SetGoState(GO_STATE_READY);
}
me->CastSpell(me, SPELL_THADDIUS_VISUAL_LIGHTNING, true); DoCastSelf(SPELL_THADDIUS_VISUAL_LIGHTNING, true);
events.ScheduleEvent(EVENT_THADDIUS_ENTER_COMBAT, 1s); events.ScheduleEvent(EVENT_THADDIUS_ENTER_COMBAT, 1s);
break; break;
} }
@@ -316,19 +303,32 @@ public:
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->SetControlled(false, UNIT_STATE_ROOT); me->SetControlled(false, UNIT_STATE_ROOT);
events.ScheduleEvent(EVENT_THADDIUS_CHAIN_LIGHTNING, 14s); events.ScheduleEvent(EVENT_THADDIUS_CHAIN_LIGHTNING, 14s);
events.ScheduleEvent(EVENT_THADDIUS_BERSERK, 6min);
events.ScheduleEvent(EVENT_THADDIUS_POLARITY_SHIFT, 20s); events.ScheduleEvent(EVENT_THADDIUS_POLARITY_SHIFT, 20s);
events.ScheduleEvent(EVENT_ALLOW_BALL_LIGHTNING, 5s); events.ScheduleEvent(EVENT_ALLOW_BALL_LIGHTNING, 5s);
ScheduleEnrageTimer(SPELL_BERSERK, 6min);
return; return;
case EVENT_THADDIUS_BERSERK:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_THADDIUS_CHAIN_LIGHTNING: case EVENT_THADDIUS_CHAIN_LIGHTNING:
me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false); if (me->HasUnitState(UNIT_STATE_CASTING))
{
events.Repeat(1s);
ballLightningEnabled = false;
return;
}
DoCastVictim(SPELL_CHAIN_LIGHTNING);
events.ScheduleEvent(EVENT_ALLOW_BALL_LIGHTNING, 1s);
events.Repeat(15s); events.Repeat(15s);
break; break;
case EVENT_THADDIUS_POLARITY_SHIFT: case EVENT_THADDIUS_POLARITY_SHIFT:
me->CastSpell(me, SPELL_POLARITY_SHIFT, false); if (me->HasUnitState(UNIT_STATE_CASTING))
{
events.Repeat(1s);
ballLightningEnabled = false;
return;
}
DoCastAOE(SPELL_POLARITY_SHIFT);
events.ScheduleEvent(EVENT_ALLOW_BALL_LIGHTNING, 3s);
events.Repeat(30s); events.Repeat(30s);
break; break;
case EVENT_ALLOW_BALL_LIGHTNING: case EVENT_ALLOW_BALL_LIGHTNING:
@@ -338,7 +338,7 @@ public:
if (IsAnyPlayerInMeleeRange()) if (IsAnyPlayerInMeleeRange())
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
else if (ballLightningEnabled && !IsAnyPlayerInMeleeRange()) else if (ballLightningEnabled && !IsAnyPlayerInMeleeRange() && !me->HasUnitState(UNIT_STATE_CASTING))
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat)) if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat))
me->CastSpell(target, SPELL_BALL_LIGHTNING, false); me->CastSpell(target, SPELL_BALL_LIGHTNING, false);
} }