diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-09-29 17:31:50 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-01-31 00:24:51 +0100 |
| commit | 688d1d9533bc42dfd5684f30b8e1c2deff2795c4 (patch) | |
| tree | 04cc2c5c60c3085fb2cb8af1f74bcec2c291e937 /src | |
| parent | e102022eeb8a0fd402e34de92468b2afb8f1f006 (diff) | |
Core/Pets: Fixed crash happening when current pet is forcibly removed while being temporarily unsummoned (like on a mount)
(cherry picked from commit d163735abdf37c8840dbb7e3151d91bc898473ef)
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 |
2 files changed, 17 insertions, 2 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d579d970426..867cdb66d8f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21961,8 +21961,23 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent) m_temporaryUnsummonedPetNumber = 0; } - if (!pet || pet->GetOwnerGUID() != GetGUID()) + if (!pet) + { + if (mode == PET_SAVE_NOT_IN_SLOT && m_petStable->CurrentPet) + { + // Handle removing pet while it is in "temporarily unsummoned" state, for example on mount + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_PET_SLOT_BY_ID); + stmt->setUInt8(0, PET_SAVE_NOT_IN_SLOT); + stmt->setUInt64(1, GetGUID().GetCounter()); + stmt->setUInt32(2, m_petStable->CurrentPet->PetNumber); + CharacterDatabase.Execute(stmt); + + m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet)); + m_petStable->CurrentPet.reset(); + } + return; + } pet->CombatStop(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index beef7e3c9c8..2cdf9006079 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3604,7 +3604,7 @@ void Spell::EffectDismissPet() Pet* pet = unitTarget->ToPet(); ExecuteLogEffectUnsummonObject(SpellEffectName(effectInfo->Effect), pet); - pet->GetOwner()->RemovePet(pet, PET_SAVE_NOT_IN_SLOT); + pet->Remove(PET_SAVE_NOT_IN_SLOT); } void Spell::EffectSummonObject() |
