#include "StdAfx.h" #include "DNUserSession.h" #include "DNUserSessionManager.h" #include "DNMasterConnection.h" #include "DNDBConnection.h" #include "DNDBConnectionManager.h" #include "DNServiceConnection.h" #include "DNIocpManager.h" #include "Log.h" #include "DNPeriodQuestSystem.h" #include "DNGuildWarManager.h" CDNUserSessionManager* g_pUserSessionManager; CDNUserSessionManager::CDNUserSessionManager(void) { m_dwChangeSaveTick = m_dwLastSaveTick = 0; m_pChangeSaveBuffer = new CBuffer(1024 * 1024 * 10); m_pLastSaveBuffer = new CBuffer(1024 * 1024 * 10); m_bServiceClose = false; m_nProcessCount = 0; Clear(); } CDNUserSessionManager::~CDNUserSessionManager(void) { SAFE_DELETE(m_pChangeSaveBuffer); SAFE_DELETE(m_pLastSaveBuffer); } void CDNUserSessionManager::Clear() { { ScopeLock lock(m_AccountLock); m_pMapAccountDBID.clear(); m_pMapSessionID.clear(); } { ScopeLock lock(m_NameLock); m_pMapName.clear(); } { ScopeLock lock(m_VecLock); m_pVecSession.clear(); } } void CDNUserSessionManager::ExternalDoUpdate(DWORD CurTick) { TQUpdateCharacter Update; CDNDBConnection *pDBCon = NULL; // ¼­¹ö ¹Ù²Ü¶§ ¿ä±â·Î if (m_pChangeSaveBuffer->GetCount() > 0){ if (CurTick >= m_dwChangeSaveTick + 50){ if (m_pChangeSaveBuffer->View((char*)&Update, sizeof(TQUpdateCharacter)) == 0){ { ScopeLock Lock(m_AccountLock); CDNUserSession* pSession = FindUserSessionByAccountDBIDAsync( Update.nAccountDBID ); if( pSession ) { pDBCon = pSession->GetDBConnection(); } else { pDBCon = g_pDBConnectionManager->GetDBConnection( Update.uiDBRandomSeed, Update.cThreadID ); } } if (pDBCon) { //±â°£ Áö³­ ¾ÆÀÌÅÛ »èÁ¦¸ÕÀú ÁøÇà pDBCon->QueryDelExpireitem(Update.cThreadID, Update.cWorldSetID, Update.nAccountDBID, Update.biCharacterDBID); pDBCon->AddSendData(MAINCMD_STATUS, QUERY_CHANGESERVERUSERDATA, (char*)&Update, sizeof(TQUpdateCharacter)); m_pChangeSaveBuffer->Skip(sizeof(TQUpdateCharacter)); } #ifdef PRE_ADD_CHAGNESERVER_LOGGING else { g_Log.Log(LogType::_ERROR, L"ExternalDoUpdate pDBCon == NULL [ADBID:%d]\n", Update.nAccountDBID); } #endif //#ifdef PRE_ADD_CHAGNESERVER_LOGGING } m_dwChangeSaveTick = CurTick; } } // °Á À¯Àú ²÷À»¶§ if (m_pLastSaveBuffer->GetCount() > 0){ if (CurTick >= m_dwLastSaveTick + 50){ if (m_pLastSaveBuffer->View((char*)&Update, sizeof(TQUpdateCharacter)) == 0){ { ScopeLock Lock(m_AccountLock); CDNUserSession* pSession = FindUserSessionByAccountDBIDAsync( Update.nAccountDBID ); if( pSession ) { pDBCon = pSession->GetDBConnection(); } else { pDBCon = g_pDBConnectionManager->GetDBConnection( Update.uiDBRandomSeed, Update.cThreadID ); } } if (pDBCon){ pDBCon->AddSendData(MAINCMD_STATUS, QUERY_LASTUPDATEUSERDATA, (char*)&Update, sizeof(TQUpdateCharacter)); m_pLastSaveBuffer->Skip(sizeof(TQUpdateCharacter)); } #ifdef PRE_ADD_CHAGNESERVER_LOGGING else { g_Log.Log(LogType::_ERROR, L"ExternalDoUpdate pDBCon == NULL [ADBID:%d]\n", Update.nAccountDBID); } #endif //#ifdef PRE_ADD_CHAGNESERVER_LOGGING } m_dwLastSaveTick = CurTick; } } //ServiceClose Flow if (m_bServiceClose) { if (m_pLastSaveBuffer->GetCount() <= 0 && m_pChangeSaveBuffer->GetCount() <= 0) { if (g_pServiceConnection) //¼­ºñ½º¸Å´ÏÀú¿¡°Ô ó¸®ÇÒ²¨ ´Ù ³¡³µ´Ù°í ¾Ë¸°´Ù. g_pServiceConnection->SendServiceClosed(); m_bServiceClose = false; } } } void CDNUserSessionManager::InternalDoUpdate(DWORD CurTick) { #ifdef PRE_FIX_VILLAGEZOMBIE DWORD dwCurTick = timeGetTime(); std::vector vDeletedSession; #endif //#ifdef PRE_FIX_VILLAGEZOMBIE if (!m_pVecSession.empty()){ ScopeLock Lock(m_VecLock); int Count = (int)m_pVecSession.size(); if (Count > CONNECTIONPROCESSCOUNT) Count = CONNECTIONPROCESSCOUNT; for (int i = 0; i < Count; i++){ if (m_nProcessCount >= (int)m_pVecSession.size()) m_nProcessCount = 0; CSocketContext* pSocketContext = m_pVecSession[m_nProcessCount]; if( pSocketContext == NULL ) continue; CScopeInterlocked Scope( &pSocketContext->m_lActiveCount ); if( Scope.bIsDelete() ) continue; CDNUserSession* pSession = reinterpret_cast(pSocketContext->GetParam()); if( pSession == NULL ) continue; #ifdef PRE_FIX_VILLAGEZOMBIE if (pSession->GetInsideDisconnectTick() > 0 && pSession->GetInsideDisconnectTick() + (60*1000*5) < dwCurTick) { vDeletedSession.push_back(pSession); continue; } #endif //#ifdef PRE_FIX_VILLAGEZOMBIE pSession->DoUpdate(CurTick); m_nProcessCount++; } } #ifdef PRE_FIX_VILLAGEZOMBIE std::vector ::iterator ii; for (ii = vDeletedSession.begin(); ii != vDeletedSession.end(); ii++) { (*ii)->SetZombieChecked(); (*ii)->DetachConnection(L"Zombie Check!"); } #endif //#ifdef PRE_FIX_VILLAGEZOMBIE } CDNUserSession *CDNUserSessionManager::AddSession(const char *pIp, const USHORT nPort) { CDNUserSession *pUserSession = new CDNUserSession; if (!pUserSession) return NULL; pUserSession->SetIp(pIp); pUserSession->SetPort(nPort); return pUserSession; } bool CDNUserSessionManager::DelSession(CDNUserSession *pUserSession, CSocketContext* pDelSocketContext ) { if (!pUserSession) return false; { ScopeLock Lock(m_AccountLock); if (!m_pMapSessionID.empty()){ TMapSession::iterator iterS = m_pMapSessionID.find(pUserSession->GetSessionID()); if (iterS != m_pMapSessionID.end()){ m_pMapSessionID.erase(iterS); } else { g_Log.Log(LogType::_ERROR, pUserSession, L"[DelSession] m_pMapSessionID fail!\r\n"); return false; // ¼¼¼ÇÀÌ ¾ø´Â ³ÑÀº ¹Ø¿¡ ¾Öµéµµ Áö¿öÁÖÁö ¾Ê´Â´Ù. } } if (!m_pMapAccountDBID.empty()){ TMapSession::iterator iterA = m_pMapAccountDBID.find(pUserSession->GetAccountDBID()); if (iterA != m_pMapAccountDBID.end()){ m_pMapAccountDBID.erase(iterA); } else g_Log.Log(LogType::_ERROR, pUserSession, L"[DelSession] m_pMapAccountDBID fail!\r\n"); } } { ScopeLock Lock(m_NameLock); if (!m_pMapName.empty()){ TMapNameSession::iterator itername = m_pMapName.find(pUserSession->wszName()); if (itername != m_pMapName.end()){ if (itername->second != pUserSession){ g_Log.Log(LogType::_ERROR, L"[ObjID:%u] DelSession(m_pMapName) invalid (%s) %x %x\r\n", pUserSession->GetObjectID(), pUserSession->wszName(), itername->second, pUserSession); } m_pMapName.erase(itername); } /* else { for (itername = m_pMapName.begin(); itername != m_pMapName.end(); itername++) { if ((*itername).second == (pUserSession) || (*itername).second->GetAccountDBID() == pUserSession->GetAccountDBID()) { //ÀÌ·²°æ¿ì ÆÄÀε尡 ¾ÈµÈ°Å´Ù. ÄÁÅ×ÀÌ³Ê »çÀÌÁî°¡ Â÷À̰¡ ³ª´Â °æ¿ì°¡ »ý±â´Â °É·Î ºÁ¼­ Áö¿öÁú¶§ Á¦´ë·Î ¾ÈÁö¿öÁö´Â °æ¿ì°¡ Àִµí g_Log.Log(LogType::_DELOBJECT_NAMEKEYFINDERR, L"[ObjID:%u] DelSession(m_pMapName) FindErr (%s) %x %x\r\n", pUserSession->GetObjectID(), pUserSession->wszName(), itername->second, pUserSession); m_pMapName.erase(itername); break; } } } */ } } { ScopeLock lock(m_VecLock); if (!m_pVecSession.empty()){ for (int i = 0; i < (int)m_pVecSession.size(); ++i) { CSocketContext* pSocketContext = m_pVecSession[i]; if( pSocketContext == NULL ) continue; if( pSocketContext != pDelSocketContext ) continue; CDNUserSession* pSession = reinterpret_cast(pSocketContext->GetParam()); if (pSession->GetAccountDBID() == pUserSession->GetAccountDBID()) { m_pVecSession.erase(m_pVecSession.begin() + i); break; } else { m_pVecSession.erase(m_pVecSession.begin() + i); g_Log.Log(LogType::_ERROR, pSession, L"m_pVecSession erase Failed!! AccountDBID different %d!=%d\r\n", pSession->GetAccountDBID(), pUserSession->GetAccountDBID() ); break; } } } } pUserSession->FinalizeEvent(); pUserSession->LeaveWorld(); pUserSession->FinalObject(); return true; } bool CDNUserSessionManager::InsertSession(CDNUserSession *pUserSession) { if (!pUserSession) return false; CDNUserSession *pExistUser = FindUserSessionByAccountDBID(pUserSession->GetAccountDBID()); if (pExistUser){ pExistUser->DetachConnection(L"Connect|InsertSession fail"); // ¿ø·¡ ÀÖ´ø¾Ö¸¦ ²÷¾î¹ö¸°´Ù g_Log.Log(LogType::_ERROR, pExistUser, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] AccountDBID Duplicate!!\r\n", pExistUser->GetAccountDBID(), pExistUser->GetCharacterDBID(), pExistUser->GetSessionID(), pExistUser->GetObjectID()); return false; } pExistUser = FindUserSession(pUserSession->GetSessionID()); if( pExistUser) { pExistUser->DetachConnection(L"Connect|InsertSession fail"); // ¿ø·¡ ÀÖ´ø¾Ö¸¦ ²÷¾î¹ö¸°´Ù g_Log.Log(LogType::_ERROR, pExistUser, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] SessionID Duplicate!!\r\n", pExistUser->GetAccountDBID(), pExistUser->GetCharacterDBID(), pExistUser->GetSessionID(), pExistUser->GetObjectID()); return false; } { ScopeLock Lock(m_AccountLock); std::pair Ret = m_pMapAccountDBID.insert(make_pair(pUserSession->GetAccountDBID(), pUserSession)); if (Ret.second == false){ pUserSession->DetachConnection(L"ModifySession(m_pMapAccountDBID) fail"); g_Log.Log(LogType::_ERROR, pUserSession, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] m_pMapAccountDBID fail\r\n", pUserSession->GetAccountDBID(), pUserSession->GetCharacterDBID(), pUserSession->GetSessionID(), pUserSession->GetObjectID()); return false; } Ret = m_pMapSessionID.insert(make_pair(pUserSession->GetSessionID(), pUserSession)); if (Ret.second == false){ pUserSession->DetachConnection(L"ModifySession(m_pMapSessionID) fail"); g_Log.Log(LogType::_ERROR, pUserSession, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] m_pMapSessionID fail\r\n", pUserSession->GetAccountDBID(), pUserSession->GetCharacterDBID(), pUserSession->GetSessionID(), pUserSession->GetObjectID()); return false; } } { ScopeLock lock(m_VecLock); m_pVecSession.push_back( pUserSession->GetSocketContext() ); } return true; } bool CDNUserSessionManager::DelTempSession(CDNUserSession *pUserSession, CSocketContext* pDelSocketContext ) { ScopeLock lock(m_VecTempLock); if (m_pVecTempSession.empty() == false) { for (int i = 0; i < (int)m_pVecTempSession.size(); ++i) { if (m_pVecTempSession[i] == pUserSession) { m_pVecTempSession.erase(m_pVecTempSession.begin() + i); return true; } } } return false; } bool CDNUserSessionManager::InsertTempSession(CDNUserSession * pUserSession) { ScopeLock lock(m_VecTempLock); for (TVecTempSession::iterator ii = m_pVecTempSession.begin(); ii != m_pVecTempSession.end(); ii++) { if ((*ii)->GetSessionID() == pUserSession->GetSessionID() || (*ii) == pUserSession) { g_Log.Log(LogType::_ERROR, pUserSession, L"InsertTempSession Failed!!\n"); return false; } } m_pVecTempSession.push_back(pUserSession); return true; } bool CDNUserSessionManager::InsertSessionByName(CDNUserSession *pUserSession) { if (!pUserSession) return false; if (FindUserSessionByName(pUserSession->wszName())){ pUserSession->DetachConnection(L"Connect|InsertSessionByName Failed"); g_Log.Log(LogType::_ERROR, pUserSession, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] InsertSessionByName failed\r\n", pUserSession->GetAccountDBID(), pUserSession->GetCharacterDBID(), pUserSession->GetSessionID(), pUserSession->GetObjectID()); return false; } ScopeLock Lock(m_NameLock); m_pMapName[pUserSession->wszName()] = pUserSession; return true; } bool CDNUserSessionManager::SwapUserKeyName(const WCHAR *pwszOriginName, const WCHAR* pwszCharacterName) { if (m_pMapName.empty()) return NULL; ScopeLock Lock(m_NameLock); TMapNameSession::iterator iter = m_pMapName.find(pwszOriginName); if (iter != m_pMapName.end()) { CDNUserSession* pUserSession = iter->second; if (pUserSession == NULL) { g_Log.Log(LogType::_ERROR, L"SwapUserKeyName pUserSession == NULL\n"); return false; } m_pMapName.erase (pwszOriginName); if (pUserSession && pwszCharacterName) pUserSession->SetCharacterName(pwszCharacterName); m_pMapName[pUserSession->wszName()] = pUserSession; return true; } return false; } int CDNUserSessionManager::GetUserCount() { m_AccountLock.Lock(); int nCount = (int)m_pMapAccountDBID.size(); m_AccountLock.UnLock(); return nCount; } UINT CDNUserSessionManager::GetUserCount(std::map & pMap) { m_AccountLock.Lock(); pMap = m_MapChannelUserCount; UINT nCount = (UINT)m_pMapAccountDBID.size(); m_AccountLock.UnLock(); return nCount; } void CDNUserSessionManager::IncreaseChannelUserCount(int nChannelID) { ScopeLock Lock(m_AccountLock); std::map ::iterator ii = m_MapChannelUserCount.find(nChannelID); if (ii == m_MapChannelUserCount.end()) m_MapChannelUserCount[nChannelID] = 1; else (*ii).second++; } void CDNUserSessionManager::DecreaseChannelUserCount(int nChannelID) { ScopeLock Lock(m_AccountLock); std::map ::iterator ii = m_MapChannelUserCount.find(nChannelID); if (ii != m_MapChannelUserCount.end()) { if ((*ii).second > 0) (*ii).second--; } else _DANGER_POINT(); } void CDNUserSessionManager::SendAddUserList() { if (m_pMapSessionID.empty()){ g_pMasterConnection->SendEndofVillageInfo(); return; } ScopeLock lock(m_AccountLock); CDNUserSession *pSession = NULL; for (TMapSession::iterator iter = m_pMapSessionID.begin(); iter != m_pMapSessionID.end(); ++iter){ pSession = iter->second; if (pSession){ if (pSession->GetChannelID() <= 0) continue; g_pMasterConnection->SendAddUserList(pSession); g_Log.Log(LogType::_ERROR, pSession, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [SendAllAddUser]\r\n", pSession->GetAccountDBID(), pSession->GetCharacterDBID(), pSession->GetSessionID(), pSession->GetObjectID()); } } g_pMasterConnection->SendEndofVillageInfo(); } void CDNUserSessionManager::SendNotice(const WCHAR * pMsg, const int nLen, int nShowSec) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) iter->second->SendNotice(pMsg, nLen, nShowSec); } } void CDNUserSessionManager::SendChat(eChatType eType, int cLen, const WCHAR *pwszCharacterName, const WCHAR *pwszChatMsg, char cRet) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) iter->second->SendChat(eType, cLen, pwszCharacterName, pwszChatMsg); } } void CDNUserSessionManager::SendZoneChat(int nMapIdx, const WCHAR * pFromName, const WCHAR * pMsg, int nLen) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second && iter->second->GetMapIndex() == nMapIdx) iter->second->SendChat(CHATTYPE_CHANNEL, nLen, pFromName, pMsg); } } void CDNUserSessionManager::SendWorldSystemMsg(const WCHAR *pFromName, char cType, int nID, int nValue, const WCHAR *pToName) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) iter->second->SendWorldSystemMsg(cType, nID, pFromName, nValue, pToName); } } void CDNUserSessionManager::SendNoticeCancel() { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) iter->second->SendNoticeCancel(); } } void CDNUserSessionManager::SendCloseService(__time64_t _tNow, __time64_t _tOderedTime, __time64_t _tCloseTime) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) { iter->second->SendCloseService(_tNow, _tOderedTime, _tCloseTime); } } } void CDNUserSessionManager::SendSaleAbortList(BYTE cCount, int *nAbortList) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) iter->second->SendSaleAbortList(cCount, nAbortList); } } void CDNUserSessionManager::SendAssginPeriodQuest (UINT nQuestID, bool bFlag) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) { iter->second->GetQuest()->OnPeriodEvent(nQuestID, bFlag); iter->second->SendAssginPeriodQuest(nQuestID, bFlag); } } } void CDNUserSessionManager::SendPeriodQuestNotice(int nItemID, int nNoticeCount) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) iter->second->SendPeriodQuestNotice(nItemID, nNoticeCount); } } void CDNUserSessionManager::SendGuildWarEvent(short wScheduleID, char cEventStep, char cEventType) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter) { if (iter->second) { if( iter->second->GetGuildWarScheduleID() != wScheduleID ) { iter->second->GuildWarReset(); iter->second->SetGuildWarScheduleID(wScheduleID); } iter->second->SendGuildWarEvent(wScheduleID, cEventStep, cEventType); } } } void CDNUserSessionManager::SendGuildWarEventTime() { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter) { if (iter->second) { iter->second->SendGuildWarEventTime(g_pGuildWarManager->GetGuildWarSchedule(), g_pGuildWarManager->GetGuildWarFinalSchedule(), g_pGuildWarManager->GetFinalProgress()); } } } void CDNUserSessionManager::SendGuildWarTournamentWin(SCGuildWarTournamentWin* pPacket) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter) { if (iter->second) { iter->second->SendGuildWarTournamentWin(pPacket); } } } void CDNUserSessionManager::ResetGuildWarBuyedItems() { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for each (TMapSession::value_type v in m_pMapAccountDBID) { if (v.second) v.second->ResetGuildWarBuyedItems(); } } #ifdef PRE_ADD_CHAGNESERVER_LOGGING bool CDNUserSessionManager::AddSaveSendData(int nMainCmd, char *pData, int iLen) { int nRet = ERROR_DB; switch (nMainCmd) { case QUERY_CHANGESERVERUSERDATA: m_pChangeSaveBuffer->Push(pData, iLen); break; case QUERY_LASTUPDATEUSERDATA: m_pLastSaveBuffer->Push(pData, iLen); break; default: g_Log.Log(LogType::_ERROR, L"AddSaveSendData [MCMD:%d][LEN:%d]\n", nMainCmd, iLen); break; } if (nRet != ERROR_NONE) { g_Log.Log(LogType::_ERROR, L"AddSaveSendData [MCMD:%d][LEN:%d]\n", nMainCmd, iLen); } return nRet == ERROR_NONE ? true : false; } #else //#ifdef PRE_ADD_CHAGNESERVER_LOGGING void CDNUserSessionManager::AddSaveSendData(int nMainCmd, char *pData, int nSize) { switch (nMainCmd) { case QUERY_CHANGESERVERUSERDATA: m_pChangeSaveBuffer->Push(pData, nSize); //g_Log.Log(LogType::_NORMAL, L"[AddChangeSaveSendData] Size:%d\r\n", nSize); break; case QUERY_LASTUPDATEUSERDATA: m_pLastSaveBuffer->Push(pData, nSize); //g_Log.Log(LogType::_NORMAL, L"[AddLastSaveSendData] Size:%d\r\n", nSize); break; } } #endif void CDNUserSessionManager::DetachAllConnection() { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter){ if (iter->second) iter->second->DetachConnection(L"Server Close"); } m_bServiceClose = true; } #ifdef _USE_VOICECHAT void CDNUserSessionManager::TalkingUpdate(UINT * pMemberArr) { if (m_pMapAccountDBID.empty()) return; CDNUserSession * pSession = NULL; TTalkingInfo Info[PARTYMAX] = { 0, }; int i, nCount = 0, nArrCount = 0; ScopeLock lock(m_AccountLock); for (i = 0; i < PARTYMAX; i++) { if (pMemberArr[i] <= 0) continue; TMapSession::iterator ii = m_pMapAccountDBID.find(pMemberArr[i]); if (ii != m_pMapAccountDBID.end()) { pSession = (CDNUserSession*)ii->second; if (pSession->IsTalking(&Info[nCount].cTalking)) { Info[nCount].nSessionID = pSession->GetSessionID(); nCount++; } } } if (nCount <= 0) return; for (i = 0; i < PARTYMAX; i++) { if (pMemberArr[i] <= 0) continue; TMapSession::iterator ii = m_pMapAccountDBID.find(pMemberArr[i]); if (ii != m_pMapAccountDBID.end()) { pSession = (CDNUserSession*)ii->second; pSession->SendTalkingUpdate(nCount, Info); } } } #endif CDNUserSession * CDNUserSessionManager::FindUserSessionByAccountDBIDAsync(UINT nAccountDBID) { //»óÀ§¿¡¼­ µ¿±â°É°í µé¾î¿Í¾ß ÇÕ´Ï´Ù. m_AccountLock if (m_pMapAccountDBID.empty()) return NULL; CDNUserSession *pUserObj = NULL; TMapSession::iterator iter = m_pMapAccountDBID.find(nAccountDBID); if (iter != m_pMapAccountDBID.end()){ pUserObj = (CDNUserSession*)iter->second; return pUserObj; } return NULL; } CDNUserSession *CDNUserSessionManager::FindUserSession(UINT nSessionID) { if (m_pMapSessionID.empty()) return NULL; ScopeLock Lock(m_AccountLock); TMapSession::iterator iter = m_pMapSessionID.find(nSessionID); if (iter != m_pMapSessionID.end()) return iter->second; return NULL; } CDNUserSession *CDNUserSessionManager::FindUserSessionByName(const WCHAR *pwszName) { if (m_pMapName.empty()) return NULL; ScopeLock Lock(m_NameLock); TMapNameSession::iterator iter = m_pMapName.find(pwszName); if (iter != m_pMapName.end()) return iter->second; return NULL; } CDNUserSession *CDNUserSessionManager::FindUserSessionByObjectID(UINT nObjID) { if (m_pMapSessionID.empty()) return NULL; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapSessionID.begin(); iter != m_pMapSessionID.end(); ++iter){ if (iter->second->GetObjectID() == nObjID) return iter->second; } return NULL; } CDNUserSession* CDNUserSessionManager::FindUserSessionByAccountDBID(UINT nAccountDBID) { if (m_pMapAccountDBID.empty()) return NULL; ScopeLock Lock(m_AccountLock); TMapSession::iterator iter = m_pMapAccountDBID.find(nAccountDBID); if (iter != m_pMapAccountDBID.end()) return iter->second; return NULL; } CDNUserSession * CDNUserSessionManager::FindTempUserSession(UINT nSessionID) { ScopeLock Lock(m_VecTempLock); CDNUserSession * pSession = NULL; for (TVecTempSession::iterator ii = m_pVecTempSession.begin(); ii != m_pVecTempSession.end(); ii++) { if ((*ii)->GetSessionID() == nSessionID) { pSession = (*ii); m_pVecTempSession.erase(ii); break; } } return pSession; } #if defined( PRE_DRAGONBUFF ) void CDNUserSessionManager::ApplyWorldBuff( WCHAR *wszCharacterName, int nItemID, int nMapIdx ) { if (m_pMapAccountDBID.empty()) return; ScopeLock Lock(m_AccountLock); for (TMapSession::iterator iter = m_pMapAccountDBID.begin(); iter != m_pMapAccountDBID.end(); ++iter) { if (iter->second && iter->second->GetMapIndex() == nMapIdx) { iter->second->ApplyWorldBuff( wszCharacterName, nItemID ); } } } #endif