aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaromegias_46@hotmail.com>2021-11-20 19:06:14 +0100
committerGitHub <noreply@github.com>2021-11-20 19:06:14 +0100
commit8614690e27df8197586cc702760409293f3f6c3d (patch)
treeeb95f093b283d9bb728e3e26800240dda462b137 /src
parentb1eb4c2b3e0745e0d801bfa4111c692cc3bb00a1 (diff)
Core/BattlePets: Implemented battle pet name query packet (#27294)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/LoginDatabase.cpp6
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.cpp41
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.h1
-rw-r--r--src/server/game/Entities/Player/Player.h5
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp5
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
-rw-r--r--src/server/game/Handlers/BattlePetHandler.cpp44
-rw-r--r--src/server/game/Server/Packets/BattlePetPackets.cpp37
-rw-r--r--src/server/game/Server/Packets/BattlePetPackets.h31
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h2
11 files changed, 153 insertions, 27 deletions
diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp
index 26399cae226..c31e8363c46 100644
--- a/src/server/database/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/database/Database/Implementation/LoginDatabase.cpp
@@ -155,10 +155,10 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite, hasFanfare) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
// Battle Pets
- PrepareStatement(LOGIN_SEL_BATTLE_PETS, "SELECT bp.guid, bp.species, bp.breed, bp.displayId, bp.level, bp.exp, bp.health, bp.quality, bp.flags, bp.name, dn.genitive, dn.dative, dn.accusative, dn.instrumental, dn.prepositional FROM battle_pets bp LEFT JOIN battle_pet_declinedname dn ON bp.guid = dn.guid WHERE bp.battlenetAccountId = ?", CONNECTION_ASYNC);
- PrepareStatement(LOGIN_INS_BATTLE_PETS, "INSERT INTO battle_pets (guid, battlenetAccountId, species, breed, displayId, level, exp, health, quality, flags, name) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_BATTLE_PETS, "SELECT bp.guid, bp.species, bp.breed, bp.displayId, bp.level, bp.exp, bp.health, bp.quality, bp.flags, bp.name, bp.nameTimestamp, dn.genitive, dn.dative, dn.accusative, dn.instrumental, dn.prepositional FROM battle_pets bp LEFT JOIN battle_pet_declinedname dn ON bp.guid = dn.guid WHERE bp.battlenetAccountId = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_BATTLE_PETS, "INSERT INTO battle_pets (guid, battlenetAccountId, species, breed, displayId, level, exp, health, quality, flags, name, nameTimestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(LOGIN_DEL_BATTLE_PETS, "DELETE FROM battle_pets WHERE battlenetAccountId = ? AND guid = ?", CONNECTION_ASYNC);
- PrepareStatement(LOGIN_UPD_BATTLE_PETS, "UPDATE battle_pets SET level = ?, exp = ?, health = ?, quality = ?, flags = ?, name = ? WHERE battlenetAccountId = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_BATTLE_PETS, "UPDATE battle_pets SET level = ?, exp = ?, health = ?, quality = ?, flags = ?, name = ?, nameTimestamp = ? WHERE battlenetAccountId = ? AND guid = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_SEL_BATTLE_PET_SLOTS, "SELECT id, battlePetGuid, locked FROM battle_pet_slots WHERE battlenetAccountId = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_INS_BATTLE_PET_SLOTS, "INSERT INTO battle_pet_slots (id, battlenetAccountId, battlePetGuid, locked) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(LOGIN_DEL_BATTLE_PET_SLOTS, "DELETE FROM battle_pet_slots WHERE battlenetAccountId = ?", CONNECTION_ASYNC);
diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp
index 9ff67a33d1e..54b4282e40e 100644
--- a/src/server/game/BattlePets/BattlePetMgr.cpp
+++ b/src/server/game/BattlePets/BattlePetMgr.cpp
@@ -20,6 +20,7 @@
#include "Containers.h"
#include "Creature.h"
#include "DatabaseEnv.h"
+#include "GameTime.h"
#include "Item.h"
#include "Log.h"
#include "ObjectAccessor.h"
@@ -235,13 +236,14 @@ void BattlePetMgr::LoadFromDB(PreparedQueryResult pets, PreparedQueryResult slot
pet.PacketInfo.Quality = fields[7].GetUInt8();
pet.PacketInfo.Flags = fields[8].GetUInt16();
pet.PacketInfo.Name = fields[9].GetString();
+ pet.NameTimestamp = fields[10].GetInt64();
pet.PacketInfo.CreatureID = speciesEntry->CreatureID;
- if (!fields[10].IsNull())
+ if (!fields[11].IsNull())
{
- pet.DeclinedName.reset(new DeclinedName);
+ pet.DeclinedName = std::make_unique<DeclinedName>();
for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
- pet.DeclinedName->name[i] = fields[10 + i].GetString();
+ pet.DeclinedName->name[i] = fields[11 + i].GetString();
}
pet.SaveInfo = BATTLE_PET_UNCHANGED;
@@ -289,6 +291,7 @@ void BattlePetMgr::SaveToDB(LoginDatabaseTransaction& trans)
stmt->setUInt8(8, itr->second.PacketInfo.Quality);
stmt->setUInt16(9, itr->second.PacketInfo.Flags);
stmt->setString(10, itr->second.PacketInfo.Name);
+ stmt->setInt64(11, itr->second.NameTimestamp);
trans->Append(stmt);
if (itr->second.DeclinedName)
@@ -313,8 +316,9 @@ void BattlePetMgr::SaveToDB(LoginDatabaseTransaction& trans)
stmt->setUInt8(3, itr->second.PacketInfo.Quality);
stmt->setUInt16(4, itr->second.PacketInfo.Flags);
stmt->setString(5, itr->second.PacketInfo.Name);
- stmt->setUInt32(6, _owner->GetBattlenetAccountId());
- stmt->setUInt64(7, itr->first);
+ stmt->setInt64(6, itr->second.NameTimestamp);
+ stmt->setUInt32(7, _owner->GetBattlenetAccountId());
+ stmt->setUInt64(8, itr->first);
trans->Append(stmt);
stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BATTLE_PET_DECLINED_NAME);
@@ -395,6 +399,7 @@ void BattlePetMgr::AddPet(uint32 species, uint32 display, uint16 breed, BattlePe
pet.PacketInfo.Name = "";
pet.CalculateStats();
pet.PacketInfo.Health = pet.PacketInfo.MaxHealth;
+ pet.NameTimestamp = 0;
pet.SaveInfo = BATTLE_PET_NEW;
_pets[pet.PacketInfo.Guid.GetCounter()] = std::move(pet);
@@ -441,6 +446,7 @@ void BattlePetMgr::ModifyName(ObjectGuid guid, std::string const& name, Declined
return;
pet->PacketInfo.Name = name;
+ pet->NameTimestamp = !pet->PacketInfo.Name.empty() ? GameTime::GetGameTime() : time_t(0);
pet->DeclinedName.reset();
if (declinedName)
@@ -448,6 +454,14 @@ void BattlePetMgr::ModifyName(ObjectGuid guid, std::string const& name, Declined
if (pet->SaveInfo != BATTLE_PET_NEW)
pet->SaveInfo = BATTLE_PET_CHANGED;
+
+ // Update the timestamp if the battle pet is summoned
+ Player* player = _owner->GetPlayer();
+ Creature* summonedBattlePet = ObjectAccessor::GetCreatureOrPetOrVehicle(*player, player->GetCritterGUID());
+ if (summonedBattlePet)
+ if (player->GetSummonedBattlePetGUID() == summonedBattlePet->GetBattlePetCompanionGUID())
+ if (summonedBattlePet->GetBattlePetCompanionGUID() == guid)
+ summonedBattlePet->SetBattlePetCompanionNameTimestamp(pet->NameTimestamp);
}
bool BattlePetMgr::IsPetInSlot(ObjectGuid guid)
@@ -581,20 +595,21 @@ void BattlePetMgr::SummonPet(ObjectGuid guid)
return;
// TODO: set proper CreatureID for spell DEFAULT_SUMMON_BATTLE_PET_SPELL (default EffectMiscValueA is 40721 - Murkimus the Gladiator)
- _owner->GetPlayer()->SetSummonedBattlePetGUID(guid);
- _owner->GetPlayer()->SetCurrentBattlePetBreedQuality(pet->PacketInfo.Quality);
- _owner->GetPlayer()->CastSpell(_owner->GetPlayer(), speciesEntry->SummonSpellID ? speciesEntry->SummonSpellID : uint32(DEFAULT_SUMMON_BATTLE_PET_SPELL));
+ Player* player = _owner->GetPlayer();
+ player->SetSummonedBattlePetGUID(guid);
+ player->SetCurrentBattlePetBreedQuality(pet->PacketInfo.Quality);
+ player->CastSpell(player, speciesEntry->SummonSpellID ? speciesEntry->SummonSpellID : uint32(DEFAULT_SUMMON_BATTLE_PET_SPELL));
}
void BattlePetMgr::DismissPet()
{
- Player* ownerPlayer = _owner->GetPlayer();
- Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*ownerPlayer, ownerPlayer->GetCritterGUID());
- if (pet && *ownerPlayer->m_activePlayerData->SummonedBattlePetGUID == pet->GetBattlePetCompanionGUID())
+ Player* player = _owner->GetPlayer();
+ Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*player, player->GetCritterGUID());
+ if (pet && player->GetSummonedBattlePetGUID() == pet->GetBattlePetCompanionGUID())
{
pet->DespawnOrUnsummon();
- ownerPlayer->SetSummonedBattlePetGUID(ObjectGuid::Empty);
- ownerPlayer->SetCurrentBattlePetBreedQuality(AsUnderlyingType(BattlePetBreedQuality::Poor));
+ player->SetSummonedBattlePetGUID(ObjectGuid::Empty);
+ player->SetCurrentBattlePetBreedQuality(AsUnderlyingType(BattlePetBreedQuality::Poor));
}
}
diff --git a/src/server/game/BattlePets/BattlePetMgr.h b/src/server/game/BattlePets/BattlePetMgr.h
index 7ad31f71db7..61da473d7e8 100644
--- a/src/server/game/BattlePets/BattlePetMgr.h
+++ b/src/server/game/BattlePets/BattlePetMgr.h
@@ -118,6 +118,7 @@ public:
void CalculateStats();
WorldPackets::BattlePet::BattlePet PacketInfo;
+ time_t NameTimestamp = time_t(0);
std::unique_ptr<::DeclinedName> DeclinedName;
BattlePetSaveInfo SaveInfo = BATTLE_PET_UNCHANGED;
};
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 27d0be2f250..bf3598c8acf 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2690,7 +2690,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
}
void ClearSelfResSpell() { ClearDynamicUpdateFieldValues(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SelfResSpells)); }
- void SetSummonedBattlePetGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SummonedBattlePetGUID), guid); }
+ ObjectGuid GetSummonedBattlePetGUID() const { return m_activePlayerData->SummonedBattlePetGUID; }
+ void SetSummonedBattlePetGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SummonedBattlePetGUID), guid); }
void AddTrackCreatureFlag(uint32 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TrackCreatureMask), flags); }
void RemoveTrackCreatureFlag(uint32 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TrackCreatureMask), flags); }
@@ -2709,7 +2710,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
uint8 GetNumRespecs() const { return m_activePlayerData->NumRespecs; }
void SetNumRespecs(uint8 numRespecs) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumRespecs), numRespecs); }
- void SetWatchedFactionIndex(int32 index) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::WatchedFactionIndex), index); }
+ void SetWatchedFactionIndex(int32 index) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::WatchedFactionIndex), index); }
void AddAuraVision(PlayerFieldByte2Flags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::AuraVision), flags); }
void RemoveAuraVision(PlayerFieldByte2Flags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::AuraVision), flags); }
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index c1939255f75..1c9545f05c2 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -5836,9 +5836,10 @@ void Unit::SetMinion(Minion *minion, bool apply)
SetCritterGUID(minion->GetGUID());
if (Player const* thisPlayer = ToPlayer())
{
- if (BattlePetMgr::BattlePet const* pet = thisPlayer->GetSession()->GetBattlePetMgr()->GetPet(thisPlayer->m_activePlayerData->SummonedBattlePetGUID))
+ if (BattlePetMgr::BattlePet const* pet = thisPlayer->GetSession()->GetBattlePetMgr()->GetPet(thisPlayer->GetSummonedBattlePetGUID()))
{
- minion->SetBattlePetCompanionGUID(thisPlayer->m_activePlayerData->SummonedBattlePetGUID);
+ minion->SetBattlePetCompanionGUID(thisPlayer->GetSummonedBattlePetGUID());
+ minion->SetBattlePetCompanionNameTimestamp(pet->NameTimestamp);
minion->SetWildBattlePetLevel(pet->PacketInfo.Level);
}
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index e48319bde83..d12d19c556f 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1300,8 +1300,10 @@ class TC_GAME_API Unit : public WorldObject
Pet* CreateTamedPetFrom(uint32 creatureEntry, uint32 spell_id = 0);
bool InitTamedPet(Pet* pet, uint8 level, uint32 spell_id);
- void SetWildBattlePetLevel(uint32 wildBattlePetLevel) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::WildBattlePetLevel), wildBattlePetLevel); }
+ uint32 GetBattlePetCompanionNameTimestamp() const { return m_unitData->BattlePetCompanionNameTimestamp; }
+ void SetBattlePetCompanionNameTimestamp(uint32 timestamp) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::BattlePetCompanionNameTimestamp), timestamp); }
uint32 GetWildBattlePetLevel() const { return m_unitData->WildBattlePetLevel; }
+ void SetWildBattlePetLevel(uint32 wildBattlePetLevel) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::WildBattlePetLevel), wildBattlePetLevel); }
// aura apply/remove helpers - you should better not use these
Aura* _TryStackingOrRefreshingExistingAura(AuraCreateInfo& createInfo);
diff --git a/src/server/game/Handlers/BattlePetHandler.cpp b/src/server/game/Handlers/BattlePetHandler.cpp
index 581be775faa..4332931795c 100644
--- a/src/server/game/Handlers/BattlePetHandler.cpp
+++ b/src/server/game/Handlers/BattlePetHandler.cpp
@@ -18,7 +18,9 @@
#include "WorldSession.h"
#include "BattlePetMgr.h"
#include "BattlePetPackets.h"
+#include "ObjectAccessor.h"
#include "Player.h"
+#include "TemporarySummon.h"
void WorldSession::HandleBattlePetRequestJournal(WorldPackets::BattlePet::BattlePetRequestJournal& /*battlePetRequestJournal*/)
{
@@ -42,7 +44,47 @@ void WorldSession::HandleBattlePetSetBattleSlot(WorldPackets::BattlePet::BattleP
void WorldSession::HandleBattlePetModifyName(WorldPackets::BattlePet::BattlePetModifyName& battlePetModifyName)
{
- GetBattlePetMgr()->ModifyName(battlePetModifyName.PetGuid, battlePetModifyName.Name, battlePetModifyName.DeclinedName.get_ptr());
+ GetBattlePetMgr()->ModifyName(battlePetModifyName.PetGuid, battlePetModifyName.Name, battlePetModifyName.DeclinedNames.get_ptr());
+}
+
+void WorldSession::HandleQueryBattlePetName(WorldPackets::BattlePet::QueryBattlePetName& queryBattlePetName)
+{
+ WorldPackets::BattlePet::QueryBattlePetNameResponse response;
+ response.BattlePetID = queryBattlePetName.BattlePetID;
+
+ Creature* summonedBattlePet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, queryBattlePetName.UnitGUID);
+ if (!summonedBattlePet || !summonedBattlePet->IsSummon())
+ {
+ SendPacket(response.Write());
+ return;
+ }
+
+ response.CreatureID = summonedBattlePet->GetEntry();
+ response.Timestamp = summonedBattlePet->GetBattlePetCompanionNameTimestamp();
+
+ Unit* petOwner = summonedBattlePet->ToTempSummon()->GetSummoner();
+ if (!petOwner->IsPlayer())
+ {
+ SendPacket(response.Write());
+ return;
+ }
+
+ BattlePetMgr::BattlePet const* battlePet = petOwner->ToPlayer()->GetSession()->GetBattlePetMgr()->GetPet(queryBattlePetName.BattlePetID);
+ if (!battlePet)
+ {
+ SendPacket(response.Write());
+ return;
+ }
+
+ response.Allow = true;
+ response.Name = battlePet->PacketInfo.Name;
+ if (battlePet->DeclinedName)
+ {
+ response.HasDeclined = true;
+ response.DeclinedNames = *battlePet->DeclinedName;
+ }
+
+ SendPacket(response.Write());
}
void WorldSession::HandleBattlePetDeletePet(WorldPackets::BattlePet::BattlePetDeletePet& battlePetDeletePet)
diff --git a/src/server/game/Server/Packets/BattlePetPackets.cpp b/src/server/game/Server/Packets/BattlePetPackets.cpp
index 3c3f4da0b2c..a9de1e154a0 100644
--- a/src/server/game/Server/Packets/BattlePetPackets.cpp
+++ b/src/server/game/Server/Packets/BattlePetPackets.cpp
@@ -116,19 +116,52 @@ void WorldPackets::BattlePet::BattlePetModifyName::Read()
if (hasDeclinedNames)
{
- DeclinedName.emplace();
+ DeclinedNames.emplace();
uint8 declinedNameLengths[MAX_DECLINED_NAME_CASES];
for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
declinedNameLengths[i] = _worldPacket.ReadBits(7);
for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
- DeclinedName->name[i] = _worldPacket.ReadString(declinedNameLengths[i]);
+ DeclinedNames->name[i] = _worldPacket.ReadString(declinedNameLengths[i]);
}
Name = _worldPacket.ReadString(nameLength);
}
+void WorldPackets::BattlePet::QueryBattlePetName::Read()
+{
+ _worldPacket >> BattlePetID;
+ _worldPacket >> UnitGUID;
+}
+
+WorldPacket const* WorldPackets::BattlePet::QueryBattlePetNameResponse::Write()
+{
+ _worldPacket << BattlePetID;
+ _worldPacket << int32(CreatureID);
+ _worldPacket << Timestamp;
+
+ _worldPacket.WriteBit(Allow);
+
+ if (Allow)
+ {
+ _worldPacket.WriteBits(Name.length(), 8);
+ _worldPacket.WriteBit(HasDeclined);
+
+ for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
+ _worldPacket.WriteBits(DeclinedNames.name[i].length(), 7);
+
+ for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
+ _worldPacket.WriteString(DeclinedNames.name[i]);
+
+ _worldPacket.WriteString(Name);
+ }
+
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
+
void WorldPackets::BattlePet::BattlePetDeletePet::Read()
{
_worldPacket >> PetGuid;
diff --git a/src/server/game/Server/Packets/BattlePetPackets.h b/src/server/game/Server/Packets/BattlePetPackets.h
index 5cd161045f4..240b62750ed 100644
--- a/src/server/game/Server/Packets/BattlePetPackets.h
+++ b/src/server/game/Server/Packets/BattlePetPackets.h
@@ -19,6 +19,7 @@
#define BattlePetPackets_h__
#include "Packet.h"
+#include "PacketUtilities.h"
#include "ObjectGuid.h"
#include "Optional.h"
#include "UnitDefines.h"
@@ -149,7 +150,35 @@ namespace WorldPackets
ObjectGuid PetGuid;
std::string Name;
- Optional<::DeclinedName> DeclinedName;
+ Optional<DeclinedName> DeclinedNames;
+ };
+
+ class QueryBattlePetName final : public ClientPacket
+ {
+ public:
+ QueryBattlePetName(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_BATTLE_PET_NAME, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid BattlePetID;
+ ObjectGuid UnitGUID;
+ };
+
+ class QueryBattlePetNameResponse final : public ServerPacket
+ {
+ public:
+ QueryBattlePetNameResponse() : ServerPacket(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid BattlePetID;
+ int32 CreatureID = 0;
+ WorldPackets::Timestamp<> Timestamp;
+ bool Allow = false;
+
+ bool HasDeclined = false;
+ DeclinedName DeclinedNames;
+ std::string Name;
};
class BattlePetDeletePet final : public ClientPacket
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index b036b6f8515..ebc5440fc07 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -666,7 +666,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandlePlayerLoginOpcode);
DEFINE_HANDLER(CMSG_PUSH_QUEST_TO_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePushQuestToParty);
DEFINE_HANDLER(CMSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePVPLogDataOpcode);
- DEFINE_HANDLER(CMSG_QUERY_BATTLE_PET_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_QUERY_BATTLE_PET_NAME, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryBattlePetName);
DEFINE_HANDLER(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryCorpseLocation);
DEFINE_HANDLER(CMSG_QUERY_CORPSE_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryCorpseTransport);
DEFINE_HANDLER(CMSG_QUERY_COUNTDOWN_TIMER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
@@ -1743,7 +1743,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_MATCH_STATISTICS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_TIER_RECORD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_CREATURE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GAME_OBJECT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 439ad78f70a..a5bb23c7549 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -193,6 +193,7 @@ namespace WorldPackets
class BattlePetRequestJournalLock;
class BattlePetSetBattleSlot;
class BattlePetModifyName;
+ class QueryBattlePetName;
class BattlePetDeletePet;
class BattlePetSetFlags;
class BattlePetClearFanfare;
@@ -1748,6 +1749,7 @@ class TC_GAME_API WorldSession
void HandleBattlePetRequestJournalLock(WorldPackets::BattlePet::BattlePetRequestJournalLock& battlePetRequestJournalLock);
void HandleBattlePetSetBattleSlot(WorldPackets::BattlePet::BattlePetSetBattleSlot& battlePetSetBattleSlot);
void HandleBattlePetModifyName(WorldPackets::BattlePet::BattlePetModifyName& battlePetModifyName);
+ void HandleQueryBattlePetName(WorldPackets::BattlePet::QueryBattlePetName& queryBattlePetName);
void HandleBattlePetDeletePet(WorldPackets::BattlePet::BattlePetDeletePet& battlePetDeletePet);
void HandleBattlePetSetFlags(WorldPackets::BattlePet::BattlePetSetFlags& battlePetSetFlags);
void HandleBattlePetClearFanfare(WorldPackets::BattlePet::BattlePetClearFanfare& battlePetClearFanfare);