loginplayer.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 279 行
CPP
279 行
//////////////////////////////////////////////////////////////////////// // Filename : LoginPlyaer.cpp // Written By : Reiot// Description :// //////////////////////////////////////////////////////////////////////#include "LoginPlayer.h"#include "Assert.h"#include "Packet.h"#include "PacketFactoryManager.h"#include "PacketValidator.h"#include "DB.h"#include "LogClient.h"#include "Profile.h"#include "PacketProfile.h"#include "GameServerInfoManager.h"#include "GameServerManager.h"#include "gameserver/billing/BillingPlayerManager.h"#include "Lpackets/LCLoginOK.h"#include "Lpackets/LCLoginError.h"#include "Lpackets/LGKickCharacter.h"#include "Lpackets/LCPCList.h"// by sigi. 2002.11.12const int defaultLoginPlayerInputStreamSize = 1024;const int defaultLoginPlayerOutputStreamSize = 4096;static int maxIdleSec = 60 * 15; // 15 盒悼救 涝仿阑 窍瘤 臼栏搁 磊悼 立加 辆丰等寸.// '捞固 立加 吝'巩力甫 秦搬窍扁 困茄.. 矫埃 眉农static uint maxWaitForKickCharacter = 3; // GameServer狼 览翠阑 5檬埃 扁促赴促.static uint maxWaitForKickCharacterCount = 3; // GameServer啊 馆览捞 绝栏搁 3雀 览翠阑 矫档茄促.// CLLoginHandler.cpp俊 乐绰 窃荐促.void addLoginPlayerData(const string& ID, const string& ip, const string& SSN, const string& zipcode);void addLogoutPlayerData(Player* pPlayer);////////////////////////////////////////////////////////////////////////// constructor////////////////////////////////////////////////////////////////////////LoginPlayer::LoginPlayer (Socket * pSocket) throw ( Error ): //Player(pSocket), m_PlayerStatus(LPS_NONE), m_FailureCount(0){ __BEGIN_TRY Assert( pSocket != NULL ); m_pSocket = pSocket; // create socket input stream m_pInputStream = new SocketInputStream( m_pSocket, defaultLoginPlayerInputStreamSize ); Assert( m_pInputStream != NULL ); // create socket output stream m_pOutputStream = new SocketOutputStream( m_pSocket, defaultLoginPlayerOutputStreamSize ); Assert( m_pOutputStream != NULL ); m_Mutex.setName("LoginPlayer"); m_ID = "NONE"; Assert( m_PacketHistory.empty() ); // 肺弊牢 敲饭捞绢啊 积己瞪 锭, 泅犁 矫埃阑 弥辆 涝仿 矫埃栏肺 埃林茄促. getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; m_bSetWorldGroupID = false; m_WorldID = 1; m_ServerGroupID = 0; m_LastSlot = 0; m_isAdult = true; m_KickCharacterCount = 0; m_bFreePass = false; __END_CATCH}////////////////////////////////////////////////////////////////////////// destructor////////////////////////////////////////////////////////////////////////LoginPlayer::~LoginPlayer () throw ( Error ){ __BEGIN_TRY // 弊 绢恫 敲饭捞绢 按眉啊 昏力瞪 锭俊档, 弊 惑怕绰 肺弊酒眶捞绢具 茄促. // 溜 绢恫 敲饭捞绢甫 立加 辆丰 矫虐妨搁, 弊 惑怕甫 肺弊酒眶栏肺 父甸绢具 茄促. Assert( m_PlayerStatus == LPS_END_SESSION ); // delete all previous packets while ( ! m_PacketHistory.empty() ) { Packet * pPacket = m_PacketHistory.front(); delete pPacket; m_PacketHistory.pop_front(); } __END_CATCH}////////////////////////////////////////////////////////////////////////// '捞固 立加 吝'牢 版快. 某腐磐狼 碍力 立加 秦力甫 困秦辑// 措扁窍绰 矫埃 汲沥.////////////////////////////////////////////////////////////////////////voidLoginPlayer::setExpireTimeForKickCharacter() throw (){ getCurrentTime(m_ExpireTimeForKickCharacter); m_ExpireTimeForKickCharacter.tv_sec += maxWaitForKickCharacter;}////////////////////////////////////////////////////////////////////////// parse packet and execute handler for the packet////////////////////////////////////////////////////////////////////////void LoginPlayer::processCommand ( bool Option ) throw ( IOException , Error ){ __BEGIN_TRY// static Timeval currentTime; // '捞固 立加 吝'牢 版快.. 碍力 立加 秦力甫 矫懦妨绊 且 锭. if (m_PlayerStatus==LPS_WAITING_FOR_GL_KICK_VERIFY) { Timeval currentTime; getCurrentTime(currentTime); // timeout 眉农 if (currentTime >= m_ExpireTimeForKickCharacter) { // 促矫 KickCharcter甫 焊郴夯促. sendLGKickCharacter(); // 馆览捞 绝绰 版快 咯矾锅 矫档甫 秦夯促. // 茄拌俊 档崔窍搁.. GameServer啊 磷菌促绊 魄窜窍绊 LoginOK甫 焊辰促. if (++ m_KickCharacterCount >= maxWaitForKickCharacterCount) { sendLCLoginOK(); } } return; } try { // 庆歹甫 烙矫历厘且 滚欺 积己 char header[szPacketHeader]; PacketID_t packetID; PacketSize_t packetSize; Packet * pPacket; // 涝仿滚欺俊 甸绢乐绰 肯傈茄 菩哦甸阑 葛炼府 贸府茄促. while ( true ) { // 涝仿胶飘覆俊辑 菩哦庆歹农扁父怒 佬绢夯促. // 父距 瘤沥茄 农扁父怒 胶飘覆俊辑 佬阑 荐 绝促搁, // Insufficient 抗寇啊 惯积窍绊, 风橇甫 狐廉唱埃促. if (!m_pInputStream->peek( header , szPacketHeader )) { // 涝仿捞 酒公 巴档 绝菌促搁, 涝仿力茄 矫埃阑 檬苞沁绰瘤 眉农茄促. Timeval currentTime; getCurrentTime(currentTime); if ( currentTime >= m_ExpireTime ) throw DisconnectException("老沥 矫埃悼救 涝仿窍瘤 臼栏搁 立加捞 辆丰邓聪促."); break; } // 菩哦酒捞叼 棺 菩哦农扁甫 舅酒辰促. // 捞锭 菩哦农扁绰 庆歹甫 器窃茄促. memcpy( &packetID , &header[0] , szPacketID ); memcpy( &packetSize , &header[szPacketID] , szPacketSize ); /* LOG4("RECV PACKET from %s, %s(%d) %d/%d\n", m_ID.c_str(), g_pPacketFactoryManager->getPacketName( packetID ).c_str(), packetID, szPacketHeader + packetSize, m_pInputStream->length() ); StringStream msg; msg << "RECV PACKET from " << m_ID << ", " << g_pPacketFactoryManager->getPacketName( packetID ) << "(" << packetID << ") " << szPacketHeader + packetSize << "/" << m_pInputStream->length() << eos; cout << msg.toString() << endl; */ // 菩哦 酒捞叼啊 捞惑窍搁 橇肺配妮 俊矾肺 埃林茄促. if ( packetID >= Packet::PACKET_MAX ) // 叼滚彪阑 困秦辑 俊矾甫 备眉利栏肺 钎矫秦敌促. throw InvalidProtocolException("too large packet id"); try { // 菩哦狼 鉴辑啊 valid 茄瘤 眉农茄促. if ( ! g_pPacketValidator->isValidPacketID( getPlayerStatus() , packetID ) ) throw InvalidProtocolException("invalid packet order"); // 菩哦 农扁啊 呈公 农搁 橇肺配妮 俊矾肺 埃林茄促. if ( packetSize > g_pPacketFactoryManager->getPacketMaxSize( packetID ) ) throw InvalidProtocolException("too large packet size"); // 涝仿滚欺郴俊 菩哦农扁父怒狼 单捞鸥啊 甸绢乐绰瘤 犬牢茄促. // 弥利拳矫 break 甫 荤侩窍搁 等促. (咯扁辑绰 老窜 exception阑 镜 巴捞促.) if ( m_pInputStream->length() < szPacketHeader + packetSize ) // throw InsufficientDataException(); break; // 弥辆涝仿矫埃阑 盎脚茄促. // 弥辆涝仿矫埃篮 菩哦 窍唱啊 肯傈窍霸 档馒茄 矫埃阑 狼固茄促. getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; // 咯扁鳖瘤 吭促搁 涝仿滚欺俊绰 肯傈茄 菩哦 窍唱 捞惑捞 甸绢乐促绰 舵捞促. // 菩哦蒲配府概聪历肺何磐 菩哦酒捞叼甫 荤侩秦辑 菩哦 胶飘钒贸甫 积己窍搁 等促. // 菩哦酒捞叼啊 肋给瞪 版快绰 菩哦蒲配府概聪历俊辑 贸府茄促. pPacket = g_pPacketFactoryManager->createPacket( packetID ); // 捞力 捞 菩哦胶飘钒贸甫 檬扁拳茄促. // 菩哦窍困努贰胶俊 沥狼等 read()啊 virtual 皋目聪硫俊 狼秦辑 龋免登绢 // 磊悼利栏肺 檬扁拳等促. m_pInputStream->readPacket( pPacket ); Timeval start, end; getCurrentTime(start); // 捞力 捞 菩哦胶飘钒贸甫 啊瘤绊 菩哦勤甸矾甫 荐青窍搁 等促. // 菩哦酒捞叼啊 肋给瞪 版快绰 菩哦勤甸矾概聪历俊辑 贸府茄促. pPacket->execute( this ); getCurrentTime(end); g_PacketProfileManager.addAccuTime(pPacket->getPacketName(), start, end); // 泅犁 菩哦阑 菩哦 洒胶配府狼 盖 第俊 持绰促. m_PacketHistory.push_back(pPacket); // 菩哦阑 nPacketHistory 俺父怒父 历厘茄促. while ( m_PacketHistory.size() > nPacketHistory ) { Packet * oldPacket = m_PacketHistory.front(); delete oldPacket; m_PacketHistory.pop_front(); } } catch ( IgnorePacketException& ) { // PacketValidator 俊辑 菩哦阑 公矫窍扼绊 沁栏聪, // 涝仿胶飘覆俊辑 葛滴 瘤况滚府绊 角青窍瘤 臼档废 茄促. // 菩哦 农扁啊 呈公 农搁 橇肺配妮 俊矾肺 埃林茄促. if ( packetSize > g_pPacketFactoryManager->getPacketMaxSize(packetID) ) throw InvalidProtocolException("too large packet size"); // 涝仿滚欺郴俊 菩哦农扁父怒狼 单捞鸥啊 甸绢乐绰瘤 犬牢茄促. // 弥利拳矫 break 甫 荤侩窍搁 等促. (咯扁辑绰 老窜 exception阑
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?