diff options
Diffstat (limited to 'src/server/game/Handlers/MiscHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 178 |
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"); |
