mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 17:05:44 +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_REVIVE_STALAGG, // timer until stalagg is revived (if feugen still lives)
|
||||||
EVENT_TRANSITION_1, // timer until overload emote
|
EVENT_TRANSITION_1, // timer until overload emote
|
||||||
EVENT_TRANSITION_2, // timer until thaddius gets zapped by the coils
|
EVENT_TRANSITION_2, // timer until thaddius gets zapped by the coils
|
||||||
EVENT_TRANSITION_3, // timer until thaddius engages
|
EVENT_TRANSITION_3, // timer until thaddius becomes attackable
|
||||||
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_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
|
enum Misc
|
||||||
@@ -381,16 +382,7 @@ struct boss_thaddius : public BossAI
|
|||||||
me->RemoveAura(SPELL_THADDIUS_INACTIVE_VISUAL);
|
me->RemoveAura(SPELL_THADDIUS_INACTIVE_VISUAL);
|
||||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
|
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
|
||||||
me->SetImmuneToPC(false);
|
me->SetImmuneToPC(false);
|
||||||
me->SetReactState(REACT_AGGRESSIVE);
|
|
||||||
|
|
||||||
DoZoneInCombat();
|
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)))
|
if (Creature* feugen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FEUGEN)))
|
||||||
feugen->AI()->DoAction(ACTION_TRANSITION_3);
|
feugen->AI()->DoAction(ACTION_TRANSITION_3);
|
||||||
@@ -401,6 +393,7 @@ struct boss_thaddius : public BossAI
|
|||||||
|
|
||||||
Talk(SAY_AGGRO);
|
Talk(SAY_AGGRO);
|
||||||
|
|
||||||
|
events.ScheduleEvent(EVENT_ENGAGE, 2s, 0, PHASE_THADDIUS);
|
||||||
events.ScheduleEvent(EVENT_ENABLE_BALL_LIGHTNING, 5s, 0, PHASE_THADDIUS);
|
events.ScheduleEvent(EVENT_ENABLE_BALL_LIGHTNING, 5s, 0, PHASE_THADDIUS);
|
||||||
events.ScheduleEvent(EVENT_SHIFT, 10s, 0, PHASE_THADDIUS);
|
events.ScheduleEvent(EVENT_SHIFT, 10s, 0, PHASE_THADDIUS);
|
||||||
events.ScheduleEvent(EVENT_CHAIN, 10s, 20s, 0, PHASE_THADDIUS);
|
events.ScheduleEvent(EVENT_CHAIN, 10s, 20s, 0, PHASE_THADDIUS);
|
||||||
@@ -409,6 +402,8 @@ struct boss_thaddius : public BossAI
|
|||||||
break;
|
break;
|
||||||
case EVENT_ENABLE_BALL_LIGHTNING:
|
case EVENT_ENABLE_BALL_LIGHTNING:
|
||||||
ballLightningUnlocked = true;
|
ballLightningUnlocked = true;
|
||||||
|
case EVENT_ENGAGE:
|
||||||
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
break;
|
break;
|
||||||
case EVENT_SHIFT:
|
case EVENT_SHIFT:
|
||||||
me->CastStop(); // shift overrides all other spells
|
me->CastStop(); // shift overrides all other spells
|
||||||
@@ -438,6 +433,7 @@ struct boss_thaddius : public BossAI
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (events.IsInPhase(PHASE_THADDIUS) && !me->HasUnitState(UNIT_STATE_CASTING) && me->isAttackReady())
|
if (events.IsInPhase(PHASE_THADDIUS) && !me->HasUnitState(UNIT_STATE_CASTING) && me->isAttackReady())
|
||||||
{
|
{
|
||||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||||
@@ -472,35 +468,26 @@ public:
|
|||||||
struct npc_stalaggAI : public ScriptedAI
|
struct npc_stalaggAI : public ScriptedAI
|
||||||
{
|
{
|
||||||
public:
|
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();
|
instance = creature->GetInstanceScript();
|
||||||
SetBoundary(instance->GetBossBoundary(BOSS_THADDIUS));
|
SetBoundary(instance->GetBossBoundary(BOSS_THADDIUS));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
void InitializeAI()
|
||||||
{
|
{
|
||||||
if (GameObject* coil = myCoilGO())
|
if (GameObject* coil = myCoilGO())
|
||||||
coil->SetGoState(GO_STATE_ACTIVE);
|
coil->SetGoState(GO_STATE_ACTIVE);
|
||||||
|
|
||||||
// if the encounter reset while feigning death
|
powerSurgeTimer = 10 * IN_MILLISECONDS;
|
||||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
|
||||||
me->SetReactState(REACT_AGGRESSIVE);
|
|
||||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
|
||||||
isOverloading = false;
|
|
||||||
isFeignDeath = false;
|
|
||||||
|
|
||||||
// force tesla coil state refresh
|
// force tesla coil state refresh
|
||||||
refreshBeam = true;
|
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)))
|
if (Creature* thaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
|
||||||
thaddius->AI()->DoAction(ACTION_STALAGG_RESET);
|
thaddius->AI()->DoAction(ACTION_STALAGG_RESET);
|
||||||
}
|
}
|
||||||
@@ -510,14 +497,6 @@ public:
|
|||||||
if (GameObject* coil = myCoilGO())
|
if (GameObject* coil = myCoilGO())
|
||||||
coil->SetGoState(GO_STATE_READY);
|
coil->SetGoState(GO_STATE_READY);
|
||||||
me->DespawnOrUnsummon(0, Hours(24*7)); // will be force respawned by thaddius
|
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
|
void DoAction(int32 action) override
|
||||||
@@ -537,21 +516,18 @@ public:
|
|||||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||||
me->SetReactState(REACT_AGGRESSIVE);
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||||
|
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||||
Talk(EMOTE_FEIGN_REVIVE);
|
Talk(EMOTE_FEIGN_REVIVE);
|
||||||
isFeignDeath = false;
|
isFeignDeath = false;
|
||||||
|
|
||||||
refreshBeam = true; // force beam refresh
|
refreshBeam = true; // force beam refresh
|
||||||
|
|
||||||
if (Creature* feugen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FEUGEN)))
|
DoZoneInCombat();
|
||||||
if (feugen->GetVictim())
|
if (!me->IsEngaged())
|
||||||
{
|
BeginResetEncounter();
|
||||||
AddThreat(feugen->EnsureVictim(), 0.0f);
|
|
||||||
me->SetInCombatWith(feugen->EnsureVictim());
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ACTION_TRANSITION:
|
case ACTION_TRANSITION:
|
||||||
me->KillSelf(); // true death
|
me->KillSelf(); // true death
|
||||||
me->DespawnOrUnsummon(0, Hours(24*7));
|
|
||||||
|
|
||||||
if (Creature* coil = myCoil())
|
if (Creature* coil = myCoil())
|
||||||
{
|
{
|
||||||
@@ -567,6 +543,7 @@ public:
|
|||||||
case ACTION_TRANSITION_3:
|
case ACTION_TRANSITION_3:
|
||||||
if (GameObject* coil = myCoilGO())
|
if (GameObject* coil = myCoilGO())
|
||||||
coil->SetGoState(GO_STATE_READY);
|
coil->SetGoState(GO_STATE_READY);
|
||||||
|
me->DespawnOrUnsummon(0, Hours(24 * 7));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -613,10 +590,10 @@ public:
|
|||||||
me->RemoveAllAuras();
|
me->RemoveAllAuras();
|
||||||
me->SetReactState(REACT_PASSIVE);
|
me->SetReactState(REACT_PASSIVE);
|
||||||
me->AttackStop();
|
me->AttackStop();
|
||||||
me->StopMoving();
|
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||||
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||||
|
|
||||||
damage = 0;
|
damage = me->GetHealth()-1;
|
||||||
|
|
||||||
// force beam refresh as we just removed auras
|
// force beam refresh as we just removed auras
|
||||||
refreshBeam = true;
|
refreshBeam = true;
|
||||||
@@ -735,36 +712,27 @@ public:
|
|||||||
struct npc_feugenAI : public ScriptedAI
|
struct npc_feugenAI : public ScriptedAI
|
||||||
{
|
{
|
||||||
public:
|
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();
|
instance = creature->GetInstanceScript();
|
||||||
SetBoundary(instance->GetBossBoundary(BOSS_THADDIUS));
|
SetBoundary(instance->GetBossBoundary(BOSS_THADDIUS));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
void InitializeAI() override
|
||||||
{
|
{
|
||||||
if (GameObject* coil = myCoilGO())
|
if (GameObject* coil = myCoilGO())
|
||||||
coil->SetGoState(GO_STATE_ACTIVE);
|
coil->SetGoState(GO_STATE_ACTIVE);
|
||||||
|
|
||||||
// if the encounter reset while feigning death
|
staticFieldTimer = 6 * IN_MILLISECONDS;
|
||||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
magneticPullTimer = 20 * IN_MILLISECONDS;
|
||||||
me->SetReactState(REACT_AGGRESSIVE);
|
|
||||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
|
||||||
isOverloading = false;
|
|
||||||
isFeignDeath = false;
|
|
||||||
|
|
||||||
// force coil state to refresh
|
// force coil state to refresh
|
||||||
refreshBeam = true;
|
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)))
|
if (Creature* thaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
|
||||||
thaddius->AI()->DoAction(ACTION_FEUGEN_RESET);
|
thaddius->AI()->DoAction(ACTION_FEUGEN_RESET);
|
||||||
}
|
}
|
||||||
@@ -774,8 +742,6 @@ public:
|
|||||||
if (GameObject* coil = myCoilGO())
|
if (GameObject* coil = myCoilGO())
|
||||||
coil->SetGoState(GO_STATE_READY);
|
coil->SetGoState(GO_STATE_READY);
|
||||||
me->DespawnOrUnsummon(0, Hours(24*7)); // will be force respawned by thaddius
|
me->DespawnOrUnsummon(0, Hours(24*7)); // will be force respawned by thaddius
|
||||||
me->setActive(false);
|
|
||||||
me->SetFarVisible(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoAction(int32 action) override
|
void DoAction(int32 action) override
|
||||||
@@ -795,6 +761,7 @@ public:
|
|||||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||||
me->SetReactState(REACT_AGGRESSIVE);
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||||
|
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||||
Talk(EMOTE_FEIGN_REVIVE);
|
Talk(EMOTE_FEIGN_REVIVE);
|
||||||
isFeignDeath = false;
|
isFeignDeath = false;
|
||||||
|
|
||||||
@@ -811,7 +778,6 @@ public:
|
|||||||
break;
|
break;
|
||||||
case ACTION_TRANSITION:
|
case ACTION_TRANSITION:
|
||||||
me->KillSelf(); // true death this time around
|
me->KillSelf(); // true death this time around
|
||||||
me->DespawnOrUnsummon(0, Hours(24*7));
|
|
||||||
|
|
||||||
if (Creature* coil = myCoil())
|
if (Creature* coil = myCoil())
|
||||||
{
|
{
|
||||||
@@ -827,6 +793,7 @@ public:
|
|||||||
case ACTION_TRANSITION_3:
|
case ACTION_TRANSITION_3:
|
||||||
if (GameObject* coil = myCoilGO())
|
if (GameObject* coil = myCoilGO())
|
||||||
coil->SetGoState(GO_STATE_READY);
|
coil->SetGoState(GO_STATE_READY);
|
||||||
|
me->DespawnOrUnsummon(0, Hours(24 * 7));
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -868,14 +835,14 @@ public:
|
|||||||
if (Creature* thaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
|
if (Creature* thaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
|
||||||
thaddius->AI()->DoAction(ACTION_FEUGEN_DIED);
|
thaddius->AI()->DoAction(ACTION_FEUGEN_DIED);
|
||||||
|
|
||||||
|
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||||
me->RemoveAllAuras();
|
me->RemoveAllAuras();
|
||||||
me->SetReactState(REACT_PASSIVE);
|
me->SetReactState(REACT_PASSIVE);
|
||||||
me->AttackStop();
|
me->AttackStop();
|
||||||
me->StopMoving();
|
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||||
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
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
|
// force beam refresh as we just removed auras
|
||||||
refreshBeam = true;
|
refreshBeam = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user