📄 incomingplayermanager.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : IncomingPlayerManager.cpp// Written by : reiot@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include <stdio.h>#include "IncomingPlayerManager.h"#include "Assert.h"#include "SocketAPI.h"#include "Socket.h"#include "Player.h"#include <algorithm>#include "Properties.h"#include "GamePlayer.h"#include "LoginServerManager.h"#include "PacketUtil.h"#include "ZoneInfoManager.h"#include "ZoneGroup.h"#include "ZonePlayerManager.h"#include "DB.h"#include "LogClient.h"#include "PaySystem.h"#include "MasterLairManager.h"#include "Encrypter.h"#include "LogDef.h"#include "PlayerCreature.h"#include "PKZoneInfoManager.h"#include "CreatureUtil.h"#include "Gpackets/GCUpdateInfo.h"#include "Gpackets/GLIncomingConnection.h"#include "Gpackets/GLKickVerify.h"#include "UserGateway.h"#include "SystemAvailabilitiesManager.h"//////////////////////////////////////////////////////////////////////////////// constructor// 窍困 概聪历 棺 单捞鸥 糕滚甸阑 积己茄促.//////////////////////////////////////////////////////////////////////////////IncomingPlayerManager::IncomingPlayerManager () throw (Error): m_pServerSocket(NULL), m_SocketID(INVALID_SOCKET), m_MinFD(-1), m_MaxFD(-1){ __BEGIN_TRY m_Mutex.setName("IncomingPlayerManager"); m_MutexOut.setName("IncomingPlayerManagerOut"); m_PlayerListQueue.clear(); try { // create server socket m_pServerSocket = new ServerSocket(g_pConfig->getPropertyInt("TCPPort")); m_pServerSocket->setNonBlocking(); // 辑滚 家南 叼胶农赋磐甫 瘤沥茄促. m_SocketID = m_pServerSocket->getSOCKET(); } catch (NoSuchElementException & nsee) { // 券版 颇老俊 弊繁 element啊 绝阑 版快 throw Error(nsee.toString()); } g_pConnectionInfoManager = new ConnectionInfoManager(); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////IncomingPlayerManager::~IncomingPlayerManager () throw (Error){ __BEGIN_TRY SAFE_DELETE(g_pConnectionInfoManager); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 窍困 概聪历 棺 单捞磐 糕滚甫 檬扁拳茄促.//////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::init () throw (Error){ __BEGIN_TRY // fd_set 甸阑 0 栏肺 檬扁拳茄促. FD_ZERO(&m_ReadFDs[0]); FD_ZERO(&m_WriteFDs[0]); FD_ZERO(&m_ExceptFDs[0]); // 辑滚 家南狼 厚飘甫 囊促. (write 绰 眉农且 鞘夸啊 绝促.) FD_SET(m_SocketID , &m_ReadFDs[0]); FD_SET(m_SocketID , &m_ExceptFDs[0]); // set min/max fd m_MinFD = m_MaxFD = m_SocketID; // m_Timeout 阑 檬扁拳茄促. // 唱吝俊绰 捞 林扁 开矫 可记栏肺 贸府窍档废 窍磊. // ZonePlayerManager俊 厚秦辑 辨绢档 公规窍促..... m_Timeout[0].tv_sec = 0; m_Timeout[0].tv_usec = 0; /* // connection info manager 甫 檬扁拳茄促. // 盔贰绰 肺弊牢辑滚肺何磐 罐酒具 窍瘤父.. // 老窜 210.220.188.161 ~ 180 鳖瘤 殿废秦敌促. char buf[20]; for (int i = 0 ; i < 20 ; i ++) { sprintf(buf,"210.220.188.%d",161+i); ConnectionInfo* pConnectionInfo = new ConnectionInfo(); pConnectionInfo->setClientIP(buf); g_pConnectionInfoManager.addConnectionInfo(pConnectionInfo); } */ string dist_host = g_pConfig->getProperty("UI_DB_HOST"); string dist_db = "DARKEDEN"; string dist_user = g_pConfig->getProperty("UI_DB_USER"); string dist_password = g_pConfig->getProperty("UI_DB_PASSWORD"); Connection* pDistConnection = new Connection(dist_host, dist_db, dist_user, dist_password); g_pDatabaseManager->addDistConnection(((int)Thread::self()), pDistConnection); cout << "******************************************************" << endl; cout << " THREAD CONNECT UIIRIBUTION DB " << endl; cout << " TID Number = " << (int)Thread::self()<< endl; cout << "******************************************************" << endl; /* // Login DB 狼 PCRoomDBInfo Table 佬绢辑 Connection 父甸扁 pStmt = pDistConnection->createStatement(); Result * pResult = NULL; pResult = pStmt->executeQuery("SELECT ID, Host, DB, User, Password FROM PCRoomDBInfo"); if (pResult->next()) { WorldID_t ID = pResult->getInt(1); string host = pResult->getString(2); string db = pResult->getString(3); string user = pResult->getString(4); string password = pResult->getString(5); cout << "Connection: " << " ID=" << (int)ID << ", HOST=" << host.c_str() << ", DB=" << db.c_str() << ", User=" << user.c_str() << endl; Connection * pConnection = new Connection(host, db, user, password); Assert(pConnection!=NULL); g_pDatabaseManager->addPCRoomConnection((int)(Thread::self()) , pConnection ); } */ // Player.LogOn 甫 沥府秦霖促. Statement * pStmt = NULL; Statement* pStmt2 = NULL; BEGIN_DB { //pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); //pStmt = g_pDatabaseManager->getDistConnection( (int)Thread::self() )->createStatement(); //pStmt2 = g_pDatabaseManager->getDistConnection( (int)Thread::self() )->createStatement(); pStmt = g_pDatabaseManager->getDistConnection( "PLAYER_DB" )->createStatement(); pStmt2 = g_pDatabaseManager->getDistConnection( "PLAYER_DB" )->createStatement(); Result* pResult = pStmt->executeQuery("SELECT PlayerID from Player WHERE LogOn='GAME' AND CurrentWorldID=%d AND CurrentServerGroupID=%d", g_pConfig->getPropertyInt("WorldID"), g_pConfig->getPropertyInt("ServerID") ); // 白规俊辑 愁带局甸 沥府秦霖促. // 呼傅~ by sigi 2002.5.31 while (pResult->next()) { string playerID = pResult->getString(1); pStmt2->executeQuery( "DELETE FROM PCRoomUserInfo WHERE PlayerID='%s'", playerID.c_str()); } pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGOFF' WHERE LogOn = 'GAME' AND CurrentWorldID=%d AND CurrentServerGroupID=%d", g_pConfig->getPropertyInt("WorldID"), g_pConfig->getPropertyInt("ServerID") ); /* // 滴锅 窍绰芭 力芭. by sigi. 2002.5.9 pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("DELETE FROM UserIPInfo WHERE ServerID = %d", g_pConfig->getPropertyInt("ServerID") ); */ SAFE_DELETE(pStmt); SAFE_DELETE(pStmt2); } END_DB(pStmt) BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("DELETE FROM UserIPInfo WHERE ServerID = %d", g_pConfig->getPropertyInt("ServerID") ); SAFE_DELETE(pStmt); } END_DB(pStmt) __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::copyPlayers() throw(){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) PlayerManager::copyPlayers(); __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::broadcast (Packet* pPacket) throw (Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) for (int i = m_MinFD ; i <= m_MaxFD ; i ++) { if (i != m_SocketID && m_pPlayers[i] != NULL) m_pPlayers[i]->sendPacket(pPacket); } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//////////////////////////////////////////////////////////////////////////////// call select() system call// 惑困俊辑 TimeoutException 阑 罐栏搁 敲饭捞绢绰 贸府窍瘤 臼酒档 等促.//////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::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]; 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()); } //__LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//////////////////////////////////////////////////////////////////////////////// process all players' inputs// 辑滚 家南狼 read flag啊 难脸阑 版快, 货肺款 立加捞 甸绢吭栏骨肺// 捞甫 贸府窍绊, 促弗 家南狼 read flag啊 难脸阑 版快, 货肺款 菩哦捞// 甸绢吭栏骨肺 弊 敲饭捞绢狼 processInput()阑 龋免窍搁 等促.//////////////////////////////////////////////////////////////////////////////void IncomingPlayerManager::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 ++) { if (FD_ISSET(i , &m_ReadFDs[1])) { if (i == m_SocketID) { // 辑滚 家南老 版快 货肺款 楷搬捞 档馒沁促绰 舵捞促. // by sigi. 2002.12.8 for (int i=0; i<50; i++) // 50疙父 罐磊 - -; { if (!acceptNewConnection()) break; } } else { if (m_pPlayers[i] != NULL) { GamePlayer* pTempPlayer = dynamic_cast<GamePlayer*>(m_pPlayers[i]); Assert(pTempPlayer != NULL); Assert(m_pPlayers[i] != NULL); if (pTempPlayer->getSocket()->getSockError()) { FILELOG_INCOMING_CONNECTION( "ICMPISocketErr.log", "[Input] PlayerID : %s, PlayerStatus : %d", pTempPlayer->getID().c_str(), (int)pTempPlayer->getPlayerStatus() ); try { // 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促. pTempPlayer->disconnect(DISCONNECTED); } catch (Throwable & t) { cerr << t.toString() << endl; } // by sigi. 2002.12.30 UserGateway::getInstance()->passUser( UserGateway::USER_OUT_INCOMING_INPUT_ERROR ); // 敲饭捞绢啊 绝促绰 富篮? 促弗 镑俊辑 瘤况 脸芭唱, // 促弗 镑俊辑 deletePlayer甫 窍绰 镑篮 绝促. // 坷肺瘤 阿 PlayerManager俊辑父 Player甫 瘤匡 荐 乐促. // ProcessCommand俊辑 荤扼脸促绰 富捞促. deletePlayer(i); deleteQueuePlayer(pTempPlayer); Creature* pCreature = pTempPlayer->getCreature(); if ( pCreature != NULL ) pCreature->setValue(1); SAFE_DELETE(pTempPlayer); } else { try { pTempPlayer->processInput(); } catch (ConnectException & ce) { FILELOG_INCOMING_CONNECTION( "ICMPIConectionErr.log", "[Input] %s, PlayerID : %s, PlayerStatus : %d", ce.toString().c_str(), pTempPlayer->getID().c_str(), (int)pTempPlayer->getPlayerStatus() ); // Blocking 家南捞骨肺, ConnectException苞 Error甫 力寇茄 绢恫 抗寇档 惯积窍瘤 臼绰促. // 楷搬捞 谗板阑 版快, 肺弊窍绊 敲饭捞绢 沥焊甫 历厘茄 饶俊 (肺靛登菌促搁) // 敲饭捞绢 按眉甫 昏力茄促. try { pTempPlayer->disconnect(); } catch (Throwable & t) { cerr << t.toString() << endl; } // by sigi. 2002.12.30 UserGateway::getInstance()->passUser( UserGateway::USER_OUT_INCOMING_INPUT_DISCONNECT ); // 敲饭捞绢啊 绝促绰 富篮? 促弗 镑俊辑 瘤况 脸芭唱, // 促弗 镑俊辑 deletePlayer甫 窍绰 镑篮 绝促. // 坷肺瘤 阿 PlayerManager俊辑父 Player甫 瘤匡 荐 乐促. // ProcessCommand俊辑 荤扼脸促绰 富捞促. deletePlayer(i); deleteQueuePlayer(pTempPlayer); Creature* pCreature = pTempPlayer->getCreature(); if ( pCreature != NULL ) pCreature->setValue(2); SAFE_DELETE(pTempPlayer); } } // else } // else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -