aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/BattlePets/BattlePetMgr.cpp
diff options
context:
space:
mode:
authorMeji <alvaromegias_46@hotmail.com>2022-01-07 22:14:07 +0100
committerGitHub <noreply@github.com>2022-01-07 22:14:07 +0100
commitddc71206de653d05aed479b82260bcf55dd72445 (patch)
treeed1b1dc4ed91f1c29df169e8ca5fe85a7aa70c29 /src/server/game/BattlePets/BattlePetMgr.cpp
parent26bdbde4679989a452cf7d2c5e29ceb6e0036ce3 (diff)
Core/Spells: Implemented spell effect 225 (SPELL_EFFECT_GRANT_BATTLEPET_LEVEL) (#27506)
Diffstat (limited to 'src/server/game/BattlePets/BattlePetMgr.cpp')
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp
index 3243f5d621b..a8e730e0b6b 100644
--- a/src/server/game/BattlePets/BattlePetMgr.cpp
+++ b/src/server/game/BattlePets/BattlePetMgr.cpp
@@ -748,6 +748,57 @@ void BattlePetMgr::GrantBattlePetExperience(ObjectGuid guid, uint16 xp, BattlePe
}
}
+void BattlePetMgr::GrantBattlePetLevel(ObjectGuid guid, uint16 grantedLevels)
+{
+ if (!HasJournalLock())
+ return;
+
+ BattlePet* pet = GetPet(guid);
+ if (!pet)
+ 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;
+
+ Player* player = _owner->GetPlayer();
+
+ while (grantedLevels > 0 && level < MAX_BATTLE_PET_LEVEL)
+ {
+ ++level;
+ --grantedLevels;
+
+ player->UpdateCriteria(CriteriaType::BattlePetReachLevel, pet->PacketInfo.Species, level);
+ }
+
+ pet->PacketInfo.Level = level;
+ if (level >= MAX_BATTLE_PET_LEVEL)
+ pet->PacketInfo.Exp = 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