aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeji <alvaromegias_46@hotmail.com>2021-12-14 20:45:20 +0100
committerShauren <shauren.trinity@gmail.com>2021-12-17 14:23:43 +0100
commit446997cdf2bf24163141d7dcaa80bb6ef891f933 (patch)
treec21eb2efadb6434c6d26f43c007c6ab461d050a8
parent01ac538cd252151f0db16748aa81a813a23b18b7 (diff)
Core/BattlePets: Misc fixes
* The battle pet's experience and level will now be reflected in the player's UpdateFields * Despawn summoned battle pet when it is caged
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.cpp31
-rw-r--r--src/server/game/Entities/Player/Player.cpp28
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
-rw-r--r--src/server/game/Handlers/PetHandler.cpp11
5 files changed, 59 insertions, 17 deletions
diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp
index 0b6f2ebeef7..dbb408325dc 100644
--- a/src/server/game/BattlePets/BattlePetMgr.cpp
+++ b/src/server/game/BattlePets/BattlePetMgr.cpp
@@ -506,12 +506,9 @@ void BattlePetMgr::ModifyName(ObjectGuid guid, std::string const& name, Declined
pet->SaveInfo = BATTLE_PET_CHANGED;
// Update the timestamp if the battle pet is summoned
- Player* player = _owner->GetPlayer();
- Creature* summonedBattlePet = ObjectAccessor::GetCreatureOrPetOrVehicle(*player, player->GetCritterGUID());
- if (summonedBattlePet)
- if (player->GetSummonedBattlePetGUID() == summonedBattlePet->GetBattlePetCompanionGUID())
- if (summonedBattlePet->GetBattlePetCompanionGUID() == guid)
- summonedBattlePet->SetBattlePetCompanionNameTimestamp(pet->NameTimestamp);
+ if (Creature* summonedBattlePet = _owner->GetPlayer()->GetSummonedBattlePet())
+ if (summonedBattlePet->GetBattlePetCompanionGUID() == guid)
+ summonedBattlePet->SetBattlePetCompanionNameTimestamp(pet->NameTimestamp);
}
bool BattlePetMgr::IsPetInSlot(ObjectGuid guid)
@@ -627,6 +624,17 @@ void BattlePetMgr::CageBattlePet(ObjectGuid guid)
WorldPackets::BattlePet::BattlePetDeleted deletePet;
deletePet.PetGuid = guid;
_owner->SendPacket(deletePet.Write());
+
+ // Battle pet despawns if it's summoned
+ Player* player = _owner->GetPlayer();
+ if (Creature* summonedBattlePet = player->GetSummonedBattlePet())
+ {
+ if (summonedBattlePet->GetBattlePetCompanionGUID() == guid)
+ {
+ summonedBattlePet->DespawnOrUnsummon();
+ player->SetBattlePetData(nullptr);
+ }
+ }
}
void BattlePetMgr::HealBattlePetsPct(uint8 pct)
@@ -661,20 +669,17 @@ void BattlePetMgr::SummonPet(ObjectGuid guid)
// TODO: set proper CreatureID for spell SPELL_SUMMON_BATTLE_PET (default EffectMiscValueA is 40721 - Murkimus the Gladiator)
Player* player = _owner->GetPlayer();
- player->SetSummonedBattlePetGUID(guid);
- player->SetCurrentBattlePetBreedQuality(pet->PacketInfo.Quality);
+ player->SetBattlePetData(pet);
player->CastSpell(player, speciesEntry->SummonSpellID ? speciesEntry->SummonSpellID : uint32(SPELL_SUMMON_BATTLE_PET));
}
void BattlePetMgr::DismissPet()
{
Player* player = _owner->GetPlayer();
- Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*player, player->GetCritterGUID());
- if (pet && player->GetSummonedBattlePetGUID() == pet->GetBattlePetCompanionGUID())
+ if (Creature* summonedBattlePet = player->GetSummonedBattlePet())
{
- pet->DespawnOrUnsummon();
- player->SetSummonedBattlePetGUID(ObjectGuid::Empty);
- player->SetCurrentBattlePetBreedQuality(AsUnderlyingType(BattlePetBreedQuality::Poor));
+ summonedBattlePet->DespawnOrUnsummon();
+ player->SetBattlePetData(nullptr);
}
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 0b9ac27aa66..1c8682a0ff5 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -32,7 +32,6 @@
#include "BattlegroundMgr.h"
#include "BattlegroundPackets.h"
#include "BattlegroundScore.h"
-#include "BattlePetMgr.h"
#include "CellImpl.h"
#include "Channel.h"
#include "ChannelMgr.h"
@@ -22030,6 +22029,33 @@ void Player::RemovePetAura(PetAura const* petSpell)
pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
}
+Creature* Player::GetSummonedBattlePet()
+{
+ if (Creature* summonedBattlePet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, GetCritterGUID()))
+ if (!GetSummonedBattlePetGUID().IsEmpty() && GetSummonedBattlePetGUID() == summonedBattlePet->GetBattlePetCompanionGUID())
+ return summonedBattlePet;
+
+ return nullptr;
+}
+
+void Player::SetBattlePetData(BattlePetMgr::BattlePet const* pet)
+{
+ if (pet)
+ {
+ SetSummonedBattlePetGUID(pet->PacketInfo.Guid);
+ SetCurrentBattlePetBreedQuality(pet->PacketInfo.Quality);
+ SetBattlePetCompanionExperience(pet->PacketInfo.Exp);
+ SetWildBattlePetLevel(pet->PacketInfo.Level);
+ }
+ else
+ {
+ SetSummonedBattlePetGUID(ObjectGuid::Empty);
+ SetCurrentBattlePetBreedQuality(AsUnderlyingType(BattlePetBreedQuality::Poor));
+ SetBattlePetCompanionExperience(0);
+ SetWildBattlePetLevel(0);
+ }
+}
+
void Player::StopCastingCharm()
{
Unit* charm = GetCharmed();
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 387671c7e86..a5a58add20e 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -19,6 +19,7 @@
#define _PLAYER_H
#include "Unit.h"
+#include "BattlePetMgr.h"
#include "CUFProfile.h"
#include "DatabaseEnvFwd.h"
#include "DBCEnums.h"
@@ -1210,6 +1211,9 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void AddPetAura(PetAura const* petSpell);
void RemovePetAura(PetAura const* petSpell);
+ Creature* GetSummonedBattlePet();
+ void SetBattlePetData(BattlePetMgr::BattlePet const* pet = nullptr);
+
/// Handles said message in regular chat based on declared language and in config pre-defined Range.
void Say(std::string const& text, Language language, WorldObject const* = nullptr) override;
void Say(uint32 textId, WorldObject const* target = nullptr) override;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index e88bcf953eb..28f9f156cec 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1302,6 +1302,8 @@ class TC_GAME_API Unit : public WorldObject
uint32 GetBattlePetCompanionNameTimestamp() const { return m_unitData->BattlePetCompanionNameTimestamp; }
void SetBattlePetCompanionNameTimestamp(uint32 timestamp) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::BattlePetCompanionNameTimestamp), timestamp); }
+ uint32 GetBattlePetCompanionExperience() const { return m_unitData->BattlePetCompanionExperience; }
+ void SetBattlePetCompanionExperience(uint32 experience) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::BattlePetCompanionExperience), experience); }
uint32 GetWildBattlePetLevel() const { return m_unitData->WildBattlePetLevel; }
void SetWildBattlePetLevel(uint32 wildBattlePetLevel) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::WildBattlePetLevel), wildBattlePetLevel); }
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp
index 5801ec4742f..4a4cda508f1 100644
--- a/src/server/game/Handlers/PetHandler.cpp
+++ b/src/server/game/Handlers/PetHandler.cpp
@@ -46,15 +46,20 @@ void WorldSession::HandleDismissCritter(WorldPackets::Pet::DismissCritter& packe
if (!pet)
{
- TC_LOG_DEBUG("entities.pet", "Vanitypet (%s) does not exist - player '%s' (%s / account: %u) attempted to dismiss it (possibly lagged out)",
+ TC_LOG_DEBUG("entities.pet", "Critter (%s) does not exist - player '%s' (%s / account: %u) attempted to dismiss it (possibly lagged out)",
packet.CritterGUID.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str(), GetAccountId());
return;
}
if (_player->GetCritterGUID() == pet->GetGUID())
{
- if (pet->GetTypeId() == TYPEID_UNIT && pet->IsSummon())
- pet->ToTempSummon()->UnSummon();
+ if (pet->GetTypeId() == TYPEID_UNIT && pet->IsSummon())
+ {
+ if (!_player->GetSummonedBattlePetGUID().IsEmpty() && _player->GetSummonedBattlePetGUID() == pet->GetBattlePetCompanionGUID())
+ _player->SetBattlePetData(nullptr);
+
+ pet->ToTempSummon()->UnSummon();
+ }
}
}