aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/MiscHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/MiscHandler.cpp')
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp178
1 files changed, 39 insertions, 139 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index ab906fa956f..3a48c29ce03 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -57,6 +57,7 @@
#include "BattlefieldMgr.h"
#include "DB2Stores.h"
#include "CharacterPackets.h"
+#include "ClientConfigPackets.h"
#include "MiscPackets.h"
void WorldSession::HandleRepopRequestOpcode(WorldPacket& recvData)
@@ -537,12 +538,9 @@ void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/)
SendPacket(&data);
}
-void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData)
+void WorldSession::HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet)
{
- ObjectGuid guid;
- recvData >> guid;
-
- _player->SetSelection(guid);
+ _player->SetSelection(packet.Selection);
}
void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData)
@@ -967,97 +965,70 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recvData)
player->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, at->target_Orientation, TELE_TO_NOT_LEAVE_TRANSPORT);
}
-void WorldSession::HandleUpdateAccountData(WorldPacket& recvData)
+void WorldSession::HandleUpdateAccountData(WorldPackets::ClientConfig::UserClientUpdateAccountData& packet)
{
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_UPDATE_ACCOUNT_DATA");
-
- uint32 type, timestamp, decompressedSize;
- recvData >> type >> timestamp >> decompressedSize;
-
- TC_LOG_DEBUG("network", "UAD: type %u, time %u, decompressedSize %u", type, timestamp, decompressedSize);
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_UPDATE_ACCOUNT_DATA: type %u, time %u, decompressedSize %u",
+ packet.DataType, packet.Time, packet.Size);
- if (type > NUM_ACCOUNT_DATA_TYPES)
+ if (packet.DataType > NUM_ACCOUNT_DATA_TYPES)
return;
- if (decompressedSize == 0) // erase
+ if (packet.Size == 0) // erase
{
- SetAccountData(AccountDataType(type), 0, "");
-
- WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
- data << uint32(type);
- data << uint32(0);
- SendPacket(&data);
-
+ SetAccountData(AccountDataType(packet.DataType), 0, "");
return;
}
- if (decompressedSize > 0xFFFF)
+ if (packet.Size > 0xFFFF)
{
- recvData.rfinish(); // unnneded warning spam in this case
- TC_LOG_ERROR("network", "UAD: Account data packet too big, size %u", decompressedSize);
+ TC_LOG_ERROR("network", "UAD: Account data packet too big, size %u", packet.Size);
return;
}
ByteBuffer dest;
- dest.resize(decompressedSize);
+ dest.resize(packet.Size);
- uLongf realSize = decompressedSize;
- if (uncompress(dest.contents(), &realSize, recvData.contents() + recvData.rpos(), recvData.size() - recvData.rpos()) != Z_OK)
+ uLongf realSize = packet.Size;
+ if (uncompress(dest.contents(), &realSize, packet.CompressedData.contents(), packet.CompressedData.size()) != Z_OK)
{
- recvData.rfinish(); // unnneded warning spam in this case
TC_LOG_ERROR("network", "UAD: Failed to decompress account data");
return;
}
- recvData.rfinish(); // uncompress read (recvData.size() - recvData.rpos())
-
std::string adata;
dest >> adata;
- SetAccountData(AccountDataType(type), timestamp, adata);
-
- WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
- data << uint32(type);
- data << uint32(0);
- SendPacket(&data);
+ SetAccountData(AccountDataType(packet.DataType), packet.Time, adata);
}
-void WorldSession::HandleRequestAccountData(WorldPacket& recvData)
+void WorldSession::HandleRequestAccountData(WorldPackets::ClientConfig::RequestAccountData& request)
{
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_REQUEST_ACCOUNT_DATA");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_REQUEST_ACCOUNT_DATA: type %u", request.DataType);
- uint32 type;
- recvData >> type;
-
- TC_LOG_DEBUG("network", "RAD: type %u", type);
-
- if (type >= NUM_ACCOUNT_DATA_TYPES)
+ if (request.DataType >= NUM_ACCOUNT_DATA_TYPES)
return;
- AccountData* adata = GetAccountData(AccountDataType(type));
+ AccountData const* adata = GetAccountData(AccountDataType(request.DataType));
- uint32 size = adata->Data.size();
+ WorldPackets::ClientConfig::UpdateAccountData data;
+ data.Player = _player ? _player->GetGUID() : ObjectGuid::Empty;
+ data.Time = adata->Time;
+ data.Size = adata->Data.size();
+ data.DataType = request.DataType;
- uLongf destSize = compressBound(size);
+ uLongf destSize = compressBound(data.Size);
- ByteBuffer dest;
- dest.resize(destSize);
+ data.CompressedData.resize(destSize);
- if (size && compress(dest.contents(), &destSize, (uint8 const*)adata->Data.c_str(), size) != Z_OK)
+ if (data.Size && compress(data.CompressedData.contents(), &destSize, (uint8 const*)adata->Data.c_str(), data.Size) != Z_OK)
{
- TC_LOG_DEBUG("network", "RAD: Failed to compress account data");
+ TC_LOG_ERROR("network", "RAD: Failed to compress account data");
return;
}
- dest.resize(destSize);
+ data.CompressedData.resize(destSize);
- WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA, 8+4+4+4+destSize);
- data << (_player ? _player->GetGUID() : ObjectGuid::Empty);
- data << uint32(type); // type (0-7)
- data << uint32(adata->Time); // unix time
- data << uint32(size); // decompressed length
- data.append(dest); // compressed data
- SendPacket(&data);
+ SendPacket(data.Write());
}
int32 WorldSession::HandleEnableNagleAlgorithm()
@@ -1522,24 +1493,21 @@ void WorldSession::HandleSetTitleOpcode(WorldPacket& recvData)
GetPlayer()->SetUInt32Value(PLAYER_CHOSEN_TITLE, title);
}
-void WorldSession::HandleTimeSyncResp(WorldPacket& recvData)
+void WorldSession::HandleTimeSyncResp(WorldPackets::Misc::TimeSyncResponse& packet)
{
TC_LOG_DEBUG("network", "CMSG_TIME_SYNC_RESP");
- uint32 counter, clientTicks;
- recvData >> counter >> clientTicks;
-
- if (counter != _player->m_timeSyncQueue.front())
+ if (packet.SequenceIndex != _player->m_timeSyncQueue.front())
TC_LOG_ERROR("network", "Wrong time sync counter from player %s (cheater?)", _player->GetName().c_str());
- TC_LOG_DEBUG("network", "Time sync received: counter %u, client ticks %u, time since last sync %u", counter, clientTicks, clientTicks - _player->m_timeSyncClient);
+ TC_LOG_DEBUG("network", "Time sync received: counter %u, client ticks %u, time since last sync %u", packet.SequenceIndex, packet.ClientTime, packet.ClientTime - _player->m_timeSyncClient);
- uint32 ourTicks = clientTicks + (getMSTime() - _player->m_timeSyncServer);
+ uint32 ourTicks = packet.ClientTime + (getMSTime() - _player->m_timeSyncServer);
// diff should be small
- TC_LOG_DEBUG("network", "Our ticks: %u, diff %u, latency %u", ourTicks, ourTicks - clientTicks, GetLatency());
+ TC_LOG_DEBUG("network", "Our ticks: %u, diff %u, latency %u", ourTicks, ourTicks - packet.ClientTime, GetLatency());
- _player->m_timeSyncClient = clientTicks;
+ _player->m_timeSyncClient = packet.ClientTime;
_player->m_timeSyncQueue.pop();
}
@@ -1756,9 +1724,9 @@ void WorldSession::HandleWorldStateUITimerUpdate(WorldPacket& /*recvData*/)
// empty opcode
TC_LOG_DEBUG("network", "WORLD: CMSG_WORLD_STATE_UI_TIMER_UPDATE");
- WorldPacket data(SMSG_WORLD_STATE_UI_TIMER_UPDATE, 4);
- data << uint32(time(NULL));
- SendPacket(&data);
+ WorldPackets::Misc::UITime response;
+ response.Time = time(NULL);
+ SendPacket(response.Write());
}
void WorldSession::SendSetPhaseShift(std::set<uint32> const& phaseIds, std::set<uint32> const& terrainswaps, std::set<uint32> const& worldMapAreaSwaps)
@@ -1896,74 +1864,6 @@ void WorldSession::HandleInstanceLockResponse(WorldPacket& recvPacket)
_player->SetPendingBind(0, 0);
}
-void WorldSession::HandleRequestHotfix(WorldPacket& recvPacket)
-{
- uint32 type, count;
- recvPacket >> type;
-
- DB2StorageBase const* store = GetDB2Storage(type);
- if (!store)
- {
- TC_LOG_ERROR("network", "CMSG_REQUEST_HOTFIX: Received unknown hotfix type: %u", type);
- recvPacket.rfinish();
- return;
- }
-
- count = recvPacket.ReadBits(23);
-
- ObjectGuid* guids = new ObjectGuid[count];
- for (uint32 i = 0; i < count; ++i)
- {
- guids[i][0] = recvPacket.ReadBit();
- guids[i][4] = recvPacket.ReadBit();
- guids[i][7] = recvPacket.ReadBit();
- guids[i][2] = recvPacket.ReadBit();
- guids[i][5] = recvPacket.ReadBit();
- guids[i][3] = recvPacket.ReadBit();
- guids[i][6] = recvPacket.ReadBit();
- guids[i][1] = recvPacket.ReadBit();
- }
-
- uint32 entry;
- for (uint32 i = 0; i < count; ++i)
- {
- recvPacket.ReadByteSeq(guids[i][5]);
- recvPacket.ReadByteSeq(guids[i][6]);
- recvPacket.ReadByteSeq(guids[i][7]);
- recvPacket.ReadByteSeq(guids[i][0]);
- recvPacket.ReadByteSeq(guids[i][1]);
- recvPacket.ReadByteSeq(guids[i][3]);
- recvPacket.ReadByteSeq(guids[i][4]);
- recvPacket >> entry;
- recvPacket.ReadByteSeq(guids[i][2]);
-
- if (!store->HasRecord(entry))
- {
- WorldPacket data(SMSG_DB_REPLY, 4 * 4);
- data << -int32(entry);
- data << uint32(store->GetHash());
- data << uint32(time(NULL));
- data << uint32(0);
- SendPacket(&data);
- continue;
- }
-
- WorldPacket data(SMSG_DB_REPLY);
- data << int32(entry);
- data << uint32(store->GetHash());
- data << uint32(sObjectMgr->GetHotfixDate(entry, store->GetHash()));
-
- size_t sizePos = data.wpos();
- data << uint32(0); // size of next block
- store->WriteRecord(entry, uint32(GetSessionDbcLocale()), data);
- data.put<uint32>(sizePos, data.wpos() - sizePos - 4);
-
- SendPacket(&data);
- }
-
- delete[] guids;
-}
-
void WorldSession::HandleUpdateMissileTrajectory(WorldPacket& recvPacket)
{
TC_LOG_DEBUG("network", "WORLD: CMSG_UPDATE_MISSILE_TRAJECTORY");