diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index c1be0701d..dccb099bd 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -553,8 +553,10 @@ void Pet::SavePetToDB(PetSaveMode mode) // save pet std::string actionBar = GenerateActionBarData(); - ASSERT(owner->GetPetStable()->CurrentPet && owner->GetPetStable()->CurrentPet->PetNumber == m_charmInfo->GetPetNumber()); - FillPetInfo(&owner->GetPetStable()->CurrentPet.value()); + if (owner->GetPetStable()->CurrentPet && owner->GetPetStable()->CurrentPet->PetNumber == m_charmInfo->GetPetNumber()) + { + FillPetInfo(&owner->GetPetStable()->CurrentPet.value()); + } stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_PET); stmt->SetData(0, m_charmInfo->GetPetNumber()); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 19ab56fe7..92cd8817a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8973,16 +8973,18 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent) // 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) + if (m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber()) { - m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet)); - m_petStable->CurrentPet.reset(); + 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 } - 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); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b5945d25e..045ee219f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -18612,23 +18612,38 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update) } } - WorldObject::SetPhaseMask(newPhaseMask, update); + WorldObject::SetPhaseMask(newPhaseMask, false); if (!IsInWorld()) + { return; + } for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ) { Unit* controlled = *itr; ++itr; if (controlled->GetTypeId() == TYPEID_UNIT) + { controlled->SetPhaseMask(newPhaseMask, true); + } } for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i) + { if (m_SummonSlot[i]) + { if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i])) + { summon->SetPhaseMask(newPhaseMask, true); + } + } + } + + if (update) + { + UpdateObjectVisibility(); + } } void Unit::UpdateObjectVisibility(bool forced, bool /*fromUpdate*/)