diff options
-rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.cpp | 51 | ||||
-rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 17 |
5 files changed, 71 insertions, 2 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 diff --git a/src/server/game/BattlePets/BattlePetMgr.h b/src/server/game/BattlePets/BattlePetMgr.h index f0cf284f896..771b016d81e 100644 --- a/src/server/game/BattlePets/BattlePetMgr.h +++ b/src/server/game/BattlePets/BattlePetMgr.h @@ -181,6 +181,7 @@ public: void CageBattlePet(ObjectGuid guid); void ChangeBattlePetQuality(ObjectGuid guid, BattlePetBreedQuality quality); void GrantBattlePetExperience(ObjectGuid guid, uint16 xp, BattlePetXpSource xpSource); + void GrantBattlePetLevel(ObjectGuid guid, uint16 grantedLevels); void HealBattlePetsPct(uint8 pct); void SummonPet(ObjectGuid guid); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 4975457c2d6..aa290851a7a 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -6044,6 +6044,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 break; } case SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY: + case SPELL_EFFECT_GRANT_BATTLEPET_LEVEL: case SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE: { Player* playerCaster = m_caster->ToPlayer(); @@ -6090,7 +6091,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 return SPELL_FAILED_CANT_UPGRADE_BATTLE_PET; } - if (spellEffectInfo.Effect == SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE) + if (spellEffectInfo.Effect == SPELL_EFFECT_GRANT_BATTLEPET_LEVEL || spellEffectInfo.Effect == SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE) if (battlePet->PacketInfo.Level >= BattlePets::MAX_BATTLE_PET_LEVEL) return GRANT_PET_LEVEL_FAIL; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index e8c3df6bb5f..f7de7c2663c 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -377,6 +377,7 @@ class TC_GAME_API Spell void EffectCancelConversation(); void EffectAddGarrisonFollower(); void EffectActivateGarrisonBuilding(); + void EffectGrantBattlePetLevel(); void EffectHealBattlePetPct(); void EffectEnableBattlePets(); void EffectChangeBattlePetQuality(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 43fb5bf68ef..b216bb5f372 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -306,7 +306,7 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF &Spell::EffectCreateHeirloomItem, //222 SPELL_EFFECT_CREATE_HEIRLOOM_ITEM &Spell::EffectNULL, //223 SPELL_EFFECT_CHANGE_ITEM_BONUSES &Spell::EffectActivateGarrisonBuilding, //224 SPELL_EFFECT_ACTIVATE_GARRISON_BUILDING - &Spell::EffectNULL, //225 SPELL_EFFECT_GRANT_BATTLEPET_LEVEL + &Spell::EffectGrantBattlePetLevel, //225 SPELL_EFFECT_GRANT_BATTLEPET_LEVEL &Spell::EffectNULL, //226 SPELL_EFFECT_TRIGGER_ACTION_SET &Spell::EffectNULL, //227 SPELL_EFFECT_TELEPORT_TO_LFG_DUNGEON &Spell::EffectNULL, //228 SPELL_EFFECT_228 @@ -5315,6 +5315,21 @@ void Spell::EffectActivateGarrisonBuilding() garrison->ActivateBuilding(effectInfo->MiscValue); } +void Spell::EffectGrantBattlePetLevel() +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + Player* playerCaster = m_caster->ToPlayer(); + if (!playerCaster) + return; + + if (!unitTarget || !unitTarget->IsCreature()) + return; + + playerCaster->GetSession()->GetBattlePetMgr()->GrantBattlePetLevel(unitTarget->GetBattlePetCompanionGUID(), damage); +} + void Spell::EffectHealBattlePetPct() { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) |