Merge branch 'master' into Playerbot

This commit is contained in:
Yunfan Li
2025-05-16 19:42:56 +08:00
19 changed files with 310 additions and 44 deletions
@@ -259,12 +259,12 @@ struct boss_kiljaeden : public BossAI
ScheduleHealthCheckEvent(85, [&]{
_phase = PHASE_DARKNESS;
if (Creature* kalec = instance->GetCreature(DATA_KALECGOS_KJ))
kalec->AI()->Talk(SAY_KALECGOS_AWAKEN, 16s);
kalec->AI()->Talk(SAY_KALECGOS_AWAKEN, 21s);
if (Creature* anveena = instance->GetCreature(DATA_ANVEENA))
anveena->AI()->Talk(SAY_ANVEENA_IMPRISONED, 22s);
anveena->AI()->Talk(SAY_ANVEENA_IMPRISONED, 26s);
Talk(SAY_KJ_PHASE3, 28s);
Talk(SAY_KJ_PHASE3, 32s);
scheduler.CancelAll();
@@ -274,7 +274,7 @@ struct boss_kiljaeden : public BossAI
if (Creature* kalec = instance->GetCreature(DATA_KALECGOS_KJ))
kalec->AI()->Talk(SAY_KALECGOS_READY1);
EmpowerOrb(false);
}, 35s);
}, 38s);
me->m_Events.AddEventAtOffset([&] {
Talk(SAY_KJ_REFLECTION);
@@ -286,11 +286,11 @@ struct boss_kiljaeden : public BossAI
DoCastSelf(SPELL_SHADOW_SPIKE);
});
ScheduleTimedEvent(3s, [&] {
ScheduleTimedEvent(31s, [&] {
DoCastSelf(SPELL_FLAME_DART);
}, 10s);
}, 20s);
ScheduleTimedEvent(16s, [&] {
ScheduleTimedEvent(55s, [&] {
Talk(EMOTE_KJ_DARKNESS);
DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS);
}, 45s);
@@ -299,12 +299,12 @@ struct boss_kiljaeden : public BossAI
ScheduleHealthCheckEvent(55, [&] {
_phase = PHASE_ARMAGEDDON;
if (Creature* kalec = instance->GetCreature(DATA_KALECGOS_KJ))
kalec->AI()->Talk(SAY_KALECGOS_LETGO, 16s);
kalec->AI()->Talk(SAY_KALECGOS_LETGO, 18s);
if (Creature* anveena = instance->GetCreature(DATA_ANVEENA))
anveena->AI()->Talk(SAY_ANVEENA_LOST, 22s);
anveena->AI()->Talk(SAY_ANVEENA_LOST, 25s);
Talk(SAY_KJ_PHASE4, 28s);
Talk(SAY_KJ_PHASE4, 32s);
scheduler.CancelAll();
@@ -312,7 +312,7 @@ struct boss_kiljaeden : public BossAI
if (Creature* kalec = instance->GetCreature(DATA_KALECGOS_KJ))
kalec->AI()->Talk(SAY_KALECGOS_READY2);
EmpowerOrb(false);
}, 35s);
}, 38s);
scheduler.Schedule(1s, [this](TaskContext)
{
@@ -326,7 +326,11 @@ struct boss_kiljaeden : public BossAI
ScheduleBasicAbilities();
});
ScheduleTimedEvent(15s, [&] {
ScheduleTimedEvent(28s, [&] {
DoCastSelf(SPELL_FLAME_DART);
}, 20s);
ScheduleTimedEvent(64s, [&] {
me->RemoveAurasDueToSpell(SPELL_ARMAGEDDON_PERIODIC);
Talk(EMOTE_KJ_DARKNESS);
DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS);
@@ -362,14 +366,14 @@ struct boss_kiljaeden : public BossAI
if (Creature* kalec = instance->GetCreature(DATA_KALECGOS_KJ))
{
kalec->AI()->Talk(SAY_KALECGOS_FOCUS, 8s);
kalec->AI()->Talk(SAY_KALECGOS_FATE, 20s + 200ms);
kalec->AI()->Talk(SAY_KALECGOS_FOCUS, 9s);
kalec->AI()->Talk(SAY_KALECGOS_FATE, 22s + 200ms);
}
if (Creature* anveena = instance->GetCreature(DATA_ANVEENA))
{
anveena->AI()->Talk(SAY_ANVEENA_KALEC, 18s);
anveena->AI()->Talk(SAY_ANVEENA_GOODBYE, 25s);
anveena->AI()->Talk(SAY_ANVEENA_KALEC, 20s);
anveena->AI()->Talk(SAY_ANVEENA_GOODBYE, 29s);
}
me->m_Events.AddEventAtOffset([&] {
@@ -378,7 +382,7 @@ struct boss_kiljaeden : public BossAI
anveena->RemoveAllAuras();
anveena->DespawnOrUnsummon(3500);
}
}, 28s);
}, 34s);
me->m_Events.AddEventAtOffset([&] {
if (Creature* anveena = instance->GetCreature(DATA_ANVEENA))
@@ -394,7 +398,11 @@ struct boss_kiljaeden : public BossAI
ScheduleBasicAbilities();
ScheduleTimedEvent(25s, [&] {
ScheduleTimedEvent(16s, [&] {
DoCastSelf(SPELL_FLAME_DART);
}, 20s);
ScheduleTimedEvent(15s, [&] {
me->RemoveAurasDueToSpell(SPELL_ARMAGEDDON_PERIODIC);
Talk(EMOTE_KJ_DARKNESS);
DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS);
@@ -411,13 +419,13 @@ struct boss_kiljaeden : public BossAI
}, 7s);
}
Talk(SAY_KJ_PHASE5);
}, 30s);
}, 36s);
me->m_Events.AddEventAtOffset([&] {
if (Creature* kalec = instance->GetCreature(DATA_KALECGOS_KJ))
kalec->AI()->Talk(SAY_KALECGOS_READY_ALL);
EmpowerOrb(true);
}, 61s);
}, 48s);
});
});
}
@@ -336,6 +336,22 @@ private:
TaskScheduler scheduler;
};
class spell_spell_fury_aura : public AuraScript
{
PrepareAuraScript(spell_spell_fury_aura);
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetUnitOwner()->ToPlayer())
ModStackAmount(5);
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_spell_fury_aura::OnApply, EFFECT_0, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, AURA_EFFECT_HANDLE_REAL);
}
};
void AddSC_instance_sunwell_plateau()
{
new instance_sunwell_plateau();
@@ -345,4 +361,5 @@ void AddSC_instance_sunwell_plateau()
RegisterSpellScriptWithArgs(spell_sunwell_teleport, "spell_teleport_to_apex_point", SPELL_TELEPORT_TO_APEX_POINT);
RegisterSpellScriptWithArgs(spell_sunwell_teleport, "spell_teleport_to_witchs_sanctum", SPELL_TELEPORT_TO_WITCHS_SANCTUM);
RegisterSpellScriptWithArgs(spell_sunwell_teleport, "spell_teleport_to_sunwell_plateau", SPELL_TELEPORT_TO_SUNWELL_PLATEAU);
RegisterSpellScript(spell_spell_fury_aura);
}
@@ -473,7 +473,7 @@ public:
{
if (spell->Id == SPELL_KODO_KOMBO_ITEM)
{
if (!caster->HasAnyAuras(SPELL_KODO_KOMBO_PLAYER_BUFF, SPELL_KODO_KOMBO_DESPAWN_BUFF)
if (!(caster->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) || me->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
&& (me->GetEntry() == NPC_AGED_KODO || me->GetEntry() == NPC_DYING_KODO || me->GetEntry() == NPC_ANCIENT_KODO))
{
me->UpdateEntry(NPC_TAMED_KODO, nullptr, false);
@@ -494,7 +494,7 @@ public:
bool OnGossipHello(Player* player, Creature* creature) override
{
if (player->HasAllAuras(SPELL_KODO_KOMBO_PLAYER_BUFF, SPELL_KODO_KOMBO_DESPAWN_BUFF))
if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && creature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
{
player->TalkedToCreature(creature->GetEntry(), ObjectGuid::Empty);
player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF);
@@ -1150,6 +1150,36 @@ class spell_pal_seal_of_vengeance : public SpellScript
}
};
// 1022 - Hand of Protection
class spell_pal_hand_of_protection : public SpellScript
{
PrepareSpellScript(spell_pal_hand_of_protection);
SpellCastResult CheckCast()
{
Unit* caster = GetCaster();
if (!caster->GetTarget() || caster->GetTarget() == caster->GetGUID())
return SPELL_CAST_OK;
if (caster->HasStunAura())
return SPELL_FAILED_STUNNED;
if (caster->HasConfuseAura())
return SPELL_FAILED_CONFUSED;
if (caster->GetUnitFlags() & UNIT_FLAG_FLEEING)
return SPELL_FAILED_FLEEING;
return SPELL_CAST_OK;
}
void Register() override
{
OnCheckCast += SpellCheckCastFn(spell_pal_hand_of_protection::CheckCast);
}
};
void AddSC_paladin_spell_scripts()
{
RegisterSpellAndAuraScriptPair(spell_pal_seal_of_command, spell_pal_seal_of_command_aura);
@@ -1178,4 +1208,5 @@ void AddSC_paladin_spell_scripts()
RegisterSpellScript(spell_pal_righteous_defense);
RegisterSpellScript(spell_pal_seal_of_righteousness);
RegisterSpellScript(spell_pal_seal_of_vengeance);
RegisterSpellScript(spell_pal_hand_of_protection);
}
+6 -2
View File
@@ -458,7 +458,8 @@ public:
####*/
enum L70ETCMusic
{
MUSIC_L70_ETC_MUSIC = 11803
MUSIC_L70_ETC_MUSIC = 11803,
MUSIC_L70_ETC_MUSIC_LOUD = 12868
};
enum L70ETCMusicEvents
@@ -486,7 +487,10 @@ public:
switch (eventId)
{
case EVENT_ETC_START_MUSIC:
me->PlayDirectMusic(MUSIC_L70_ETC_MUSIC);
if (me->GetMapId() == MAP_BLACKROCK_DEPTHS)
me->PlayDirectMusic(MUSIC_L70_ETC_MUSIC_LOUD);
else
me->PlayDirectMusic(MUSIC_L70_ETC_MUSIC);
_events.ScheduleEvent(EVENT_ETC_START_MUSIC, 1600); // Every 1.6 seconds SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
break;
default: