diff options
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;          }  | 
