From 92d7c276c1c10f5b9ee00e77444d63316bd7cc26 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Mon, 13 Dec 2021 09:41:09 +0100 Subject: [PATCH] refactor(Scripts/Event): convert pilgrims_bounty into new system (#9608) --- src/server/scripts/Events/pilgrims_bounty.cpp | 911 ++++++++---------- 1 file changed, 415 insertions(+), 496 deletions(-) diff --git a/src/server/scripts/Events/pilgrims_bounty.cpp b/src/server/scripts/Events/pilgrims_bounty.cpp index 84e2a3885..c70659a17 100644 --- a/src/server/scripts/Events/pilgrims_bounty.cpp +++ b/src/server/scripts/Events/pilgrims_bounty.cpp @@ -102,457 +102,412 @@ enum tableEvent // NPCs ///////////////////////////// -class npc_pilgrims_bounty_chair : public CreatureScript +struct npc_pilgrims_bounty_chair : public VehicleAI { -public: - npc_pilgrims_bounty_chair() : CreatureScript("npc_pilgrims_bounty_chair") { } - - struct npc_pilgrims_bounty_chairAI : public VehicleAI + npc_pilgrims_bounty_chair(Creature* creature) : VehicleAI(creature) { - npc_pilgrims_bounty_chairAI(Creature* creature) : VehicleAI(creature) - { - plateGUID.Clear(); - timerSpawnPlate = 1; - timerRotateChair = 0; - me->SetReactState(REACT_PASSIVE); - } + plateGUID.Clear(); + timerSpawnPlate = 1; + timerRotateChair = 0; + me->SetReactState(REACT_PASSIVE); + } - void MoveInLineOfSight(Unit* /*who*/) override {} - void AttackStart(Unit*) override {} + void MoveInLineOfSight(Unit* /*who*/) override {} + void AttackStart(Unit*) override {} - void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override - { - if (apply && who->GetTypeId() == TYPEID_PLAYER) - who->ToPlayer()->SetClientControl(me, 0, true); - } - - ObjectGuid plateGUID; - uint32 timerSpawnPlate; - uint32 timerRotateChair; - - Creature* GetPlate() { return plateGUID ? ObjectAccessor::GetCreature(*me, plateGUID) : nullptr; } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override - { - damage = 0; - } - - void DoAction(int32 param) override - { - switch (param) - { - case SPELL_VISUAL_THROW_TURKEY: - case SPELL_VISUAL_BOUNCE_TURKEY: - me->CastSpell(me, SPELL_STORE_TURKEY, true); - me->CastSpell(me, SPELL_CAN_EAT_TURKEY, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_TURKEY, true); - break; - case SPELL_VISUAL_THROW_STUFFING: - case SPELL_VISUAL_BOUNCE_STUFFING: - me->CastSpell(me, SPELL_STORE_STUFFING, true); - me->CastSpell(me, SPELL_CAN_EAT_STUFFING, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_STUFFING, true); - break; - case SPELL_VISUAL_THROW_PIE: - case SPELL_VISUAL_BOUNCE_PIE: - me->CastSpell(me, SPELL_STORE_PIE, true); - me->CastSpell(me, SPELL_CAN_EAT_PIE, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_PIE, true); - break; - case SPELL_VISUAL_THROW_CRANBERRY: - case SPELL_VISUAL_BOUNCE_CRANBERRY: - me->CastSpell(me, SPELL_STORE_CRANBERRY, true); - me->CastSpell(me, SPELL_CAN_EAT_CRANBERRY, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_CRANBERRY, true); - break; - case SPELL_VISUAL_THROW_SWEET_POTATO: - case SPELL_VISUAL_BOUNCE_SWEET_POTATO: - me->CastSpell(me, SPELL_STORE_SWEET_POTATO, true); - me->CastSpell(me, SPELL_CAN_EAT_SWEET_POTATO, true); - if (Unit* plate = GetPlate()) - plate->CastSpell(plate, SPELL_PLATE_SWEET_POTATO, true); - break; - - // AURA REMOVAL - case SPELL_STORE_SWEET_POTATO: - me->RemoveAura(SPELL_CAN_EAT_SWEET_POTATO); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_SWEET_POTATO); - break; - case SPELL_STORE_TURKEY: - me->RemoveAura(SPELL_CAN_EAT_TURKEY); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_TURKEY); - break; - case SPELL_STORE_PIE: - me->RemoveAura(SPELL_CAN_EAT_PIE); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_PIE); - break; - case SPELL_STORE_STUFFING: - me->RemoveAura(SPELL_CAN_EAT_STUFFING); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_STUFFING); - break; - case SPELL_STORE_CRANBERRY: - me->RemoveAura(SPELL_CAN_EAT_CRANBERRY); - if (Unit* plate = GetPlate()) - plate->RemoveAura(SPELL_PLATE_CRANBERRY); - break; - } - } - - void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) override - { - Unit* charm = target->GetCharm(); - if (!charm || !charm->ToCreature()) - return; - - charm->ToCreature()->AI()->DoAction(spellInfo->Id); - } - - void SpellHit(Unit* /*target*/, const SpellInfo* spellInfo) override - { - switch (spellInfo->Id) - { - case SPELL_FEAST_ON_SWEET_POTATOES: - if (Aura* aur = me->GetAura(SPELL_STORE_SWEET_POTATO)) - aur->ModStackAmount(-1); - break; - case SPELL_FEAST_ON_TURKEY: - if (Aura* aur = me->GetAura(SPELL_STORE_TURKEY)) - aur->ModStackAmount(-1); - break; - case SPELL_FEAST_ON_PIE: - if (Aura* aur = me->GetAura(SPELL_STORE_PIE)) - aur->ModStackAmount(-1); - break; - case SPELL_FEAST_ON_STUFFING: - if (Aura* aur = me->GetAura(SPELL_STORE_STUFFING)) - aur->ModStackAmount(-1); - break; - case SPELL_FEAST_ON_CRANBERRY: - if (Aura* aur = me->GetAura(SPELL_STORE_CRANBERRY)) - aur->ModStackAmount(-1); - break; - } - } - - void UpdateAI(uint32 diff) override - { - if (timerSpawnPlate) - { - timerSpawnPlate += diff; - if (timerSpawnPlate >= 1000) - { - if (Vehicle* table = me->GetVehicle()) - if (Unit* plateHolder = table->GetPassenger(6)) - { - SeatMap::const_iterator itr = table->GetSeatIteratorForPassenger(me); - if (itr == table->Seats.end()) - return; - - uint8 vehicleSeatId = itr->first; - Creature* plate = me->SummonCreature(NPC_STRUDY_PLATE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f); - if (!plate) - return; - - plateGUID = plate->GetGUID(); - plate->EnterVehicle(plateHolder, vehicleSeatId); - timerSpawnPlate = 0; - timerRotateChair = 1; - } - } - } - if (timerRotateChair) - { - timerRotateChair += diff; - if (timerRotateChair >= 1000) - { - if (Creature* plate = GetPlate()) - me->SetFacingToObject(plate); - - timerRotateChair = 0; - } - } - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override { - return new npc_pilgrims_bounty_chairAI(creature); + if (apply && who->GetTypeId() == TYPEID_PLAYER) + who->ToPlayer()->SetClientControl(me, 0, true); + } + + ObjectGuid plateGUID; + uint32 timerSpawnPlate; + uint32 timerRotateChair; + + Creature* GetPlate() { return plateGUID ? ObjectAccessor::GetCreature(*me, plateGUID) : nullptr; } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override + { + damage = 0; + } + + void DoAction(int32 param) override + { + switch (param) + { + case SPELL_VISUAL_THROW_TURKEY: + case SPELL_VISUAL_BOUNCE_TURKEY: + me->CastSpell(me, SPELL_STORE_TURKEY, true); + me->CastSpell(me, SPELL_CAN_EAT_TURKEY, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_TURKEY, true); + break; + case SPELL_VISUAL_THROW_STUFFING: + case SPELL_VISUAL_BOUNCE_STUFFING: + me->CastSpell(me, SPELL_STORE_STUFFING, true); + me->CastSpell(me, SPELL_CAN_EAT_STUFFING, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_STUFFING, true); + break; + case SPELL_VISUAL_THROW_PIE: + case SPELL_VISUAL_BOUNCE_PIE: + me->CastSpell(me, SPELL_STORE_PIE, true); + me->CastSpell(me, SPELL_CAN_EAT_PIE, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_PIE, true); + break; + case SPELL_VISUAL_THROW_CRANBERRY: + case SPELL_VISUAL_BOUNCE_CRANBERRY: + me->CastSpell(me, SPELL_STORE_CRANBERRY, true); + me->CastSpell(me, SPELL_CAN_EAT_CRANBERRY, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_CRANBERRY, true); + break; + case SPELL_VISUAL_THROW_SWEET_POTATO: + case SPELL_VISUAL_BOUNCE_SWEET_POTATO: + me->CastSpell(me, SPELL_STORE_SWEET_POTATO, true); + me->CastSpell(me, SPELL_CAN_EAT_SWEET_POTATO, true); + if (Unit* plate = GetPlate()) + plate->CastSpell(plate, SPELL_PLATE_SWEET_POTATO, true); + break; + + // AURA REMOVAL + case SPELL_STORE_SWEET_POTATO: + me->RemoveAura(SPELL_CAN_EAT_SWEET_POTATO); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_SWEET_POTATO); + break; + case SPELL_STORE_TURKEY: + me->RemoveAura(SPELL_CAN_EAT_TURKEY); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_TURKEY); + break; + case SPELL_STORE_PIE: + me->RemoveAura(SPELL_CAN_EAT_PIE); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_PIE); + break; + case SPELL_STORE_STUFFING: + me->RemoveAura(SPELL_CAN_EAT_STUFFING); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_STUFFING); + break; + case SPELL_STORE_CRANBERRY: + me->RemoveAura(SPELL_CAN_EAT_CRANBERRY); + if (Unit* plate = GetPlate()) + plate->RemoveAura(SPELL_PLATE_CRANBERRY); + break; + } + } + + void SpellHitTarget(Unit* target, const SpellInfo* spellInfo) override + { + Unit* charm = target->GetCharm(); + if (!charm || !charm->ToCreature()) + return; + + charm->ToCreature()->AI()->DoAction(spellInfo->Id); + } + + void SpellHit(Unit* /*target*/, const SpellInfo* spellInfo) override + { + switch (spellInfo->Id) + { + case SPELL_FEAST_ON_SWEET_POTATOES: + if (Aura* aur = me->GetAura(SPELL_STORE_SWEET_POTATO)) + aur->ModStackAmount(-1); + break; + case SPELL_FEAST_ON_TURKEY: + if (Aura* aur = me->GetAura(SPELL_STORE_TURKEY)) + aur->ModStackAmount(-1); + break; + case SPELL_FEAST_ON_PIE: + if (Aura* aur = me->GetAura(SPELL_STORE_PIE)) + aur->ModStackAmount(-1); + break; + case SPELL_FEAST_ON_STUFFING: + if (Aura* aur = me->GetAura(SPELL_STORE_STUFFING)) + aur->ModStackAmount(-1); + break; + case SPELL_FEAST_ON_CRANBERRY: + if (Aura* aur = me->GetAura(SPELL_STORE_CRANBERRY)) + aur->ModStackAmount(-1); + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (timerSpawnPlate) + { + timerSpawnPlate += diff; + if (timerSpawnPlate >= 1000) + { + if (Vehicle* table = me->GetVehicle()) + if (Unit* plateHolder = table->GetPassenger(6)) + { + SeatMap::const_iterator itr = table->GetSeatIteratorForPassenger(me); + if (itr == table->Seats.end()) + return; + + uint8 vehicleSeatId = itr->first; + Creature* plate = me->SummonCreature(NPC_STRUDY_PLATE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f); + if (!plate) + return; + + plateGUID = plate->GetGUID(); + plate->EnterVehicle(plateHolder, vehicleSeatId); + timerSpawnPlate = 0; + timerRotateChair = 1; + } + } + } + if (timerRotateChair) + { + timerRotateChair += diff; + if (timerRotateChair >= 1000) + { + if (Creature* plate = GetPlate()) + me->SetFacingToObject(plate); + + timerRotateChair = 0; + } + } } }; -class npc_pilgrims_bounty_plate : public CreatureScript +struct npc_pilgrims_bounty_plate : public NullCreatureAI { -public: - npc_pilgrims_bounty_plate() : CreatureScript("npc_pilgrims_bounty_plate") { } + npc_pilgrims_bounty_plate(Creature* creature) : NullCreatureAI(creature) { } - struct npc_pilgrims_bounty_plateAI : public NullCreatureAI + void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) override { - npc_pilgrims_bounty_plateAI(Creature* creature) : NullCreatureAI(creature) + switch (spellInfo->Id) { + case SPELL_VISUAL_THROW_TURKEY: + case SPELL_VISUAL_THROW_STUFFING: + case SPELL_VISUAL_THROW_PIE: + case SPELL_VISUAL_THROW_CRANBERRY: + case SPELL_VISUAL_THROW_SWEET_POTATO: + if (TempSummon* ts = me->ToTempSummon()) + if (Unit* owner = ts->GetSummonerUnit()) + owner->ToCreature()->AI()->DoAction(spellInfo->Id); + break; } - - void SpellHit(Unit* /*caster*/, const SpellInfo* spellInfo) override - { - switch (spellInfo->Id) - { - case SPELL_VISUAL_THROW_TURKEY: - case SPELL_VISUAL_THROW_STUFFING: - case SPELL_VISUAL_THROW_PIE: - case SPELL_VISUAL_THROW_CRANBERRY: - case SPELL_VISUAL_THROW_SWEET_POTATO: - if (TempSummon* ts = me->ToTempSummon()) - if (Unit* owner = ts->GetSummonerUnit()) - owner->ToCreature()->AI()->DoAction(spellInfo->Id); - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_pilgrims_bounty_plateAI(creature); } }; ///////////////////////////// // Spells ///////////////////////////// -class spell_pilgrims_bounty_pass_generic : public SpellScriptLoader + +class spell_pilgrims_bounty_pass_generic : public SpellScript { -public: - spell_pilgrims_bounty_pass_generic() : SpellScriptLoader("spell_pilgrims_bounty_pass_generic") {} + PrepareSpellScript(spell_pilgrims_bounty_pass_generic); - class spell_pilgrims_bounty_pass_generic_SpellScript : public SpellScript + uint32 GetVisualThrow(uint32 passSpell, bool isPlayer) { - PrepareSpellScript(spell_pilgrims_bounty_pass_generic_SpellScript); - - uint32 GetVisualThrow(uint32 passSpell, bool isPlayer) + if (isPlayer) { - if (isPlayer) + switch (passSpell) { - switch (passSpell) - { - case SPELL_PASS_TURKEY: - return SPELL_VISUAL_BOUNCE_TURKEY; - case SPELL_PASS_STUFFING: - return SPELL_VISUAL_BOUNCE_STUFFING; - case SPELL_PASS_PIE: - return SPELL_VISUAL_BOUNCE_PIE; - case SPELL_PASS_CRANBERRY: - return SPELL_VISUAL_BOUNCE_CRANBERRY; - case SPELL_PASS_SWEET_POTATO: - return SPELL_VISUAL_BOUNCE_SWEET_POTATO; - } + case SPELL_PASS_TURKEY: + return SPELL_VISUAL_BOUNCE_TURKEY; + case SPELL_PASS_STUFFING: + return SPELL_VISUAL_BOUNCE_STUFFING; + case SPELL_PASS_PIE: + return SPELL_VISUAL_BOUNCE_PIE; + case SPELL_PASS_CRANBERRY: + return SPELL_VISUAL_BOUNCE_CRANBERRY; + case SPELL_PASS_SWEET_POTATO: + return SPELL_VISUAL_BOUNCE_SWEET_POTATO; } - else + } + else + { + switch (passSpell) { - switch (passSpell) - { - case SPELL_PASS_TURKEY: - return SPELL_VISUAL_THROW_TURKEY; - case SPELL_PASS_STUFFING: - return SPELL_VISUAL_THROW_STUFFING; - case SPELL_PASS_PIE: - return SPELL_VISUAL_THROW_PIE; - case SPELL_PASS_CRANBERRY: - return SPELL_VISUAL_THROW_CRANBERRY; - case SPELL_PASS_SWEET_POTATO: - return SPELL_VISUAL_THROW_SWEET_POTATO; - } + case SPELL_PASS_TURKEY: + return SPELL_VISUAL_THROW_TURKEY; + case SPELL_PASS_STUFFING: + return SPELL_VISUAL_THROW_STUFFING; + case SPELL_PASS_PIE: + return SPELL_VISUAL_THROW_PIE; + case SPELL_PASS_CRANBERRY: + return SPELL_VISUAL_THROW_CRANBERRY; + case SPELL_PASS_SWEET_POTATO: + return SPELL_VISUAL_THROW_SWEET_POTATO; } - - return 0; } - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - { - uint32 spellId = 0; - switch (GetSpellInfo()->Id) - { - case SPELL_PASS_TURKEY: - spellId = SPELL_STORE_TURKEY; - break; - case SPELL_PASS_STUFFING: - spellId = SPELL_STORE_STUFFING; - break; - case SPELL_PASS_PIE: - spellId = SPELL_STORE_PIE; - break; - case SPELL_PASS_CRANBERRY: - spellId = SPELL_STORE_CRANBERRY; - break; - case SPELL_PASS_SWEET_POTATO: - spellId = SPELL_STORE_SWEET_POTATO; - break; - } + return 0; + } - // player case - if (target->IsVehicle() && target->ToCreature()) + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + { + uint32 spellId = 0; + switch (GetSpellInfo()->Id) + { + case SPELL_PASS_TURKEY: + spellId = SPELL_STORE_TURKEY; + break; + case SPELL_PASS_STUFFING: + spellId = SPELL_STORE_STUFFING; + break; + case SPELL_PASS_PIE: + spellId = SPELL_STORE_PIE; + break; + case SPELL_PASS_CRANBERRY: + spellId = SPELL_STORE_CRANBERRY; + break; + case SPELL_PASS_SWEET_POTATO: + spellId = SPELL_STORE_SWEET_POTATO; + break; + } + + // player case + if (target->IsVehicle() && target->ToCreature()) + { + if (Player* player = target->GetCharmerOrOwnerPlayerOrPlayerItself()) { - if (Player* player = target->GetCharmerOrOwnerPlayerOrPlayerItself()) + GetCaster()->CastSpell(player, GetVisualThrow(GetSpellInfo()->Id, true), true); + if (AuraEffect* aur = target->GetAuraEffectDummy(spellId)) { - GetCaster()->CastSpell(player, GetVisualThrow(GetSpellInfo()->Id, true), true); - if (AuraEffect* aur = target->GetAuraEffectDummy(spellId)) + if (aur->GetBase()->GetStackAmount() >= 5) { - if (aur->GetBase()->GetStackAmount() >= 5) + if (Player* casterPlayer = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) { - if (Player* casterPlayer = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) - { - casterPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, GetVisualThrow(GetSpellInfo()->Id, true)); - } + casterPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, GetVisualThrow(GetSpellInfo()->Id, true)); } } } } - // normal case - else - { - if (TempSummon* ts = target->ToTempSummon()) - if (Unit* owner = ts->GetSummonerUnit()) - if (owner->GetEntry() == GetCaster()->GetEntry()) - return; - - GetCaster()->CastSpell(target, GetVisualThrow(GetSpellInfo()->Id, false), true); - } } - - // Get chair charmer, passing achievement - if (Player* player = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) + // normal case + else { - uint32 spellId = 0; - switch (GetSpellInfo()->Id) - { - case SPELL_PASS_TURKEY: - spellId = SPELL_ACHI_PASS_TURKEY; - break; - case SPELL_PASS_STUFFING: - spellId = SPELL_ACHI_PASS_STUFFING; - break; - case SPELL_PASS_PIE: - spellId = SPELL_ACHI_PASS_PIE; - break; - case SPELL_PASS_CRANBERRY: - spellId = SPELL_ACHI_PASS_CRANBERRY; - break; - case SPELL_PASS_SWEET_POTATO: - spellId = SPELL_ACHI_PASS_SWEET_POTATOES; - break; - } + if (TempSummon* ts = target->ToTempSummon()) + if (Unit* owner = ts->GetSummonerUnit()) + if (owner->GetEntry() == GetCaster()->GetEntry()) + return; - if (spellId) - player->CastSpell(player, spellId, true); + GetCaster()->CastSpell(target, GetVisualThrow(GetSpellInfo()->Id, false), true); } } - void Register() override + // Get chair charmer, passing achievement + if (Player* player = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself()) { - OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_pass_generic_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_pilgrims_bounty_pass_generic_SpellScript(); - } -}; - -class spell_pilgrims_bounty_feast_on_generic : public SpellScriptLoader -{ -public: - spell_pilgrims_bounty_feast_on_generic() : SpellScriptLoader("spell_pilgrims_bounty_feast_on_generic") {} - - class spell_pilgrims_bounty_feast_on_generic_SpellScript : public SpellScript - { - PrepareSpellScript(spell_pilgrims_bounty_feast_on_generic_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Player* player = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself(); - if (!player) - return; - uint32 spellId = 0; switch (GetSpellInfo()->Id) { - case SPELL_FEAST_ON_TURKEY: - spellId = SPELL_PLAYER_TURKEY; + case SPELL_PASS_TURKEY: + spellId = SPELL_ACHI_PASS_TURKEY; break; - case SPELL_FEAST_ON_STUFFING: - spellId = SPELL_PLAYER_STUFFING; + case SPELL_PASS_STUFFING: + spellId = SPELL_ACHI_PASS_STUFFING; break; - case SPELL_FEAST_ON_PIE: - spellId = SPELL_PLAYER_PIE; + case SPELL_PASS_PIE: + spellId = SPELL_ACHI_PASS_PIE; break; - case SPELL_FEAST_ON_CRANBERRY: - spellId = SPELL_PLAYER_CRANBERRY; + case SPELL_PASS_CRANBERRY: + spellId = SPELL_ACHI_PASS_CRANBERRY; break; - case SPELL_FEAST_ON_SWEET_POTATOES: - spellId = SPELL_PLAYER_SWEET_POTATOES; + case SPELL_PASS_SWEET_POTATO: + spellId = SPELL_ACHI_PASS_SWEET_POTATOES; break; } if (spellId) - { player->CastSpell(player, spellId, true); - if (AuraEffect* aur = player->GetAuraEffectDummy(spellId)) + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_pass_generic::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_pilgrims_bounty_feast_on_generic : public SpellScript +{ + PrepareSpellScript(spell_pilgrims_bounty_feast_on_generic); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* player = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (!player) + return; + + uint32 spellId = 0; + switch (GetSpellInfo()->Id) + { + case SPELL_FEAST_ON_TURKEY: + spellId = SPELL_PLAYER_TURKEY; + break; + case SPELL_FEAST_ON_STUFFING: + spellId = SPELL_PLAYER_STUFFING; + break; + case SPELL_FEAST_ON_PIE: + spellId = SPELL_PLAYER_PIE; + break; + case SPELL_FEAST_ON_CRANBERRY: + spellId = SPELL_PLAYER_CRANBERRY; + break; + case SPELL_FEAST_ON_SWEET_POTATOES: + spellId = SPELL_PLAYER_SWEET_POTATOES; + break; + } + + if (spellId) + { + player->CastSpell(player, spellId, true); + if (AuraEffect* aur = player->GetAuraEffectDummy(spellId)) + { + if (aur->GetBase()->GetStackAmount() >= 5) { - if (aur->GetBase()->GetStackAmount() >= 5) + switch (spellId) { - switch (spellId) - { - case SPELL_PLAYER_TURKEY: - player->CastSpell(player, SPELL_WELL_FED_TURKEY, true); - break; - case SPELL_PLAYER_STUFFING: - player->CastSpell(player, SPELL_WELL_FED_STUFFING, true); - break; - case SPELL_PLAYER_PIE: - player->CastSpell(player, SPELL_WELL_FED_PIE, true); - break; - case SPELL_PLAYER_CRANBERRY: - player->CastSpell(player, SPELL_WELL_FED_CRANBERRY, true); - break; - case SPELL_PLAYER_SWEET_POTATOES: - player->CastSpell(player, SPELL_WELL_FED_SWEET_POTATOES, true); - break; - } - - uint8 count = 0; - Unit::AuraEffectList const& dummyAuras = player->GetAuraEffectsByType(SPELL_AURA_DUMMY); - for (Unit::AuraEffectList::const_iterator i = dummyAuras.begin(); i != dummyAuras.end(); ++i) - { - if ((*i)->GetId() >= SPELL_PLAYER_CRANBERRY && (*i)->GetId() <= SPELL_PLAYER_PIE) - if ((*i)->GetBase()->GetStackAmount() >= 5) - ++count; - } - - // Cast spirit of sharing - if (count >= 5) - player->CastSpell(player, SPELL_SPIRIT_OF_SHARING, true); + case SPELL_PLAYER_TURKEY: + player->CastSpell(player, SPELL_WELL_FED_TURKEY, true); + break; + case SPELL_PLAYER_STUFFING: + player->CastSpell(player, SPELL_WELL_FED_STUFFING, true); + break; + case SPELL_PLAYER_PIE: + player->CastSpell(player, SPELL_WELL_FED_PIE, true); + break; + case SPELL_PLAYER_CRANBERRY: + player->CastSpell(player, SPELL_WELL_FED_CRANBERRY, true); + break; + case SPELL_PLAYER_SWEET_POTATOES: + player->CastSpell(player, SPELL_WELL_FED_SWEET_POTATOES, true); + break; } + + uint8 count = 0; + Unit::AuraEffectList const& dummyAuras = player->GetAuraEffectsByType(SPELL_AURA_DUMMY); + for (Unit::AuraEffectList::const_iterator i = dummyAuras.begin(); i != dummyAuras.end(); ++i) + { + if ((*i)->GetId() >= SPELL_PLAYER_CRANBERRY && (*i)->GetId() <= SPELL_PLAYER_PIE) + if ((*i)->GetBase()->GetStackAmount() >= 5) + ++count; + } + + // Cast spirit of sharing + if (count >= 5) + player->CastSpell(player, SPELL_SPIRIT_OF_SHARING, true); } } } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_feast_on_generic_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_pilgrims_bounty_feast_on_generic_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_feast_on_generic::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -562,140 +517,104 @@ enum tTracker SPELL_ACHI_TURKINATOR_CREDIT = 62021, }; -class spell_pilgrims_bounty_turkey_tracker : public SpellScriptLoader +class spell_pilgrims_bounty_turkey_tracker : public SpellScript { -public: - spell_pilgrims_bounty_turkey_tracker() : SpellScriptLoader("spell_pilgrims_bounty_turkey_tracker") {} + PrepareSpellScript(spell_pilgrims_bounty_turkey_tracker); - class spell_pilgrims_bounty_turkey_tracker_SpellScript : public SpellScript + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_pilgrims_bounty_turkey_tracker_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (Player* target = GetHitPlayer()) { - if (Player* target = GetHitPlayer()) - if (AuraEffect* aurEff = target->GetAuraEffectDummy(SPELL_TURKEY_TRACKER)) + if (AuraEffect* aurEff = target->GetAuraEffectDummy(SPELL_TURKEY_TRACKER)) + { + uint32 stackAmount = aurEff->GetBase()->GetStackAmount(); + switch (stackAmount) { - uint32 stackAmount = aurEff->GetBase()->GetStackAmount(); - switch (stackAmount) - { - case 10: - target->TextEmote("Turkey Hunter!", target, true); - break; - case 20: - target->TextEmote("Turkey Domination!", target, true); - break; - case 30: - target->TextEmote("Turkey Slaughter!", target, true); - break; - case 40: - target->TextEmote("TURKEY TRIUMPH!", target, true); - target->CastSpell(target, SPELL_ACHI_TURKINATOR_CREDIT, true); - aurEff->GetBase()->Remove(); - break; - } + case 10: + target->TextEmote("Turkey Hunter!", target, true); + break; + case 20: + target->TextEmote("Turkey Domination!", target, true); + break; + case 30: + target->TextEmote("Turkey Slaughter!", target, true); + break; + case 40: + target->TextEmote("TURKEY TRIUMPH!", target, true); + target->CastSpell(target, SPELL_ACHI_TURKINATOR_CREDIT, true); + aurEff->GetBase()->Remove(); + break; } + } } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_turkey_tracker_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_pilgrims_bounty_turkey_tracker_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_turkey_tracker::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_pilgrims_bounty_serve_generic : public SpellScriptLoader +class spell_pilgrims_bounty_serve_generic : public AuraScript { -public: - spell_pilgrims_bounty_serve_generic() : SpellScriptLoader("spell_pilgrims_bounty_serve_generic") { } + PrepareAuraScript(spell_pilgrims_bounty_serve_generic); - class spell_pilgrims_bounty_serve_generic_AuraScript : public AuraScript + void OnAuraRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_pilgrims_bounty_serve_generic_AuraScript); + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id); + } - void OnAuraRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->AI()->DoAction(GetSpellInfo()->Id); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_pilgrims_bounty_serve_generic_AuraScript::OnAuraRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_pilgrims_bounty_serve_generic_AuraScript(); + OnEffectRemove += AuraEffectRemoveFn(spell_pilgrims_bounty_serve_generic::OnAuraRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_pilgrims_bounty_food : public SpellScriptLoader +class spell_pilgrims_bounty_food_aura : public AuraScript { -public: - spell_pilgrims_bounty_food() : SpellScriptLoader("spell_pilgrims_bounty_food") { } + PrepareAuraScript(spell_pilgrims_bounty_food_aura); - class spell_pilgrims_bounty_food_AuraScript : public AuraScript + void RecalculateHook(AuraEffect const* /*aurEffect*/, int32& amount, bool& canBeRecalculated) { - PrepareAuraScript(spell_pilgrims_bounty_food_AuraScript); - - void RecalculateHook(AuraEffect const* /*aurEffect*/, int32& amount, bool& canBeRecalculated) + if (GetCaster()) { - if (GetCaster()) - { - if (GetId() == 66041) - amount = CalculatePct(GetCaster()->GetMaxPower(POWER_MANA), 20); - else - amount = CalculatePct(GetCaster()->GetMaxHealth(), 15); - } - canBeRecalculated = true; + if (GetId() == 66041) + amount = CalculatePct(GetCaster()->GetMaxPower(POWER_MANA), 20); + else + amount = CalculatePct(GetCaster()->GetMaxHealth(), 15); } - - void Register() override - { - if (m_scriptSpellId == 66041) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pilgrims_bounty_food_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_POWER_REGEN); - else if (m_scriptSpellId != 66477) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pilgrims_bounty_food_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_REGEN); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_pilgrims_bounty_food_AuraScript(); + canBeRecalculated = true; } - class spell_pilgrims_bounty_food_SpellScript : public SpellScript + void Register() override { - PrepareSpellScript(spell_pilgrims_bounty_food_SpellScript); + if (m_scriptSpellId == 66041) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pilgrims_bounty_food_aura::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_POWER_REGEN); + else if (m_scriptSpellId != 66477) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pilgrims_bounty_food_aura::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_REGEN); + } +}; - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - { - target->AddAura(sSpellMgr->GetSpellInfo(65422), 1, target); - target->CastSpell(target, 66041, true); - target->CastSpell(target, 66622, true); - } - } +class spell_pilgrims_bounty_food : public SpellScript +{ + PrepareSpellScript(spell_pilgrims_bounty_food); - void Register() override - { - if (m_scriptSpellId == 66477) - OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_food_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - return new spell_pilgrims_bounty_food_SpellScript(); + if (Unit* target = GetHitUnit()) + { + target->AddAura(sSpellMgr->GetSpellInfo(65422), 1, target); + target->CastSpell(target, 66041, true); + target->CastSpell(target, 66622, true); + } + } + + void Register() override + { + if (m_scriptSpellId == 66477) + OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_food::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -741,15 +660,15 @@ public: void AddSC_event_pilgrims_end_scripts() { // Spells - new spell_pilgrims_bounty_pass_generic(); - new spell_pilgrims_bounty_feast_on_generic(); - new spell_pilgrims_bounty_turkey_tracker(); - new spell_pilgrims_bounty_serve_generic(); - new spell_pilgrims_bounty_food(); + RegisterSpellScript(spell_pilgrims_bounty_pass_generic); + RegisterSpellScript(spell_pilgrims_bounty_feast_on_generic); + RegisterSpellScript(spell_pilgrims_bounty_turkey_tracker); + RegisterSpellScript(spell_pilgrims_bounty_serve_generic); + RegisterSpellAndAuraScriptPair(spell_pilgrims_bounty_food, spell_pilgrims_bounty_food_aura); // Npcs - new npc_pilgrims_bounty_chair(); - new npc_pilgrims_bounty_plate(); + RegisterCreatureAI(npc_pilgrims_bounty_chair); + RegisterCreatureAI(npc_pilgrims_bounty_plate); // Achievements new achievement_pb_pilgrims_peril();