bool WorldSession::Update(uint32 /*diff*/) { //we delete socket only if it not connected in current if (_socket && !_socket->IsConnected()) { sLog.outError("ROGNAR: WorldSession::Update - _socket && !_socket->IsConnected() 1 socket handle [%u]", _socket->GetSocket()); // delete _socket; WorldSocket * tempSocket = _socket; _socket = NULL; tempSocket->CloseSocket(); tempSocket = NULL; return false; //Will remove this session from the world session map } if (!_socket) return false; WorldPacket *packet; ///- Retrieve packets from the receive queue and call the appropriate handlers /// \todo Is there a way to consolidate the OpcondeHandlerTable and the g_worldOpcodeNames to only maintain 1 list? /// answer : there is a way, but this is better, because it would use redundant RAM while (!_recvQueue.empty()) { packet = _recvQueue.next(); /*#if 1 sLog.outError( "MOEP: %s (0x%.4X)", LookupOpcodeName(packet->GetOpcode()), packet->GetOpcode()); #endif*/ OpcodeTableMap::const_iterator iter = objmgr.opcodeTable.find( packet->GetOpcode() ); if (iter == objmgr.opcodeTable.end()) { sLog.outError( "SESSION: received unhandled opcode %s (0x%.4X)", LookupOpcodeName(packet->GetOpcode()), packet->GetOpcode()); } else { if (iter->second.status == STATUS_LOGGEDIN && _player) { (this->*iter->second.handler)(*packet); } else if (iter->second.status == STATUS_AUTHED) { m_playerRecentlyLogout = false; (this->*iter->second.handler)(*packet); } else // skip STATUS_LOGGEDIN opcode unexpected errors if player logout sometime ago - this can be network lag delayed packets if(!m_playerRecentlyLogout) { sLog.outError( "SESSION: received unexpected opcode %s (0x%.4X)", LookupOpcodeName(packet->GetOpcode()), packet->GetOpcode()); } } delete packet; } ///- If necessary, log the player out time_t currTime = time(NULL); if (!_socket || !_socket->IsConnected() || (ShouldLogOut(currTime) && !m_playerLoading)) LogoutPlayer(true); if (!_socket) return false; //session already not active, delete if at update world //we delete socket only if it not connected in current if (_socket && !_socket->IsConnected()) { sLog.outError("ROGNAR: WorldSession::Update - _socket && !_socket->IsConnected() 2 socket handle [%u]", _socket->GetSocket()); WorldSocket * tempSocket = _socket; _socket = NULL; tempSocket->CloseSocket(); tempSocket = NULL; return false; //Will remove this session from the world session map } return true; }