aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Pet
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-09-10 11:54:09 +0200
committerShauren <shauren.trinity@gmail.com>2023-09-10 11:54:09 +0200
commita667d723bf18ffba9b7b25c4fff1223d23e55524 (patch)
tree3c30f5668407de815cdb6448c3932dfab98b89cf /src/server/game/Entities/Pet
parentedb103eadbee04aa2cd6746409e0fe297ba15958 (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.cpp16
-rw-r--r--src/server/game/Entities/Pet/Pet.h2
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);