diff options
author | Meji <alvaromegias_46@hotmail.com> | 2021-12-19 13:27:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-19 13:27:27 +0100 |
commit | c4fee8c5cf85aeddc45aad18d7a944efa59022bd (patch) | |
tree | 327bcb401fd8d5e0a7f86308d509ad7242746933 /src | |
parent | e6ac3316b73d68d1ce776e5c740cafd3b7b0bad6 (diff) |
Core/Spells: Implemented spell effect 204 (SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY) (#27425)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.cpp | 35 | ||||
-rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 59 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 31 |
5 files changed, 127 insertions, 1 deletions
diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp index c9166d86a02..5f5ad43154d 100644 --- a/src/server/game/BattlePets/BattlePetMgr.cpp +++ b/src/server/game/BattlePets/BattlePetMgr.cpp @@ -642,6 +642,41 @@ void BattlePetMgr::CageBattlePet(ObjectGuid guid) } } +void BattlePetMgr::ChangeBattlePetQuality(ObjectGuid guid, BattlePetBreedQuality quality) +{ + if (!HasJournalLock()) + return; + + BattlePet* pet = GetPet(guid); + if (!pet) + return; + + if (quality > BattlePetBreedQuality::Rare) + return; + + if (BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(pet->PacketInfo.Species)) + if (battlePetSpecies->GetFlags().HasFlag(BattlePetSpeciesFlags::CantBattle)) + return; + + uint8 qualityValue = AsUnderlyingType(quality); + if (pet->PacketInfo.Quality >= qualityValue) + return; + + pet->PacketInfo.Quality = qualityValue; + pet->CalculateStats(); + pet->PacketInfo.Health = pet->PacketInfo.MaxHealth; + + if (pet->SaveInfo != BATTLE_PET_NEW) + pet->SaveInfo = BATTLE_PET_CHANGED; + + std::vector<std::reference_wrapper<BattlePet>> updates; + updates.push_back(std::ref(*pet)); + SendUpdates(std::move(updates), false); + + // UF::PlayerData::CurrentBattlePetBreedQuality isn't updated (Intended) + // _owner->GetPlayer()->SetCurrentBattlePetBreedQuality(qualityValue); +} + void BattlePetMgr::HealBattlePetsPct(uint8 pct) { // TODO: After each Pet Battle, any injured companion will automatically diff --git a/src/server/game/BattlePets/BattlePetMgr.h b/src/server/game/BattlePets/BattlePetMgr.h index 7a80e82aee8..3c2542eb596 100644 --- a/src/server/game/BattlePets/BattlePetMgr.h +++ b/src/server/game/BattlePets/BattlePetMgr.h @@ -38,6 +38,7 @@ enum BattlePetMisc SPELL_SUMMON_BATTLE_PET = 118301 }; +static constexpr uint16 MAX_BATTLE_PET_LEVEL = 25; static constexpr Milliseconds REVIVE_BATTLE_PETS_COOLDOWN = 180s; enum class BattlePetBreedQuality : uint8 @@ -170,6 +171,7 @@ public: std::vector<WorldPackets::BattlePet::BattlePetSlot> const& GetSlots() const { return _slots; } void CageBattlePet(ObjectGuid guid); + void ChangeBattlePetQuality(ObjectGuid guid, BattlePetBreedQuality quality); void HealBattlePetsPct(uint8 pct); void SummonPet(ObjectGuid guid); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 59cf6e00210..338867b9a52 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -20,6 +20,7 @@ #include "Battlefield.h" #include "BattlefieldMgr.h" #include "Battleground.h" +#include "BattlePetMgr.h" #include "CellImpl.h" #include "CombatLogPackets.h" #include "Common.h" @@ -6003,6 +6004,64 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 } break; } + case SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY: + case SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE: + { + Player* playerCaster = m_caster->ToPlayer(); + if (!playerCaster || !m_targets.GetUnitTarget() || !m_targets.GetUnitTarget()->IsCreature()) + return SPELL_FAILED_BAD_TARGETS; + + BattlePets::BattlePetMgr* battlePetMgr = playerCaster->GetSession()->GetBattlePetMgr(); + if (!battlePetMgr->HasJournalLock()) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + + Creature* creature = m_targets.GetUnitTarget()->ToCreature(); + if (creature) + { + if (!playerCaster->GetSummonedBattlePetGUID() || !creature->GetBattlePetCompanionGUID()) + return SPELL_FAILED_NO_PET; + + if (playerCaster->GetSummonedBattlePetGUID() != creature->GetBattlePetCompanionGUID()) + return SPELL_FAILED_BAD_TARGETS; + + if (BattlePets::BattlePet* battlePet = battlePetMgr->GetPet(creature->GetBattlePetCompanionGUID())) + { + if (BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(battlePet->PacketInfo.Species)) + { + if (uint32 battlePetType = spellEffectInfo.MiscValue) + if (!(battlePetType & (1 << battlePetSpecies->PetTypeEnum))) + return SPELL_FAILED_WRONG_BATTLE_PET_TYPE; + + if (spellEffectInfo.Effect == SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY) + { + BattlePets::BattlePetBreedQuality quality = BattlePets::BattlePetBreedQuality::Poor; + switch (spellEffectInfo.BasePoints) + { + case 85: + quality = BattlePets::BattlePetBreedQuality::Rare; + break; + case 75: + quality = BattlePets::BattlePetBreedQuality::Uncommon; + break; + default: + // Ignore Epic Battle-Stones + break; + } + if (battlePet->PacketInfo.Quality >= AsUnderlyingType(quality)) + return SPELL_FAILED_CANT_UPGRADE_BATTLE_PET; + } + + if (spellEffectInfo.Effect == SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE) + if (battlePet->PacketInfo.Level >= BattlePets::MAX_BATTLE_PET_LEVEL) + return GRANT_PET_LEVEL_FAIL; + + if (battlePetSpecies->GetFlags().HasFlag(BattlePetSpeciesFlags::CantBattle)) + return SPELL_FAILED_BAD_TARGETS; + } + } + } + break; + } default: break; } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 018550c373b..ec13aaee2b4 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -377,6 +377,7 @@ class TC_GAME_API Spell void EffectActivateGarrisonBuilding(); void EffectHealBattlePetPct(); void EffectEnableBattlePets(); + void EffectChangeBattlePetQuality(); void EffectLaunchQuestChoice(); void EffectUncageBattlePet(); void EffectCreateHeirloomItem(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index ad335d2a4a8..621e620866a 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -285,7 +285,7 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF &Spell::EffectEnableBattlePets, //201 SPELL_EFFECT_ENABLE_BATTLE_PETS &Spell::EffectUnused, //202 SPELL_EFFECT_APPLY_AREA_AURA_SUMMONS &Spell::EffectRemoveAura, //203 SPELL_EFFECT_REMOVE_AURA_2 - &Spell::EffectNULL, //204 SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY + &Spell::EffectChangeBattlePetQuality, //204 SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY &Spell::EffectLaunchQuestChoice, //205 SPELL_EFFECT_LAUNCH_QUEST_CHOICE &Spell::EffectNULL, //206 SPELL_EFFECT_ALTER_ITEM &Spell::EffectNULL, //207 SPELL_EFFECT_LAUNCH_QUEST_TASK @@ -5297,6 +5297,35 @@ void Spell::EffectEnableBattlePets() player->GetSession()->GetBattlePetMgr()->UnlockSlot(BattlePets::BattlePetSlot::Slot0); } +void Spell::EffectChangeBattlePetQuality() +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + Player* playerCaster = m_caster->ToPlayer(); + if (!playerCaster) + return; + + if (!unitTarget || !unitTarget->IsCreature()) + return; + + BattlePets::BattlePetBreedQuality quality = BattlePets::BattlePetBreedQuality::Poor; + switch (damage) + { + case 85: + quality = BattlePets::BattlePetBreedQuality::Rare; + break; + case 75: + quality = BattlePets::BattlePetBreedQuality::Uncommon; + break; + default: + // Ignore Epic Battle-Stones + break; + } + + playerCaster->GetSession()->GetBattlePetMgr()->ChangeBattlePetQuality(unitTarget->GetBattlePetCompanionGUID(), quality); +} + void Spell::EffectLaunchQuestChoice() { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) |