aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-09-29 17:31:50 +0200
committerShauren <shauren.trinity@gmail.com>2020-09-29 17:31:50 +0200
commitd163735abdf37c8840dbb7e3151d91bc898473ef (patch)
treec35dc84cbac5efb52cf1390ec8cdca7a55c2cd87 /src/server
parented567014cc8e3d2cf94bd4d1b707bea3bc3c63dc (diff)
Core/Pets: Fixed crash happening when current pet is forcibly removed while being temporarily unsummoned (like on a mount)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/Player/Player.cpp17
-rw-r--r--src/server/game/Spells/SpellEffects.cpp2
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 d9ee88f9499..318c41196ed 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -20654,8 +20654,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->setUInt32(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 b2d8f0101d7..68025cffc10 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -4033,7 +4033,7 @@ void Spell::EffectDismissPet(SpellEffIndex effIndex)
Pet* pet = unitTarget->ToPet();
ExecuteLogEffectUnsummonObject(effIndex, pet);
- pet->GetOwner()->RemovePet(pet, PET_SAVE_NOT_IN_SLOT);
+ pet->Remove(PET_SAVE_NOT_IN_SLOT);
}
void Spell::EffectSummonObject(SpellEffIndex effIndex)