aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaromegias_46@hotmail.com>2021-12-19 13:27:27 +0100
committerGitHub <noreply@github.com>2021-12-19 13:27:27 +0100
commitc4fee8c5cf85aeddc45aad18d7a944efa59022bd (patch)
tree327bcb401fd8d5e0a7f86308d509ad7242746933 /src
parente6ac3316b73d68d1ce776e5c740cafd3b7b0bad6 (diff)
Core/Spells: Implemented spell effect 204 (SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY) (#27425)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.cpp35
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.h2
-rw-r--r--src/server/game/Spells/Spell.cpp59
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp31
5 files changed, 127 insertions, 1 deletions
diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp
index c9166d86a02..5f5ad43154d 100644
--- a/src/server/game/BattlePets/BattlePetMgr.cpp
+++ b/src/server/game/BattlePets/BattlePetMgr.cpp
@@ -642,6 +642,41 @@ void BattlePetMgr::CageBattlePet(ObjectGuid guid)
}
}
+void BattlePetMgr::ChangeBattlePetQuality(ObjectGuid guid, BattlePetBreedQuality quality)
+{
+ if (!HasJournalLock())
+ return;
+
+ BattlePet* pet = GetPet(guid);
+ if (!pet)
+ return;
+
+ if (quality > BattlePetBreedQuality::Rare)
+ return;
+
+ if (BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(pet->PacketInfo.Species))
+ if (battlePetSpecies->GetFlags().HasFlag(BattlePetSpeciesFlags::CantBattle))
+ return;
+
+ uint8 qualityValue = AsUnderlyingType(quality);
+ if (pet->PacketInfo.Quality >= qualityValue)
+ return;
+
+ pet->PacketInfo.Quality = qualityValue;
+ 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);
+
+ // UF::PlayerData::CurrentBattlePetBreedQuality isn't updated (Intended)
+ // _owner->GetPlayer()->SetCurrentBattlePetBreedQuality(qualityValue);
+}
+
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 7a80e82aee8..3c2542eb596 100644
--- a/src/server/game/BattlePets/BattlePetMgr.h
+++ b/src/server/game/BattlePets/BattlePetMgr.h
@@ -38,6 +38,7 @@ enum BattlePetMisc
SPELL_SUMMON_BATTLE_PET = 118301
};
+static constexpr uint16 MAX_BATTLE_PET_LEVEL = 25;
static constexpr Milliseconds REVIVE_BATTLE_PETS_COOLDOWN = 180s;
enum class BattlePetBreedQuality : uint8
@@ -170,6 +171,7 @@ public:
std::vector<WorldPackets::BattlePet::BattlePetSlot> const& GetSlots() const { return _slots; }
void CageBattlePet(ObjectGuid guid);
+ void ChangeBattlePetQuality(ObjectGuid guid, BattlePetBreedQuality quality);
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 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;
}
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 018550c373b..ec13aaee2b4 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 EffectActivateGarrisonBuilding();
void EffectHealBattlePetPct();
void EffectEnableBattlePets();
+ void EffectChangeBattlePetQuality();
void EffectLaunchQuestChoice();
void EffectUncageBattlePet();
void EffectCreateHeirloomItem();
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index ad335d2a4a8..621e620866a 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -285,7 +285,7 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF
&Spell::EffectEnableBattlePets, //201 SPELL_EFFECT_ENABLE_BATTLE_PETS
&Spell::EffectUnused, //202 SPELL_EFFECT_APPLY_AREA_AURA_SUMMONS
&Spell::EffectRemoveAura, //203 SPELL_EFFECT_REMOVE_AURA_2
- &Spell::EffectNULL, //204 SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY
+ &Spell::EffectChangeBattlePetQuality, //204 SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY
&Spell::EffectLaunchQuestChoice, //205 SPELL_EFFECT_LAUNCH_QUEST_CHOICE
&Spell::EffectNULL, //206 SPELL_EFFECT_ALTER_ITEM
&Spell::EffectNULL, //207 SPELL_EFFECT_LAUNCH_QUEST_TASK
@@ -5297,6 +5297,35 @@ void Spell::EffectEnableBattlePets()
player->GetSession()->GetBattlePetMgr()->UnlockSlot(BattlePets::BattlePetSlot::Slot0);
}
+void Spell::EffectChangeBattlePetQuality()
+{
+ if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
+ return;
+
+ Player* playerCaster = m_caster->ToPlayer();
+ if (!playerCaster)
+ return;
+
+ if (!unitTarget || !unitTarget->IsCreature())
+ return;
+
+ BattlePets::BattlePetBreedQuality quality = BattlePets::BattlePetBreedQuality::Poor;
+ switch (damage)
+ {
+ case 85:
+ quality = BattlePets::BattlePetBreedQuality::Rare;
+ break;
+ case 75:
+ quality = BattlePets::BattlePetBreedQuality::Uncommon;
+ break;
+ default:
+ // Ignore Epic Battle-Stones
+ break;
+ }
+
+ playerCaster->GetSession()->GetBattlePetMgr()->ChangeBattlePetQuality(unitTarget->GetBattlePetCompanionGUID(), quality);
+}
+
void Spell::EffectLaunchQuestChoice()
{
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)