📄 zoneplayermanager.cpp
字号:
{ ZONE_COORD zoneCoord; Assert( pCreature->isPC() ); PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature); Assert( pPC != NULL ); // 努扼捞攫飘俊 蜡丰 荤侩捞 场车促绰 皋矫瘤甫 免仿窍档废茄促. // 老窜 公丰粮栏肺 捞悼窍霸 登骨肺 瘤陛 焊郴拎辑绰 家侩捞 绝促. // 货肺款 粮俊 甸绢啊辑 皋矫瘤甫 罐档废 茄促. Statement* pStmt = NULL; BEGIN_DB { uint strID = STRID_END_PAY_PLAY; // 菩剐府 夸陛力 秦力肺 牢茄 公丰粮 捞悼矫 皋矫瘤 if ( pTempPlayer->isFamilyFreePassEnd() ) strID = STRID_FAMILY_FREE_PLAY_END; pStmt = g_pDatabaseManager->getConnection( "DARKEDEN" )->createStatement(); pStmt->executeQuery( "INSERT INTO Messages ( Receiver, Message ) VALUES ( '%s', '%s')", pPC->getName().c_str(), g_pStringPool->c_str( strID ) ); if ( pCreature->isFlag( Effect::EFFECT_CLASS_LOGIN_GUILD_MESSAGE ) ) pCreature->removeFlag( Effect::EFFECT_CLASS_LOGIN_GUILD_MESSAGE ); SAFE_DELETE(pStmt); } END_DB(pStmt) // 公丰粮栏肺 颗变促. if ( g_pResurrectLocationManager->getRaceDefaultPosition( pPC->getRace(), zoneCoord ) ) { transportCreature(pCreature, zoneCoord.id, zoneCoord.x, zoneCoord.y, true); } else { // 酒, 厚惑捞村... throw Error("Critical Error : ResurrectInfo is not established!1"); } } #elif defined(__PAY_SYSTEM_FREE_LIMIT__) || defined(__PAY_SYSTEM_LOGIN__) //cout << "Pay timeout" << endl; //throw DisconnectException(); PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature); Assert(pPC!=NULL); if (pPC->isPayPlayAvaiable()) { // 蜡丰粮老 版快 公丰粮栏肺 颗变促. if (pZone->isPayPlay()) { ZONE_COORD zoneCoord; Assert( pCreature->isPC() ); PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature); Assert( pPC != NULL ); if ( g_pResurrectLocationManager->getRaceDefaultPosition( pPC->getRace(), zoneCoord ) ) { transportCreature(pCreature, zoneCoord.id, zoneCoord.x, zoneCoord.y, true); } else { // 酒, 厚惑捞村... throw Error("Critical Error : ResurrectInfo is not established!1"); } } else { GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage( g_pStringPool->getString( STRID_EXPIRE_PREMIUM_SERVICE ) ); pTempPlayer->sendPacket( &gcSystemMessage ); } } else { pTempPlayer->kickPlayer( 30, KICK_MESSAGE_PAY_TIMEOUT );/* EventKick* pEventKick = new EventKick(pTempPlayer); pEventKick->setDeadline(30*10); pTempPlayer->addEvent(pEventKick); // 割 檬饶俊 漏赴促..绊 焊郴霖促. GCKickMessage gcKickMessage; gcKickMessage.setType( KICK_MESSAGE_PAY_TIMEOUT ); gcKickMessage.setSeconds( 30 ); pTempPlayer->sendPacket( &gcKickMessage ); */ } #endif } // 菩剐府 夸陛力 利侩捞 场车促搁, 促矫 眉农窍瘤 臼霸 窍扁困俊 鸥涝阑 官层霖促. if ( pTempPlayer->isFamilyFreePassEnd() ) { pTempPlayer->setFamilyPayPartyType( FAMILY_PAY_PARTY_TYPE_NONE ); }#ifdef __CONNECT_CBILLING_SYSTEM__ if ( !pTempPlayer->isPayPlayer() ) { // 蜡丰 矫埃 场车澜. 楼弗促. pTempPlayer->kickPlayer( 30, KICK_MESSAGE_PAY_TIMEOUT ); } else { // 蜡丰 荤侩磊狼 版快 pay info 甫 酒流 救 焊郴玲促搁 焊郴霖促. if ( pTempPlayer->isCBillingVerified() && !pTempPlayer->isCBShowPayInfo() ) { pTempPlayer->sendCBillingPayInfo(); pTempPlayer->setCBShowPayInfo(); } }#endif } } catch (ProtocolException & pe) { pTempPlayer->setPenaltyFlag(PENALTY_TYPE_KICKED); pTempPlayer->setItemRatioBonusPoint(11); try { CGLogoutHandler::execute( NULL, pTempPlayer ); } catch ( DisconnectException& de ) { filelog( "DIFF_ZG.log", "%s ZPM+PC+PE", de.toString().c_str() ); deletePlayer( pTempPlayer->getSocket()->getSOCKET() ); pushOutPlayer( pTempPlayer ); } // by sigi. 2002.12.30 if (IsPayPlayEnd) { // by sigi. 2002.12.30 UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_COMMAND_PAYPLAY_END ); } else { // by sigi. 2002.12.30 UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_COMMAND_ERROR ); } /* try { // 免仿 滚欺甫 敲矾矫茄促. pTempPlayer->disconnect(UNDISCONNECTED); } catch (Throwable & t) { filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::processCommands(4)", t.toString().c_str()); } deletePlayer(i); deleteQueuePlayer(pTempPlayer); // 敲饭捞绢 按眉甫 昏力茄促. delete pTempPlayer; */ } } } }// __ENTER_CRITICAL_SECTION(m_Mutex)/* if (m_MinFD == -1 && m_MaxFD == -1) { // no player exist m_Mutex.unlock(); return; } for (int i = m_MinFD ; i <= m_MaxFD ; i ++) { if (m_pPlayers[i] != NULL) { Assert (m_pPlayers[i] != NULL); if (m_pPlayers[i]->getSocket()->getSockError()) { try { // 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促. m_pPlayers[i]->disconnect(DISCONNECTED); } catch (Throwable & t) { } // 敲饭捞绢 按眉甫 昏力茄促. delete m_pPlayers[i]; // 敲饭捞绢 概聪历俊辑 敲饭捞绢 器牢磐甫 昏力茄促.// deletePlayer_NOBLOCKED(i); deletePlayer(i); } else { try { m_pPlayers[i]->processCommand(); } catch (ProtocolException & pe) { // LOG1("INVALID PROTOCOL %s (%s)\n", m_pPlayers[i]->getID().c_str() , pe.toString().c_str()); try { // 免仿 滚欺甫 敲矾矫茄促. m_pPlayers[i]->disconnect(UNDISCONNECTED); } catch (Throwable & t) { } // 敲饭捞绢 按眉甫 昏力茄促. delete m_pPlayers[i]; // 敲饭捞绢 概聪历俊辑 敲饭捞绢 器牢磐甫 昏力茄促.// deletePlayer_NOBLOCKED(i); deletePlayer(i); } } } }*/// __LEAVE_CRITICAL_SECTION(m_Mutex) __END_DEBUG __END_CATCH}////////////////////////////////////////////////////////////////////////// process all players' outputs////////////////////////////////////////////////////////////////////////void ZonePlayerManager::processOutputs () 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_WriteFDs[1])) { 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(12); try { CGLogoutHandler::execute( NULL, pTempPlayer ); } catch ( DisconnectException& de ) { filelog( "DIFF_ZG.log", "%s ZPM+PO+SOCKERR", de.toString().c_str() ); deletePlayer( pTempPlayer->getSocket()->getSOCKET() ); pushOutPlayer( pTempPlayer ); } // by sigi. 2002.12.30 UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_OUTPUT_ERROR ); /* try { // 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促. pTempPlayer->disconnect(DISCONNECTED); } catch (Throwable & t) { filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::processOutput(1)", t.toString().c_str()); } deletePlayer(i); deleteQueuePlayer(pTempPlayer); // 敲饭捞绢 按眉甫 昏力茄促. delete pTempPlayer; */ } else { try { pTempPlayer->processOutput(); } catch (ConnectException & ce) { pTempPlayer->setPenaltyFlag(PENALTY_TYPE_KICKED); pTempPlayer->setItemRatioBonusPoint(13); try { CGLogoutHandler::execute( NULL, pTempPlayer ); } catch ( DisconnectException& de ) { filelog( "DIFF_ZG.log", "%s ZPM+PO+CE", de.toString().c_str() ); deletePlayer( pTempPlayer->getSocket()->getSOCKET() ); pushOutPlayer( pTempPlayer ); } // by sigi. 2002.12.30 UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_OUTPUT_DISCONNECT ); /* try { // 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促. pTempPlayer->disconnect(DISCONNECTED); } catch (Throwable & t) { filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::processOutput(4)", t.toString().c_str()); } deletePlayer(i); deleteQueuePlayer(pTempPlayer); // 敲饭捞绢 按眉甫 昏力茄促. delete pTempPlayer; */ } catch (ProtocolException & cp) { pTempPlayer->setPenaltyFlag(PENALTY_TYPE_KICKED); pTempPlayer->setItemRatioBonusPoint(14); try { CGLogoutHandler::execute( NULL, pTempPlayer ); } catch ( DisconnectException& de ) { filelog( "DIFF_ZG.log", "%s ZPM+PO+PE", de.toString().c_str() ); deletePlayer( pTempPlayer->getSocket()->getSOCKET() ); pushOutPlayer( pTempPlayer ); } // by sigi. 2002.12.30 UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_OUTPUT_DISCONNECT2 ); /* // 捞固 楷搬捞 辆丰登菌栏骨肺, 免仿 滚欺甫 敲矾矫秦辑绰 救等促. try { pTempPlayer->disconnect(DISCONNECTED); } catch (Throwable & t) { filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::processOutput(7)", t.toString().c_str()); } deletePlayer(i); deleteQueuePlayer(pTempPlayer); // 敲饭捞绢 按眉甫 昏力茄促. delete pTempPlayer; */ } } } } } //__LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}////////////////////////////////////////////////////////////////////////// process all players' exceptions//// 泅犁鳖瘤绰 OOB 单捞鸥甫 傈价且 拌裙篮 绝促.// 蝶扼辑, 父距 OOB啊 难廉 乐促搁 俊矾肺 埃林窍绊 立加阑 犬 漏扼 滚赴促.////////////////////////////////////////////////////////////////////////void ZonePlayerManager::processExceptions () 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_ExceptFDs[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); pTempPlayer->setPenaltyFlag(PENALTY_TYPE_KICKED); pTempPlayer->setItemRatioBonusPoint(15); try { CGLogoutHandler::execute( NULL, pTempPlayer ); } catch ( DisconnectException& de ) { filelog( "DIFF_ZG.log", "%s ZPM+PE", de.toString().c_str() ); deletePlayer( pTempPlayer->getSocket()->getSOCKET() ); pushOutPlayer( pTempPlayer ); } // by sigi. 2002.12.30 UserGateway::getInstance()->passUser( UserGateway::USER_OUT_ZPM_EXCEPTION ); /* try { // 免仿 滚欺甫 敲矾矫茄促. m_pPlayers[i]->disconnect(UNDISCONNECTED); } catch (Throwable & t) { filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::processException(1)", t.toString().c_str()); } deletePlayer(i); deleteQueuePlayer(pTempPlayer); // 敲饭捞绢 按眉甫 昏力茄促. delete pTempPlayer; */ } } } //__LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH} //////////////////////////////////////////////////////////////////////// 漂沥 敲饭捞绢甫 概聪历俊 眠啊茄促.//////////////////////////////////////////////////////////////////////void ZonePlayerManager::addPlayer (GamePlayer* pGamePlayer) throw (DuplicatedException , Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) PlayerManager::addPlayer(pGamePlayer); SOCKET fd = pGamePlayer->getSocket()->getSOCKET(); // m_MinFD , m_MaxFD 甫 犁炼沥茄促. if (m_MinFD == -1 && m_MaxFD == -1) { // 弥檬狼 敲饭捞绢狼 版快 m_MinFD = m_MaxFD = fd; } else { m_MinFD = min(fd , m_MinFD); m_MaxFD = max(fd , m_MaxFD); } // 葛电 fd_set 俊 fd 厚飘甫 on 矫挪促. // m_XXXFDs[1] 篮 促澜锅俊 贸府秦林搁 等促. FD_SET(fd , &m_ReadFDs[0]); FD_SET(fd , &m_WriteFDs[0]); FD_SET(fd , &m_ExceptFDs[0]); __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//////////////////////////////////////////////////////////////////////// 漂沥 敲饭捞绢甫 概聪历俊 眠啊茄促.//////////////////////////////////////////////////////////////////////void ZonePlayerManager::addPlayer_NOBLOCKED (GamePlayer* pGamePlayer) throw (DuplicatedException , Error){ __BEGIN_TRY PlayerManager::addPlayer(pGamePlayer); SOCKET fd = pGamePlayer->getSocket()->getSOCKET(); // m_MinFD , m_MaxFD 甫 犁炼沥茄促. if (m_MinFD == -1 && m_MaxFD == -1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -