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/server/game/Spells/Spell.cpp | |
| parent | e6ac3316b73d68d1ce776e5c740cafd3b7b0bad6 (diff) | |
Core/Spells: Implemented spell effect 204 (SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY) (#27425)
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
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; } |
