aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.cpp51
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.h1
-rw-r--r--src/server/game/Spells/Spell.cpp3
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp17
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)