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 + -
显示快捷键?