aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDDuarte <dnpd.dd@gmail.com>2014-09-02 00:49:17 +0100
committerDDuarte <dnpd.dd@gmail.com>2014-09-02 00:49:17 +0100
commite0f7cd151451863b29e800b10e5c5fe90f3627ef (patch)
tree2a956bf2b10bcbc21cffb211331feb510f44abe6 /src
parentd05246f171546085f43bed877408c0db8233b8e3 (diff)
Core/Misc: Send cemetery list when the client requests it
Implement CMSG_REQUEST_CEMETERY_LIST & SMSG_REQUEST_CEMETERY_LIST_RESPONSE Sends up to 15 graveyard ids from the player zone (needs verification, *some* packets were seen with graveyards from the whole continent).
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp31
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h3
3 files changed, 35 insertions, 1 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index 1162622af60..99cab39c241 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -508,6 +508,37 @@ void WorldSession::HandleReturnToGraveyard(WorldPacket& /*recvPacket*/)
GetPlayer()->RepopAtGraveyard();
}
+void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/)
+{
+ uint32 zoneId = _player->GetZoneId();
+ uint32 team = _player->GetTeam();
+
+ std::vector<uint32> graveyardIds;
+ auto range = sObjectMgr->GraveYardStore.equal_range(zoneId);
+
+ for (auto it = range.first; it != range.second && graveyardIds.size() < 16; ++it) // client max
+ {
+ if (it->second.team == 0 || it->second.team == team)
+ graveyardIds.push_back(it->first);
+ }
+
+ if (graveyardIds.empty())
+ {
+ TC_LOG_DEBUG("network", "No graveyards found for zone %u for player %u (team %u) in CMSG_REQUEST_CEMETERY_LIST",
+ zoneId, m_GUIDLow, team);
+ return;
+ }
+
+ WorldPacket data(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, 4 + 4 * graveyardIds.size());
+ data.WriteBit(0); // Is MicroDungeon (WorldMapFrame.lua)
+
+ data.WriteBits(graveyardIds.size(), 24);
+ for (int i = 0; i < graveyardIds.size(); ++i)
+ data << uint32(graveyardIds[i]);
+
+ SendPacket(&data);
+}
+
void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData)
{
uint64 guid;
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index f653b1ec9d4..cbf766ee279 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -450,7 +450,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(CMSG_REPORT_PVP_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK );
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData );
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCategoryCooldowns );
- DEFINE_OPCODE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCemeteryList );
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_HOTFIX, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleRequestHotfix );
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyMemberStatsOpcode);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 40119124490..646a76bcbe5 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -430,7 +430,10 @@ class WorldSession
void HandleMoveUnRootAck(WorldPacket& recvPacket);
void HandleMoveRootAck(WorldPacket& recvPacket);
void HandleLookingForGroup(WorldPacket& recvPacket);
+
+ // cemetery/graveyard related
void HandleReturnToGraveyard(WorldPacket& recvPacket);
+ void HandleRequestCemeteryList(WorldPacket& recvPacket);
// new inspect
void HandleInspectOpcode(WorldPacket& recvPacket);