#include "stdafx.h" #include "PVPManager.h" #include "gamesrv.h" #include "ObjectManager.h" #include "PvPScript.h" #include "StageScript.h" #include "AppTimer.h" #include "GridManager.h" cPVPManager* cPVPManager::mpPVPManager = NULL; cPVPManager::cPVPManager() : mpDMInfo(0) { if(mpPVPManager) { MessageBox(NULL,"cSkillManager : ÀÌ Å¬·¡½º´Â °´Ã¼°¡ À¯ÀÏÇѰ´Ã¼(singleton)À̾î¾ß ÇÕ´Ï´Ù.\ ÀÌÀü °´Ã¼¸¦ »ç¿ëÇÏ´øÁö ÀÌÀü °´Ã¼¸¦ Áö¿ì°í »ý¼ºÇϽʽÿÀ.","°æ°í",MB_OK); } else { mpPVPManager = this; } mpPvPScript = 0; mDMMaxCnt = 0; mPvPObjectRoot.pool = NULL; mPvPObjectRoot.root = NULL; mMapNumber = MAP_NONE; mTeamGenPos[0] = 0; mTeamGenPos[1] = 0; } cPVPManager::~cPVPManager() { //Release(); } bool cPVPManager::Init( SERVER_TYPE type, unsigned short mapNumber ) { for( unsigned char i = 0 ; i < PVP_DM_LEVEL_SECTION_MAX ; ++i ) { mSectionInfo[i].mSecProcess = ePVPSECTION_WAIT; mSectionInfo[i].mMinLevel = i * 10 + 1; mSectionInfo[i].mMaxLevel = i * 10 + 10; mSectionInfo[i].mNoticeSendTime = 0; mSectionInfo[i].mNoticeCount = PVP_DM_NOTICE_TIME / MINUTE; } mSectionInfo[PVP_DM_LEVEL_SECTION_MAX-1].mMaxLevel = 100; /// 081114 PKH pvp ½ºÅ©¸³Æ® mpPvPScript = new cPvPScript; if ( !mpPvPScript->Init( ) ) { return false; } if( type != _E_ST_ID_PVP_ ) { mProcess = ePVPPROCESS_WAIT; return true; } /// mpDMInfo = PVPSCRIPT->GetDmInfo( mapNumber ); if( mpDMInfo == 0 ) return false; /// ´ÙÀ½ ½ÃÀÛ ½Ã°£À» ¼³Á¤ÇÒ ½ºÅ©¸³Æ® ÂüÁ¶Á¤º¸¸¦ ¾ò¾î¿È cPAry* pTimeAry = PVPSCRIPT->GetStartTimeAry(); if( pTimeAry == NULL ) return false; /// ½ÃÀÛ ½Ã°£ÀÌ ¾øÀ¸¸é ¼­¹ö¸¦ ųÀÌÀ¯µµ ¾ø´Ù. if( pTimeAry->GetSize() == 0 ) return false; unsigned long serverPlusTime = 0; //if( NETWORK2->GetServerNum() > 0 ) // serverPlusTime = ( NETWORK2->GetServerNum() - 1 ) * 10 * MINUTE; /// ÇöÀç ½Ã°è¸¦ ¾ò¾î¿È TIMESTAMP_STRUCT now = TIMER->GetRealTime(); for( unsigned long i = 0 ; i < pTimeAry->GetSize() ; ++i ) { /// ½ºÅ©¸³Æ® Ç׸ñ ·Îµå sPvPStartTime* pStartTime = (sPvPStartTime*)(*pTimeAry)[i]; if( pStartTime == NULL ) return false; /// ÃʱâÈ­ ¼³Á¤ - ¸ñ·Ï ¸¶Áö¸·°¡Áö ¼±Á¤ÀÌ ¾ÈµÈ°æ¿ì ³»ÀÏÀ» ½ÃÀÛÀ¸·Î ¼³Á¤ if( i == 0 ) { /// ³¯Â¥¸¦ ÇÏ·ç ´ÙÀ½³¯·Î ³õ°í ½Ã°£À» ½ºÅ©¸³Æ® óÀ½°ÍÀ¸·Î ¼³Á¤ TIMESTAMP_STRUCT tomorrow = TIMER->GetRealPlusTime( 1 * DAY ); tomorrow.hour = pStartTime->mHour; tomorrow.minute = pStartTime->mMinute; tomorrow.second = 0; struct tm tmTomorrow = TIMER->ConvertTStoTM( tomorrow ); time_t result; /// ¼­¹ö±ºº° ½ÃÀ۽ð£+@ ½Ã°£ ´õÇϱâ tmTomorrow.tm_sec = tmTomorrow.tm_sec + ( serverPlusTime / 1000 ); if( (result = mktime( &tmTomorrow )) != (time_t)-1 ) { //datetime = *localtime( &result ); errno_t err = localtime_s( &tmTomorrow , &result ); if( err != 0 ) NETWORK2->PostServerEvent("cPvPManager::Init errno_t err[%d]", err ); } tomorrow.year = (SQLSMALLINT)tmTomorrow.tm_year+1900; tomorrow.month = (SQLSMALLINT)tmTomorrow.tm_mon+1; tomorrow.day = (SQLSMALLINT)tmTomorrow.tm_mday; tomorrow.hour = (SQLSMALLINT)tmTomorrow.tm_hour; tomorrow.minute = (SQLSMALLINT)tmTomorrow.tm_min; tomorrow.second = (SQLSMALLINT)tmTomorrow.tm_sec; tomorrow.fraction = 0; mNextStartTime = tomorrow; mStartTimeScriptPos = i; } TIMESTAMP_STRUCT scriptTime = now; scriptTime.hour = pStartTime->mHour; scriptTime.minute = pStartTime->mMinute; scriptTime.second = 0; struct tm tmScript = TIMER->ConvertTStoTM( scriptTime ); time_t result; /// ¼­¹ö±ºº° ½ÃÀ۽ð£+@ ½Ã°£ ´õÇϱâ tmScript.tm_sec = tmScript.tm_sec + ( serverPlusTime / 1000 ); if( (result = mktime( &tmScript )) != (time_t)-1 ) { //datetime = *localtime( &result ); errno_t err = localtime_s( &tmScript , &result ); if( err != 0 ) NETWORK2->PostServerEvent("cPvPManager::Init errno_t err[%d]", err ); } scriptTime.year = (SQLSMALLINT)tmScript.tm_year+1900; scriptTime.month = (SQLSMALLINT)tmScript.tm_mon+1; scriptTime.day = (SQLSMALLINT)tmScript.tm_mday; scriptTime.hour = (SQLSMALLINT)tmScript.tm_hour; scriptTime.minute = (SQLSMALLINT)tmScript.tm_min; scriptTime.second = (SQLSMALLINT)tmScript.tm_sec; scriptTime.fraction = 0; /// ½ºÅ©¸³Æ® ½Ã°£+¼­¹öº° Áõ°¨½Ã°£ À̶û ÇöÀç ½Ã°£À̶û ºñ±³Çؼ­ ½ºÅ©¸³Æ® ½Ã°£ÀÌ Áö³ªÁö ¾Ê¾ÒÀ¸¸é ´ÙÀ½ ½ÃÀÛÀ¸·Î ¼³Á¤ if( TIMER->DiffRealTime( scriptTime ) > 0 ) { mNextStartTime = scriptTime; mStartTimeScriptPos = i; break; } /* /// ÇöÀç ½Ã°è¿Í ½ºÅ©¸³Æ® ½Ã°è¸¦ ºñ±³Çؼ­ ¿À´Ã ÄÑÁú¼ö Àִ°ÍÁß °¡Àå °¡±î¿î°ÍÀ» ã´Â´Ù. /// ¡Ø ãÁö ¸øÇÏ´Â °æ¿ì À§ÀÇ ÃʱâÈ­ ¼³Á¤ºÎ¿¡¼­ ÇÏ·ç ´ÙÀ½³¯ óÀ½ ½ºÅ©¸³Æ® À§Ä¡ÀÇ ½Ã°£À¸·Î ÁøÇàµÈ´Ù if( pStartTime->mHour > now.hour || ( pStartTime->mHour == now.hour && pStartTime->mMinute > now.minute ) ) { mNextStartTime = now; mNextStartTime.hour = pStartTime->mHour; mNextStartTime.minute = pStartTime->mMinute; mNextStartTime.second = 0; mStartTimeScriptPos = i; break; } */ } ///// //tPointerArray* pArray = STAGESCRIPT->GetMapChangeDestArr( mapNumber ); //if( pArray == 0 || pArray->GetSize() < 2 ) //{ // assert(0); // return false; //} //sStageChangePos* pAPos = (sStageChangePos*)(*pArray)[0]; //sStageChangePos* pBPos = (sStageChangePos*)(*pArray)[1]; //if( pAPos == 0 || pBPos == 0 ) //{ // assert(0); // return false; //} //mTeamGenPos[0] = pAPos->mPosIdx; //mTeamGenPos[1] = pBPos->mPosIdx; if( mapNumber == MAP_DEATHMATCH ) { sStageChangePos* pAPos = STAGESCRIPT->GetPosScriptInfo( 210101 ); sStageChangePos* pBPos = STAGESCRIPT->GetPosScriptInfo( 210102 ); if( pAPos == 0 || pBPos == 0 ) { assert(0); return false; } mTeamGenPos[0] = pAPos->mPosIdx; mTeamGenPos[1] = pBPos->mPosIdx; } else { sStageChangePos* pAPos = STAGESCRIPT->GetPosScriptInfo( 210201 ); sStageChangePos* pBPos = STAGESCRIPT->GetPosScriptInfo( 210202 ); if( pAPos == 0 || pBPos == 0 ) { assert(0); return false; } mTeamGenPos[0] = pAPos->mPosIdx; mTeamGenPos[1] = pBPos->mPosIdx; } /// ·¹º§ ±¸°£º° Àοø¼±Á¤¿ë ±¸Á¶Ã¼ »ý¼º unsigned int blockCnt = mpDMInfo->mLevelBlockInfo.GetSize(); for( unsigned int i=0;imLevelBlockInfo[i]; if( pInfo == 0 ) { assert(0); return false; } /// ±¸°£Á¤º¸ »ý¼º sLevelForceInfo* pLvForceInfo = new sLevelForceInfo; pLvForceInfo->mpBlockInfo = pInfo; mLevelForceAry.PushBack( pLvForceInfo ); /// ·¹º§º° ÂüÁ¶ Á¤º¸ »ý¼º for( unsigned char j = pInfo->mLevelMin ; j <= pInfo->mLevelMax ; ++j ) { if( mLevelForceMap.Insert( j, pLvForceInfo ) == false ) { assert(0); return false; } } } mMapNumber = mapNumber; mProcess = ePVPPROCESS_WAIT; /// ¼­¹ö´Ù¿îÀ¸·Î ³²¾ÆÀÖÀ»Áö ¸ð¸£´Â µ¥ÀÌÅ͸¦ ÃʱâÈ­ ÇØÁØ´Ù. HANDLE handle = NULL; PVP_USER_CLEAR* pPvPClear = (PVP_USER_CLEAR*)NETWORK2->GetSQL( &handle, SQL_GAME_PROCESS_PVP_USER_CLEAR ); if( pPvPClear != NULL ) { pPvPClear->pvpIdx = mapNumber; pPvPClear->minLevel = 0; pPvPClear->maxLevel = CHAR_MAX; NETWORK2->SendSQL( handle, sizeof(PVP_USER_CLEAR) ); } return true; } void cPVPManager::Release() { for( unsigned long i = 0 ; i < PVP_DM_LEVEL_SECTION_MAX ; ++i ) { if( mSectionInfo[i].mSecProcess != ePVPPROCESS_WAIT ) NETWORK2->PostPVPStatus( _E_PVP_CLOSING_, NETWORK2->GetInDunMapNum(), i ); } PVPOBJECTPOOL->Shutdown(); PVPPLAYERLISTPOOL->Shutdown(); mLevelForceMap.Clear(); for( unsigned long i = 0 ; i < mLevelForceAry.GetSize() ; ++i ) { sLevelForceInfo* pLevelForceInfo = (sLevelForceInfo*)mLevelForceAry[i]; SAFE_DELETE( pLevelForceInfo ); } mLevelForceAry.Clear(); // if( mPvPType == ePVPSERVERTYPE_NONE ) SAFE_RELEASE_DELETE( mpPvPScript ); } void cPVPManager::Process( unsigned long elapsedTime, unsigned long accumTime ) { switch( mProcess ) { case ePVPPROCESS_WAIT: { if( TIMER->DiffRealTime( mNextStartTime ) > 0 ) return; ////////////////////////////////////////////////////////////////////////// /// ½ºÅ©¸³Æ®¸¦ Àоî¿ÀÁö ¸øÇÏ¸é ´õ ÁøÇàÀ» ½ÃŰÁö ¾Ê´Â´Ù. cPAry* pTimeAry = PVPSCRIPT->GetStartTimeAry(); if( pTimeAry == NULL ) { assert(NULL); return; } /// ½ÃÀÛ ½Ã°£ÀÌ ¾øÀ¸¸é ´õ ÁøÇàÀ» ½ÃŰÁö ¾Ê´Â´Ù. if( pTimeAry->GetSize() == 0 ) { assert(NULL); return; } unsigned long serverPlusTime = 0; //if( NETWORK2->GetServerNum() > 0 ) // serverPlusTime = ( NETWORK2->GetServerNum() - 1 ) * 10 * MINUTE; /// ¸¶Áö¸· ½Ã°£°¡Áö »ç¿ëÇßÀ¸¸é ³¯Â¥¸¦ ÇÏ·ç ³Ñ±â°í óÀ½ ½ÃÀ۽ð£À¸·Î ¼³Á¤ÇÑ´Ù. if( mStartTimeScriptPos + 1 >= pTimeAry->GetSize() ) { /// ½ºÅ©¸³Æ® Ç׸ñ ·Îµå sPvPStartTime* pStartTime = (sPvPStartTime*)(*pTimeAry)[0]; if( pStartTime == NULL ) { assert(NULL); return; } /// ³¯Â¥¸¦ ÇÏ·ç ´ÙÀ½³¯·Î ³õ°í ½Ã°£À» ½ºÅ©¸³Æ® óÀ½°ÍÀ¸·Î ¼³Á¤ TIMESTAMP_STRUCT tomorrow = TIMER->GetRealPlusTime( 1 * DAY ); tomorrow.hour = pStartTime->mHour; tomorrow.minute = pStartTime->mMinute; tomorrow.second = 0; struct tm tmTomorrow = TIMER->ConvertTStoTM( tomorrow ); time_t result; /// ¼­¹ö±ºº° ½ÃÀ۽ð£+@ ½Ã°£ ´õÇϱâ tmTomorrow.tm_sec = tmTomorrow.tm_sec + ( serverPlusTime / 1000 ); if( (result = mktime( &tmTomorrow )) != (time_t)-1 ) { //datetime = *localtime( &result ); errno_t err = localtime_s( &tmTomorrow , &result ); if( err != 0 ) NETWORK2->PostServerEvent("cPvPManager::Init errno_t err[%d]", err ); } tomorrow.year = (SQLSMALLINT)tmTomorrow.tm_year+1900; tomorrow.month = (SQLSMALLINT)tmTomorrow.tm_mon+1; tomorrow.day = (SQLSMALLINT)tmTomorrow.tm_mday; tomorrow.hour = (SQLSMALLINT)tmTomorrow.tm_hour; tomorrow.minute = (SQLSMALLINT)tmTomorrow.tm_min; tomorrow.second = (SQLSMALLINT)tmTomorrow.tm_sec; tomorrow.fraction = 0; mNextStartTime = tomorrow; mStartTimeScriptPos = 0; } else { /// ½ºÅ©¸³Æ® Ç׸ñ ·Îµå sPvPStartTime* pStartTime = (sPvPStartTime*)(*pTimeAry)[mStartTimeScriptPos + 1]; if( pStartTime == NULL ) { assert(NULL); return; } /// ´ÙÀ½¹ø¿¡ ÀÖ´Â ½Ã°£ °ªÀ» °¡Áö°í¿Í ¼ÂÆÃÇÑ´Ù. TIMESTAMP_STRUCT nextTime = mNextStartTime; nextTime.hour = pStartTime->mHour; nextTime.minute = pStartTime->mMinute; nextTime.second = 0; struct tm tmNextTime = TIMER->ConvertTStoTM( nextTime ); time_t result; /// ¼­¹ö±ºº° ½ÃÀ۽ð£+@ ½Ã°£ ´õÇϱâ tmNextTime.tm_sec = tmNextTime.tm_sec + ( serverPlusTime / 1000 ); if( (result = mktime( &tmNextTime )) != (time_t)-1 ) { //datetime = *localtime( &result ); errno_t err = localtime_s( &tmNextTime , &result ); if( err != 0 ) NETWORK2->PostServerEvent("cPvPManager::Init errno_t err[%d]", err ); } nextTime.year = (SQLSMALLINT)tmNextTime.tm_year+1900; nextTime.month = (SQLSMALLINT)tmNextTime.tm_mon+1; nextTime.day = (SQLSMALLINT)tmNextTime.tm_mday; nextTime.hour = (SQLSMALLINT)tmNextTime.tm_hour; nextTime.minute = (SQLSMALLINT)tmNextTime.tm_min; nextTime.second = (SQLSMALLINT)tmNextTime.tm_sec; nextTime.fraction = 0; mNextStartTime = nextTime; ++mStartTimeScriptPos; } /// °øÁö¹ß¼Û ³¡³ª´Â ½Ã°£ mNextEventTime = accumTime + PVP_DM_NOTICE_TIME; mDMMaxCnt = 0; mProcess = ePVPPROCESS_RUN; for( unsigned long i = 0 ; i < PVP_DM_LEVEL_SECTION_MAX ; ++i ) { /// ±¸°£º° ÀüÀå ½ÃÀÛ Á¤º¸ ¼³Á¤ mSectionInfo[i].mSecProcess = ePVPSECTION_WAIT; mSectionInfo[i].mNextEventTime = accumTime + i * PVP_DM_LEVEL_START_TERM; } } case ePVPPROCESS_RUN: { for( unsigned long i = 0 ; i < PVP_DM_LEVEL_SECTION_MAX ; ++i ) { /// ±¸°£º° ¸ðÁý switch( mSectionInfo[i].mSecProcess ) { case ePVPSECTION_WAIT: { if( mSectionInfo[i].mNextEventTime > accumTime ) continue; /// °øÁö ¹ß¼Û ½ÃÀÛ NETWORK2->PostPvPNotice( PVP_DM_NOTICE_CNT, NETWORK2->GetInDunMapNum(), i ); mSectionInfo[i].mSecProcess = ePVPPROCESS_NOTICE; mSectionInfo[i].mNextEventTime = accumTime + PVP_DM_NOTICE_TIME; mSectionInfo[i].mNoticeSendTime = 0; mSectionInfo[i].mNoticeCount = PVP_DM_NOTICE_CNT; } break; case ePVPPROCESS_NOTICE: { if( mSectionInfo[i].mNextEventTime <= accumTime ) { /// °øÁö³¡ - Âü¿©ÀÚ ½Åû¹ÞÀ½ NETWORK2->PostPVPStatus( _E_PVP_READY_, NETWORK2->GetInDunMapNum(), i ); mSectionInfo[i].mSecProcess = ePVPPROCESS_READY; mSectionInfo[i].mNextEventTime = accumTime + PVP_DM_JOIN_TIME; } else { /// pvp °øÁö ¹ß¼Û mSectionInfo[i].mNoticeSendTime += elapsedTime; if( mSectionInfo[i].mNoticeSendTime > MINUTE ) { mSectionInfo[i].mNoticeCount--; mSectionInfo[i].mNoticeSendTime = mSectionInfo[i].mNoticeSendTime-MINUTE; NETWORK2->PostPvPNotice( mSectionInfo[i].mNoticeCount, NETWORK2->GetInDunMapNum(), i ); } } } break; case ePVPPROCESS_READY: { if( mSectionInfo[i].mNextEventTime > accumTime ) continue; /// Âü¿©ÀÚ ½Åû ¸¶°¨ NETWORK2->PostPVPStatus( _E_PVP_PLAYERLISTWAIT_, NETWORK2->GetInDunMapNum(), i ); HANDLE handle = NULL; PVP_USER_SELECT* pPvPSelect = (PVP_USER_SELECT*)NETWORK2->GetSQL( &handle, SQL_GAME_PROCESS_PVP_USER_SELECT ); if( pPvPSelect != NULL ) { pPvPSelect->pvpIdx = NETWORK2->GetInDunMapNum(); pPvPSelect->aryPos = i; pPvPSelect->minLevel = mSectionInfo[i].mMinLevel; pPvPSelect->maxLevel = mSectionInfo[i].mMaxLevel; NETWORK2->SendSQL( handle, sizeof(PVP_USER_SELECT) ); } /// ¹æº°·Î ÀÔÀåºÎÅÍ ³¡³¯¶§±îÁö ÇÁ·Î¼¼½º¸¦ ¸Ã±ä´Ù mSectionInfo[i].mSecProcess = ePVPPROCESS_RUNOBJECT; mSectionInfo[i].mNextEventTime = 0; } break; } } /// ¹æº° ÀüÀå ÇÁ·Î¼¼½Ì ObjectProcess( elapsedTime, accumTime ); /// ½Ã°£ÀÌ ´ÙµÇµµ·Ï ÀδøÀÌ »ç¶óÁöÁö ¾ÊÀ¸¸é Á¤¸®ÇØÁØ´Ù. if( TIMER->DiffRealTime( mNextStartTime ) <= 0 ) { mProcess = ePVPPROCESS_WAIT; //for( unsigned long i = 0 ; i < PVP_DM_LEVEL_SECTION_MAX ; ++i ) //{ // /// ÇÁ·Î¼¼½º »óÅ ¹Ù²Þ // mSectionInfo[i].mSecProcess = ePVPSECTION_WAIT; // NETWORK2->PostPVPStatus( _E_PVP_CLOSED_, NETWORK2->GetInDunMapNum(), i ); //} cBaseDeathMatch* pPvPObject = (cBaseDeathMatch*)mPvPObjectRoot.pool; while( pPvPObject ) { /// »ç¶óÁöÁö ¾ÊÀº ¹æÁ¤º¸ ·Î±×³²±è NETWORK2->PostServerEvent("cPVPManager::Process TIMER->DiffRealTime pPvPObject[%d,%d,%d][%d,%d]", pPvPObject->GetType(), pPvPObject->GetDMIdx(), pPvPObject->GetProcess(), pPvPObject->GetProcessEndTime(), NETWORK2->GetAccumTime()); pPvPObject->EndDM(); cBaseDeathMatch* pDelObject = pPvPObject; pPvPObject = (cBaseDeathMatch*)pPvPObject->next; /// ¿ÀºêÁ§Æ® »èÁ¦ PVPOBJECTPOOL->ReleasePvPObject( &mPvPObjectRoot, pDelObject->GetDMIdx() ); } PVPOBJECTPOOL->Shutdown(); mPvPObjectRoot.pool = NULL; mPvPObjectRoot.root = NULL; mPvPObjectRoot.count = 0; for( unsigned long i = 0 ; i < mLevelForceAry.GetSize() ; ++i ) { sLevelForceInfo* pLvForceInfo = (sLevelForceInfo*)mLevelForceAry[i]; if( pLvForceInfo != NULL ) pLvForceInfo->Init(); } } } } /* switch( mProcess ) { case ePVPPROCESS_WAIT: { if( TIMER->DiffRealTime( mNextStartTime ) > 0 ) return; mAutoOutCheckTime = 0; ////////////////////////////////////////////////////////////////////////// /// ½ºÅ©¸³Æ®¸¦ Àоî¿ÀÁö ¸øÇÏ¸é ´õ ÁøÇàÀ» ½ÃŰÁö ¾Ê´Â´Ù. cPAry* pTimeAry = PVPSCRIPT->GetStartTimeAry(); if( pTimeAry == NULL ) { assert(NULL); return; } /// ½ÃÀÛ ½Ã°£ÀÌ ¾øÀ¸¸é ´õ ÁøÇàÀ» ½ÃŰÁö ¾Ê´Â´Ù. if( pTimeAry->GetSize() == 0 ) { assert(NULL); return; } unsigned long serverPlusTime = 0; if( NETWORK2->GetServerNum() > 0 ) serverPlusTime = ( NETWORK2->GetServerNum() - 1 ) * 10 * MINUTE; /// ¸¶Áö¸· ½Ã°£°¡Áö »ç¿ëÇßÀ¸¸é ³¯Â¥¸¦ ÇÏ·ç ³Ñ±â°í óÀ½ ½ÃÀ۽ð£À¸·Î ¼³Á¤ÇÑ´Ù. if( mStartTimeScriptPos + 1 >= pTimeAry->GetSize() ) { /// ½ºÅ©¸³Æ® Ç׸ñ ·Îµå sPvPStartTime* pStartTime = (sPvPStartTime*)(*pTimeAry)[0]; if( pStartTime == NULL ) { assert(NULL); return; } /// ³¯Â¥¸¦ ÇÏ·ç ´ÙÀ½³¯·Î ³õ°í ½Ã°£À» ½ºÅ©¸³Æ® óÀ½°ÍÀ¸·Î ¼³Á¤ TIMESTAMP_STRUCT tomorrow = TIMER->GetRealPlusTime( 1 * DAY ); tomorrow.hour = pStartTime->mHour; tomorrow.minute = pStartTime->mMinute; tomorrow.second = 0; struct tm tmTomorrow = TIMER->ConvertTStoTM( tomorrow ); time_t result; /// ¼­¹ö±ºº° ½ÃÀ۽ð£+@ ½Ã°£ ´õÇϱâ tmTomorrow.tm_sec = tmTomorrow.tm_sec + ( serverPlusTime / 1000 ); if( (result = mktime( &tmTomorrow )) != (time_t)-1 ) { //datetime = *localtime( &result ); errno_t err = localtime_s( &tmTomorrow , &result ); if( err != 0 ) NETWORK2->PostServerEvent("cPvPManager::Init errno_t err[%d]", err ); } tomorrow.year = (SQLSMALLINT)tmTomorrow.tm_year+1900; tomorrow.month = (SQLSMALLINT)tmTomorrow.tm_mon+1; tomorrow.day = (SQLSMALLINT)tmTomorrow.tm_mday; tomorrow.hour = (SQLSMALLINT)tmTomorrow.tm_hour; tomorrow.minute = (SQLSMALLINT)tmTomorrow.tm_min; tomorrow.second = (SQLSMALLINT)tmTomorrow.tm_sec; tomorrow.fraction = 0; mNextStartTime = tomorrow; mStartTimeScriptPos = 0; } else { /// ½ºÅ©¸³Æ® Ç׸ñ ·Îµå sPvPStartTime* pStartTime = (sPvPStartTime*)(*pTimeAry)[mStartTimeScriptPos + 1]; if( pStartTime == NULL ) { assert(NULL); return; } /// ´ÙÀ½¹ø¿¡ ÀÖ´Â ½Ã°£ °ªÀ» °¡Áö°í¿Í ¼ÂÆÃÇÑ´Ù. TIMESTAMP_STRUCT nextTime = mNextStartTime; nextTime.hour = pStartTime->mHour; nextTime.minute = pStartTime->mMinute; nextTime.second = 0; struct tm tmNextTime = TIMER->ConvertTStoTM( nextTime ); time_t result; /// ¼­¹ö±ºº° ½ÃÀ۽ð£+@ ½Ã°£ ´õÇϱâ tmNextTime.tm_sec = tmNextTime.tm_sec + ( serverPlusTime / 1000 ); if( (result = mktime( &tmNextTime )) != (time_t)-1 ) { //datetime = *localtime( &result ); errno_t err = localtime_s( &tmNextTime , &result ); if( err != 0 ) NETWORK2->PostServerEvent("cPvPManager::Init errno_t err[%d]", err ); } nextTime.year = (SQLSMALLINT)tmNextTime.tm_year+1900; nextTime.month = (SQLSMALLINT)tmNextTime.tm_mon+1; nextTime.day = (SQLSMALLINT)tmNextTime.tm_mday; nextTime.hour = (SQLSMALLINT)tmNextTime.tm_hour; nextTime.minute = (SQLSMALLINT)tmNextTime.tm_min; nextTime.second = (SQLSMALLINT)tmNextTime.tm_sec; nextTime.fraction = 0; mNextStartTime = nextTime; ++mStartTimeScriptPos; } /// °øÁö ¹ß¼Û ½ÃÀÛ ¼³Á¤ mProcess = ePVPPROCESS_NOTICE; /// °øÁö¹ß¼Û ³¡³ª´Â ½Ã°£ mNextEventTime = accumTime + PVP_DM_NOTICE_TIME; mNoticeCount = PVP_DM_NOTICE_TIME / MINUTE; mNoticeSendTime = 0; NETWORK2->PostPvPNotice( mNoticeCount, NETWORK2->GetInDunMapNum() ); mDMMaxCnt = 0; } break; case ePVPPROCESS_NOTICE: { if( mNextEventTime <= accumTime ) { /// °øÁö³¡ - Âü¿©ÀÚ ½Åû¹ÞÀ½ NETWORK2->PostPVPStatus( _E_PVP_READY_, NETWORK2->GetInDunMapNum() ); mProcess = ePVPPROCESS_READY; mNextEventTime = accumTime + PVP_DM_JOIN_TIME; } else { /// pvp °øÁö ¹ß¼Û mNoticeSendTime += elapsedTime; if( mNoticeSendTime > MINUTE ) { mNoticeCount--; mNoticeSendTime = mNoticeSendTime-MINUTE; NETWORK2->PostPvPNotice( mNoticeCount, NETWORK2->GetInDunMapNum() ); } } } break; case ePVPPROCESS_READY: { if( mNextEventTime <= accumTime ) { /// Âü¿©ÀÚ ½Åû ¸¶°¨ NETWORK2->PostPVPStatus( _E_PVP_PLAYERLISTWAIT_, NETWORK2->GetInDunMapNum() ); mProcess = ePVPPROCESS_JOINDBWAIT; mNextEventTime = 0; /// DB ÃÖ´ë ´ë±â½Ã°£ ¼³Á¤ /// °ÔÀÓ¼­¹ö·Î ºÎÅÍ µî·ÏµÈ Ç÷¹À̾î DBÁ¤º¸¸¦ ÀÐ¾î ¿Â´Ù. HANDLE handle = NULL; PVP_USER_SELECT* pPvPSelect = (PVP_USER_SELECT*)NETWORK2->GetSQL( &handle, SQL_GAME_PROCESS_PVP_USER_SELECT ); if( pPvPSelect != NULL ) { pPvPSelect->pvpIdx = NETWORK2->GetInDunMapNum(); NETWORK2->SendSQL( handle, sizeof(PVP_USER_SELECT) ); } } } break; case ePVPPROCESS_JOINDBWAIT: /// db󸮰¡ ¾È¿Ã°æ¿ì¸¦ ´ëºñÇÏ¿© ÀÏÁ¤½Ã°£ÈÄ¿¡ ÁøÇà ºÒ°¡ ¸Þ¼¼Áö¿Í ÁøÇà»óŸ¦ ¹Ù²ãÁÖÀÚ! break; case ePVPPROCESS_JOINREADY: { if( mNextEventTime <= accumTime ) { /// Àδø °´Ã¼µé Àüü ·¹µð cBaseDeathMatch* pPvPObject = (cBaseDeathMatch*)mPvPObjectRoot.pool; while( pPvPObject ) { pPvPObject->Ready(); pPvPObject = (cBaseDeathMatch*)pPvPObject->next; } mProcess = ePVPPROCESS_RUN; } } break; case ePVPPROCESS_RUN: { /// °³º° ÀüÀå ÇÁ·Î¼¼½Ì ObjectProcess( elapsedTime, accumTime ); /// ÁøÇàÁßÀÎ °´Ã¼°¡ ¾øÀ¸¸é »óÅ ¹Ù²Þ if( mPvPObjectRoot.count == 0 ) { mProcess = ePVPPROCESS_WAIT; NETWORK2->PostPVPStatus( _E_PVP_CLOSED_, NETWORK2->GetInDunMapNum() ); for( unsigned long i = 0 ; i < mLevelForceAry.GetSize() ; ++i ) { sLevelForceInfo* pLvForceInfo = (sLevelForceInfo*)mLevelForceAry[i]; if( pLvForceInfo != NULL ) pLvForceInfo->Init(); } } else { /// ½Ã°£ÀÌ ´ÙµÇµµ·Ï ÀδøÀÌ »ç¶óÁöÁö ¾ÊÀ¸¸é Á¤¸®ÇØÁØ´Ù. if( TIMER->DiffRealTime( mNextStartTime ) <= 0 ) { cBaseDeathMatch* pPvPObject = (cBaseDeathMatch*)mPvPObjectRoot.pool; while( pPvPObject ) { /// »ç¶óÁöÁö ¾ÊÀº ¹æÁ¤º¸ ·Î±×³²±è NETWORK2->PostServerEvent("cPVPManager::Process TIMER->DiffRealTime pPvPObject[%d,%d,%d][%d,%d]", pPvPObject->GetType(), pPvPObject->GetDMIdx(), pPvPObject->GetProcess(), pPvPObject->GetProcessEndTime(), NETWORK2->GetAccumTime()); pPvPObject->EndDM(); pPvPObject = (cBaseDeathMatch*)pPvPObject->next; } PVPOBJECTPOOL->Shutdown(); mPvPObjectRoot.pool = NULL; mPvPObjectRoot.root = NULL; mPvPObjectRoot.count = 0; NETWORK2->PostServerEvent("cPVPManager::Process TIMER->DiffRealTime( [%d,%d,%d] [%d,%d,%d] ) <= 0", mNextStartTime.hour, mNextStartTime.minute, mNextStartTime.second, TIMER->GetRealTime().hour, TIMER->GetRealTime().minute, TIMER->GetRealTime().second); mProcess = ePVPPROCESS_WAIT; NETWORK2->PostPVPStatus( _E_PVP_CLOSED_, NETWORK2->GetInDunMapNum() ); for( unsigned long i = 0 ; i < mLevelForceAry.GetSize() ; ++i ) { sLevelForceInfo* pLvForceInfo = (sLevelForceInfo*)mLevelForceAry[i]; if( pLvForceInfo != NULL ) pLvForceInfo->Init(); } } } } break; } */ } void cPVPManager::ObjectProcess( unsigned long elapsedTime, unsigned long accumTime ) { /// °³º° ¿ÀºêÁ§Æ® ÇÁ·Î¼¼½º cBaseDeathMatch* pPvPObject = (cBaseDeathMatch*)mPvPObjectRoot.pool; while( pPvPObject ) { pPvPObject->Process( elapsedTime, accumTime ); pPvPObject = (cBaseDeathMatch*)pPvPObject->next; } /// »èÁ¦ ¿¹¾à ¿ÀºêÁ§Æ® »èÁ¦ for( unsigned long i = 0 ; i < mDelDMAry.GetSize() ; ++i ) { PVPOBJECTPOOL->ReleasePvPObject( &mPvPObjectRoot, mDelDMAry[i] ); } mDelDMAry.Clear(); } cBaseDeathMatch* cPVPManager::GetPvPDMObject( unsigned long dmIdx ) { return PVPOBJECTPOOL->GetPvPObject( &mPvPObjectRoot, dmIdx ); } void cPVPManager::TeamDivision( PVP_USER_SELECT* select ) { if( mSectionInfo[select->aryPos].mSecProcess != ePVPPROCESS_RUNOBJECT ) return; ///// ÇÁ·Î¼¼½º »óÅ º¯°æ //mSectionInfo[select->aryPos].mSecProcess = ePVPPROCESS_JOINREADY; ///// Ç÷¹À̾îµéÀÌ Á¢¼ÓÇϱ⠱îÁö ±â´Ù·ÁÁִ½ð£ PVP_DM_READY_PRINT1_TIME ½Ã°£ÀÌµÇ¸é ·¹µð·Î ¹Ù²Þ //mSectionInfo[select->aryPos].mNextEventTime = NETWORK2->GetAccumTime() + PVP_DM_READY_TIME - PVP_DM_READY_PRINT1_TIME; /// ±âÁ¸ Á¤º¸ ÃʱâÈ­ for( unsigned long i = 0 ; i < mLevelForceAry.GetSize() ; ++i ) { sLevelForceInfo* pInfo = (sLevelForceInfo*)mLevelForceAry[i]; if( pInfo == 0 ) { assert(0); continue; } pInfo->Init(); } /// ·¹º§ ±¸°£º° ÀοøÄ«¿îÆ® for( int i = 0 ; i < select->rowCount ; ++i ) { sLevelForceInfo* pLevelForceInfo = (sLevelForceInfo*)mLevelForceMap.GetAt( select->table[i].characterLevel ); if( pLevelForceInfo == NULL ) { assert(0); continue; } pLevelForceInfo->mForceCnt[select->table[i].characterForceType]++; } /// ·¹º§ ±¸°£º° ÆÀ¼¼·Â °áÁ¤ for( unsigned long i = 0 ; i < mLevelForceAry.GetSize() ; ++i ) { sLevelForceInfo* pLevelForceInfo = (sLevelForceInfo*)mLevelForceAry[i]; if( pLevelForceInfo == NULL ) { assert(0); continue; } /// Àüü Àοø °è»ê ¹× ÀοøÀÌ Á¦ÀÏ ¸¹Àº ¼¼·Â°ú Á¦ÀÏ ÀûÀº ¼¼·Â ¼±Á¤ int maxForce = eFORCETYPE_FIRE; int minForce = eFORCETYPE_EARTH; unsigned long totalCnt = 0; for( int i2 = eFORCETYPE_FIRE ; i2 < eFORCETYPE_MAX ; ++i2 ) { totalCnt = totalCnt + pLevelForceInfo->mForceCnt[i2]; if( pLevelForceInfo->mForceCnt[maxForce] < pLevelForceInfo->mForceCnt[i2] ) maxForce = i2; if( pLevelForceInfo->mForceCnt[minForce] > pLevelForceInfo->mForceCnt[i2] ) minForce = i2; } if( totalCnt > pLevelForceInfo->mForceCnt[maxForce] ) { /// ÀοøÀÌ °¡Àå ¸¹Àº ¼¼·ÂÀº aÆÀ pLevelForceInfo->mATeam[maxForce] = true; unsigned long teamCnt[ePVPDM_TEAMTYPE_MAX] = {0,}; teamCnt[ePVPDM_TEAMTYPE_A] = pLevelForceInfo->mForceCnt[maxForce]; teamCnt[ePVPDM_TEAMTYPE_B] = totalCnt - pLevelForceInfo->mForceCnt[maxForce]; if( pLevelForceInfo->mForceCnt[maxForce] < totalCnt - pLevelForceInfo->mForceCnt[maxForce] ) { unsigned long gap1 = abs((long)( totalCnt - pLevelForceInfo->mForceCnt[maxForce]*2 )); unsigned long gap2 = abs((long)( totalCnt - (pLevelForceInfo->mForceCnt[maxForce] + pLevelForceInfo->mForceCnt[minForce])*2 )); if( gap1 >= gap2 ) { pLevelForceInfo->mATeam[minForce] = true; teamCnt[ePVPDM_TEAMTYPE_A] = pLevelForceInfo->mForceCnt[maxForce] + pLevelForceInfo->mForceCnt[minForce]; teamCnt[ePVPDM_TEAMTYPE_B] = totalCnt - pLevelForceInfo->mForceCnt[maxForce] + pLevelForceInfo->mForceCnt[minForce]; } } /// »ý¼º ¹æÀÇ °¹¼ö ¼±Á¤ pLevelForceInfo->mCreateMaxRoom = 0; ePVPDM_TEAM_TYPE minTeam = ePVPDM_TEAMTYPE_A; if( teamCnt[ePVPDM_TEAMTYPE_A] > teamCnt[ePVPDM_TEAMTYPE_B] ) minTeam = ePVPDM_TEAMTYPE_B; if( mpDMInfo->mTeamPlayerMax == 0 ) continue; pLevelForceInfo->mCreateMaxRoom = teamCnt[minTeam] / mpDMInfo->mTeamPlayerMax; if( teamCnt[minTeam] % mpDMInfo->mTeamPlayerMax >= mpDMInfo->mTeamPlayerMin ) ++pLevelForceInfo->mCreateMaxRoom; } } /// ³»ºÎ¼­¹ö°£ Åë½Å(udp)À»À§ÇÑ ¸Þ¸ð¸®¸¦ ¾òÀ½ PerIoContext* perIoContext = NETWORK2->GetIoContext( IOCP_REQUEST_WRITE ); MSG_SYN_POSTPVP_PLAYERLIST* pList = (MSG_SYN_POSTPVP_PLAYERLIST*)perIoContext->buffer; pList->mAryPos = select->aryPos; /// Âü¿© °¡´ÉÀÚ¿Í ºÒ°¡´ÉÀÚ ±¸º° for( int i = 0 ; i < select->rowCount ; ++i ) { /// ³»ºÎ¼­¹ö Àü¼Û¿ë ¸Þ¼¼Áö ÀÛ¼º pList->mList[i].mCharacterChannel = select->table[i].characterChannel; pList->mList[i].mPlayerIdx = select->table[i].characterIdx; pList->mList[i].mLevel = select->table[i].characterLevel; pList->mList[i].mForceType = select->table[i].characterForceType; pList->mList[i].mSelection = false; sLevelForceInfo* pLevelForceInfo = (sLevelForceInfo*)mLevelForceMap.GetAt( select->table[i].characterLevel ); if( pLevelForceInfo == NULL ) continue; if( pLevelForceInfo->mCreateMaxRoom == 0 ) continue; /// aÆÀ bÆÀ ±¸ºÐ ePVPDM_TEAM_TYPE teamType = ePVPDM_TEAMTYPE_A; if( pLevelForceInfo->mATeam[select->table[i].characterForceType] == false ) teamType = ePVPDM_TEAMTYPE_B; if( mpDMInfo->mTeamPlayerMax == 0 ) continue; /// ÀÔÀå °¡´É È®ÀÎ - Àοø ¹èºÐ if( pLevelForceInfo->mTeamCnt[teamType] <= mpDMInfo->mTeamPlayerMax * pLevelForceInfo->mCreateMaxRoom ) { ++pLevelForceInfo->mTeamCnt[teamType]; pList->mList[i].mSelection = true; } } pList->mCount = select->rowCount; /// Âü¿© °¡´ÉÀÚ¿Í ºÒ°¡´ÉÀÚ ¸ñ·ÏÀ» °ÔÀÓ¼­¹ö·Î ¹ß¼Û NETWORK2->PostPVPPlayerList( (char*)pList, pList->GetMsgLength() ); /// ³»ºÎ¼­¹ö°£ Åë½Å¿ë ¸Þ¸ð¸® ÇØÁ¦ perIoContext->offset = pList->GetMsgLength(); NETWORK2->ReleaseIoContext( perIoContext, "cPVPManager::TeamDivision ReleaseIoContext" ); } unsigned short cPVPManager::JoinDeathMatch( cPlayer* player, float* x, float* y ) { if( player == 0 ) { NETWORK2->PostServerEvent( "cPVPManager::JoinDeathMatch player is null" ); return 0; } if( x == NULL || y == NULL ) { NETWORK2->PostServerEvent( "cPVPManager::JoinDeathMatch x,y is null" ); return 0; } /// gmÅø ÀÔÀåÀº ¹æ»ý¼º¾øÀÌ °­Á¦ ¸¶Áö¸·¸Ê ÁøÀÔ if( IsGmPlayer( player->GetObjectID() ) == true ) { player->SetPvPDMTeam( ePVPDM_TEAMTYPE_MAX ); unsigned long posIdx = GetTeamGenPosIdx( ePVPDM_TEAMTYPE_A ); if( posIdx == 0 ) { NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch GM posIdx == 0"); } else { if ( STAGESCRIPT->CalcTargetMapPos( posIdx, x, y ) == false ) NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch GM if( STAGESCRIPT->CalcTargetMapPos( %d, %.0f, %.0f ) == false", posIdx, x, y); } return INDUN_MAP_MAX; } sLevelForceInfo* pInfo = (sLevelForceInfo*)mLevelForceMap.GetAt( player->GetLevel() ); if( pInfo == NULL ) { NETWORK2->PostServerEvent( "cPVPManager::JoinDeathMatch pInfo is null(%d)", player->GetLevel() ); return 0; } /// »ý¼ºµÈ ¹æ¿¡ ³Ö¾îº»´Ù. unsigned int roomCnt = pInfo->mPvPObjectIdxAry.GetSize(); for( unsigned int i=0; iGetPvPObject( &mPvPObjectRoot, pInfo->mPvPObjectIdxAry[i] ); if( pObj == NULL ) continue; /// Ç÷¹À̾ ÀÔÀå °¡´ÉÇϸé ÀÔÀå ÈÄ ¸®ÅÏ if( pObj->JoinTeam( player ) == 0 ) { ePVPDM_TEAM_TYPE type = (ePVPDM_TEAM_TYPE)player->GetPvPDMTeam(); unsigned long posIdx = GetTeamGenPosIdx( type ); if( posIdx == 0 ) { NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch posIdx == 0"); } else { if ( STAGESCRIPT->CalcTargetMapPos( posIdx, x, y ) == false ) NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch if( STAGESCRIPT->CalcTargetMapPos( %d, %.0f, %.0f ) == false", posIdx, x, y); } return (unsigned short)pInfo->mPvPObjectIdxAry[i]; } } /// ½Å±Ô¹æ »ý¼º if( mDMMaxCnt >= INDUN_MAP_MAX ) { NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch (mDMMaxCnt > %d)", INDUN_MAP_MAX ); return 0; } cBaseDeathMatch* newPvPObj = 0; switch( NETWORK2->GetInDunMapNum() ) { case MAP_DEATHMATCH: { cDeathMatchObject* pDm = new cDeathMatchObject; newPvPObj = (cBaseDeathMatch*)pDm; } break; case MAP_FLAG: { cDeathMatch2Object* pDm = new cDeathMatch2Object; newPvPObj = (cBaseDeathMatch*)pDm; } break; default: NETWORK2->PostServerEvent( "cPVPManager::JoinDeathMatch mPvPType error(%d)", NETWORK2->GetInDunMapNum() ); return 0; } ++mDMMaxCnt; unsigned short dmIdx = mDMMaxCnt; if( newPvPObj->Init( dmIdx, pInfo ) == false ) { PVPOBJECTPOOL->ReleasePvPObject( &mPvPObjectRoot, dmIdx ); NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch pDMObject->Init( %d ) == false", dmIdx ); return 0; } int retcode = newPvPObj->JoinTeam( player ); if( retcode != 0 ) { PVPOBJECTPOOL->ReleasePvPObject( &mPvPObjectRoot, dmIdx ); NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch pDMObject->JoinTeam DMIdx(%d,%d)", dmIdx, retcode ); return 0; } ePVPDM_TEAM_TYPE type = (ePVPDM_TEAM_TYPE)player->GetPvPDMTeam(); unsigned long posIdx = GetTeamGenPosIdx( type ); if( posIdx == 0 ) { NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch posIdx == 0"); } else { if ( STAGESCRIPT->CalcTargetMapPos( posIdx, x, y ) == false ) NETWORK2->PostServerEvent("cPVPManager::JoinDeathMatch if( STAGESCRIPT->CalcTargetMapPos( %d, %.0f, %.0f ) == false", posIdx, x, y); } /// »ý¼ºµÈ °´Ã¼¸¦ ·¹º§±¸°£º° ¸ñ·Ï¿¡µµ ³Ö¾îÁØ´Ù. pInfo->mPvPObjectIdxAry.PushBack( dmIdx ); return dmIdx; } void cPVPManager::DelAryInsertPVP( unsigned long pvpDMIdx ) { mDelDMAry.PushBack( pvpDMIdx ); } void cPVPManager::MemberOut( unsigned long pvpIdx, unsigned long playerIdx, ePVPDM_TEAM_TYPE teamType ) { cBaseDeathMatch* pPvPDM = GetPvPDMObject( pvpIdx ); if( pPvPDM != NULL ) { pPvPDM->OutMember( playerIdx, teamType ); } } unsigned long cPVPManager::GetTeamPlayerMax() { if( mpDMInfo ) return mpDMInfo->mTeamPlayerMax; return 0; } unsigned long cPVPManager::GetTeamPlayerMin() { if( mpDMInfo ) return mpDMInfo->mTeamPlayerMin; return 0; } void cPVPManager::AddReadyPlayer( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; if( pPlayer->GetPvPJoinAryPos() != ULONG_MAX ) return; for( unsigned long i = 0 ; i < PVP_DM_LEVEL_SECTION_MAX ; ++i ) { if( pPlayer->GetLevel() < mSectionInfo[i].mMinLevel || mSectionInfo[i].mMaxLevel < pPlayer->GetLevel() ) continue; pPlayer->SetPvPJoinAryPos( i ); mSectionInfo[i].mReadyPlayerSet.Insert( pPlayer->GetObjectID() ); return; } NETWORK2->PostServerEvent( "cPVPManager::AddReadyPlayer[%d]", pPlayer->GetObjectID() ); } void cPVPManager::DelReadyPlayer( cPlayer* pPlayer ) { if( pPlayer == NULL ) return; unsigned long aryPos = pPlayer->GetPvPJoinAryPos(); if( aryPos >= PVP_DM_LEVEL_SECTION_MAX ) { NETWORK2->PostServerEvent( "cPVPManager::DelReadyPlayer[%d]", aryPos ); return; } pPlayer->SetPvPJoinAryPos( ULONG_MAX ); mSectionInfo[aryPos].mReadyPlayerSet.Erase( pPlayer->GetObjectID() ); } void cPVPManager::SendNotPvPIn( unsigned long aryPos ) { if( aryPos >= PVP_DM_LEVEL_SECTION_MAX ) return; cHashSet::cIterator b = mSectionInfo[aryPos].mReadyPlayerSet.Begin(); cHashSet::cIterator e = mSectionInfo[aryPos].mReadyPlayerSet.End(); for( ; b != e ; ++b ) { unsigned long playerIdx = *b; cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( playerIdx ); if( pPlayer == NULL ) continue; if( pPlayer->GetPvPJoinAryPos() == ULONG_MAX ) continue; pPlayer->SetPvPJoinAryPos( ULONG_MAX ); /// ÀÔÀå ºÒ°¡¸Þ¼¼Áö ¹ß¼Û if( pPlayer->GetGameIn() == true ) NETWORK2->SendMsgError( pPlayer->GetConnectionIdx( ), NM_PVP, NM_PVP_JOIN_SYN, 99 ); } mSectionInfo[aryPos].mReadyPlayerSet.Clear(); } bool cPVPManager::IsGmPlayer( unsigned long playerIdx ) { cHashSet::cIterator b = mGmPlayer.Find( playerIdx ); cHashSet::cIterator e = mGmPlayer.End(); if( b == e ) return false; mGmPlayer.Erase( playerIdx ); return true; } unsigned long cPVPManager::GetTeamGenPosIdx( ePVPDM_TEAM_TYPE teamType ) { if( teamType >= ePVPDM_TEAMTYPE_MAX ) { assert(0); return 0; } return mTeamGenPos[teamType]; } //void cPVPManager::SendReadyLeftTime( cPlayer* pPlayer ) //{ // if( pPlayer == NULL ) // return; // // /// ÀÔÀåÈÄ ÀüÅõ ½ÃÀÛ±îÁö ³²Àº½Ã°£ ¹ß¼Û // if( mProcess == ePVPPROCESS_JOINREADY ) // { // /// ³²Àº½Ã°£ °è»ê // unsigned long leftTime = 0; // if( mNextEventTime > NETWORK2->GetAccumTime() ) // leftTime = mNextEventTime - NETWORK2->GetAccumTime(); // // /// ÀüÅõ½ÃÀÛ±îÁö ³²Àº½Ã°£ ¹ß¼Û // HANDLE handle = NULL; // MSG_SYN_PVP_JOINTIME* sendMsg = (MSG_SYN_PVP_JOINTIME*)NETWORK2->GetMsgRoot( &handle, pPlayer->GetConnectionIdx( ), // NM_PVP, NM_PVP_DM_JOINTIME_SYN ); // if ( sendMsg != NULL ) // { // sendMsg->mFightLeftTime = leftTime; // NETWORK2->SendMsgRoot( handle, sizeof(MSG_SYN_PVP_JOINTIME) ); // } // // return; // } // /// ÀÔÀåÈÄ ÀÌ¹Ì ÀüÅõ°¡ ½ÃÀÛÇßÀ¸¸é ½ÃÀÛÀ» ¾Ë¸² // else if( mProcess == ePVPPROCESS_RUN ) // { // cBaseDeathMatch* pDM = GetPvPDMObject( pPlayer->GetPvPDMIdx() ); // if( pDM != NULL && pDM->SendFight( pPlayer ) == true ) // return; // } // // /// ÀüÅõÁøÇà ºÒ°¡¸¦ ¾Ë¸² // NETWORK2->SendMsgRoot( pPlayer->GetConnectionIdx( ), NM_PVP, NM_PVP_DM_NOTREADY_SYN ); //} unsigned long cPVPManager::GetSectionAryPos( unsigned char level ) { for( unsigned long i = 0 ; i < PVP_DM_LEVEL_SECTION_MAX ; ++i ) { if( mSectionInfo[i].mMinLevel <= level && level <= mSectionInfo[i].mMaxLevel ) return i; } return ULONG_MAX; } sSecionInfo* cPVPManager::GetSectionInfo( unsigned long aryPos ) { if( aryPos < PVP_DM_LEVEL_SECTION_MAX ) return &mSectionInfo[aryPos]; return NULL; } void cPVPManager::SendMsgSynPvPReadyClose( unsigned long aryPos ) { if( aryPos >= PVP_DM_LEVEL_SECTION_MAX ) return; cHashSet::cIterator b = mSectionInfo[aryPos].mReadyPlayerSet.Begin(); cHashSet::cIterator e = mSectionInfo[aryPos].mReadyPlayerSet.End(); for( ; b != e ; ++b ) { unsigned long playerIdx = *b; cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( playerIdx ); if( pPlayer == NULL ) continue; if( pPlayer->GetPvPJoinAryPos() == ULONG_MAX ) continue; /// ÀÔÀå ºÒ°¡¸Þ¼¼Áö ¹ß¼Û if( pPlayer->GetGameIn() == true ) NETWORK2->SendMsgRoot( pPlayer->GetConnectionIdx( ), NM_PVP, NM_PVP_READYCLOSE_SYN ); } }