diff options
author | joschiwald <joschiwald.trinity@gmail.com> | 2014-10-31 14:47:56 +0100 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2014-10-31 14:47:56 +0100 |
commit | 310c33d96f77909dd38cd2bb89d20ec858ace807 (patch) | |
tree | 7346cce82178f40dd13cabe56a71cf399e7ebc56 /src/server/game/Handlers/CharacterHandler.cpp | |
parent | e9e1f5b018f8d526b605e48eae686c2a68c66811 (diff) |
Core/NetworkIO: update SMSG_CHAR_ENUM and CMSG_PLAYER_LOGIN
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 83 |
1 files changed, 29 insertions, 54 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 58e431ac2bd..a3ed092e56a 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -21,6 +21,7 @@ #include "ArenaTeamMgr.h" #include "Battleground.h" #include "CalendarMgr.h" +#include "CharacterPackets.h" #include "Chat.h" #include "Common.h" #include "DatabaseEnv.h" @@ -222,45 +223,35 @@ bool LoginQueryHolder::Initialize() void WorldSession::HandleCharEnum(PreparedQueryResult result) { - uint32 charCount = 0; - WorldPacket data(SMSG_CHAR_ENUM); - data.WriteBit(1); // Success - data.WriteBit(0); // IsDeleted (used for character undelete list) - + WorldPackets::Character::CharEnumResult charEnum; + charEnum.Success = true; + charEnum.IsDeletedCharacters = false; if (result) { _legitCharacters.clear(); - charCount = uint32(result->GetRowCount()); - data << uint32(charCount); - data << uint32(0); // FactionChangeRestrictions - - data.reserve(charCount * 450); // Guessed - do { - ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>((*result)[0].GetUInt64()); + Field* fields = result->Fetch(); + WorldPackets::Character::CharEnumResult::CharacterInfo charInfo(fields); - TC_LOG_INFO("network", "Loading char guid %s from account %u.", guid.ToString().c_str(), GetAccountId()); + TC_LOG_INFO("network", "Loading char guid %s from account %u.", charInfo.Guid.ToString().c_str(), GetAccountId()); - Player::BuildEnumData(result, &data); + // Do not allow locked characters to login + if (!(charInfo.Flags & (CHARACTER_FLAG_LOCKED_FOR_TRANSFER | CHARACTER_FLAG_LOCKED_BY_BILLING))) + _legitCharacters.insert(charInfo.Guid); - // Do not allow banned characters to log in - if (!(*result)[20].GetUInt64()) - _legitCharacters.insert(guid); + if (!sWorld->HasCharacterNameData(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. + sWorld->AddCharacterNameData(charInfo.Guid, charInfo.Name, charInfo.Sex, charInfo.Race, charInfo.Class, charInfo.Level); - if (!sWorld->HasCharacterNameData(guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. - sWorld->AddCharacterNameData(guid, (*result)[1].GetString(), (*result)[4].GetUInt8(), (*result)[2].GetUInt8(), (*result)[3].GetUInt8(), (*result)[7].GetUInt8()); - } while (result->NextRow()); - } - else - { - data << uint32(0); // CharCount - data << uint32(0); // FactionChangeRestrictions + charEnum.Characters.emplace_back(charInfo); + } + while (result->NextRow()); } - SendPacket(&data); + charEnum.Write(); + SendPacket(&charEnum.GetWorldPacket()); } void WorldSession::HandleCharEnumOpcode(WorldPacket& /*recvData*/) @@ -763,38 +754,23 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) return; } + TC_LOG_DEBUG("network", "WORLD: Recvd Player Logon Message"); + m_playerLoading = true; - ObjectGuid playerGuid; - TC_LOG_DEBUG("network", "WORLD: Recvd Player Logon Message"); - playerGuid[2] = recvData.ReadBit(); - playerGuid[3] = recvData.ReadBit(); - playerGuid[0] = recvData.ReadBit(); - playerGuid[6] = recvData.ReadBit(); - playerGuid[4] = recvData.ReadBit(); - playerGuid[5] = recvData.ReadBit(); - playerGuid[1] = recvData.ReadBit(); - playerGuid[7] = recvData.ReadBit(); - - recvData.ReadByteSeq(playerGuid[2]); - recvData.ReadByteSeq(playerGuid[7]); - recvData.ReadByteSeq(playerGuid[0]); - recvData.ReadByteSeq(playerGuid[3]); - recvData.ReadByteSeq(playerGuid[5]); - recvData.ReadByteSeq(playerGuid[6]); - recvData.ReadByteSeq(playerGuid[1]); - recvData.ReadByteSeq(playerGuid[4]); - - TC_LOG_DEBUG("network", "Character %s logging in", playerGuid.ToString().c_str()); - - if (!IsLegitCharacterForAccount(playerGuid)) - { - TC_LOG_ERROR("network", "Account (%u) can't login with that character (%s).", GetAccountId(), playerGuid.ToString().c_str()); + WorldPackets::Character::PlayerLogin playerLogin(std::move(recvData)); + playerLogin.Read(); + + TC_LOG_DEBUG("network", "Character %s logging in", playerLogin.Guid.ToString().c_str()); + + if (!IsLegitCharacterForAccount(playerLogin.Guid)) + { + TC_LOG_ERROR("network", "Account (%u) can't login with that character (%s).", GetAccountId(), playerLogin.Guid.ToString().c_str()); KickPlayer(); return; } - LoginQueryHolder *holder = new LoginQueryHolder(GetAccountId(), playerGuid); + LoginQueryHolder* holder = new LoginQueryHolder(GetAccountId(), playerLogin.Guid); if (!holder->Initialize()) { delete holder; // delete all unprocessed queries @@ -1083,9 +1059,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) if (pCurrChar->IsGameMaster()) SendNotification(LANG_GM_ON); - std::string IP_str = GetRemoteAddress(); TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Login Character: [%s] (%s) Level: %d", - GetAccountId(), IP_str.c_str(), pCurrChar->GetName().c_str(), pCurrChar->GetGUID().ToString().c_str(), pCurrChar->getLevel()); + GetAccountId(), GetRemoteAddress().c_str(), pCurrChar->GetName().c_str(), pCurrChar->GetGUID().ToString().c_str(), pCurrChar->getLevel()); if (!pCurrChar->IsStandState() && !pCurrChar->HasUnitState(UNIT_STATE_STUNNED)) pCurrChar->SetStandState(UNIT_STAND_STATE_STAND); |