diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-09-10 11:54:09 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-09-10 11:54:09 +0200 |
commit | a667d723bf18ffba9b7b25c4fff1223d23e55524 (patch) | |
tree | 3c30f5668407de815cdb6448c3932dfab98b89cf /src/server/game/Entities/Pet | |
parent | edb103eadbee04aa2cd6746409e0fe297ba15958 (diff) |
Core/Pets: Improved pet despawn behavior when mounting
* Pets will now only be despawned when starting to fly
* Fixed crash when summoning a pet that is different than the one that was despawned by flying
Closes #29303
Diffstat (limited to 'src/server/game/Entities/Pet')
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.h | 2 |
2 files changed, 10 insertions, 8 deletions
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index e4e367c1d94..dd66132f216 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -244,6 +244,8 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c return false; } + owner->SetTemporaryUnsummonedPetNumber(0); + Map* map = owner->GetMap(); ObjectGuid::LowType guid = map->GenerateLowGuid<HighGuid::Pet>(); @@ -366,9 +368,6 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c uint32 newPetIndex = std::distance(petStable->ActivePets.begin(), activePetItr); - // Check that we either have no pet (unsummoned by player) or it matches temporarily unsummoned pet by server (for example on flying mount) - ASSERT(!petStable->CurrentPetIndex || petStable->CurrentPetIndex == newPetIndex); - petStable->SetCurrentActivePetIndex(newPetIndex); } @@ -456,6 +455,9 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c } } + if (owner->IsMounted()) + owner->DisablePetControlsOnMount(REACT_PASSIVE, COMMAND_FOLLOW); + // must be after SetMinion (owner guid check) LoadTemplateImmunities(); m_loading = false; @@ -525,7 +527,7 @@ void Pet::SavePetToDB(PetSaveMode mode) std::string actionBar = GenerateActionBarData(); ASSERT(owner->GetPetStable()->GetCurrentPet() && owner->GetPetStable()->GetCurrentPet()->PetNumber == m_charmInfo->GetPetNumber()); - FillPetInfo(owner->GetPetStable()->GetCurrentPet()); + FillPetInfo(owner->GetPetStable()->GetCurrentPet(), owner->GetTemporaryPetReactState()); stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PET); stmt->setUInt32(0, m_charmInfo->GetPetNumber()); @@ -534,7 +536,7 @@ void Pet::SavePetToDB(PetSaveMode mode) stmt->setUInt32(3, GetNativeDisplayId()); stmt->setUInt8(4, GetLevel()); stmt->setUInt32(5, m_unitData->PetExperience); - stmt->setUInt8(6, GetReactState()); + stmt->setUInt8(6, owner->GetTemporaryPetReactState().value_or(GetReactState())); stmt->setInt16(7, owner->GetPetStable()->GetCurrentActivePetIndex().value_or(PET_SAVE_NOT_IN_SLOT)); stmt->setString(8, m_name); stmt->setUInt8(9, HasPetFlag(UNIT_PET_FLAG_CAN_BE_RENAMED) ? 0 : 1); @@ -557,14 +559,14 @@ void Pet::SavePetToDB(PetSaveMode mode) } } -void Pet::FillPetInfo(PetStable::PetInfo* petInfo) const +void Pet::FillPetInfo(PetStable::PetInfo* petInfo, Optional<ReactStates> forcedReactState /*= {}*/) const { petInfo->PetNumber = m_charmInfo->GetPetNumber(); petInfo->CreatureId = GetEntry(); petInfo->DisplayId = GetNativeDisplayId(); petInfo->Level = GetLevel(); petInfo->Experience = m_unitData->PetExperience; - petInfo->ReactState = GetReactState(); + petInfo->ReactState = forcedReactState.value_or(GetReactState()); petInfo->Name = GetName(); petInfo->WasRenamed = !HasPetFlag(UNIT_PET_FLAG_CAN_BE_RENAMED); petInfo->Health = GetHealth(); diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h index a03ab823bb4..64bd4836999 100644 --- a/src/server/game/Entities/Pet/Pet.h +++ b/src/server/game/Entities/Pet/Pet.h @@ -63,7 +63,7 @@ class TC_GAME_API Pet : public Guardian bool LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool current, Optional<PetSaveMode> forcedSlot = {}); bool IsLoading() const override { return m_loading;} void SavePetToDB(PetSaveMode mode); - void FillPetInfo(PetStable::PetInfo* petInfo) const; + void FillPetInfo(PetStable::PetInfo* petInfo, Optional<ReactStates> forcedReactState = {}) const; void Remove(PetSaveMode mode, bool returnreagent = false); static void DeleteFromDB(uint32 petNumber); |