aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2021_02_07_03_world_2017_11_17_13_world.sql38
-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
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