mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user