fix(Core/Player): null crash in RemovePet() (#11464)
* closes https://github.com/azerothcore/azerothcore-wotlk/issues/11331
This commit is contained in:
@@ -8951,56 +8951,58 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent)
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
pet->CombatStop();
|
|
||||||
|
|
||||||
if (returnreagent)
|
|
||||||
{
|
{
|
||||||
switch (pet->GetEntry())
|
pet->CombatStop();
|
||||||
|
|
||||||
|
if (returnreagent)
|
||||||
{
|
{
|
||||||
//warlock pets except imp are removed(?) when logging out
|
switch (pet->GetEntry())
|
||||||
case 1860:
|
{
|
||||||
case 1863:
|
//warlock pets except imp are removed(?) when logging out
|
||||||
case 417:
|
case 1860:
|
||||||
case 17252:
|
case 1863:
|
||||||
mode = PET_SAVE_NOT_IN_SLOT;
|
case 417:
|
||||||
break;
|
case 17252:
|
||||||
|
mode = PET_SAVE_NOT_IN_SLOT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// only if current pet in slot
|
// only if current pet in slot
|
||||||
pet->SavePetToDB(mode);
|
pet->SavePetToDB(mode);
|
||||||
|
|
||||||
ASSERT(m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber());
|
ASSERT(m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber());
|
||||||
if (mode == PET_SAVE_NOT_IN_SLOT)
|
if (mode == PET_SAVE_NOT_IN_SLOT)
|
||||||
{
|
{
|
||||||
m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
|
m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
|
||||||
m_petStable->CurrentPet.reset();
|
m_petStable->CurrentPet.reset();
|
||||||
}
|
}
|
||||||
else if (mode == PET_SAVE_AS_DELETED)
|
else if (mode == PET_SAVE_AS_DELETED)
|
||||||
m_petStable->CurrentPet.reset();
|
m_petStable->CurrentPet.reset();
|
||||||
// else if (stable slots) handled in opcode handlers due to required swaps
|
// else if (stable slots) handled in opcode handlers due to required swaps
|
||||||
// else (current pet) doesnt need to do anything
|
// else (current pet) doesnt need to do anything
|
||||||
|
|
||||||
SetMinion(pet, false);
|
SetMinion(pet, false);
|
||||||
|
|
||||||
pet->AddObjectToRemoveList();
|
pet->AddObjectToRemoveList();
|
||||||
pet->m_removed = true;
|
pet->m_removed = true;
|
||||||
|
|
||||||
if (pet->isControlled())
|
if (pet->isControlled())
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_PET_SPELLS, 8);
|
WorldPacket data(SMSG_PET_SPELLS, 8);
|
||||||
data << uint64(0);
|
data << uint64(0);
|
||||||
GetSession()->SendPacket(&data);
|
GetSession()->SendPacket(&data);
|
||||||
|
|
||||||
if (GetGroup())
|
if (GetGroup())
|
||||||
SetGroupUpdateFlag(GROUP_UPDATE_PET);
|
SetGroupUpdateFlag(GROUP_UPDATE_PET);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
|
if (NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
|
||||||
{
|
{
|
||||||
ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PHP", 0);
|
ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PHP", 0);
|
||||||
ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PET", 0);
|
ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PET", 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user