aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp59
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;
}