/* * 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 "Creature.h" #include "CreatureAI.h" #include "Player.h" #include "SpellAuraEffects.h" #include "SpellMgr.h" #include "SpellScript.h" #include "Vehicle.h" enum PilgrimsBountyBuffFood { // Pilgrims Bounty Buff Food SPELL_WELL_FED_AP_TRIGGER = 65414, SPELL_WELL_FED_ZM_TRIGGER = 65412, SPELL_WELL_FED_HIT_TRIGGER = 65416, SPELL_WELL_FED_HASTE_TRIGGER = 65410, SPELL_WELL_FED_SPIRIT_TRIGGER = 65415 }; class spell_pilgrims_bounty_buff_food : public AuraScript { uint32 const _triggeredSpellId; public: spell_pilgrims_bounty_buff_food(uint32 triggeredSpellId) : AuraScript(), _triggeredSpellId(triggeredSpellId) { _handled = false; } void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); if (_handled) return; _handled = true; GetTarget()->CastSpell(GetTarget(), _triggeredSpellId, true); } void Register() override { OnEffectPeriodic += AuraEffectPeriodicFn(spell_pilgrims_bounty_buff_food::HandleTriggerSpell, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } bool _handled; }; enum FeastOnSpells { FEAST_ON_TURKEY = 61784, FEAST_ON_CRANBERRIES = 61785, FEAST_ON_SWEET_POTATOES = 61786, FEAST_ON_PIE = 61787, FEAST_ON_STUFFING = 61788, SPELL_CRANBERRY_HELPINS = 61841, SPELL_TURKEY_HELPINS = 61842, SPELL_STUFFING_HELPINS = 61843, SPELL_SWEET_POTATO_HELPINS = 61844, SPELL_PIE_HELPINS = 61845, SPELL_ON_PLATE_EAT_VISUAL = 61826 }; /* 61784 - Feast On Turkey 61785 - Feast On Cranberries 61786 - Feast On Sweet Potatoes 61787 - Feast On Pie 61788 - Feast On Stuffing */ class spell_pilgrims_bounty_feast_on : public SpellScript { bool Validate(SpellInfo const* spellInfo) override { return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellEffect({ { uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()), EFFECT_0 } }); } void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); uint32 _spellId = 0; switch (GetSpellInfo()->Id) { case FEAST_ON_TURKEY: _spellId = SPELL_TURKEY_HELPINS; break; case FEAST_ON_CRANBERRIES: _spellId = SPELL_CRANBERRY_HELPINS; break; case FEAST_ON_SWEET_POTATOES: _spellId = SPELL_SWEET_POTATO_HELPINS; break; case FEAST_ON_PIE: _spellId = SPELL_PIE_HELPINS; break; case FEAST_ON_STUFFING: _spellId = SPELL_STUFFING_HELPINS; break; default: return; } if (Vehicle* vehicle = caster->GetVehicleKit()) if (Unit* target = vehicle->GetPassenger(0)) if (Player* player = target->ToPlayer()) { player->CastSpell(player, SPELL_ON_PLATE_EAT_VISUAL, true); caster->CastSpell(player, _spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK) .SetOriginalCaster(player->GetGUID())); } if (Aura* aura = caster->GetAura(GetEffectValue())) { if (aura->GetStackAmount() == 1) caster->RemoveAurasDueToSpell(aura->GetSpellInfo()->GetEffect(EFFECT_0).CalcValue()); aura->ModStackAmount(-1); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_feast_on::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; enum TheTurkinator { SPELL_KILL_COUNTER_VISUAL = 62015, SPELL_KILL_COUNTER_VISUAL_MAX = 62021, EMOTE_TURKEY_HUNTER = 0, EMOTE_TURKEY_DOMINATION = 1, EMOTE_TURKEY_SLAUGHTER = 2, EMOTE_TURKEY_TRIUMPH = 3 }; // 62014 - Turkey Tracker class spell_pilgrims_bounty_turkey_tracker : public SpellScript { bool Validate(SpellInfo const* /*spell*/) override { return ValidateSpellInfo({ SPELL_KILL_COUNTER_VISUAL, SPELL_KILL_COUNTER_VISUAL_MAX }); } void HandleScript(SpellEffIndex /*effIndex*/) { Creature* caster = GetCaster()->ToCreature(); Unit* target = GetHitUnit(); if (!target || !caster) return; if (target->HasAura(SPELL_KILL_COUNTER_VISUAL_MAX)) return; if (Aura const* aura = target->GetAura(GetSpellInfo()->Id)) { switch (aura->GetStackAmount()) { case 10: caster->AI()->Talk(EMOTE_TURKEY_HUNTER, target); break; case 20: caster->AI()->Talk(EMOTE_TURKEY_DOMINATION, target); break; case 30: caster->AI()->Talk(EMOTE_TURKEY_SLAUGHTER, target); break; case 40: caster->AI()->Talk(EMOTE_TURKEY_TRIUMPH, target); target->CastSpell(target, SPELL_KILL_COUNTER_VISUAL_MAX, true); target->RemoveAurasDueToSpell(GetSpellInfo()->Id); break; default: return; } target->CastSpell(target, SPELL_KILL_COUNTER_VISUAL, true); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_turkey_tracker::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum SpiritOfSharing { SPELL_THE_SPIRIT_OF_SHARING = 61849 }; class spell_pilgrims_bounty_well_fed : public SpellScript { uint32 _triggeredSpellId; public: spell_pilgrims_bounty_well_fed(uint32 triggeredSpellId) : SpellScript(), _triggeredSpellId(triggeredSpellId) { } private: bool Validate(SpellInfo const* /*spell*/) override { return ValidateSpellInfo({ _triggeredSpellId }); } void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); Player* target = GetHitPlayer(); if (!target) return; if (Aura const* aura = target->GetAura(GetSpellInfo()->Id)) { if (aura->GetStackAmount() == 5) target->CastSpell(target, _triggeredSpellId, true); } Aura const* turkey = target->GetAura(SPELL_TURKEY_HELPINS); Aura const* cranberies = target->GetAura(SPELL_CRANBERRY_HELPINS); Aura const* stuffing = target->GetAura(SPELL_STUFFING_HELPINS); Aura const* sweetPotatoes = target->GetAura(SPELL_SWEET_POTATO_HELPINS); Aura const* pie = target->GetAura(SPELL_PIE_HELPINS); if ((turkey && turkey->GetStackAmount() == 5) && (cranberies && cranberies->GetStackAmount() == 5) && (stuffing && stuffing->GetStackAmount() == 5) && (sweetPotatoes && sweetPotatoes->GetStackAmount() == 5) && (pie && pie->GetStackAmount() == 5)) { target->CastSpell(target, SPELL_THE_SPIRIT_OF_SHARING, true); target->RemoveAurasDueToSpell(SPELL_TURKEY_HELPINS); target->RemoveAurasDueToSpell(SPELL_CRANBERRY_HELPINS); target->RemoveAurasDueToSpell(SPELL_STUFFING_HELPINS); target->RemoveAurasDueToSpell(SPELL_SWEET_POTATO_HELPINS); target->RemoveAurasDueToSpell(SPELL_PIE_HELPINS); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_well_fed::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum BountifulTableMisc { SEAT_PLAYER = 0, SEAT_PLATE_HOLDER = 6, NPC_BOUNTIFUL_TABLE = 32823, SPELL_ON_PLATE_TURKEY = 61928, SPELL_ON_PLATE_CRANBERRIES = 61925, SPELL_ON_PLATE_STUFFING = 61927, SPELL_ON_PLATE_SWEET_POTATOES = 61929, SPELL_ON_PLATE_PIE = 61926, SPELL_PASS_THE_TURKEY = 66373, SPELL_PASS_THE_CRANBERRIES = 66372, SPELL_PASS_THE_STUFFING = 66375, SPELL_PASS_THE_SWEET_POTATOES = 66376, SPELL_PASS_THE_PIE = 66374, SPELL_ON_PLATE_VISUAL_PIE = 61825, SPELL_ON_PLATE_VISUAL_CRANBERRIES = 61821, SPELL_ON_PLATE_VISUAL_POTATOES = 61824, SPELL_ON_PLATE_VISUAL_TURKEY = 61822, SPELL_ON_PLATE_VISUAL_STUFFING = 61823, SPELL_A_SERVING_OF_CRANBERRIES_PLATE = 61833, SPELL_A_SERVING_OF_TURKEY_PLATE = 61835, SPELL_A_SERVING_OF_STUFFING_PLATE = 61836, SPELL_A_SERVING_OF_SWEET_POTATOES_PLATE = 61837, SPELL_A_SERVING_OF_PIE_PLATE = 61838, SPELL_A_SERVING_OF_CRANBERRIES_CHAIR = 61804, SPELL_A_SERVING_OF_TURKEY_CHAIR = 61807, SPELL_A_SERVING_OF_STUFFING_CHAIR = 61806, SPELL_A_SERVING_OF_SWEET_POTATOES_CHAIR = 61808, SPELL_A_SERVING_OF_PIE_CHAIR = 61805 }; /* 66250 - Pass The Turkey 66259 - Pass The Stuffing 66260 - Pass The Pie 66261 - Pass The Cranberries 66262 - Pass The Sweet Potatoes */ class spell_pilgrims_bounty_on_plate : public SpellScript { uint32 _triggeredSpellId1; uint32 _triggeredSpellId2; uint32 _triggeredSpellId3; uint32 _triggeredSpellId4; public: spell_pilgrims_bounty_on_plate(uint32 triggeredSpellId1, uint32 triggeredSpellId2, uint32 triggeredSpellId3, uint32 triggeredSpellId4) : SpellScript(), _triggeredSpellId1(triggeredSpellId1), _triggeredSpellId2(triggeredSpellId2), _triggeredSpellId3(triggeredSpellId3), _triggeredSpellId4(triggeredSpellId4) { } private: bool Validate(SpellInfo const* /*spell*/) override { return ValidateSpellInfo( { _triggeredSpellId1, _triggeredSpellId2, _triggeredSpellId3, _triggeredSpellId4 }); } Vehicle* GetTable(Unit* target) { if (target->GetTypeId() == TYPEID_PLAYER) { if (Unit* vehBase = target->GetVehicleBase()) if (Vehicle* table = vehBase->GetVehicle()) if (table->GetCreatureEntry() == NPC_BOUNTIFUL_TABLE) return table; } else if (Vehicle* veh = target->GetVehicle()) if (veh->GetCreatureEntry() == NPC_BOUNTIFUL_TABLE) return veh; return nullptr; } Unit* GetPlateInSeat(Vehicle* table, uint8 seat) { if (Unit* holderUnit = table->GetPassenger(SEAT_PLATE_HOLDER)) if (Vehicle* holder = holderUnit->GetVehicleKit()) if (Unit* plate = holder->GetPassenger(seat)) return plate; return nullptr; } void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); Unit* target = GetHitUnit(); if (!target || caster == target) return; Vehicle* table = GetTable(caster); if (!table || table != GetTable(target)) return; if (Vehicle* casterChair = caster->GetVehicleKit()) if (Unit* casterPlr = casterChair->GetPassenger(SEAT_PLAYER)) { if (casterPlr == target) return; casterPlr->CastSpell(casterPlr, _triggeredSpellId2, true); //Credit for Sharing is Caring(always) uint8 seat = target->GetTransSeat(); if (target->GetTypeId() == TYPEID_PLAYER && target->GetVehicleBase()) seat = target->GetVehicleBase()->GetTransSeat(); if (Unit* plate = GetPlateInSeat(table, seat)) { if (target->GetTypeId() == TYPEID_PLAYER) //Food Fight case { casterPlr->CastSpell(target, _triggeredSpellId1, true); caster->CastSpell(target->GetVehicleBase(), _triggeredSpellId4, true); //CanEat-chair(always) } else { casterPlr->CastSpell(plate, _triggeredSpellId3, true); //Food Visual on plate caster->CastSpell(target, _triggeredSpellId4, true); //CanEat-chair(always) } } } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_on_plate::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; /* 61804 - A Serving of Cranberries 61805 - A Serving of Pie 61806 - A Serving of Stuffing 61807 - A Serving of Turkey 61808 - A Serving of Sweet Potatoes 61793 - Cranberry Server 61794 - Pie Server 61795 - Stuffing Server 61796 - Turkey Server 61797 - Sweet Potatoes Server */ class spell_pilgrims_bounty_a_serving_of : public AuraScript { uint32 _triggeredSpellId; public: spell_pilgrims_bounty_a_serving_of(uint32 triggeredSpellId) : AuraScript(), _triggeredSpellId(triggeredSpellId) { } private: bool Validate(SpellInfo const* /*spell*/) override { return ValidateSpellInfo({ _triggeredSpellId }); } void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); target->CastSpell(target, uint32(aurEff->GetAmount()), true); HandlePlate(target, true); } void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); target->RemoveAurasDueToSpell(aurEff->GetAmount()); HandlePlate(target, false); } void HandlePlate(Unit* target, bool apply) { if (Vehicle* table = target->GetVehicle()) if (Unit* holderUnit = table->GetPassenger(SEAT_PLATE_HOLDER)) if (Vehicle* holder = holderUnit->GetVehicleKit()) if (Unit* plate = holder->GetPassenger(target->GetTransSeat())) { if (apply) target->CastSpell(plate, _triggeredSpellId, true); else plate->RemoveAurasDueToSpell(_triggeredSpellId); } } void Register() override { AfterEffectApply += AuraEffectApplyFn(spell_pilgrims_bounty_a_serving_of::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); OnEffectRemove += AuraEffectRemoveFn(spell_pilgrims_bounty_a_serving_of::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; void AddSC_event_pilgrims_bounty() { RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_slow_roasted_turkey", SPELL_WELL_FED_AP_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_cranberry_chutney", SPELL_WELL_FED_ZM_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_spice_bread_stuffing", SPELL_WELL_FED_HIT_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_pumpkin_pie", SPELL_WELL_FED_SPIRIT_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_candied_sweet_potato", SPELL_WELL_FED_HASTE_TRIGGER); RegisterSpellScript(spell_pilgrims_bounty_feast_on); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_well_fed, "spell_pilgrims_bounty_well_fed_turkey", SPELL_WELL_FED_AP_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_well_fed, "spell_pilgrims_bounty_well_fed_cranberry", SPELL_WELL_FED_ZM_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_well_fed, "spell_pilgrims_bounty_well_fed_stuffing", SPELL_WELL_FED_HIT_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_well_fed, "spell_pilgrims_bounty_well_fed_sweet_potatoes", SPELL_WELL_FED_HASTE_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_well_fed, "spell_pilgrims_bounty_well_fed_pie", SPELL_WELL_FED_SPIRIT_TRIGGER); RegisterSpellScript(spell_pilgrims_bounty_turkey_tracker); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_on_plate, "spell_pilgrims_bounty_on_plate_turkey", SPELL_ON_PLATE_TURKEY, SPELL_PASS_THE_TURKEY, SPELL_ON_PLATE_VISUAL_TURKEY, SPELL_A_SERVING_OF_TURKEY_CHAIR); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_on_plate, "spell_pilgrims_bounty_on_plate_cranberries", SPELL_ON_PLATE_CRANBERRIES, SPELL_PASS_THE_CRANBERRIES, SPELL_ON_PLATE_VISUAL_CRANBERRIES, SPELL_A_SERVING_OF_CRANBERRIES_CHAIR); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_on_plate, "spell_pilgrims_bounty_on_plate_stuffing", SPELL_ON_PLATE_STUFFING, SPELL_PASS_THE_STUFFING, SPELL_ON_PLATE_VISUAL_STUFFING, SPELL_A_SERVING_OF_STUFFING_CHAIR); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_on_plate, "spell_pilgrims_bounty_on_plate_sweet_potatoes", SPELL_ON_PLATE_SWEET_POTATOES, SPELL_PASS_THE_SWEET_POTATOES, SPELL_ON_PLATE_VISUAL_POTATOES, SPELL_A_SERVING_OF_SWEET_POTATOES_CHAIR); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_on_plate, "spell_pilgrims_bounty_on_plate_pie", SPELL_ON_PLATE_PIE, SPELL_PASS_THE_PIE, SPELL_ON_PLATE_VISUAL_PIE, SPELL_A_SERVING_OF_PIE_CHAIR); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_a_serving_of, "spell_pilgrims_bounty_a_serving_of_cranberries", SPELL_A_SERVING_OF_CRANBERRIES_PLATE); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_a_serving_of, "spell_pilgrims_bounty_a_serving_of_turkey", SPELL_A_SERVING_OF_TURKEY_PLATE); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_a_serving_of, "spell_pilgrims_bounty_a_serving_of_stuffing", SPELL_A_SERVING_OF_STUFFING_PLATE); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_a_serving_of, "spell_pilgrims_bounty_a_serving_of_potatoes", SPELL_A_SERVING_OF_SWEET_POTATOES_PLATE); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_a_serving_of, "spell_pilgrims_bounty_a_serving_of_pie", SPELL_A_SERVING_OF_PIE_PLATE); }