diff options
| author | Shauren <shauren.trinity@gmail.com> | 2012-07-09 14:23:55 +0200 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2012-07-09 14:23:55 +0200 | 
| commit | d9e830c4842cfb333c1385e794b8ad1f875e2dc6 (patch) | |
| tree | eecd0a76b3c6e254b939341a15dd66b67c792814 /src/server/game/Handlers/CharacterHandler.cpp | |
| parent | 9f52f4df537c6ce0cd5329b03ee04c5bc57f271e (diff) | |
Core/PacketIO: Updated character list packet structure to 4.3.4
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 106 | 
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);  }  | 
