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 6e7e43172e)
This commit is contained in:
sirikfoll
2017-11-17 23:41:11 -02:00
committed by funjoker
parent a87098fe85
commit da76a0db5b
4 changed files with 213 additions and 121 deletions

View File

@@ -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');

View File

@@ -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();
}
}
void Register() override
{
AfterEffectApply += AuraEffectApplyFn(spell_midsummer_braziers_hit_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAPPLY));
}
};
AuraScript* GetAuraScript() const override
if ((player->HasAura(SPELL_TORCH_TOSSING_TRAINING) && GetStackAmount() == 8) || (player->HasAura(SPELL_TORCH_TOSSING_PRACTICE) && GetStackAmount() == 20))
{
return new spell_midsummer_braziers_hit_AuraScript();
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_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;
}
// set xp buff duration
if (Aura* aur = target->GetAura(SPELL_RIBBON_DANCE))
{
aur->SetMaxDuration(std::min(3600000, aur->GetMaxDuration() + 180000));
aur->RefreshDuration();
// 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
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_ribbon_pole_dancer_check_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
AuraScript* GetAuraScript() const override
if (Aura* aur = target->GetAura(SPELL_RIBBON_DANCE))
{
return new spell_gen_ribbon_pole_dancer_check_AuraScript();
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);
}
};
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);
}

View File

@@ -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;
}

View File

@@ -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