📄 zoneplayermanager.cpp
字号:
//// 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 + -