diff options
-rw-r--r-- | sql/updates/world/master/2021_02_07_03_world_2017_11_17_13_world.sql | 38 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_holiday.cpp | 229 | ||||
-rw-r--r-- | src/server/scripts/World/go_scripts.cpp | 18 | ||||
-rw-r--r-- | src/server/scripts/World/npcs_special.cpp | 41 |
4 files changed, 209 insertions, 117 deletions
diff --git a/sql/updates/world/master/2021_02_07_03_world_2017_11_17_13_world.sql b/sql/updates/world/master/2021_02_07_03_world_2017_11_17_13_world.sql new file mode 100644 index 00000000000..e4ce5d9e44d --- /dev/null +++ b/sql/updates/world/master/2021_02_07_03_world_2017_11_17_13_world.sql @@ -0,0 +1,38 @@ +DELETE FROM `spell_script_names` WhERE `ScriptName` IN +('spell_midsummer_torch_target_picker', +'spell_midsummer_torch_toss_land', +'spell_midsummer_test_ribbon_pole_channel', +'spell_gen_ribbon_pole_dancer_check', +'spell_midsummer_ribbon_pole_periodic_visual'); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(45907,'spell_midsummer_torch_target_picker'), +(46054,'spell_midsummer_torch_toss_land'), +(29705,'spell_midsummer_test_ribbon_pole_channel'), +(29726,'spell_midsummer_test_ribbon_pole_channel'), +(29727,'spell_midsummer_test_ribbon_pole_channel'), +(45406,'spell_midsummer_ribbon_pole_periodic_visual'); + +-- UPDATE `spell_dbc` SET `Effect1`=3, `EffectImplicitTargetA1`=1 WHERE `Id`=58934; +DELETE FROM `spelleffect_dbc` WHERE `Id`=155919; +INSERT INTO `spelleffect_dbc` (`Id`, `Effect`, `EffectValueMultiplier`, `EffectApplyAuraName`, `EffectAmplitude`, `EffectBasePoints`, `EffectBonusMultiplier`, `EffectDamageMultiplier`, `EffectChainTarget`, `EffectDieSides`, `EffectItemType`, `EffectMechanic`, `EffectMiscValue`, `EffectMiscValueB`, `EffectRadiusIndex`, `EffectRadiusIndexMax`, `EffectRealPointsPerLevel`, `EffectSpellClassMaskA`, `EffectSpellClassMaskB`, `EffectSpellClassMaskC`, `EffectTriggerSpell`, `EffectImplicitTargetA`, `EffectImplicitTargetB`, `EffectSpellId`, `EffectIndex`) VALUES +(155919, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 58934, 0); + +UPDATE `creature_template` SET `AIName`='' WHERE `entry`=25535; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=25535; + +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=29726; +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=45723 AND `spell_effect`=43313; +DELETE FROM `disables` WHERE `sourceType`=0 AND `entry` IN(45724); +INSERT INTO `disables` (`sourceType`, `entry`, `flags`, `params_0`, `params_1`, `comment`) VALUES +(0,45724,64,0,0,'Disable LoS for spell Braziers Hit'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (45907,46054,45732,29705,29727); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition` ,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,45907,0,0,31,0,3,25535,0,0,0,'','Spell \'Torch Target Picker\' targets [DNT] Torch Tossing Target Bunny'), +(13,1,45907,0,0,1,0,45723,0,0,1,0,'','Spell \'Torch Target Picker\' can not hit targets with Aura \'Target Indicator (Rank 1)\''), +(13,1,45732,0,0,1,0,45723,0,0,0,0,'','Spell \'Torch Toss\' can only hit targets with Aura \'Target Indicator\''), +(13,1,46054,0,0,1,0,45723,0,0,0,0,'','Spell \'Torch Toss\' can only hit targets with Aura \'Target Indicator\''), +(13,1,46054,0,0,31,0,3,25535,0,0,0,'','Spell \'Torch Target Picker\' targets [DNT] Torch Tossing Target Bunny'), +(13,1,45732,0,0,31,0,3,25535,0,0,0,'','Spell \'Torch Target Picker\' targets [DNT] Torch Tossing Target Bunny'), +(13,1,29705,0,0,31,0,3,17066,0,0,0,'','Spell \'Test Ribbon Pole Channel\' targets Ribbon Pole Debug Target'), +(13,1,29727,0,0,31,0,3,17066,0,0,0,'','Spell \'Test Ribbon Pole Channel\' targets Ribbon Pole Debug Target'); 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 |