fix(Core/Player): null crash in RemovePet() (#11464)

* closes https://github.com/azerothcore/azerothcore-wotlk/issues/11331
This commit is contained in:
Kitzunu
2022-04-23 16:33:44 +02:00
committed by GitHub
parent 35a7781224
commit 8d3c183345
+42 -40
View File
@@ -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);
}
} }
} }