aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/CharacterHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp106
1 files changed, 24 insertions, 82 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 26a3e7c67ea..d31e1c8316f 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -203,100 +203,42 @@ bool LoginQueryHolder::Initialize()
void WorldSession::HandleCharEnum(PreparedQueryResult result)
{
- WorldPacket data(SMSG_CHAR_ENUM, 270);
-
- data << uint8(0x80); // 0 causes the client to free memory of charlist
- data << uint32(0); // number of characters
- data << uint32(0); // unk loop counter
+ uint32 charCount = 0;
+ ByteBuffer bitBuffer;
+ ByteBuffer dataBuffer;
+ bitBuffer.WriteBits(0, 23);
+ bitBuffer.WriteBit(1);
if (result)
{
- typedef std::pair<uint32, uint64> Guids;
- std::vector<Guids> guidsVect;
- ByteBuffer buffer;
_allowedCharsToLogin.clear();
- do
- {
- uint32 GuidLow = (*result)[0].GetUInt32();
- uint64 GuildGuid = (*result)[13].GetUInt32();//TODO: store as uin64
+ charCount = uint32(result->GetRowCount());
+ bitBuffer.reserve(24 * charCount / 8);
+ dataBuffer.reserve(charCount * 381);
- guidsVect.push_back(std::make_pair(GuidLow, GuildGuid));
+ bitBuffer.WriteBits(charCount, 17);
- sLog->outDetail("Loading char guid %u from account %u.", GuidLow, GetAccountId());
+ do
+ {
+ uint32 guidLow = (*result)[0].GetUInt32();
- if (!Player::BuildEnumData(result, &buffer))
- {
- sLog->outError("Building enum data for SMSG_CHAR_ENUM has failed, aborting");
- return;
- }
- _allowedCharsToLogin.insert(GuidLow);
- }
- while (result->NextRow());
+ sLog->outDetail("Loading char guid %u from account %u.", guidLow, GetAccountId());
- for (std::vector<Guids>::iterator itr = guidsVect.begin(); itr != guidsVect.end(); ++itr)
- {
- uint32 GuidLow = (*itr).first;
- uint64 GuildGuid = (*itr).second;
+ Player::BuildEnumData(result, &dataBuffer, &bitBuffer);
- uint8 Guid0 = uint8(GuidLow);
- uint8 Guid1 = uint8(GuidLow >> 8);
- uint8 Guid2 = uint8(GuidLow >> 16);
- uint8 Guid3 = uint8(GuidLow >> 24);
+ _allowedCharsToLogin.insert(guidLow);
+ } while (result->NextRow());
- for (uint8 i = 0; i < 17; ++i)
- {
- switch(i)
- {
- //case 14:
- // data.writeBit(1);//unk
- // break;
- case 11: data.WriteBit(Guid0 ? 1 : 0); break;
- case 12: data.WriteBit(Guid1 ? 1 : 0); break;
- case 9: data.WriteBit(Guid2 ? 1 : 0); break;
- case 8: data.WriteBit(Guid3 ? 1 : 0); break;
- /*case 15:
- if(uint8(GuildGuid))
- data.writeBit(1);
- break;
- case 4:
- if(uint8(GuildGuid >> 8))
- data.writeBit(1);
- break;
- case 13:
- if(uint8(GuildGuid >> 16))
- data.writeBit(1);
- break;
- case 2:
- if(uint8(GuildGuid >> 24))
- data.writeBit(1);
- break;*/
- /*case 0:
- if(uint8(GuildGuid >> 32))
- data.writeBit(1);
- break;
- case 0:
- if(uint8(GuildGuid >> 40))
- data.writeBit(1);
- break;*/
- /*case 5:
- if(uint8(GuildGuid >> 48))
- data.writeBit(1);
- break;
- case 3:
- if(uint8(GuildGuid >> 56))
- data.writeBit(1);
- break;*/
- default:
- data.WriteBit(0);
- break;
- }
- }
- }
- data.FlushBits();
- data.append(buffer);
- data.put<uint32>(1, guidsVect.size());
+ bitBuffer.FlushBits();
}
+ else
+ bitBuffer.WriteBits(0, 17);
+
+ WorldPacket data(SMSG_CHAR_ENUM, 7 + bitBuffer.size() + dataBuffer.size());
+ data.append(bitBuffer);
+ if (charCount)
+ data.append(dataBuffer);
SendPacket(&data);
}