Scripts/Naxxramas: Thaddius no longer evades on transition, and some general cleanup to that script. Fixes #23026.

This commit is contained in:
Treeston
2019-07-08 20:15:59 +02:00
parent c71e36acae
commit f2cd721d53

View File

@@ -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;