aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsirikfoll <sirikfoll@hotmail.com>2017-11-17 23:41:11 -0200
committerfunjoker <funjoker109@gmail.com>2021-02-15 19:13:25 +0100
commitda76a0db5b5791040a883d969e18b5905af96244 (patch)
tree33300ebd3c85c00a69f72f5e2327e60b2e516200 /src
parenta87098fe856bb55e257aef02d6be6c0e55a55922 (diff)
Core/Scripts Fix issues with Midsummer's Ribbon Pole
Closes #6876 Fixed achievement Burning Hot Pole Dance Update scripts for quest Torch Tossing, using all correct spells and timers Updated script register model (cherry picked from commit 6e7e43172ecd73fcc43872b75917f16a876f47c7)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp229
-rw-r--r--src/server/scripts/World/go_scripts.cpp18
-rw-r--r--src/server/scripts/World/npcs_special.cpp41
3 files changed, 171 insertions, 117 deletions
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
index f6c58fdb7fa..dd90fb3d616 100644
--- a/src/server/scripts/Spells/spell_holiday.cpp
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -1491,117 +1491,175 @@ enum TorchSpells
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 SpellScriptLoader
+class spell_midsummer_braziers_hit : public AuraScript
{
- public:
- spell_midsummer_braziers_hit() : SpellScriptLoader("spell_midsummer_braziers_hit") { }
+ PrepareAuraScript(spell_midsummer_braziers_hit);
- class spell_midsummer_braziers_hit_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
{
- PrepareAuraScript(spell_midsummer_braziers_hit_AuraScript);
+ SPELL_TORCH_TOSSING_TRAINING,
+ SPELL_TORCH_TOSSING_PRACTICE,
+ SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE,
+ SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE
+ });
+ }
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_TORCH_TOSSING_TRAINING, SPELL_TORCH_TOSSING_PRACTICE });
- }
+ void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Player* player = GetTarget()->ToPlayer();
+ if (!player)
+ return;
- 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();
+ }
+ }
- 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);
+ }
+};
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_midsummer_braziers_hit_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAPPLY));
- }
- };
+// 45907 - Torch Target Picker
+class spell_midsummer_torch_target_picker : public SpellScript
+{
+ PrepareSpellScript(spell_midsummer_torch_target_picker);
- AuraScript* GetAuraScript() const override
- {
- return new spell_midsummer_braziers_hit_AuraScript();
- }
+ 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_DANCE_COSMETIC = 29726,
- SPELL_RIBBON_DANCE = 29175,
- GO_RIBBON_POLE = 181605,
+ 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
};
-class spell_gen_ribbon_pole_dancer_check : public SpellScriptLoader
+// 29705, 29726, 29727 - Test Ribbon Pole Channel
+class spell_midsummer_test_ribbon_pole_channel : public AuraScript
{
- public:
- spell_gen_ribbon_pole_dancer_check() : SpellScriptLoader("spell_gen_ribbon_pole_dancer_check") { }
+ PrepareAuraScript(spell_midsummer_test_ribbon_pole_channel);
- class spell_gen_ribbon_pole_dancer_check_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
{
- PrepareAuraScript(spell_gen_ribbon_pole_dancer_check_AuraScript);
+ SPELL_RIBBON_POLE_PERIODIC_VISUAL,
+ SPELL_BURNING_HOT_POLE_DANCE,
+ SPELL_HAS_FULL_MIDSUMMER_SET,
+ SPELL_RIBBON_DANCE
+ });
+ }
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_HAS_FULL_MIDSUMMER_SET,
- SPELL_RIBBON_DANCE,
- SPELL_BURNING_HOT_POLE_DANCE
- });
- }
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->RemoveAurasDueToSpell(SPELL_RIBBON_POLE_PERIODIC_VISUAL);
+ }
- void PeriodicTick(AuraEffect const* /*aurEff*/)
- {
- Unit* target = GetTarget();
+ void PeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ Unit* target = GetTarget();
+ target->CastSpell(target, SPELL_RIBBON_POLE_PERIODIC_VISUAL, true);
- // check if aura needs to be removed
- if (!target->FindNearestGameObject(GO_RIBBON_POLE, 8.0f) || !target->HasUnitState(UNIT_STATE_CASTING))
- {
- target->InterruptNonMeleeSpells(false);
- target->RemoveAurasDueToSpell(GetId());
- target->RemoveAura(SPELL_RIBBON_DANCE_COSMETIC);
- return;
- }
+ if (Aura* aur = target->GetAura(SPELL_RIBBON_DANCE))
+ {
+ aur->SetMaxDuration(std::min(3600000, aur->GetMaxDuration() + 180000));
+ aur->RefreshDuration();
- // set xp buff duration
- 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);
+ }
- // reward achievement criteria
- if (aur->GetMaxDuration() == 3600000 && target->HasAura(SPELL_HAS_FULL_MIDSUMMER_SET))
- target->CastSpell(target, SPELL_BURNING_HOT_POLE_DANCE, true);
- }
- else
- target->AddAura(SPELL_RIBBON_DANCE, target);
- }
+ 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);
+ }
+};
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_ribbon_pole_dancer_check_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
- };
+// 45406 - Holiday - Midsummer, Ribbon Pole Periodic Visual
+class spell_midsummer_ribbon_pole_periodic_visual : public AuraScript
+{
+ PrepareAuraScript(spell_midsummer_ribbon_pole_periodic_visual);
- AuraScript* GetAuraScript() const override
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
{
- return new spell_gen_ribbon_pole_dancer_check_AuraScript();
- }
+ 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);
+ }
};
void AddSC_holiday_spell_scripts()
@@ -1652,6 +1710,9 @@ void AddSC_holiday_spell_scripts()
new spell_brewfest_dismount_ram();
new spell_brewfest_barker_bunny();
// Midsummer Fire Festival
- new spell_midsummer_braziers_hit();
- new spell_gen_ribbon_pole_dancer_check();
+ RegisterAuraScript(spell_midsummer_braziers_hit);
+ RegisterSpellScript(spell_midsummer_torch_target_picker);
+ RegisterSpellScript(spell_midsummer_torch_toss_land);
+ RegisterAuraScript(spell_midsummer_test_ribbon_pole_channel);
+ RegisterAuraScript(spell_midsummer_ribbon_pole_periodic_visual);
}
diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index c30a7a5c8d5..ca4062cfeeb 100644
--- a/src/server/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
@@ -1406,10 +1406,18 @@ public:
enum MidsummerPoleRibbon
{
- SPELL_POLE_DANCE = 29726,
- SPELL_BLUE_FIRE_RING = 46842,
- NPC_POLE_RIBBON_BUNNY = 17066,
- ACTION_COSMETIC_FIRES = 0
+ SPELL_TEST_RIBBON_POLE_1 = 29705,
+ SPELL_TEST_RIBBON_POLE_2 = 29726,
+ SPELL_TEST_RIBBON_POLE_3 = 29727,
+ NPC_POLE_RIBBON_BUNNY = 17066,
+ ACTION_COSMETIC_FIRES = 0
+};
+
+uint32 const RibbonPoleSpells[3] =
+{
+ SPELL_TEST_RIBBON_POLE_1,
+ SPELL_TEST_RIBBON_POLE_2,
+ SPELL_TEST_RIBBON_POLE_3
};
class go_midsummer_ribbon_pole : public GameObjectScript
@@ -1426,7 +1434,7 @@ public:
if (Creature* creature = me->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f))
{
creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES);
- player->CastSpell(creature, SPELL_POLE_DANCE, true);
+ player->CastSpell(player, RibbonPoleSpells[urand(0, 2)], true);
}
return true;
}
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index d67f51796c5..53dbd145218 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -452,8 +452,7 @@ public:
enum TorchTossingTarget
{
- NPC_TORCH_TOSSING_TARGET_BUNNY = 25535,
- SPELL_TARGET_INDICATOR = 45723
+ SPELL_TORCH_TARGET_PICKER = 45907
};
class npc_torch_tossing_target_bunny_controller : public CreatureScript
@@ -463,42 +462,28 @@ public:
struct npc_torch_tossing_target_bunny_controllerAI : public ScriptedAI
{
- npc_torch_tossing_target_bunny_controllerAI(Creature* creature) : ScriptedAI(creature)
- {
- _targetTimer = 3000;
- }
+ npc_torch_tossing_target_bunny_controllerAI(Creature* creature) : ScriptedAI(creature) { }
- ObjectGuid DoSearchForTargets(ObjectGuid lastTargetGUID)
+ void Reset() override
{
- std::list<Creature*> targets;
- me->GetCreatureListWithEntryInGrid(targets, NPC_TORCH_TOSSING_TARGET_BUNNY, 60.0f);
- targets.remove_if([lastTargetGUID](Creature* creature) { return creature->GetGUID() == lastTargetGUID; });
-
- if (!targets.empty())
+ _scheduler.Schedule(Seconds(2), [this](TaskContext context)
{
- _lastTargetGUID = Trinity::Containers::SelectRandomContainerElement(targets)->GetGUID();
-
- return _lastTargetGUID;
- }
- return ObjectGuid::Empty;
+ me->CastCustomSpell(SPELL_TORCH_TARGET_PICKER, SPELLVALUE_MAX_TARGETS, 1);
+ _scheduler.Schedule(Seconds(3), [this](TaskContext /*context*/)
+ {
+ me->CastCustomSpell(SPELL_TORCH_TARGET_PICKER, SPELLVALUE_MAX_TARGETS, 1);
+ });
+ context.Repeat(Seconds(5));
+ });
}
void UpdateAI(uint32 diff) override
{
- if (_targetTimer < diff)
- {
- if (Unit* target = ObjectAccessor::GetUnit(*me, DoSearchForTargets(_lastTargetGUID)))
- target->CastSpell(target, SPELL_TARGET_INDICATOR, true);
-
- _targetTimer = 3000;
- }
- else
- _targetTimer -= diff;
+ _scheduler.Update(diff);
}
private:
- uint32 _targetTimer;
- ObjectGuid _lastTargetGUID;
+ TaskScheduler _scheduler;
};
CreatureAI* GetAI(Creature* creature) const override