aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp27
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h2
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp14
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h49
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp10
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h6
-rw-r--r--src/server/game/Server/WorldSession.cpp32
-rw-r--r--src/server/game/Server/WorldSession.h9
-rw-r--r--src/server/game/Server/WorldSocket.cpp5
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.cpp1
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.h1
12 files changed, 112 insertions, 46 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index a96cd9220ac..de72e024e5e 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -56,6 +56,7 @@
#include "Battlefield.h"
#include "BattlefieldMgr.h"
#include "DB2Stores.h"
+#include "CharacterPackets.h"
void WorldSession::HandleRepopRequestOpcode(WorldPacket& recvData)
{
@@ -373,7 +374,7 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData)
TC_LOG_DEBUG("network", "WORLD: Send SMSG_WHO Message");
}
-void WorldSession::HandleLogoutRequestOpcode(WorldPacket& /*recvData*/)
+void WorldSession::HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequest& /*logoutRequest*/)
{
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_LOGOUT_REQUEST Message, security - %u", GetSecurity());
@@ -395,14 +396,14 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPacket& /*recvData*/)
else if (GetPlayer()->duel || GetPlayer()->HasAura(9454)) // is dueling or frozen by GM via freeze command
reason = 2; // FIXME - Need the correct value
- WorldPacket data(SMSG_LOGOUT_RESPONSE, 1+4);
- data << uint32(reason);
- data << uint8(instantLogout);
- SendPacket(&data);
+ WorldPackets::Character::LogoutResponse logoutResponse;
+ logoutResponse.LogoutResult = reason;
+ logoutResponse.Instant = instantLogout;
+ SendPacket(logoutResponse.Write());
if (reason)
{
- LogoutRequest(0);
+ SetLogoutStartTime(0);
return;
}
@@ -422,15 +423,10 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPacket& /*recvData*/)
GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
- LogoutRequest(time(NULL));
+ SetLogoutStartTime(time(NULL));
}
-void WorldSession::HandlePlayerLogoutOpcode(WorldPacket& /*recvData*/)
-{
- TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_PLAYER_LOGOUT Message");
-}
-
-void WorldSession::HandleLogoutCancelOpcode(WorldPacket& /*recvData*/)
+void WorldSession::HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCancel& /*logoutCancel*/)
{
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_LOGOUT_CANCEL Message");
@@ -438,10 +434,9 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPacket& /*recvData*/)
if (!GetPlayer())
return;
- LogoutRequest(0);
+ SetLogoutStartTime(0);
- WorldPacket data(SMSG_LOGOUT_CANCEL_ACK, 0);
- SendPacket(&data);
+ SendPacket(WorldPackets::Character::LogoutCancelAck().Write());
// not remove flags if can't free move - its not set in Logout request code.
if (GetPlayer()->CanFreeMove())
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp
index 95f2379e82f..2bb1760b31c 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.cpp
+++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp
@@ -142,7 +142,7 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
std::string const WorldPackets::Auth::ConnectTo::Haiku("An island of peace\nCorruption is brought ashore\nPandarens will rise\n\0\0", 71);
-uint8 const WorldPackets::Auth::ConnectTo::PiDigits[260] =
+uint8 const WorldPackets::Auth::ConnectTo::PiDigits[130] =
{
0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93, 0x23, 0x84,
0x62, 0x64, 0x33, 0x83, 0x27, 0x95, 0x02, 0x88, 0x41, 0x97,
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h
index 70aa38cac8e..6f9eae12f63 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.h
+++ b/src/server/game/Server/Packets/AuthenticationPackets.h
@@ -141,7 +141,7 @@ namespace WorldPackets
class ConnectTo final : public ServerPacket
{
static std::string const Haiku;
- static uint8 const PiDigits[260];
+ static uint8 const PiDigits[130];
struct ConnectPayload
{
diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp
index 790402c473f..70da43ff661 100644
--- a/src/server/game/Server/Packets/CharacterPackets.cpp
+++ b/src/server/game/Server/Packets/CharacterPackets.cpp
@@ -337,3 +337,17 @@ WorldPacket const* WorldPackets::Character::LoginVerifyWorld::Write()
_worldPacket << uint32(Reason);
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Character::LogoutResponse::Write()
+{
+ _worldPacket << int32(LogoutResult);
+ _worldPacket.WriteBit(Instant);
+ _worldPacket.FlushBits();
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Character::LogoutComplete::Write()
+{
+ _worldPacket << SwitchToCharacter;
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h
index 57a81e0ed11..a4bb21cd9b0 100644
--- a/src/server/game/Server/Packets/CharacterPackets.h
+++ b/src/server/game/Server/Packets/CharacterPackets.h
@@ -207,9 +207,9 @@ namespace WorldPackets
{
public:
GenerateRandomCharacterName(WorldPacket&& packet);
-
+
void Read() override;
-
+
uint8 Sex = 0;
uint8 Race = 0;
};
@@ -304,6 +304,51 @@ namespace WorldPackets
Position Pos;
uint32 Reason = 0;
};
+
+ class LogoutRequest final : public ClientPacket
+ {
+ public:
+ LogoutRequest(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class LogoutResponse final : public ServerPacket
+ {
+ public:
+ LogoutResponse() : ServerPacket(SMSG_LOGOUT_RESPONSE, 4 + 1) { }
+
+ WorldPacket const* Write() override;
+
+ int32 LogoutResult = 0;
+ bool Instant = false;
+ };
+
+ class LogoutComplete final : public ServerPacket
+ {
+ public:
+ LogoutComplete() : ServerPacket(SMSG_LOGOUT_COMPLETE, 2) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid SwitchToCharacter;
+ };
+
+ class LogoutCancel final : public ClientPacket
+ {
+ public:
+ LogoutCancel(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class LogoutCancelAck final : public ServerPacket
+ {
+ public:
+ LogoutCancelAck() : ServerPacket(SMSG_LOGOUT_CANCEL_ACK, 0) { }
+
+ WorldPacket const* Write() override { return &_worldPacket; }
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 97fc18a1c2f..57d6abe49e6 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -378,8 +378,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderSetGuildPost );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LIST_INVENTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleListInventoryOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOAD_SCREEN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLoadScreenOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_LOGOUT_CANCEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutCancelOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_LOGOUT_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutRequestOpcode );
+ DEFINE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutCancel, &WorldSession::HandleLogoutCancelOpcode);
+ DEFINE_HANDLER(CMSG_LOGOUT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutRequest, &WorldSession::HandleLogoutRequestOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOG_DISCONNECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_CURRENCY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -1034,9 +1034,9 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SETTIMESPEED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_VERIFY_WORLD, STATUS_NEVER);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_CANCEL_ACK, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_COMPLETE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_CANCEL_ACK, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_COMPLETE, STATUS_NEVER);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XPGAIN, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CLEAR_MONEY, STATUS_UNHANDLED);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 879554e8bd6..a77793ce6dd 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -335,7 +335,7 @@ enum OpcodeClient : uint32
CMSG_LF_GUILD_SET_GUILD_POST = 0xBADD,
CMSG_LIST_INVENTORY = 0xBADD,
CMSG_LOAD_SCREEN = 0x0B08,
- CMSG_LOGOUT_CANCEL = 0xBADD,
+ CMSG_LOGOUT_CANCEL = 0x03C2,
CMSG_LOGOUT_REQUEST = 0x1911,
CMSG_LOG_DISCONNECT = 0x04D5,
CMSG_LOOT = 0xBADD,
@@ -563,7 +563,7 @@ enum OpcodeClient : uint32
CMSG_SUGGESTION_SUBMIT = 0xBADD,
CMSG_SUMMON_RESPONSE = 0xBADD,
CMSG_SUSPEND_COMMS_ACK = 0x0C56,
- CMSG_SUSPEND_TOKEN_RESPONSE = 0x0142,
+ CMSG_SUSPEND_TOKEN_RESPONSE = 0xBADD,
CMSG_SWAP_INV_ITEM = 0xBADD,
CMSG_SWAP_ITEM = 0xBADD,
CMSG_SYNC_DANCE = 0xBADD,
@@ -1060,7 +1060,7 @@ enum OpcodeServer : uint32
SMSG_LOAD_CUF_PROFILES = 0x1530,
SMSG_LOGIN_SETTIMESPEED = 0x09AA,
SMSG_LOGIN_VERIFY_WORLD = 0x0B19,
- SMSG_LOGOUT_CANCEL_ACK = 0xBADD,
+ SMSG_LOGOUT_CANCEL_ACK = 0x0FAD,
SMSG_LOGOUT_COMPLETE = 0x0B21,
SMSG_LOGOUT_RESPONSE = 0x052D,
SMSG_LOG_XPGAIN = 0xBADD,
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index f427b91787a..2554a9e09db 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -138,7 +138,7 @@ WorldSession::WorldSession(uint32 id, uint32 battlenetAccountId, std::shared_ptr
LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = %u;", GetAccountId()); // One-time query
}
- m_Socket[0] = sock;
+ m_Socket[CONNECTION_TYPE_REALM] = sock;
InitializeQueryCallbackParameters();
}
@@ -288,7 +288,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
///- Before we process anything:
/// If necessary, kick the player from the character select screen
if (IsConnectionIdle())
- m_Socket[0]->CloseSocket();
+ m_Socket[CONNECTION_TYPE_REALM]->CloseSocket();
///- Retrieve packets from the receive queue and call the appropriate handlers
/// not process packets if socket already closed
@@ -305,7 +305,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
uint32 processedPackets = 0;
time_t currentTime = time(NULL);
- while (m_Socket[0] && !_recvQueue.empty() && _recvQueue.peek(true) != firstDelayedPacket && _recvQueue.next(packet, updater))
+ while (m_Socket[CONNECTION_TYPE_REALM] && !_recvQueue.empty() && _recvQueue.peek(true) != firstDelayedPacket && _recvQueue.next(packet, updater))
{
if (!AntiDOS.EvaluateOpcode(*packet, currentTime))
KickPlayer();
@@ -414,7 +414,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
break;
}
- if (m_Socket[0] && m_Socket[0]->IsOpen() && _warden)
+ if (m_Socket[CONNECTION_TYPE_REALM] && m_Socket[CONNECTION_TYPE_REALM]->IsOpen() && _warden)
_warden->Update();
ProcessQueryCallbacks();
@@ -428,21 +428,22 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
if (ShouldLogOut(currTime) && m_playerLoading.IsEmpty())
LogoutPlayer(true);
- if (m_Socket[0] && GetPlayer() && _warden)
+ if (m_Socket[CONNECTION_TYPE_REALM] && GetPlayer() && _warden)
_warden->Update();
///- Cleanup socket pointer if need
- if ((m_Socket[0] && !m_Socket[0]->IsOpen()) || (m_Socket[1] && !m_Socket[1]->IsOpen()))
+ if ((m_Socket[CONNECTION_TYPE_REALM] && !m_Socket[CONNECTION_TYPE_REALM]->IsOpen()) ||
+ (m_Socket[CONNECTION_TYPE_INSTANCE] && !m_Socket[CONNECTION_TYPE_INSTANCE]->IsOpen()))
{
expireTime -= expireTime > diff ? diff : expireTime;
if (expireTime < diff || forceExit || !GetPlayer())
{
- m_Socket[0].reset();
- m_Socket[1].reset();
+ m_Socket[CONNECTION_TYPE_REALM].reset();
+ m_Socket[CONNECTION_TYPE_INSTANCE].reset();
}
}
- if (!m_Socket[0])
+ if (!m_Socket[CONNECTION_TYPE_REALM])
return false; //Will remove this session from the world session map
}
@@ -544,7 +545,7 @@ void WorldSession::LogoutPlayer(bool save)
// remove player from the group if he is:
// a) in group; b) not in raid group; c) logging out normally (not being kicked or disconnected)
- if (_player->GetGroup() && !_player->GetGroup()->isRaidGroup() && m_Socket[0])
+ if (_player->GetGroup() && !_player->GetGroup()->isRaidGroup() && m_Socket[CONNECTION_TYPE_REALM])
_player->RemoveFromGroup();
//! Send update to group and reset stored max enchanting level
@@ -578,8 +579,7 @@ void WorldSession::LogoutPlayer(bool save)
//! Send the 'logout complete' packet to the client
//! Client will respond by sending 3x CMSG_CANCEL_TRADE, which we currently dont handle
- WorldPacket data(SMSG_LOGOUT_COMPLETE, 0);
- SendPacket(&data);
+ SendPacket(WorldPackets::Character::LogoutComplete().Write());
TC_LOG_DEBUG("network", "SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
//! Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline
@@ -588,10 +588,16 @@ void WorldSession::LogoutPlayer(bool save)
CharacterDatabase.Execute(stmt);
}
+ if (m_Socket[CONNECTION_TYPE_INSTANCE])
+ {
+ m_Socket[CONNECTION_TYPE_INSTANCE]->CloseSocket();
+ m_Socket[CONNECTION_TYPE_INSTANCE].reset();
+ }
+
m_playerLogout = false;
m_playerSave = false;
m_playerRecentlyLogout = true;
- LogoutRequest(0);
+ SetLogoutStartTime(0);
}
/// Kick a player out of the World
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 83a746c8f44..bf496077c36 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -87,6 +87,8 @@ namespace WorldPackets
class ReorderCharacters;
class UndeleteCharacter;
class PlayerLogin;
+ class LogoutRequest;
+ class LogoutCancel;
}
namespace Guild
@@ -276,7 +278,7 @@ class WorldSession
bool isLogingOut() const { return _logoutTime || m_playerLogout; }
/// Engage the logout process for the user
- void LogoutRequest(time_t requestTime)
+ void SetLogoutStartTime(time_t requestTime)
{
_logoutTime = requestTime;
}
@@ -511,9 +513,8 @@ class WorldSession
void HandleLootReleaseOpcode(WorldPacket& recvPacket);
void HandleLootMasterGiveOpcode(WorldPacket& recvPacket);
void HandleWhoOpcode(WorldPacket& recvPacket);
- void HandleLogoutRequestOpcode(WorldPacket& recvPacket);
- void HandlePlayerLogoutOpcode(WorldPacket& recvPacket);
- void HandleLogoutCancelOpcode(WorldPacket& recvPacket);
+ void HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequest& logoutRequest);
+ void HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCancel& logoutCancel);
// GM Ticket opcodes
void HandleGMTicketCreateOpcode(WorldPacket& recvPacket);
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index d4265c9a601..2c414413deb 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -670,7 +670,10 @@ void WorldSocket::HandleAuthContinuedSession(WorldPackets::Auth::AuthContinuedSe
{
uint32 accountId = PAIR64_LOPART(authSession.Key);
_type = ConnectionType(PAIR64_HIPART(authSession.Key));
- QueryResult result = LoginDatabase.PQuery("SELECT username, sessionkey FROM account WHERE id = %u", accountId);
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_CONTINUED_SESSION);
+ stmt->setUInt32(0, accountId);
+ PreparedQueryResult result = LoginDatabase.Query(stmt);
if (!result)
{
SendAuthResponseError(AUTH_UNKNOWN_ACCOUNT);
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
index c0c9751a804..bfdd39fdd3e 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
@@ -35,6 +35,7 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_INS_ACCOUNT_AUTO_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity Auth', 'Failed login autoban', 1)", CONNECTION_ASYNC);
PrepareStatement(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_CONTINUED_SESSION, "SELECT username, sessionkey FROM account WHERE id = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.lock_country, a.last_ip, aa.gmlevel, a.v, a.s, a.token_key, a.battlenet_account FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h
index bf4b8511e67..07653263ef9 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.h
+++ b/src/server/shared/Database/Implementation/LoginDatabase.h
@@ -53,6 +53,7 @@ enum LoginDatabaseStatements
LOGIN_INS_ACCOUNT_AUTO_BANNED,
LOGIN_DEL_ACCOUNT_BANNED,
LOGIN_SEL_SESSIONKEY,
+ LOGIN_SEL_ACCOUNT_INFO_CONTINUED_SESSION,
LOGIN_UPD_VS,
LOGIN_UPD_LOGONPROOF,
LOGIN_SEL_LOGONCHALLENGE,