Merge branch 'master' into 4.x and some warning fixes
This commit is contained in:
commit
fa9daaf95b
148 files changed
+2881
-969
No files matched your search
@@ -241,7 +241,18 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
|
||||
///- Retrieve packets from the receive queue and call the appropriate handlers
|
||||
/// not process packets if socket already closed
|
||||
WorldPacket* packet = NULL;
|
||||
while (m_Socket && !m_Socket->IsClosed() && _recvQueue.next(packet, updater))
|
||||
//! Delete packet after processing by default
|
||||
bool deletePacket = true;
|
||||
//! To prevent infinite loop
|
||||
WorldPacket* firstDelayedPacket = NULL;
|
||||
//! If _recvQueue.peek() == firstDelayedPacket it means that in this Update call, we've processed all
|
||||
//! *properly timed* packets, and we're now at the part of the queue where we find
|
||||
//! delayed packets that were re-enqueued due to improper timing. To prevent an infinite
|
||||
//! loop caused by re-enqueueing the same packets over and over again, we stop updating this session
|
||||
//! and continue updating others. The re-enqueued packets will be handled in the next Update call for this session.
|
||||
while (m_Socket && !m_Socket->IsClosed() &&
|
||||
!_recvQueue.empty() && _recvQueue.peek(true) != firstDelayedPacket &&
|
||||
_recvQueue.next(packet, updater))
|
||||
{
|
||||
const OpcodeHandler* opHandle = opcodeTable[packet->GetOpcode()];
|
||||
try
|
||||
@@ -252,8 +263,20 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
|
||||
if (!_player)
|
||||
{
|
||||
// skip STATUS_LOGGEDIN opcode unexpected errors if player logout sometime ago - this can be network lag delayed packets
|
||||
//! If player didn't log out a while ago, it means packets are being sent while the server does not recognize
|
||||
//! the client to be in world yet. We will re-add the packets to the bottom of the queue and process them later.
|
||||
if (!m_playerRecentlyLogout)
|
||||
LogUnexpectedOpcode(packet, "STATUS_LOGGEDIN", "the player has not logged in yet");
|
||||
{
|
||||
//! Prevent infinite loop
|
||||
if (!firstDelayedPacket)
|
||||
firstDelayedPacket = packet;
|
||||
//! Because checking a bool is faster than reallocating memory
|
||||
deletePacket = false;
|
||||
QueuePacket(packet);
|
||||
//! Log
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "Re-enqueueing packet with opcode %s (0x%.4X) with with status STATUS_LOGGEDIN. "
|
||||
"Player is currently not in world yet.", opHandle->name, packet->GetOpcode());
|
||||
}
|
||||
}
|
||||
else if (_player->IsInWorld())
|
||||
{
|
||||
@@ -331,7 +354,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
|
||||
}
|
||||
}
|
||||
|
||||
delete packet;
|
||||
if (deletePacket)
|
||||
delete packet;
|
||||
}
|
||||
|
||||
ProcessQueryCallbacks();
|
||||
@@ -355,6 +379,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
|
||||
if (!m_Socket)
|
||||
return false; //Will remove this session from the world session map
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -514,7 +539,13 @@ void WorldSession::LogoutPlayer(bool Save)
|
||||
|
||||
///- Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline
|
||||
//No SQL injection as AccountId is uint32
|
||||
CharacterDatabase.PExecute("UPDATE characters SET online = 0 WHERE account = '%u'", GetAccountId());
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ACCOUNT_ONLINE);
|
||||
|
||||
stmt->setUInt32(0, GetAccountId());
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
|
||||
}
|
||||
|
||||
@@ -888,7 +919,7 @@ void WorldSession::InitializeQueryCallbackParameters()
|
||||
|
||||
void WorldSession::ProcessQueryCallbacks()
|
||||
{
|
||||
QueryResult result;
|
||||
PreparedQueryResult result;
|
||||
|
||||
//! HandleCharEnumOpcode
|
||||
if (_charEnumCallback.ready())
|
||||
@@ -900,9 +931,8 @@ void WorldSession::ProcessQueryCallbacks()
|
||||
|
||||
if (_charCreateCallback.IsReady())
|
||||
{
|
||||
PreparedQueryResult pResult;
|
||||
_charCreateCallback.GetResult(pResult);
|
||||
HandleCharCreateCallback(pResult, _charCreateCallback.GetParam());
|
||||
_charCreateCallback.GetResult(result);
|
||||
HandleCharCreateCallback(result, _charCreateCallback.GetParam());
|
||||
// Don't call FreeResult() here, the callback handler will do that depending on the events in the callback chain
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user