diff options
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 23 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Handlers/NPCHandler.cpp | 2 |
3 files changed, 25 insertions, 3 deletions
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 74c86e4c7ca..aba5a14ad77 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -210,6 +210,10 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c return false; } + // Don't try to reload the current pet + if (petStable->CurrentPet && owner->GetPet() && petStable->CurrentPet.value().PetNumber == petInfo->PetNumber) + return false; + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(petInfo->CreatedBySpellId, owner->GetMap()->GetDifficultyID()); bool isTemporarySummon = spellInfo && spellInfo->GetDuration() > 0; @@ -330,9 +334,13 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c // PET_SAVE_NOT_IN_SLOT(100) = not stable slot (summoning)) if (slot == PET_SAVE_NOT_IN_SLOT) { + uint32 petInfoNumber = petInfo->PetNumber; + if (petStable->CurrentPet) + owner->RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT); + auto unslottedPetItr = std::find_if(petStable->UnslottedPets.begin(), petStable->UnslottedPets.end(), [&](PetStable::PetInfo const& unslottedPet) { - return unslottedPet.PetNumber == petInfo->PetNumber; + return unslottedPet.PetNumber == petInfoNumber; }); ASSERT(!petStable->CurrentPet); ASSERT(unslottedPetItr != petStable->UnslottedPets.end()); @@ -343,6 +351,19 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c // old petInfo pointer is no longer valid, refresh it petInfo = &petStable->CurrentPet.value(); } + else if (PET_SAVE_FIRST_STABLE_SLOT <= slot && slot <= PET_SAVE_LAST_STABLE_SLOT) + { + auto stabledPet = std::find_if(petStable->StabledPets.begin(), petStable->StabledPets.end(), [petnumber](Optional<PetStable::PetInfo> const& pet) + { + return pet && pet->PetNumber == petnumber; + }); + ASSERT(stabledPet != petStable->StabledPets.end()); + + std::swap(*stabledPet, petStable->CurrentPet); + + // old petInfo pointer is no longer valid, refresh it + petInfo = &petStable->CurrentPet.value(); + } // Send fake summon spell cast - this is needed for correct cooldown application for spells // Example: 46584 - without this cooldown (which should be set always when pet is loaded) isn't set clientside diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 708f07b34d6..8c4b8db42bf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -28718,6 +28718,9 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy return nullptr; } + if (petType == SUMMON_PET && petStable.CurrentPet) + RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT); + PhasingHandler::InheritPhaseShift(pet, this); pet->SetCreatorGUID(GetGUID()); diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 9854aaa6710..4d618e612ec 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -598,8 +598,6 @@ void WorldSession::HandleUnstablePet(WorldPacket& recvData) } else { - std::swap(*stabledPet, petStable->CurrentPet); - // update current pet slot in db immediately to maintain slot consistency, dismissed pet was already saved CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_PET_SLOT_BY_ID); stmt->setUInt8(0, PET_SAVE_AS_CURRENT); |