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
This commit is contained in:
Meji
2021-12-14 20:45:20 +01:00
committed by Shauren
parent 01ac538cd2
commit 446997cdf2
5 changed files with 59 additions and 17 deletions

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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); }

View File

@@ -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();
}
}
}