diff options
author | Meji <alvaromegias_46@hotmail.com> | 2021-12-14 20:45:20 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-17 14:23:43 +0100 |
commit | 446997cdf2bf24163141d7dcaa80bb6ef891f933 (patch) | |
tree | c21eb2efadb6434c6d26f43c007c6ab461d050a8 | |
parent | 01ac538cd252151f0db16748aa81a813a23b18b7 (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.cpp | 31 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 28 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/PetHandler.cpp | 11 |
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(); + } } } |