⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zoneplayermanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//// Filename    : ZonePlayerManager.cpp// Written by  : reiot@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include <stdio.h>#include "ZonePlayerManager.h"#include "IncomingPlayerManager.h"#include "Assert.h"#include "SocketAPI.h"#include "Socket.h"#include "GamePlayer.h"#include "Slayer.h"#include "PlayerCreature.h"#include "GamePlayer.h"#include "LogClient.h"#include "Zone.h"#include <algorithm>#include "StringStream.h"#include "Cpackets/CGLogout.h"#include "Profile.h"#include "ZoneInfoManager.h"#include "PaySystem.h"#include "ZoneUtil.h"#include "ResurrectLocationManager.h"#include "Thread.h"#include "billing/BillingInfo.h"#include "UserGateway.h"#include "StringPool.h"#include "DB.h"#include "ZoneGroup.h"#include "VariableManager.h"#include "Party.h"#include "DefaultOptionSetInfo.h"#include "chinabilling/CBillingInfo.h"#include "Gpackets/GCSystemMessage.h"#include "Gpackets/GCKickMessage.h"bool checkZonePlayerManager( GamePlayer* pGamePlayer, ZonePlayerManager* pZPM, const string& str );//////////////////////////////////////////////////////////////////////////////// constructor// 窍困 概聪历 按眉甫 积己茄促.//////////////////////////////////////////////////////////////////////////////ZonePlayerManager::ZonePlayerManager () 	throw (): m_MinFD(-1), m_MaxFD(-1){	__BEGIN_TRY	m_Mutex.setName("ZonePlayerManager");	m_PlayerListQueue.clear();	// fd_set 甸阑 0 栏肺 檬扁拳茄促.	FD_ZERO(&m_ReadFDs[0]);	FD_ZERO(&m_WriteFDs[0]);	FD_ZERO(&m_ExceptFDs[0]);	// m_Timeout 阑 檬扁拳茄促.	// 唱吝俊绰 捞 林扁 开矫 可记栏肺 贸府窍档废 窍磊.	m_Timeout[0].tv_sec = 0;	m_Timeout[0].tv_usec = 0;	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////ZonePlayerManager::~ZonePlayerManager () 	throw (){	__BEGIN_TRY	// 敲饭捞绢 昏力绰 PlayerManager 饭骇俊辑 捞风绢瘤骨肺 脚版静瘤 臼酒档 等促.	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void ZonePlayerManager::broadcastPacket (Packet* pPacket)	throw (Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	PlayerManager::broadcastPacket(pPacket);	__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void ZonePlayerManager::broadcastPacket_NOBLOCKED (Packet* pPacket)	throw (Error){	__BEGIN_TRY	PlayerManager::broadcastPacket(pPacket);	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void ZonePlayerManager::copyPlayers()	throw(){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	PlayerManager::copyPlayers();	__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// call select() system call// 惑困俊辑 TimeoutException 阑 罐栏搁 敲饭捞绢绰 贸府窍瘤 臼酒档 等促.//////////////////////////////////////////////////////////////////////////////void ZonePlayerManager::select ()	throw (TimeoutException , InterruptedException , Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_Mutex)	// m_Timeout[0] 阑 m_Timeout[1] 栏肺 汗荤茄促.	m_Timeout[1].tv_sec  = m_Timeout[0].tv_sec;	m_Timeout[1].tv_usec = m_Timeout[0].tv_usec;	// m_XXXFDs[0] 阑 m_XXXFDs[1] 栏肺 汗荤茄促.	m_ReadFDs[1]   = m_ReadFDs[0];	m_WriteFDs[1]  = m_WriteFDs[0];	m_ExceptFDs[1] = m_ExceptFDs[0];	__LEAVE_CRITICAL_SECTION(m_Mutex)    try 	{		// 捞力 m_XXXFDs[1] 阑 啊瘤绊 select() 甫 龋免茄促.		SocketAPI::select_ex(m_MaxFD + 1 , &m_ReadFDs[1] , &m_WriteFDs[1] , &m_ExceptFDs[1] , &m_Timeout[1]);    } 	// 林籍贸府 by sigi. 2002.5.14	//catch (TimeoutException&) 	//{		// do nothing    //} 	catch (InterruptedException & ie) 	{	    // 矫弊澄捞 棵 府啊 决骂~~		log(LOG_GAMESERVER_ERROR, "", "", ie.toString());    }	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// process all players' inputs//// 辑滚 家南狼 read flag啊 难脸阑 版快, 货肺款 立加捞 甸绢吭栏骨肺// 捞甫 贸府窍绊, 促弗 家南狼 read flag啊 难脸阑 版快, 货肺款 菩哦捞// 甸绢吭栏骨肺 弊 敲饭捞绢狼 processInput()阑 龋免窍搁 等促.//////////////////////////////////////////////////////////////////////////////void ZonePlayerManager::processInputs () 	throw (IOException , Error){	__BEGIN_TRY	//__ENTER_CRITICAL_SECTION(m_Mutex)	if (m_MinFD == -1 && m_MaxFD == -1) // no player exist	{ 		//m_Mutex.unlock();		return;	}	//copyPlayers();	for (int i = m_MinFD ; i <= m_MaxFD ; i ++) 	{		// ZPM俊绰 敲饭捞绢父 甸绢乐栏骨肺, 歹 厚背且 波府啊 绝促.		if (FD_ISSET(i , &m_ReadFDs[1])) 		{			if (m_pPlayers[i] != NULL && m_pPlayers[i] == m_pPlayers[i]) 			{				GamePlayer* pTempPlayer = dynamic_cast<GamePlayer*>(m_pPlayers[i]);				Assert (pTempPlayer != NULL);				Assert (m_pPlayers[i] != NULL);				if ( g_pVariableManager->getVariable( PCROOM_ITEM_RATIO_BONUS ) == 100 && !checkZonePlayerManager( pTempPlayer, this, "PI" ) )				{					try					{						CGLogoutHandler::execute( NULL, pTempPlayer );					}					catch ( DisconnectException& de )					{						deletePlayer( pTempPlayer->getSocket()->getSOCKET() );						pushOutPlayer( pTempPlayer );					}				}				else if (pTempPlayer->getSocket()->getSockError()) 				{					pTempPlayer->setPenaltyFlag(PENALTY_TYPE_KICKED);					pTempPlayer->setItemRatioBonusPoint(7);										try					{						CGLogoutHandler::execute( NULL, pTempPlayer );					}					catch ( DisconnectException& de )					{						filelog( "DIFF_ZG.log", "%s ZPM+PI+SOCKERR", de.toString().c_str() );						deletePlayer( pTempPlayer->getSocket()->getSOCKET() );						pushOutPlayer( pTempPlayer );					}					// by sigi. 2002.12.30					UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_INPUT_ERROR );					/*					try 					{						// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.						pTempPlayer->disconnect(DISCONNECTED);					} 					catch (Throwable & t) 					{						filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::processInput(1)", t.toString().c_str());					} 					deletePlayer(i);					deleteQueuePlayer(pTempPlayer);					// 敲饭捞绢 按眉甫 昏力茄促.					delete pTempPlayer;					*/				} 				else 				{					try 					{						pTempPlayer->processInput();					} 					catch (ConnectException & ce) 					{						pTempPlayer->setPenaltyFlag(PENALTY_TYPE_KICKED);						pTempPlayer->setItemRatioBonusPoint(8);												try						{							CGLogoutHandler::execute( NULL, pTempPlayer );						}						catch ( DisconnectException& de )						{							filelog( "DIFF_ZG.log", "%s ZPM+PI+CE", de.toString().c_str() );							deletePlayer( pTempPlayer->getSocket()->getSOCKET() );							pushOutPlayer( pTempPlayer );						}						// by sigi. 2002.12.30						UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_INPUT_DISCONNECT );						/*						try 						{							// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.							pTempPlayer->disconnect(DISCONNECTED);						} 						catch (Throwable & t) 						{							filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::processInput(4)", t.toString().c_str());						} 						deletePlayer(i);						deleteQueuePlayer(pTempPlayer);						// 敲饭捞绢 按眉甫 昏力茄促.						delete pTempPlayer;						*/					}					catch (IOException & ioe)					{						pTempPlayer->setPenaltyFlag(PENALTY_TYPE_KICKED);						pTempPlayer->setItemRatioBonusPoint(9);						try						{							CGLogoutHandler::execute( NULL, pTempPlayer );						}						catch ( DisconnectException& de )						{							filelog( "DIFF_ZG.log", "%s ZPM+PI+IOE", de.toString().c_str() );							deletePlayer( pTempPlayer->getSocket()->getSOCKET() );							pushOutPlayer( pTempPlayer );						}						// by sigi. 2002.12.30						UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_INPUT_DISCONNECT2 );						/*						try 						{							// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.							pTempPlayer->disconnect(DISCONNECTED);						} 						catch (Throwable & t) 						{						} 						deletePlayer(i);						deleteQueuePlayer(pTempPlayer);						delete pTempPlayer;						*/					}				}			}		}	}//	__LEAVE_CRITICAL_SECTION(m_Mutex)	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// process all players' commands//////////////////////////////////////////////////////////////////////////////void ZonePlayerManager::processCommands() 	throw (IOException , Error){	__BEGIN_TRY	__BEGIN_DEBUG	// test code	/*	for (int i=0; i<100; i++)	{		PaySystem ps;		try {			ps.loginPayPlay("111.111.222.333", "sdfdf");			cout << "[" << (int)Thread::self() << "] " << i << endl;		} catch (Throwable&t)		{			cout << t.toString().c_str() << endl;		}	}	*/	if (m_MinFD == -1 && m_MaxFD == -1) // no player exist	{			//m_Mutex.unlock();		return;	}	//copyPlayers();	VSDateTime currentDateTime( VSDate::currentDate(), VSTime::currentTime() );	Timeval currentTime;	getCurrentTime(currentTime);	for (int i = m_MinFD ; i <= m_MaxFD ; i ++) 	{		if (m_pPlayers[i] != NULL) 		{			GamePlayer* pTempPlayer = dynamic_cast<GamePlayer*>(m_pPlayers[i]);			Assert (pTempPlayer);			Assert (m_pPlayers[i] != NULL);			if (pTempPlayer->getSocket()->getSockError()) 			{				pTempPlayer->setPenaltyFlag(PENALTY_TYPE_KICKED);				pTempPlayer->setItemRatioBonusPoint(10);				try				{					CGLogoutHandler::execute( NULL, pTempPlayer );				}				catch ( DisconnectException& de )				{					filelog( "DIFF_ZG.log", "%s ZPM+PC+SOCKERR", de.toString().c_str() );					deletePlayer( pTempPlayer->getSocket()->getSOCKET() );					pushOutPlayer( pTempPlayer );				}				// by sigi. 2002.12.30				UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_COMMAND_ERROR );				/*				try 				{					// 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促.					pTempPlayer->disconnect(DISCONNECTED);				} 				catch (Throwable & t) 				{					filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::processCommands(1)", t.toString().c_str());				}				deletePlayer(i);				deleteQueuePlayer(pTempPlayer);				// 敲饭捞绢 按眉甫 昏力茄促.				delete pTempPlayer;				*/			} 			else 			{				bool IsPayPlayEnd = false;				try 				{					beginProfileEx("ZPM_PACKET");					pTempPlayer->processCommand();					endProfileEx("ZPM_PACKET");					if ( g_pVariableManager->getVariable( PCROOM_ITEM_RATIO_BONUS ) == 100 && !checkZonePlayerManager( pTempPlayer, this, "PC" ) )					{						try						{							CGLogoutHandler::execute( NULL, pTempPlayer );						}						catch ( DisconnectException& de )						{							deletePlayer( pTempPlayer->getSocket()->getSOCKET() );							pushOutPlayer( pTempPlayer );						}					}					// 沥惑利牢 霸烙 惑怕俊辑(GPS_NORMAL)父 Pay眉农甫 茄促.					// PCManager::killCreature()俊辑绰 GPS_IGNORE_ALL肺 官差绊					// tile俊辑 瘤快绊.. zone捞悼捞 登骨肺.. 捞吧肺 巩力啊 积辨 荐 乐促绊 夯促.					// by sigi. 2002.12.10					else if (pTempPlayer->getPlayerStatus()==GPS_NORMAL)					{#ifdef __CONNECT_BILLING_SYSTEM__						// 酒流 呼傅 矫胶袍俊辑 八刘登瘤 臼疽促搁..						if (!pTempPlayer->isBillingLoginVerified())						{							if ( !pTempPlayer->isMetroFreePlayer() )								pTempPlayer->sendBillingLogin();						}						// 呼傅 矫胶袍 八刘捞 等 版快捞绊..						// 呼傅 敲饭捞啊 阂啊瓷茄 版快扼搁..						// 力茄利牢 公丰 敲饭捞啊 啊瓷茄瘤 眉农秦夯促.	// by sigi. 2002.12.5						else if (pTempPlayer->isBillingLoginVerified() 								&& !pTempPlayer->isBillingPlayAvaiable())#endif						// 菩剐府 夸陛力 利侩捞 场抄 版快. 蜡丰粮俊 乐绰 公丰 颇萍盔甸阑 公丰粮栏肺 颗败具茄促.						if ( pTempPlayer->isFamilyFreePassEnd() )						{							Creature* pCreature = pTempPlayer->getCreature();							Zone* pZone = pCreature->getZone();							Assert(pZone!=NULL);							if ( pZone->isPayPlay() )							{								// 公丰 荤侩磊老 版快 酒贰 if 巩俊辑 蜡丰 眉农甫 窍绊 公丰粮栏肺 颗败埃促.								pTempPlayer->setPremiumPlay();							}						}						// 蜡丰 荤侩磊牢 版快绰 矫埃阑 临牢促.						// 菩剐府 夸陛 荤侩磊牢 版快 矫埃捞 促登菌绰瘤 犬牢茄促. 蜡公丰粮俊 惑包绝捞						if ((pTempPlayer->isPayPlaying() || pTempPlayer->isPremiumPlay() || pTempPlayer->isFamilyPayAvailable() )							&& !pTempPlayer->updatePayPlayTime(pTempPlayer->getID(), currentDateTime, currentTime))						{							Creature* pCreature = pTempPlayer->getCreature();							Zone* pZone = pCreature->getZone();							Assert(pZone!=NULL);							// 蜡丰 辑厚胶 辆丰							pTempPlayer->logoutPayPlay( pTempPlayer->getID() );							// 菩剐府 夸陛 荤侩磊牢 版快 FamilyPayAvailable flag 阑 波霖促.							// 菩剐府 夸陛 叼弃飘 可记阑 谗促.							if ( pTempPlayer->isFamilyPayAvailable() )							{								pTempPlayer->setFamilyPayAvailable( false );								// 颇萍盔老 版快 Family Pay甫 refresh 茄促.								int PartyID = pCreature->getPartyID();								if ( PartyID != 0 )								{									g_pGlobalPartyManager->refreshFamilyPay( PartyID );								}								PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature);								Assert( pPC != NULL );								pPC->removeDefaultOptionSet( DEFAULT_OPTION_SET_FAMILY_PAY );								pPC->setFlag( Effect::EFFECT_CLASS_INIT_ALL_STAT );							}							// by sigi. 2002.12.30							IsPayPlayEnd = true;						// Zone窜困 蜡丰牢 版快绰.. 公丰粮栏肺 颗变促.						#if defined(__PAY_SYSTEM_ZONE__)														// 蜡丰 辑厚胶 荤侩 阂啊牢 版快							//							// slayer : 俊浇巢悼俊辑 何劝窍绰 镑栏肺 埃促.							// vampire : 覆焊巢悼俊辑 何劝窍绰 镑栏肺 埃促.							if (pZone->isPayPlay())

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -