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.cpp41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 854e00595dc..25a6397748f 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -223,20 +223,20 @@ bool LoginQueryHolder::Initialize()
void WorldSession::HandleCharEnum(PreparedQueryResult result)
{
uint32 charCount = 0;
- ByteBuffer bitBuffer;
- ByteBuffer dataBuffer;
+ WorldPacket data(SMSG_CHAR_ENUM);
+ data.WriteBit(1); // Success
+ data.WriteBit(0); // IsDeleted (used for character undelete list)
+
- bitBuffer.WriteBits(0, 23);
- bitBuffer.WriteBit(1);
if (result)
{
_legitCharacters.clear();
charCount = uint32(result->GetRowCount());
- bitBuffer.reserve(24 * charCount / 8);
- dataBuffer.reserve(charCount * 381);
+ data << uint32(charCount);
+ data << uint32(0); // FactionChangeRestrictions
- bitBuffer.WriteBits(charCount, 17);
+ data.reserve(charCount * 450); // Guessed
do
{
@@ -244,7 +244,7 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result)
TC_LOG_INFO("network", "Loading char guid %s from account %u.", guid.ToString().c_str(), GetAccountId());
- Player::BuildEnumData(result, &dataBuffer, &bitBuffer);
+ Player::BuildEnumData(result, &data);
// Do not allow banned characters to log in
if (!(*result)[20].GetUInt32())
@@ -255,14 +255,10 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result)
} while (result->NextRow());
}
else
- bitBuffer.WriteBits(0, 17);
-
- bitBuffer.FlushBits();
-
- WorldPacket data(SMSG_CHAR_ENUM, 7 + bitBuffer.size() + dataBuffer.size());
- data.append(bitBuffer);
- if (charCount)
- data.append(dataBuffer);
+ {
+ data << uint32(0); // CharCount
+ data << uint32(0); // FactionChangeRestrictions
+ }
SendPacket(&data);
}
@@ -290,8 +286,10 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData)
{
CharacterCreateInfo createInfo;
- recvData >> createInfo.Name
- >> createInfo.Race
+ uint32 nameLength = recvData.ReadBits(6);
+ bool hasTempalte = recvData.ReadBit();
+
+ recvData >> createInfo.Race
>> createInfo.Class
>> createInfo.Gender
>> createInfo.Skin
@@ -301,6 +299,12 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData)
>> createInfo.FacialHair
>> createInfo.OutfitId;
+ createInfo.Name = recvData.ReadString(nameLength);
+
+ if (hasTempalte)
+ recvData.read_skip<uint32>(); // Template from SMSG_AUTH_RESPONSE
+
+
if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_TEAMMASK))
{
if (uint32 mask = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED))
@@ -681,6 +685,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
{
ObjectGuid guid;
recvData >> guid;
+
// Initiating
uint32 initAccountId = GetAccountId();