📄 zoneplayermanager.cpp
字号:
// 弥檬狼 敲饭捞绢狼 版快 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]); __END_CATCH}//////////////////////////////////////////////////////////////////////// 漂沥 敲饭捞绢甫 概聪历俊辑 昏力茄促.//////////////////////////////////////////////////////////////////////void ZonePlayerManager::deletePlayer_NOBLOCKED (SOCKET fd) throw (OutOfBoundException , NoSuchElementException , Error){ __BEGIN_TRY // 敲饭捞绢 器牢磐甫 敲饭捞绢 硅凯俊辑 昏力茄促. PlayerManager::deletePlayer(fd); Assert(m_pPlayers[fd] == NULL); // m_MinFD , m_MaxFD 甫 犁炼沥茄促. // fd == m_MinFD && fd == m_MaxFD 牢 版快绰 霉锅掳 if 俊辑 贸府等促. if (fd == m_MinFD) { // 菊俊辑何磐 力老 累篮 fd 甫 茫绰促. // m_MinFD 磊府绰 泅犁 NULL 捞 登绢 乐澜阑 蜡狼窍扼. int i = m_MinFD; for (i = m_MinFD ; i <= m_MaxFD ; i ++) { if (m_pPlayers[i] != NULL) { m_MinFD = i; break; } } // 利例茄 m_MinFD甫 茫瘤 给沁阑 版快, // 捞锭俊绰 m_MinFD == m_MaxFD 牢 版快捞促. // 捞锭俊绰 笛 促 -1 肺 汲沥秦林磊. if (i > m_MaxFD) m_MinFD = m_MaxFD = -1; } else if (fd == m_MaxFD) { // 第俊辑何磐 啊厘 奴 fd 甫 茫绰促. int i = m_MaxFD; for (i = m_MaxFD ; i >= m_MinFD ; i --) { if (m_pPlayers[i] != NULL) { m_MaxFD = i; break; } } // 利例茄 m_MinFD甫 茫瘤 给沁阑 版快, if (i < m_MinFD) { filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::deletePlayer_NOBLOCKED()", "MinMaxFD problem"); throw UnknownError("m_MinFD & m_MaxFD problem."); } } // 葛电 fd_set 俊 fd 厚飘甫 off 矫挪促. // m_XXXFDs[1]档 绊媚具 窍绰 捞蜡绰, 捞饶 贸府俊辑 按眉啊 绝绢脸绰单档 // 贸府罐阑 犬伏捞 乐扁 锭巩捞促. FD_CLR(fd , &m_ReadFDs[0]); FD_CLR(fd , &m_ReadFDs[1]); FD_CLR(fd , &m_WriteFDs[0]); FD_CLR(fd , &m_WriteFDs[1]); FD_CLR(fd , &m_ExceptFDs[0]); FD_CLR(fd , &m_ExceptFDs[1]); __END_CATCH}//////////////////////////////////////////////////////////////////////// 漂沥 敲饭捞绢甫 概聪历俊辑 昏力茄促.//////////////////////////////////////////////////////////////////////void ZonePlayerManager::deletePlayer (SOCKET fd) throw (OutOfBoundException , NoSuchElementException , Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) try { // 敲饭捞绢 器牢磐甫 敲饭捞绢 硅凯俊辑 昏力茄促. PlayerManager::deletePlayer(fd); } catch ( OutOfBoundException& o ) { filelog( "ZPMError.txt", "OOB: %s, Socket: %d", o.toString().c_str(), fd ); throw; } catch ( NoSuchElementException& n ) { filelog( "ZPMError.txt", "NSEE: %s, Socket: %d", n.toString().c_str(), fd ); throw; } catch ( Error& e) { filelog( "ZPMError.txt", "Error: %s, Socket: %d", e.toString().c_str(), fd ); throw; } catch (...) { filelog( "ZPMError.txt", "抄 隔扼. Socket: %d", fd ); throw; } Assert(m_pPlayers[fd] == NULL); // m_MinFD , m_MaxFD 甫 犁炼沥茄促. // fd == m_MinFD && fd == m_MaxFD 牢 版快绰 霉锅掳 if 俊辑 贸府等促. if (fd == m_MinFD) { // 菊俊辑何磐 力老 累篮 fd 甫 茫绰促. // m_MinFD 磊府绰 泅犁 NULL 捞 登绢 乐澜阑 蜡狼窍扼. int i = m_MinFD; for (i = m_MinFD ; i <= m_MaxFD ; i ++) { if (m_pPlayers[i] != NULL) { m_MinFD = i; break; } } // 利例茄 m_MinFD甫 茫瘤 给沁阑 版快, // 捞锭俊绰 m_MinFD == m_MaxFD 牢 版快捞促. // 捞锭俊绰 笛 促 -1 肺 汲沥秦林磊. if (i > m_MaxFD) m_MinFD = m_MaxFD = -1; } else if (fd == m_MaxFD) { // 第俊辑何磐 啊厘 奴 fd 甫 茫绰促. int i = m_MaxFD; for (i = m_MaxFD ; i >= m_MinFD ; i --) { if (m_pPlayers[i] != NULL) { m_MaxFD = i; break; } } // 利例茄 m_MinFD甫 茫瘤 给沁阑 版快, if (i < m_MinFD) { filelog("ZonePlayerManagerBug.txt", "%s : %s", "ZonePlayerManager::deletePlayer()", "MinMaxFD problem"); throw UnknownError("m_MinFD & m_MaxFD problem."); } } // 葛电 fd_set 俊 fd 厚飘甫 off 矫挪促. // m_XXXFDs[1]档 绊媚具 窍绰 捞蜡绰, 捞饶 贸府俊辑 按眉啊 绝绢脸绰单档 // 贸府罐阑 犬伏捞 乐扁 锭巩捞促. FD_CLR(fd , &m_ReadFDs[0]); FD_CLR(fd , &m_ReadFDs[1]); FD_CLR(fd , &m_WriteFDs[0]); FD_CLR(fd , &m_WriteFDs[1]); FD_CLR(fd , &m_ExceptFDs[0]); FD_CLR(fd , &m_ExceptFDs[1]); __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Player* ZonePlayerManager::getPlayer (SOCKET fd) throw (OutOfBoundException , NoSuchElementException , Error){ __BEGIN_TRY Player* pPlayer = NULL; __ENTER_CRITICAL_SECTION(m_Mutex) pPlayer = PlayerManager::getPlayer(fd); __LEAVE_CRITICAL_SECTION(m_Mutex) return pPlayer; __END_CATCH}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Player* ZonePlayerManager::getPlayerByPhoneNumber(PhoneNumber_t PhoneNumber) throw(OutOfBoundException, NoSuchElementException , Error){ __BEGIN_TRY return NULL; __END_CATCH}//////////////////////////////////////////////////////////////////////// 傈眉 荤侩磊甸狼 技捞宏甫 淬寸窍绰 风凭.// 促弗 静饭靛俊辑 立辟 且 荐 乐栏骨肺 遏阑 吧绢 拎具 窍唱..// 泅犁 静饭靛狼 Event贸府甫 窍搁辑 save甫 且 荐 乐栏骨肺...// 窍困 save俊 Lock阑 吧绢林绊 捞 风凭俊辑绰 窃荐父 龋免窍档废 茄促.// ZonePlayerManager:: save()//////////////////////////////////////////////////////////////////////void ZonePlayerManager::save() throw(Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) unsigned int i; for(i = 0; i < nMaxPlayers ; i++) { if (m_pPlayers[i] != NULL) { Assert(m_pPlayers[i] != NULL); // by sigi Creature* pCreature = ((GamePlayer*)m_pPlayers[i])->getCreature(); Assert(pCreature != NULL); // by sigi pCreature->save(); } } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}void ZonePlayerManager::pushPlayer(GamePlayer* pGamePlayer) throw(Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) m_PlayerListQueue.push_back(pGamePlayer); __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}void ZonePlayerManager::pushOutPlayer(GamePlayer* pGamePlayer) throw(Error){ __BEGIN_TRY m_PlayerOutListQueue.push_back(pGamePlayer); __END_CATCH}void ZonePlayerManager::processPlayerListQueue() throw(Error) { __BEGIN_TRY // PlayerQueue狼 Player甫 皋聪廉俊 眠啊茄促. while(! m_PlayerListQueue.empty()) { GamePlayer* pGamePlayer = m_PlayerListQueue.front(); if (pGamePlayer == NULL) { filelog("ZoneBug.txt", "%s : %s", "Zone::heartbeat(1)", "pGamePlayer啊 NULL涝聪促."); continue; } addPlayer_NOBLOCKED(pGamePlayer); m_PlayerListQueue.pop_front(); Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); // 货肺 甸绢哎 Zone.. by sigi. 2002.5.11 Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); /* // getNewZone()篮 IncomingPlayerManager俊辑 贸府窍档废 沁促. // by sigi. 2002.5.15 if (pZone==NULL) { pZone = pCreature->getZone(); Assert(pZone != NULL); } else { pCreature->setZone( pZone ); pCreature->setNewZone( NULL ); pCreature->setXY( pCreature->getNewX(), pCreature->getNewY() ); // 货 Zone俊 甸绢啊霸 登绰 版快 //pCreature->registerObject(); } */ pZone->addPC(pCreature, pCreature->getX(), pCreature->getY(), DOWN); } __END_CATCH}void ZonePlayerManager::heartbeat() throw(Error) { __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) processPlayerListQueue(); __LEAVE_CRITICAL_SECTION(m_Mutex) // 唱哎 措扁凯俊 乐绰 荤恩阑 贸府 秦 霖促. // 扁成 IPM栏肺 Push窍谷 场捞促. while(!m_PlayerOutListQueue.empty()) { GamePlayer* pGamePlayer = m_PlayerOutListQueue.front(); m_PlayerOutListQueue.pop_front(); Assert(pGamePlayer != NULL); g_pIncomingPlayerManager->pushPlayer(pGamePlayer); } __END_CATCH}void ZonePlayerManager::deleteQueuePlayer(GamePlayer* pGamePlayer) throw(NoSuchElementException , Error){ __BEGIN_TRY // 鞘夸绝绰 lock牢芭 鞍促. // 力芭 by sigi. 2002.5.9 //__ENTER_CRITICAL_SECTION(m_Mutex) Assert(pGamePlayer != NULL); list<GamePlayer *>::iterator itr = find_if (m_PlayerOutListQueue.begin(), m_PlayerOutListQueue.end(), isSamePlayer(pGamePlayer)); if (itr != m_PlayerOutListQueue.end()) { m_PlayerOutListQueue.erase(itr); } //__LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}void ZonePlayerManager::removeFlag (Effect::EffectClass EC) throw(Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) for (uint i = 0; i < nMaxPlayers ; i++) { Player* pPlayer = m_pPlayers[i]; if (pPlayer != NULL) { GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>( pPlayer ); Assert(pGamePlayer!=NULL); Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); pCreature->removeFlag( EC ); } } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}////////////////////////////////////////////////////////////////////////// ZonePlayerManager 俊 乐绰 葛电 荤侩磊甫 沥府茄促.////////////////////////////////////////////////////////////////////////void ZonePlayerManager::clearPlayers() throw (Error){ __BEGIN_TRY // PlayerListQueue 俊 乐绰 局甸阑 沥府茄促. while ( !m_PlayerListQueue.empty() ) { GamePlayer* pGamePlayer = m_PlayerListQueue.front(); m_PlayerListQueue.pop_front(); if ( pGamePlayer != NULL ) { try { pGamePlayer->disconnect(); } catch ( Throwable& t ) { // 公矫 } SAFE_DELETE( pGamePlayer ); } } // PlayerOutListQueue 俊 乐绰 局甸阑 沥府茄促. while ( !m_PlayerOutListQueue.empty() ) { GamePlayer* pGamePlayer = m_PlayerOutListQueue.front(); m_PlayerOutListQueue.pop_front(); if ( pGamePlayer != NULL ) { try { pGamePlayer->disconnect(); } catch ( Throwable& t ) { // 公矫 } SAFE_DELETE( pGamePlayer ); } } if ( m_MinFD == -1 && m_MaxFD == -1 ) return; // 敲饭捞绢甫 沥府茄促. for ( int i = m_MinFD; i <= m_MaxFD; i ++ ) { if ( m_pPlayers[i] != NULL ) { GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>( m_pPlayers[i] ); if ( pGamePlayer != NULL ) { try { pGamePlayer->disconnect(); } catch ( Throwable& t ) { // 公矫 } SAFE_DELETE( pGamePlayer ); } } } __END_CATCH}bool checkZonePlayerManager( GamePlayer* pGamePlayer, ZonePlayerManager* pZPM, const string& str ){ if ( pGamePlayer == NULL ) return true; Creature* pCreature = pGamePlayer->getCreature(); if ( pCreature == NULL ) return true; Zone* pZone = pCreature->getZone(); if ( pZone == NULL ) return true; ZoneGroup* pZoneGroup = pZone->getZoneGroup(); if ( pZoneGroup == NULL ) return true; ZonePlayerManager* pZonePlayerManager = pZoneGroup->getZonePlayerManager(); if ( pZonePlayerManager == NULL ) return true; if ( pZPM != pZonePlayerManager ) { filelog( "ZPMCheck.log", "CZPM:%u GZPM:%u SOCK:%d ZID:%u NAME:%s P:%s", pZPM->getZGID(), pZonePlayerManager->getZGID(), pGamePlayer->getSocket()->getSOCKET(), pZone->getZoneID(), pCreature->getName().c_str(), str.c_str() ); return false; } return true;}// external variable definitionZonePlayerManager* g_pZonePlayerManager = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -