diff options
Diffstat (limited to 'src/server/game/BattlePets/BattlePetMgr.cpp')
| -rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp index 85ab36ef132..3243f5d621b 100644 --- a/src/server/game/BattlePets/BattlePetMgr.cpp +++ b/src/server/game/BattlePets/BattlePetMgr.cpp @@ -20,6 +20,7 @@ #include "Containers.h" #include "Creature.h" #include "DatabaseEnv.h" +#include "GameTables.h" #include "GameTime.h" #include "Item.h" #include "Log.h" @@ -677,6 +678,76 @@ void BattlePetMgr::ChangeBattlePetQuality(ObjectGuid guid, BattlePetBreedQuality // _owner->GetPlayer()->SetCurrentBattlePetBreedQuality(qualityValue); } +void BattlePetMgr::GrantBattlePetExperience(ObjectGuid guid, uint16 xp, BattlePetXpSource xpSource) +{ + if (!HasJournalLock()) + return; + + BattlePet* pet = GetPet(guid); + if (!pet) + return; + + if (xp <= 0 || xpSource >= BattlePetXpSource::Count) + return; + + if (BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(pet->PacketInfo.Species)) + if (battlePetSpecies->GetFlags().HasFlag(BattlePetSpeciesFlags::CantBattle)) + return; + + uint16 level = pet->PacketInfo.Level; + if (level >= MAX_BATTLE_PET_LEVEL) + return; + + GtBattlePetXPEntry const* xpEntry = sBattlePetXPGameTable.GetRow(level); + if (!xpEntry) + return; + + Player* player = _owner->GetPlayer(); + uint16 nextLevelXp = uint16(GetBattlePetXPPerLevel(xpEntry)); + + if (xpSource == BattlePetXpSource::PetBattle) + xp *= player->GetTotalAuraMultiplier(SPELL_AURA_MOD_BATTLE_PET_XP_PCT); + + xp += pet->PacketInfo.Exp; + + while (xp >= nextLevelXp && level < MAX_BATTLE_PET_LEVEL) + { + xp -= nextLevelXp; + + xpEntry = sBattlePetXPGameTable.GetRow(++level); + if (!xpEntry) + return; + + nextLevelXp = uint16(GetBattlePetXPPerLevel(xpEntry)); + + player->UpdateCriteria(CriteriaType::BattlePetReachLevel, pet->PacketInfo.Species, level); + if (xpSource == BattlePetXpSource::PetBattle) + player->UpdateCriteria(CriteriaType::ActivelyEarnPetLevel, pet->PacketInfo.Species, level); + } + + pet->PacketInfo.Level = level; + pet->PacketInfo.Exp = level < MAX_BATTLE_PET_LEVEL ? xp : 0; + 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); + + // Update battle pet related update fields + if (Creature* summonedBattlePet = player->GetSummonedBattlePet()) + { + if (summonedBattlePet->GetBattlePetCompanionGUID() == guid) + { + summonedBattlePet->SetWildBattlePetLevel(pet->PacketInfo.Level); + player->SetBattlePetData(pet); + } + } +} + void BattlePetMgr::HealBattlePetsPct(uint8 pct) { // TODO: After each Pet Battle, any injured companion will automatically |
