From 8d3c183345b475db51ddd8ead61ad60862a40288 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sat, 23 Apr 2022 16:33:44 +0200 Subject: [PATCH] fix(Core/Player): null crash in RemovePet() (#11464) * closes https://github.com/azerothcore/azerothcore-wotlk/issues/11331 --- src/server/game/Entities/Player/Player.cpp | 82 +++++++++++----------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8be39d595..eff235c4e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8951,56 +8951,58 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent) return; } - - pet->CombatStop(); - - if (returnreagent) + else { - switch (pet->GetEntry()) + pet->CombatStop(); + + if (returnreagent) { - //warlock pets except imp are removed(?) when logging out - case 1860: - case 1863: - case 417: - case 17252: - mode = PET_SAVE_NOT_IN_SLOT; - break; + switch (pet->GetEntry()) + { + //warlock pets except imp are removed(?) when logging out + case 1860: + case 1863: + case 417: + case 17252: + mode = PET_SAVE_NOT_IN_SLOT; + break; + } } - } - // only if current pet in slot - pet->SavePetToDB(mode); + // only if current pet in slot + pet->SavePetToDB(mode); - ASSERT(m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber()); - if (mode == PET_SAVE_NOT_IN_SLOT) - { - m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet)); - m_petStable->CurrentPet.reset(); - } - else if (mode == PET_SAVE_AS_DELETED) - m_petStable->CurrentPet.reset(); - // else if (stable slots) handled in opcode handlers due to required swaps - // else (current pet) doesnt need to do anything + ASSERT(m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber()); + if (mode == PET_SAVE_NOT_IN_SLOT) + { + m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet)); + m_petStable->CurrentPet.reset(); + } + else if (mode == PET_SAVE_AS_DELETED) + m_petStable->CurrentPet.reset(); + // else if (stable slots) handled in opcode handlers due to required swaps + // else (current pet) doesnt need to do anything - SetMinion(pet, false); + SetMinion(pet, false); - pet->AddObjectToRemoveList(); - pet->m_removed = true; + pet->AddObjectToRemoveList(); + pet->m_removed = true; - if (pet->isControlled()) - { - WorldPacket data(SMSG_PET_SPELLS, 8); - data << uint64(0); - GetSession()->SendPacket(&data); + if (pet->isControlled()) + { + WorldPacket data(SMSG_PET_SPELLS, 8); + data << uint64(0); + GetSession()->SendPacket(&data); - if (GetGroup()) - SetGroupUpdateFlag(GROUP_UPDATE_PET); - } + if (GetGroup()) + SetGroupUpdateFlag(GROUP_UPDATE_PET); + } - if (NeedSendSpectatorData() && pet->GetCreatureTemplate()->family) - { - ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PHP", 0); - ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PET", 0); + if (NeedSendSpectatorData() && pet->GetCreatureTemplate()->family) + { + ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PHP", 0); + ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PET", 0); + } } }