Revert "Merge branch 'master' into Playerbot"

This reverts commit 9973151927, reversing
changes made to 6f5b504e4c.
This commit is contained in:
Yunfan Li
2024-09-13 17:13:32 +08:00
parent 7e8c2d2887
commit 2358b256f2
32 changed files with 499 additions and 539 deletions
@@ -94,7 +94,7 @@ public:
_conflagrateThreat = me->GetThreatMgr().GetThreat(me->GetVictim());
me->GetThreatMgr().ModifyThreatByPercent(target, -100);
}
events.ScheduleEvent(EVENT_CONFLAGRATION, 18s, 25s);
events.ScheduleEvent(EVENT_CONFLAGRATION, 10s, 13s);
events.ScheduleEvent(EVENT_CHECK_CONFLAGRATION_TARGET, 10s);
break;
case EVENT_THUNDERCLAP:
@@ -89,7 +89,6 @@ struct boss_nalorakk : public BossAI
{
boss_nalorakk(Creature* creature) : BossAI(creature, DATA_NALORAKKEVENT)
{
_phase = PHASE_SEND_GUARDS_1;
_ranIntro = false;
_active = true;
creature->SetReactState(REACT_PASSIVE);
@@ -65,110 +65,127 @@ enum Misc
GROUP_DELAY = 1
};
struct boss_gurtogg_bloodboil : public BossAI
class boss_gurtogg_bloodboil : public CreatureScript
{
boss_gurtogg_bloodboil(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL), _recentlySpoken(false) { }
public:
boss_gurtogg_bloodboil() : CreatureScript("boss_gurtogg_bloodboil") { }
void Reset() override
CreatureAI* GetAI(Creature* creature) const override
{
BossAI::Reset();
_recentlySpoken = false;
return GetBlackTempleAI<boss_gurtogg_bloodboilAI>(creature);
}
void JustEngagedWith(Unit* who) override
struct boss_gurtogg_bloodboilAI : public BossAI
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL), _recentlySpoken(false) { }
DoCastSelf(SPELL_ACIDIC_WOUND, true);
ScheduleTimedEvent(10s, [&] {
if (!me->HasAura(SPELL_FEL_RAGE_SELF))
me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false);
}, 10s);
ScheduleTimedEvent(38s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1);
}, 30s);
ScheduleTimedEvent(14s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1);
}, 20s);
ScheduleTimedEvent(5s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1);
}, 15s);
ScheduleTimedEvent(1min, [&] {
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true))
{
me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT);
DoCastSelf(SPELL_FEL_RAGE_SELF, true);
DoCast(target, SPELL_FEL_RAGE_TARGET, true);
DoCast(target, SPELL_FEL_RAGE_2, true);
DoCast(target, SPELL_FEL_RAGE_3, true);
DoCast(target, SPELL_FEL_RAGE_SIZE, true);
target->CastSpell(me, SPELL_TAUNT_GURTOGG, true);
DoCast(target, SPELL_FEL_GEYSER_SUMMON, true);
DoCastSelf(SPELL_FEL_GEYSER_STUN, true);
DoCastSelf(SPELL_INSIGNIFICANCE, true);
me->m_Events.AddEventAtOffset([&] {
DoCastVictim(SPELL_CHARGE);
}, 2s);
scheduler.DelayGroup(GROUP_DELAY, 30s);
}
}, 90s);
ScheduleUniqueTimedEvent(10min, [&] {
Talk(SAY_ENRAGE);
DoCastSelf(SPELL_BERSERK, true);
}, EVENT_SPELL_BERSERK);
scheduler.Schedule(28s, [this](TaskContext context) {
context.SetGroup(GROUP_DELAY);
DoCastVictim(SPELL_BEWILDERING_STRIKE);
context.Repeat(30s);
});
}
bool CanAIAttack(Unit const* who) const override
{
return !who->IsImmunedToDamage(SPELL_SCHOOL_MASK_ALL);
}
void KilledUnit(Unit* /*victim*/) override
{
if (!_recentlySpoken)
void Reset() override
{
Talk(SAY_SLAY);
me->m_Events.AddEventAtOffset([&] {
_recentlySpoken = false;
}, 6s);
BossAI::Reset();
_recentlySpoken = false;
}
}
void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
summon->CastSpell(summon, SPELL_FEL_GEYSER_DAMAGE, false);
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
DoCastSelf(SPELL_ACIDIC_WOUND, true);
bool CheckEvadeIfOutOfCombatArea() const override
{
return me->GetHomePosition().GetExactDist2d(me) > 105.0f;
}
ScheduleTimedEvent(10s, [&] {
me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false);
}, 10s);
private:
bool _recentlySpoken;
ScheduleTimedEvent(38s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1);
}, 30s);
ScheduleTimedEvent(14s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1);
}, 20s);
ScheduleTimedEvent(5s, [&] {
DoCastVictim(me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1);
}, 15s);
ScheduleTimedEvent(1min, [&] {
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true))
{
me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT);
DoCastSelf(SPELL_FEL_RAGE_SELF, true);
DoCast(target, SPELL_FEL_RAGE_TARGET, true);
DoCast(target, SPELL_FEL_RAGE_2, true);
DoCast(target, SPELL_FEL_RAGE_3, true);
DoCast(target, SPELL_FEL_RAGE_SIZE, true);
target->CastSpell(me, SPELL_TAUNT_GURTOGG, true);
DoCast(target, SPELL_FEL_GEYSER_SUMMON, true);
DoCastSelf(SPELL_FEL_GEYSER_STUN, true);
DoCastSelf(SPELL_INSIGNIFICANCE, true);
me->m_Events.AddEventAtOffset([&] {
DoCastVictim(SPELL_CHARGE);
}, 2s);
scheduler.DelayGroup(GROUP_DELAY, 30s);
}
}, 90s);
ScheduleUniqueTimedEvent(10min, [&] {
Talk(SAY_ENRAGE);
DoCastSelf(SPELL_BERSERK, true);
}, EVENT_SPELL_BERSERK);
scheduler.Schedule(28s, [this](TaskContext context) {
context.SetGroup(GROUP_DELAY);
DoCastVictim(SPELL_BEWILDERING_STRIKE);
context.Repeat(30s);
});
}
void KilledUnit(Unit* /*victim*/) override
{
if (!_recentlySpoken)
{
Talk(SAY_SLAY);
me->m_Events.AddEventAtOffset([&] {
_recentlySpoken = false;
}, 6s);
}
}
void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
summon->CastSpell(summon, SPELL_FEL_GEYSER_DAMAGE, false);
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
scheduler.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady();
}
bool CheckEvadeIfOutOfCombatArea() const override
{
return me->GetHomePosition().GetExactDist2d(me) > 105.0f;
}
private:
bool _recentlySpoken;
};
};
class spell_gurtogg_bloodboil : public SpellScript
@@ -214,7 +231,7 @@ class spell_gurtogg_eject : public SpellScript
void AddSC_boss_gurtogg_bloodboil()
{
RegisterBlackTempleCreatureAI(boss_gurtogg_bloodboil);
new boss_gurtogg_bloodboil();
RegisterSpellScript(spell_gurtogg_bloodboil);
RegisterSpellScript(spell_gurtogg_eject);
}
@@ -1209,10 +1209,7 @@ enum WarbladeTear
struct npc_blade_of_azzinoth : public ScriptedAI
{
npc_blade_of_azzinoth(Creature* creature) : ScriptedAI(creature)
{
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
}
npc_blade_of_azzinoth(Creature* creature) : ScriptedAI(creature) { }
void IsSummonedBy(WorldObject* /*summoner*/) override
{
@@ -1260,13 +1257,12 @@ enum FlameAzzinoth
struct npc_flame_of_azzinoth : public ScriptedAI
{
npc_flame_of_azzinoth(Creature* creature) : ScriptedAI(creature) { }
npc_flame_of_azzinoth(Creature* creature) : ScriptedAI(creature), _bladeSummoner(nullptr) { }
void IsSummonedBy(WorldObject* /*summoner*/) override
{
// Flame is set to be Illidan's summon, so we check for nearest blade
if (Creature* _blade = me->FindNearestCreature(NPC_BLADE_OF_AZZINOTH, 15.0f))
_bladeGUID = _blade->GetGUID();
_bladeSummoner = me->FindNearestCreature(NPC_BLADE_OF_AZZINOTH, 15.0f);
me->SetCorpseDelay(2);
me->SetReactState(REACT_DEFENSIVE);
@@ -1289,8 +1285,8 @@ struct npc_flame_of_azzinoth : public ScriptedAI
void JustEngagedWith(Unit* /*who*/) override
{
ScheduleTimedEvent(10s, [&] {
if (Creature* _blade = ObjectAccessor::GetCreature(*me, _bladeGUID))
if (Unit* target = _blade->AI()->SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
if (_bladeSummoner)
if (Unit* target = _bladeSummoner->AI()->SelectTarget(SelectTargetMethod::Random, 0, 30.f, true))
DoCast(target, SPELL_CHARGE);
}, 5s, 20s);
@@ -1305,7 +1301,7 @@ struct npc_flame_of_azzinoth : public ScriptedAI
}
private:
ObjectGuid _bladeGUID;
Creature* _bladeSummoner;
};
class spell_illidan_draw_soul : public SpellScript
@@ -262,7 +262,7 @@ struct boss_illidari_council_memberAI : public ScriptedAI
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_COUNCIL_SLAY);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
}
}
@@ -303,12 +303,12 @@ struct boss_gathios_the_shatterer : public boss_illidari_council_memberAI
void JustEngagedWith(Unit* who) override
{
boss_illidari_council_memberAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_SPELL_BLESSING, 10s);
events.ScheduleEvent(EVENT_SPELL_AURA, 0s);
events.ScheduleEvent(EVENT_SPELL_SEAL, 2s);
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 6s);
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 15s);
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 4s);
events.ScheduleEvent(EVENT_SPELL_BLESSING, 10000);
events.ScheduleEvent(EVENT_SPELL_AURA, 0);
events.ScheduleEvent(EVENT_SPELL_SEAL, 2000);
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 6000);
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 8000);
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 4000);
}
void UpdateAI(uint32 diff) override
@@ -328,18 +328,18 @@ struct boss_gathios_the_shatterer : public boss_illidari_council_memberAI
me->CastSpell(member, _toggleBlessing ? SPELL_BLESSING_OF_PROTECTION : SPELL_BLESSING_OF_SPELL_WARDING);
_toggleBlessing = !_toggleBlessing;
}
events.ScheduleEvent(EVENT_SPELL_BLESSING, 15s);
events.ScheduleEvent(EVENT_SPELL_BLESSING, 15000);
break;
case EVENT_SPELL_AURA:
me->CastSpell(me, _toggleAura ? SPELL_DEVOTION_AURA : SPELL_CHROMATIC_RESISTANCE_AURA);
_toggleAura = !_toggleAura;
events.ScheduleEvent(EVENT_SPELL_AURA, 60s);
events.ScheduleEvent(EVENT_SPELL_AURA, 60000);
break;
case EVENT_SPELL_CONSECRATION:
if (roll_chance_i(50))
Talk(SAY_COUNCIL_SPECIAL);
me->CastSpell(me, SPELL_CONSECRATION, false);
events.ScheduleEvent(EVENT_SPELL_AURA, 30s);
events.ScheduleEvent(EVENT_SPELL_AURA, 30000);
break;
case EVENT_SPELL_HAMMER_OF_JUSTICE:
if (Unit* target = me->GetVictim())
@@ -349,16 +349,16 @@ struct boss_gathios_the_shatterer : public boss_illidari_council_memberAI
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 20s);
break;
}
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0s);
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0);
break;
case EVENT_SPELL_SEAL:
me->CastSpell(me, _toggleSeal ? SPELL_SEAL_OF_COMMAND : SPELL_SEAL_OF_BLOOD);
_toggleSeal = !_toggleSeal;
events.ScheduleEvent(EVENT_SPELL_SEAL, 20s);
events.ScheduleEvent(EVENT_SPELL_SEAL, 20000);
break;
case EVENT_SPELL_JUDGEMENT:
me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT, false);
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 16s, 20s);
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 20000);
break;
}
@@ -493,10 +493,10 @@ struct boss_lady_malande : public boss_illidari_council_memberAI
void JustEngagedWith(Unit* who) override
{
boss_illidari_council_memberAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 10s);
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20s);
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 5s);
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 15s);
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 10000);
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000);
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 5000);
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 15000);
}
void UpdateAI(uint32 diff) override
@@ -512,22 +512,22 @@ struct boss_lady_malande : public boss_illidari_council_memberAI
{
case EVENT_SPELL_CIRCLE_OF_HEALING:
me->CastSpell(me, SPELL_CIRCLE_OF_HEALING, false);
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20s);
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000);
break;
case EVENT_SPELL_REFLECTIVE_SHIELD:
if (roll_chance_i(50))
Talk(SAY_COUNCIL_SPECIAL);
me->CastSpell(me, SPELL_REFLECTIVE_SHIELD, false);
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40s);
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40000);
break;
case EVENT_SPELL_DIVINE_WRATH:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
me->CastSpell(target, SPELL_DIVINE_WRATH, false);
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20s);
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20000);
break;
case EVENT_SPELL_EMPOWERED_SMITE:
me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE, false);
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3s);
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3000);
break;
}
}
@@ -541,8 +541,8 @@ struct boss_veras_darkshadow : public boss_illidari_council_memberAI
{
me->SetCanDualWield(true);
boss_illidari_council_memberAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_SPELL_VANISH, 10s);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 90s);
events.ScheduleEvent(EVENT_SPELL_VANISH, 10000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 900000);
}
void JustSummoned(Creature* summon) override
@@ -566,8 +566,8 @@ struct boss_veras_darkshadow : public boss_illidari_council_memberAI
Talk(SAY_COUNCIL_SPECIAL);
me->CastSpell(me, SPELL_DEADLY_STRIKE, false);
me->CastSpell(me, SPELL_VANISH, false);
events.ScheduleEvent(EVENT_SPELL_VANISH, 60s);
events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29s);
events.ScheduleEvent(EVENT_SPELL_VANISH, 60000);
events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29000);
break;
case EVENT_SPELL_VANISH_OUT:
me->CastSpell(me, SPELL_VANISH_OUT, false);
@@ -220,7 +220,6 @@ struct npc_akama_shade : public ScriptedAI
DoCastSelf(SPELL_STEALTH, true);
me->SetWalk(true);
_sayLowHealth = false;
_died = false;
scheduler.CancelAll();
}
@@ -233,14 +232,14 @@ struct npc_akama_shade : public ScriptedAI
case POINT_ENGAGE:
me->SetHomePosition(me->GetPosition());
me->SetFaction(FACTION_ENGAGE);
DoCastSelf(SPELL_AKAMA_SOUL_CHANNEL, true);
DoCast(me, SPELL_AKAMA_SOUL_CHANNEL, true);
break;
case POINT_OUTRO:
DoCastSelf(SPELL_AKAMA_SOUL_RETRIEVE, true);
ScheduleUniqueTimedEvent(15600ms, [&]
{
Talk(SAY_BROKEN_FREE_0);
me->SummonCreatureGroup(SUMMON_GROUP_BROKENS);
Talk(SAY_BROKEN_FREE_0);
me->SummonCreatureGroup(SUMMON_GROUP_BROKENS);
}, 1);
ScheduleUniqueTimedEvent(26550ms, [&]
{
@@ -276,19 +275,6 @@ struct npc_akama_shade : public ScriptedAI
_sayLowHealth = true;
Talk(SAY_LOW_HEALTH);
}
else if (damage >= me->GetHealth() && !_died)
{
damage = me->GetHealth() - 1;
Talk(SAY_DEATH);
if (Creature* shade = instance->GetCreature(DATA_SHADE_OF_AKAMA))
{
shade->SetHomePosition(shade->GetHomePosition());
shade->AI()->EnterEvadeMode();
}
me->DespawnOrUnsummon();
ScriptedAI::EnterEvadeMode(EvadeReason::EVADE_REASON_OTHER);
}
}
void DoAction(int32 param) override
@@ -312,6 +298,18 @@ struct npc_akama_shade : public ScriptedAI
void EnterEvadeMode(EvadeReason /*why*/) override { }
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
if (Creature* shade = instance->GetCreature(DATA_SHADE_OF_AKAMA))
{
shade->SetHomePosition(shade->GetHomePosition());
shade->AI()->EnterEvadeMode();
}
me->DespawnOrUnsummon();
}
void JustEngagedWith(Unit* /*who*/) override
{
ScheduleTimedEvent(2s, [&]
@@ -340,7 +338,6 @@ struct npc_akama_shade : public ScriptedAI
private:
bool _sayLowHealth;
bool _died;
};
struct npc_creature_generator_akama : public ScriptedAI
@@ -448,18 +445,27 @@ private:
struct npc_ashtongue_sorcerer : public NullCreatureAI
{
npc_ashtongue_sorcerer(Creature* creature) : NullCreatureAI(creature) { }
npc_ashtongue_sorcerer(Creature* creature) : NullCreatureAI(creature)
{
instance = creature->GetInstanceScript();
}
void MovementInform(uint32 type, uint32 point) override
{
if (type == POINT_MOTION_TYPE && point == POINT_ENGAGE)
me->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL, true);
}
private:
InstanceScript* instance;
};
struct npc_ashtongue_channeler : public NullCreatureAI
{
npc_ashtongue_channeler(Creature* creature) : NullCreatureAI(creature) { }
npc_ashtongue_channeler(Creature* creature) : NullCreatureAI(creature)
{
instance = creature->GetInstanceScript();
}
void Reset() override
{
@@ -478,6 +484,7 @@ struct npc_ashtongue_channeler : public NullCreatureAI
}
private:
InstanceScript* instance;
TaskScheduler scheduler;
};
@@ -294,6 +294,11 @@ struct boss_kaelthas : public BossAI
BossAI::AttackStart(who);
}
void JustReachedHome() override
{
Reset();
}
void MoveInLineOfSight(Unit* who) override
{
if (_phase == PHASE_NONE && who->IsPlayer() && me->IsValidAttackTarget(who))