fix(Core): Crashfix. (#11903)
* fix(Core): Crashfix. Fixes #11650 * Update.
This commit is contained in:
@@ -553,8 +553,10 @@ void Pet::SavePetToDB(PetSaveMode mode)
|
|||||||
// save pet
|
// save pet
|
||||||
std::string actionBar = GenerateActionBarData();
|
std::string actionBar = GenerateActionBarData();
|
||||||
|
|
||||||
ASSERT(owner->GetPetStable()->CurrentPet && owner->GetPetStable()->CurrentPet->PetNumber == m_charmInfo->GetPetNumber());
|
if (owner->GetPetStable()->CurrentPet && owner->GetPetStable()->CurrentPet->PetNumber == m_charmInfo->GetPetNumber())
|
||||||
FillPetInfo(&owner->GetPetStable()->CurrentPet.value());
|
{
|
||||||
|
FillPetInfo(&owner->GetPetStable()->CurrentPet.value());
|
||||||
|
}
|
||||||
|
|
||||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_PET);
|
stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_PET);
|
||||||
stmt->SetData(0, m_charmInfo->GetPetNumber());
|
stmt->SetData(0, m_charmInfo->GetPetNumber());
|
||||||
|
|||||||
@@ -8973,16 +8973,18 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent)
|
|||||||
// 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());
|
if (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));
|
if (mode == PET_SAVE_NOT_IN_SLOT)
|
||||||
m_petStable->CurrentPet.reset();
|
{
|
||||||
|
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);
|
SetMinion(pet, false);
|
||||||
|
|
||||||
|
|||||||
@@ -18612,23 +18612,38 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldObject::SetPhaseMask(newPhaseMask, update);
|
WorldObject::SetPhaseMask(newPhaseMask, false);
|
||||||
|
|
||||||
if (!IsInWorld())
|
if (!IsInWorld())
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
|
for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
|
||||||
{
|
{
|
||||||
Unit* controlled = *itr;
|
Unit* controlled = *itr;
|
||||||
++itr;
|
++itr;
|
||||||
if (controlled->GetTypeId() == TYPEID_UNIT)
|
if (controlled->GetTypeId() == TYPEID_UNIT)
|
||||||
|
{
|
||||||
controlled->SetPhaseMask(newPhaseMask, true);
|
controlled->SetPhaseMask(newPhaseMask, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
|
for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
|
||||||
|
{
|
||||||
if (m_SummonSlot[i])
|
if (m_SummonSlot[i])
|
||||||
|
{
|
||||||
if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
|
if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
|
||||||
|
{
|
||||||
summon->SetPhaseMask(newPhaseMask, true);
|
summon->SetPhaseMask(newPhaseMask, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (update)
|
||||||
|
{
|
||||||
|
UpdateObjectVisibility();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::UpdateObjectVisibility(bool forced, bool /*fromUpdate*/)
|
void Unit::UpdateObjectVisibility(bool forced, bool /*fromUpdate*/)
|
||||||
|
|||||||
Reference in New Issue
Block a user