From d3c9c14f83078736b1500e303da5ec575aaf22dc Mon Sep 17 00:00:00 2001
From: offl <11556157+offl@users.noreply.github.com>
Date: Sun, 21 Nov 2021 23:18:10 +0200
Subject: Scripts/Misc: Migrate world event scripts to separate files (#27284)
(cherry picked from commit 542c10094f8660302708e24cf3c8b2903ac25607)
---
src/server/scripts/Events/midsummer.cpp | 461 ++++++++++++++++++++++++++++++++
1 file changed, 461 insertions(+)
create mode 100644 src/server/scripts/Events/midsummer.cpp
(limited to 'src/server/scripts/Events/midsummer.cpp')
diff --git a/src/server/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp
new file mode 100644
index 00000000000..2e28d3f18c3
--- /dev/null
+++ b/src/server/scripts/Events/midsummer.cpp
@@ -0,0 +1,461 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#include "ScriptMgr.h"
+#include "CreatureAIImpl.h"
+#include "Player.h"
+#include "SpellAuraEffects.h"
+#include "SpellScript.h"
+
+enum TorchSpells
+{
+ SPELL_TORCH_TOSSING_TRAINING = 45716,
+ SPELL_TORCH_TOSSING_PRACTICE = 46630,
+ SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE = 45719,
+ SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE = 46651,
+ SPELL_TARGET_INDICATOR_COSMETIC = 46901,
+ SPELL_TARGET_INDICATOR = 45723,
+ SPELL_BRAZIERS_HIT = 45724
+};
+
+// 45724 - Braziers Hit!
+class spell_midsummer_braziers_hit : public AuraScript
+{
+ PrepareAuraScript(spell_midsummer_braziers_hit);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
+ {
+ SPELL_TORCH_TOSSING_TRAINING,
+ SPELL_TORCH_TOSSING_PRACTICE,
+ SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE,
+ SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE
+ });
+ }
+
+ void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Player* player = GetTarget()->ToPlayer();
+ if (!player)
+ return;
+
+ if ((player->HasAura(SPELL_TORCH_TOSSING_TRAINING) && GetStackAmount() == 8) || (player->HasAura(SPELL_TORCH_TOSSING_PRACTICE) && GetStackAmount() == 20))
+ {
+ if (player->GetTeam() == ALLIANCE)
+ player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE, true);
+ else if (player->GetTeam() == HORDE)
+ player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE, true);
+ Remove();
+ }
+ }
+
+ void Register() override
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_midsummer_braziers_hit::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAPPLY);
+ }
+};
+
+// 45907 - Torch Target Picker
+class spell_midsummer_torch_target_picker : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_torch_target_picker);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_TARGET_INDICATOR_COSMETIC, SPELL_TARGET_INDICATOR });
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* target = GetHitUnit();
+ target->CastSpell(target, SPELL_TARGET_INDICATOR_COSMETIC, true);
+ target->CastSpell(target, SPELL_TARGET_INDICATOR, true);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_midsummer_torch_target_picker::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 46054 - Torch Toss (land)
+class spell_midsummer_torch_toss_land : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_torch_toss_land);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_BRAZIERS_HIT });
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ GetHitUnit()->CastSpell(GetCaster(), SPELL_BRAZIERS_HIT, true);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_midsummer_torch_toss_land::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
+enum RibbonPoleData
+{
+ SPELL_HAS_FULL_MIDSUMMER_SET = 58933,
+ SPELL_BURNING_HOT_POLE_DANCE = 58934,
+ SPELL_RIBBON_POLE_PERIODIC_VISUAL = 45406,
+ SPELL_RIBBON_DANCE = 29175,
+ SPELL_TEST_RIBBON_POLE_1 = 29705,
+ SPELL_TEST_RIBBON_POLE_2 = 29726,
+ SPELL_TEST_RIBBON_POLE_3 = 29727
+};
+
+// 29705, 29726, 29727 - Test Ribbon Pole Channel
+class spell_midsummer_test_ribbon_pole_channel : public AuraScript
+{
+ PrepareAuraScript(spell_midsummer_test_ribbon_pole_channel);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
+ {
+ SPELL_RIBBON_POLE_PERIODIC_VISUAL,
+ SPELL_BURNING_HOT_POLE_DANCE,
+ SPELL_HAS_FULL_MIDSUMMER_SET,
+ SPELL_RIBBON_DANCE
+ });
+ }
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->RemoveAurasDueToSpell(SPELL_RIBBON_POLE_PERIODIC_VISUAL);
+ }
+
+ void PeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ Unit* target = GetTarget();
+ target->CastSpell(target, SPELL_RIBBON_POLE_PERIODIC_VISUAL, true);
+
+ if (Aura* aur = target->GetAura(SPELL_RIBBON_DANCE))
+ {
+ aur->SetMaxDuration(std::min(3600000, aur->GetMaxDuration() + 180000));
+ aur->RefreshDuration();
+
+ if (aur->GetMaxDuration() == 3600000 && target->HasAura(SPELL_HAS_FULL_MIDSUMMER_SET))
+ target->CastSpell(target, SPELL_BURNING_HOT_POLE_DANCE, true);
+ }
+ else
+ target->CastSpell(target, SPELL_RIBBON_DANCE, true);
+ }
+
+ void Register() override
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_midsummer_test_ribbon_pole_channel::HandleRemove, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_midsummer_test_ribbon_pole_channel::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
+};
+
+// 45406 - Holiday - Midsummer, Ribbon Pole Periodic Visual
+class spell_midsummer_ribbon_pole_periodic_visual : public AuraScript
+{
+ PrepareAuraScript(spell_midsummer_ribbon_pole_periodic_visual);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
+ {
+ SPELL_TEST_RIBBON_POLE_1,
+ SPELL_TEST_RIBBON_POLE_2,
+ SPELL_TEST_RIBBON_POLE_3
+ });
+ }
+
+ void PeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ Unit* target = GetTarget();
+ if (!target->HasAura(SPELL_TEST_RIBBON_POLE_1) && !target->HasAura(SPELL_TEST_RIBBON_POLE_2) && !target->HasAura(SPELL_TEST_RIBBON_POLE_3))
+ Remove();
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_midsummer_ribbon_pole_periodic_visual::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
+enum JugglingTorch
+{
+ SPELL_JUGGLE_TORCH_SLOW = 45792,
+ SPELL_JUGGLE_TORCH_MEDIUM = 45806,
+ SPELL_JUGGLE_TORCH_FAST = 45816,
+ SPELL_JUGGLE_TORCH_SELF = 45638,
+
+ SPELL_JUGGLE_TORCH_SHADOW_SLOW = 46120,
+ SPELL_JUGGLE_TORCH_SHADOW_MEDIUM = 46118,
+ SPELL_JUGGLE_TORCH_SHADOW_FAST = 46117,
+ SPELL_JUGGLE_TORCH_SHADOW_SELF = 46121,
+
+ SPELL_GIVE_TORCH = 45280,
+ QUEST_TORCH_CATCHING_A = 11657,
+ QUEST_TORCH_CATCHING_H = 11923,
+ QUEST_MORE_TORCH_CATCHING_A = 11924,
+ QUEST_MORE_TORCH_CATCHING_H = 11925
+};
+
+// 45819 - Throw Torch
+class spell_midsummer_juggle_torch : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_juggle_torch);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({
+ SPELL_JUGGLE_TORCH_SLOW, SPELL_JUGGLE_TORCH_MEDIUM, SPELL_JUGGLE_TORCH_FAST,
+ SPELL_JUGGLE_TORCH_SELF, SPELL_JUGGLE_TORCH_SHADOW_SLOW, SPELL_JUGGLE_TORCH_SHADOW_MEDIUM,
+ SPELL_JUGGLE_TORCH_SHADOW_FAST, SPELL_JUGGLE_TORCH_SHADOW_SELF
+ });
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (!GetExplTargetDest())
+ return;
+
+ Position spellDest = *GetExplTargetDest();
+ float distance = GetCaster()->GetExactDist2d(spellDest.GetPositionX(), spellDest.GetPositionY());
+
+ uint32 torchSpellID = 0;
+ uint32 torchShadowSpellID = 0;
+
+ if (distance <= 1.5f)
+ {
+ torchSpellID = SPELL_JUGGLE_TORCH_SELF;
+ torchShadowSpellID = SPELL_JUGGLE_TORCH_SHADOW_SELF;
+ spellDest = GetCaster()->GetPosition();
+ }
+ else if (distance <= 10.0f)
+ {
+ torchSpellID = SPELL_JUGGLE_TORCH_SLOW;
+ torchShadowSpellID = SPELL_JUGGLE_TORCH_SHADOW_SLOW;
+ }
+ else if (distance <= 20.0f)
+ {
+ torchSpellID = SPELL_JUGGLE_TORCH_MEDIUM;
+ torchShadowSpellID = SPELL_JUGGLE_TORCH_SHADOW_MEDIUM;
+ }
+ else
+ {
+ torchSpellID = SPELL_JUGGLE_TORCH_FAST;
+ torchShadowSpellID = SPELL_JUGGLE_TORCH_SHADOW_FAST;
+ }
+
+ GetCaster()->CastSpell(spellDest, torchSpellID);
+ GetCaster()->CastSpell(spellDest, torchShadowSpellID);
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_midsummer_juggle_torch::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 45644 - Juggle Torch (Catch)
+class spell_midsummer_torch_catch : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_torch_catch);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_GIVE_TORCH });
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Player* player = GetHitPlayer();
+ if (!player)
+ return;
+
+ if (player->GetQuestStatus(QUEST_TORCH_CATCHING_A) == QUEST_STATUS_REWARDED || player->GetQuestStatus(QUEST_TORCH_CATCHING_H) == QUEST_STATUS_REWARDED)
+ player->CastSpell(player, SPELL_GIVE_TORCH);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_midsummer_torch_catch::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+enum FlingTorch
+{
+ SPELL_FLING_TORCH_TRIGGERED = 45669,
+ SPELL_FLING_TORCH_SHADOW = 46105,
+ SPELL_JUGGLE_TORCH_MISSED = 45676,
+ SPELL_TORCHES_CAUGHT = 45693,
+ SPELL_TORCH_CATCHING_SUCCESS_ALLIANCE = 46081,
+ SPELL_TORCH_CATCHING_SUCCESS_HORDE = 46654,
+ SPELL_TORCH_CATCHING_REMOVE_TORCHES = 46084
+};
+
+// 46747 - Fling torch
+class spell_midsummer_fling_torch : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_fling_torch);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_FLING_TORCH_TRIGGERED, SPELL_FLING_TORCH_SHADOW });
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Position dest = GetCaster()->GetFirstCollisionPosition(30.0f, (float)rand_norm() * static_cast(2 * M_PI));
+ GetCaster()->CastSpell(dest, SPELL_FLING_TORCH_TRIGGERED, true);
+ GetCaster()->CastSpell(dest, SPELL_FLING_TORCH_SHADOW);
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_midsummer_fling_torch::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 45669 - Fling Torch
+class spell_midsummer_fling_torch_triggered : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_fling_torch_triggered);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_JUGGLE_TORCH_MISSED });
+ }
+
+ void HandleTriggerMissile(SpellEffIndex effIndex)
+ {
+ if (Position const* pos = GetHitDest())
+ {
+ if (GetCaster()->GetExactDist2d(pos) > 3.0f)
+ {
+ PreventHitEffect(effIndex);
+ GetCaster()->CastSpell(*GetExplTargetDest(), SPELL_JUGGLE_TORCH_MISSED);
+ GetCaster()->RemoveAura(SPELL_TORCHES_CAUGHT);
+ }
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_midsummer_fling_torch_triggered::HandleTriggerMissile, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE);
+ }
+};
+
+// 45671 - Juggle Torch (Catch, Quest)
+class spell_midsummer_fling_torch_catch : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_fling_torch_catch);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({
+ SPELL_FLING_TORCH_TRIGGERED,
+ SPELL_TORCH_CATCHING_SUCCESS_ALLIANCE,
+ SPELL_TORCH_CATCHING_SUCCESS_HORDE,
+ SPELL_TORCH_CATCHING_REMOVE_TORCHES,
+ SPELL_FLING_TORCH_SHADOW
+ });
+ }
+
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ {
+ Player* player = GetHitPlayer();
+ if (!player)
+ return;
+
+ if (!GetExplTargetDest())
+ return;
+
+ // Only the caster can catch the torch
+ if (player->GetGUID() != GetCaster()->GetGUID())
+ return;
+
+ uint8 requiredCatches = 0;
+ // Number of required catches depends on quest - 4 for the normal quest, 10 for the daily version
+ if (player->GetQuestStatus(QUEST_TORCH_CATCHING_A) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_TORCH_CATCHING_H) == QUEST_STATUS_INCOMPLETE)
+ requiredCatches = 3;
+ else if (player->GetQuestStatus(QUEST_MORE_TORCH_CATCHING_A) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_MORE_TORCH_CATCHING_H) == QUEST_STATUS_INCOMPLETE)
+ requiredCatches = 9;
+
+ // Used quest item without being on quest - do nothing
+ if (requiredCatches == 0)
+ return;
+
+ if (player->GetAuraCount(SPELL_TORCHES_CAUGHT) >= requiredCatches)
+ {
+ player->CastSpell(player, (player->GetTeam() == ALLIANCE) ? SPELL_TORCH_CATCHING_SUCCESS_ALLIANCE : SPELL_TORCH_CATCHING_SUCCESS_HORDE);
+ player->CastSpell(player, SPELL_TORCH_CATCHING_REMOVE_TORCHES);
+ player->RemoveAura(SPELL_TORCHES_CAUGHT);
+ }
+ else
+ {
+ Position dest = player->GetFirstCollisionPosition(15.0f, (float)rand_norm() * static_cast(2 * M_PI));
+ player->CastSpell(player, SPELL_TORCHES_CAUGHT);
+ player->CastSpell(dest, SPELL_FLING_TORCH_TRIGGERED, true);
+ player->CastSpell(dest, SPELL_FLING_TORCH_SHADOW);
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_midsummer_fling_torch_catch::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
+// 45676 - Juggle Torch (Quest, Missed)
+class spell_midsummer_fling_torch_missed : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_fling_torch_missed);
+
+ void FilterTargets(std::list& targets)
+ {
+ // This spell only hits the caster
+ targets.remove_if([this](WorldObject* obj)
+ {
+ return obj->GetGUID() != GetCaster()->GetGUID();
+ });
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_midsummer_fling_torch_missed::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_midsummer_fling_torch_missed::FilterTargets, EFFECT_2, TARGET_UNIT_DEST_AREA_ENTRY);
+ }
+};
+
+void AddSC_event_midsummer()
+{
+ RegisterSpellScript(spell_midsummer_braziers_hit);
+ RegisterSpellScript(spell_midsummer_torch_target_picker);
+ RegisterSpellScript(spell_midsummer_torch_toss_land);
+ RegisterSpellScript(spell_midsummer_test_ribbon_pole_channel);
+ RegisterSpellScript(spell_midsummer_ribbon_pole_periodic_visual);
+ RegisterSpellScript(spell_midsummer_juggle_torch);
+ RegisterSpellScript(spell_midsummer_torch_catch);
+ RegisterSpellScript(spell_midsummer_fling_torch);
+ RegisterSpellScript(spell_midsummer_fling_torch_triggered);
+ RegisterSpellScript(spell_midsummer_fling_torch_catch);
+ RegisterSpellScript(spell_midsummer_fling_torch_missed);
+}
--
cgit v1.2.3