mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 15:40:45 +01:00
Scripts/Naxxramas: Thaddius no longer evades on transition, and some general cleanup to that script. Fixes #23026.
This commit is contained in:
@@ -64,8 +64,9 @@ enum Events
|
||||
EVENT_REVIVE_STALAGG, // timer until stalagg is revived (if feugen still lives)
|
||||
EVENT_TRANSITION_1, // timer until overload emote
|
||||
EVENT_TRANSITION_2, // timer until thaddius gets zapped by the coils
|
||||
EVENT_TRANSITION_3, // timer until thaddius engages
|
||||
EVENT_ENABLE_BALL_LIGHTNING // grace period after thaddius aggro after which he starts being a baller (e.g. tossing ball lightning at out of range targets)
|
||||
EVENT_TRANSITION_3, // timer until thaddius becomes attackable
|
||||
EVENT_ENGAGE, // timer until thaddius engages
|
||||
EVENT_ENABLE_BALL_LIGHTNING // grace period after thaddius aggro after which he starts tossing ball lightning at out of range targets
|
||||
};
|
||||
|
||||
enum Misc
|
||||
@@ -381,16 +382,7 @@ struct boss_thaddius : public BossAI
|
||||
me->RemoveAura(SPELL_THADDIUS_INACTIVE_VISUAL);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
|
||||
me->SetImmuneToPC(false);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
|
||||
DoZoneInCombat();
|
||||
if (Unit* closest = SelectTarget(SELECT_TARGET_MINDISTANCE, 0, 500.0f))
|
||||
AttackStart(closest);
|
||||
else // if there is no nearest target, then there is no target, meaning we should reset
|
||||
{
|
||||
BeginResetEncounter();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Creature* feugen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FEUGEN)))
|
||||
feugen->AI()->DoAction(ACTION_TRANSITION_3);
|
||||
@@ -401,6 +393,7 @@ struct boss_thaddius : public BossAI
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_ENGAGE, 2s, 0, PHASE_THADDIUS);
|
||||
events.ScheduleEvent(EVENT_ENABLE_BALL_LIGHTNING, 5s, 0, PHASE_THADDIUS);
|
||||
events.ScheduleEvent(EVENT_SHIFT, 10s, 0, PHASE_THADDIUS);
|
||||
events.ScheduleEvent(EVENT_CHAIN, 10s, 20s, 0, PHASE_THADDIUS);
|
||||
@@ -409,6 +402,8 @@ struct boss_thaddius : public BossAI
|
||||
break;
|
||||
case EVENT_ENABLE_BALL_LIGHTNING:
|
||||
ballLightningUnlocked = true;
|
||||
case EVENT_ENGAGE:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
break;
|
||||
case EVENT_SHIFT:
|
||||
me->CastStop(); // shift overrides all other spells
|
||||
@@ -438,6 +433,7 @@ struct boss_thaddius : public BossAI
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (events.IsInPhase(PHASE_THADDIUS) && !me->HasUnitState(UNIT_STATE_CASTING) && me->isAttackReady())
|
||||
{
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
@@ -472,35 +468,26 @@ public:
|
||||
struct npc_stalaggAI : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_stalaggAI(Creature* creature) : ScriptedAI(creature), _myCoil(ObjectGuid::Empty), _myCoilGO(ObjectGuid::Empty), isOverloading(false), refreshBeam(false), isFeignDeath(false)
|
||||
npc_stalaggAI(Creature* creature) : ScriptedAI(creature),
|
||||
instance(creature->GetInstanceScript()), powerSurgeTimer(), _myCoil(ObjectGuid::Empty), _myCoilGO(ObjectGuid::Empty), isOverloading(false), refreshBeam(false), isFeignDeath(false)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
SetBoundary(instance->GetBossBoundary(BOSS_THADDIUS));
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
void InitializeAI()
|
||||
{
|
||||
if (GameObject* coil = myCoilGO())
|
||||
coil->SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
// if the encounter reset while feigning death
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
isOverloading = false;
|
||||
isFeignDeath = false;
|
||||
powerSurgeTimer = 10 * IN_MILLISECONDS;
|
||||
|
||||
// force tesla coil state refresh
|
||||
refreshBeam = true;
|
||||
|
||||
powerSurgeTimer = 10 * IN_MILLISECONDS;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void EnterEvadeMode(EvadeReason /*reason*/) override
|
||||
{
|
||||
if (isFeignDeath || !me->IsAlive())
|
||||
return;
|
||||
if (Creature* thaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
|
||||
thaddius->AI()->DoAction(ACTION_STALAGG_RESET);
|
||||
}
|
||||
@@ -510,14 +497,6 @@ public:
|
||||
if (GameObject* coil = myCoilGO())
|
||||
coil->SetGoState(GO_STATE_READY);
|
||||
me->DespawnOrUnsummon(0, Hours(24*7)); // will be force respawned by thaddius
|
||||
me->setActive(false);
|
||||
me->SetFarVisible(false);
|
||||
}
|
||||
|
||||
void ResetEncounter()
|
||||
{
|
||||
me->Respawn(true);
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
@@ -537,21 +516,18 @@ public:
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
Talk(EMOTE_FEIGN_REVIVE);
|
||||
isFeignDeath = false;
|
||||
|
||||
refreshBeam = true; // force beam refresh
|
||||
|
||||
if (Creature* feugen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FEUGEN)))
|
||||
if (feugen->GetVictim())
|
||||
{
|
||||
AddThreat(feugen->EnsureVictim(), 0.0f);
|
||||
me->SetInCombatWith(feugen->EnsureVictim());
|
||||
}
|
||||
DoZoneInCombat();
|
||||
if (!me->IsEngaged())
|
||||
BeginResetEncounter();
|
||||
break;
|
||||
case ACTION_TRANSITION:
|
||||
me->KillSelf(); // true death
|
||||
me->DespawnOrUnsummon(0, Hours(24*7));
|
||||
|
||||
if (Creature* coil = myCoil())
|
||||
{
|
||||
@@ -567,6 +543,7 @@ public:
|
||||
case ACTION_TRANSITION_3:
|
||||
if (GameObject* coil = myCoilGO())
|
||||
coil->SetGoState(GO_STATE_READY);
|
||||
me->DespawnOrUnsummon(0, Hours(24 * 7));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -613,10 +590,10 @@ public:
|
||||
me->RemoveAllAuras();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->AttackStop();
|
||||
me->StopMoving();
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
|
||||
damage = 0;
|
||||
damage = me->GetHealth()-1;
|
||||
|
||||
// force beam refresh as we just removed auras
|
||||
refreshBeam = true;
|
||||
@@ -735,36 +712,27 @@ public:
|
||||
struct npc_feugenAI : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_feugenAI(Creature* creature) : ScriptedAI(creature), _myCoil(ObjectGuid::Empty), _myCoilGO(ObjectGuid::Empty), isOverloading(false), refreshBeam(false), isFeignDeath(false)
|
||||
npc_feugenAI(Creature* creature) : ScriptedAI(creature),
|
||||
instance(creature->GetInstanceScript()), magneticPullTimer(), staticFieldTimer(), _myCoil(ObjectGuid::Empty), _myCoilGO(ObjectGuid::Empty), isOverloading(false), refreshBeam(false), isFeignDeath(false)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
SetBoundary(instance->GetBossBoundary(BOSS_THADDIUS));
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
void InitializeAI() override
|
||||
{
|
||||
if (GameObject* coil = myCoilGO())
|
||||
coil->SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
// if the encounter reset while feigning death
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
isOverloading = false;
|
||||
isFeignDeath = false;
|
||||
staticFieldTimer = 6 * IN_MILLISECONDS;
|
||||
magneticPullTimer = 20 * IN_MILLISECONDS;
|
||||
|
||||
// force coil state to refresh
|
||||
refreshBeam = true;
|
||||
|
||||
staticFieldTimer = 6 * IN_MILLISECONDS;
|
||||
magneticPullTimer = 20 * IN_MILLISECONDS;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
if (isFeignDeath || !me->IsAlive())
|
||||
return;
|
||||
if (Creature* thaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
|
||||
thaddius->AI()->DoAction(ACTION_FEUGEN_RESET);
|
||||
}
|
||||
@@ -774,8 +742,6 @@ public:
|
||||
if (GameObject* coil = myCoilGO())
|
||||
coil->SetGoState(GO_STATE_READY);
|
||||
me->DespawnOrUnsummon(0, Hours(24*7)); // will be force respawned by thaddius
|
||||
me->setActive(false);
|
||||
me->SetFarVisible(false);
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
@@ -795,6 +761,7 @@ public:
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
Talk(EMOTE_FEIGN_REVIVE);
|
||||
isFeignDeath = false;
|
||||
|
||||
@@ -811,7 +778,6 @@ public:
|
||||
break;
|
||||
case ACTION_TRANSITION:
|
||||
me->KillSelf(); // true death this time around
|
||||
me->DespawnOrUnsummon(0, Hours(24*7));
|
||||
|
||||
if (Creature* coil = myCoil())
|
||||
{
|
||||
@@ -827,6 +793,7 @@ public:
|
||||
case ACTION_TRANSITION_3:
|
||||
if (GameObject* coil = myCoilGO())
|
||||
coil->SetGoState(GO_STATE_READY);
|
||||
me->DespawnOrUnsummon(0, Hours(24 * 7));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -868,14 +835,14 @@ public:
|
||||
if (Creature* thaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
|
||||
thaddius->AI()->DoAction(ACTION_FEUGEN_DIED);
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->RemoveAllAuras();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->AttackStop();
|
||||
me->StopMoving();
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
damage = 0;
|
||||
damage = me->GetHealth()-1;
|
||||
|
||||
// force beam refresh as we just removed auras
|
||||
refreshBeam = true;
|
||||
|
||||
Reference in New Issue
Block a user