#include "StdAfx.h" #include ".\usermanager.h" #include "User.h" #include "GuidUserList.h" #include "CharNameUserList.h" #include #include #include // Ä£±¸ À§ÇØ #include // ¾Ïȣȭ À¯Àú À¯Áöº¸¼ö À§ÇØ #include #include "Lotto/Lotto.h" //__NA_000313_20070223_REALTIME_CHAT_BLOCK #ifdef _JP_0_20101123_PMS #include #endif UserManager::UserManager(void) { m_pGuidUserList = new GuidUserList; m_pCharGuidList = new GuidUserList; m_pCharNameUserList = new CharNameUserList; m_mapUserFriend.clear(); m_vecUserCrypt.clear(); m_mapChatBlocked.clear(); m_pFriendPool = new util::CMemoryPoolFactory; m_pBlockPool = new util::CMemoryPoolFactory; m_pRevengePool = new util::CMemoryPoolFactory; } UserManager::~UserManager(void) { SAFE_DELETE( m_pGuidUserList ); SAFE_DELETE( m_pCharGuidList ); SAFE_DELETE( m_pCharNameUserList ); FRIEND_USER_MAP_ITER iter; while( !m_mapUserFriend.empty() ) { iter = m_mapUserFriend.begin(); (*iter).second.clear(); m_mapUserFriend.erase(iter); } m_mapUserFriend.clear(); m_vecUserCrypt.clear(); m_mapChatBlocked.clear(); delete m_pFriendPool; delete m_pBlockPool; delete m_pRevengePool; } VOID UserManager::Init() { m_pGuidUserList->Init(); m_pCharGuidList->Init(); m_pCharNameUserList->Init(); m_mapUserFriend.clear(); //m_pFriendPool->Initialize( 500000, 250000 ); //m_pBlockPool->Initialize( 500000, 250000 ); //m_pRevengePool->Initialize( 500000, 25000 ); m_pFriendPool->Initialize( 50, 50 ); m_pBlockPool->Initialize( 50, 50 ); m_pRevengePool->Initialize( 50, 50 ); } VOID UserManager::Release() { m_pGuidUserList->Release(); m_pCharGuidList->Release(); m_pCharNameUserList->Release(); FRIEND_USER_MAP_ITER iter; while( !m_mapUserFriend.empty() ) { iter = m_mapUserFriend.begin(); (*iter).second.clear(); m_mapUserFriend.erase(iter); } m_mapUserFriend.clear(); m_pFriendPool->Release(); m_pBlockPool->Release(); m_pRevengePool->Release(); } // FriendCharGuid¸¦ Ä£±¸·Î ÁöÁ¤ÇÑ pUser Á¤º¸ Ãß°¡ BOOL UserManager::AddNewFriend( DWORD FriendCharGuid, User* pUser ) { // ÀÌ »ç¿ëÀÚÀÇ Ä£±¸µé ¸ñ·Ï Ãß°¡ FRIEND_USER_MAP_ITER iter; FRIEND_ATOM_MAP mapFriendAtom; // Ä£±¸°¡ µé¾î¿À¸é ¹Ù·Î µ¥ÀÌÅÍ ¾òÀ» ¼ö ÀÖµµ·Ï ³» Ä£±¸ Á¤º¸¸¦ µî·ÏÇÑ´Ù iter = m_mapUserFriend.find( FriendCharGuid ); if( iter != m_mapUserFriend.end() ) { // µ¥ÀÌÅÍ ÀÖÀ¸¸é ±× µÚ¿¡ Ãß°¡ (*iter).second.insert( FRIEND_ATOM_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é »õ·Î ¸¸µé¾î ³Ö´Â´Ù mapFriendAtom.insert( FRIEND_ATOM_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); m_mapUserFriend.insert( FRIEND_USER_MAP_PAIR( FriendCharGuid, mapFriendAtom ) ); } // ÀÌ Ä£±¸°¡ ¿Â¶óÀÎÀ̶ó¸é Ä£±¸ ÀνºÅϽº¿¡ '³»°¡ ³Ê¸¦ Ä£±¸ ¸Ô¾ú´Ù!'°í ÀúÀå½ÃŲ´Ù // ÀÌÈÄ pFriend°¡ ·Î±×¾Æ¿ôÇϸé pUser°¡ ¾Ë ¼ö ÀÖ´Ù User* pFriend = FindUserByCharGuid( FriendCharGuid ); if( pFriend ) { // ÀÌ Ä£±¸°¡ ³ª¸¦ Â÷´ÜÇß´Ù¸é ¾Ë·ÁÁÖÁö ¾Ê´Â´Ù if( !pFriend->FindBlock( pUser->GetCharGuid() ) ) { pFriend->AddOnlineFriend( pUser ); } } // MessageOut( eFULL_LOG, "[%s] AddNewFriend(%u)", pUser->GetCharName().c_str(), FriendCharGuid ); return TRUE; } BOOL UserManager::AddFriend( User* pUser ) { // ÀÌ »ç¿ëÀÚÀÇ Ä£±¸µé ¸ñ·Ï Ãß°¡ #ifdef _NA_0_20091104_FIRENDMAP_REFACTORYING STRUCT_FRIEND_INFO* pFriend = pUser->GetFriendMap()->GetFirstFriend(); #else STRUCT_FRIEND_INFO* pFriend = pUser->GetFirstFriend(); #endif FRIEND_USER_MAP_ITER iter; FRIEND_ATOM_MAP mapFriendAtom; // Ä£±¸°¡ µé¾î¿À¸é ¹Ù·Î µ¥ÀÌÅÍ ¾òÀ» ¼ö ÀÖµµ·Ï ³» Ä£±¸ Á¤º¸¸¦ µî·ÏÇÑ´Ù if( pFriend ) { do { iter = m_mapUserFriend.find( pFriend->dwFriendGuid ); if( iter != m_mapUserFriend.end() ) { // µ¥ÀÌÅÍ ÀÖÀ¸¸é ±× µÚ¿¡ Ãß°¡ (*iter).second.insert( FRIEND_ATOM_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é »õ·Î ¸¸µé¾î ³Ö´Â´Ù mapFriendAtom.insert( FRIEND_ATOM_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); m_mapUserFriend.insert( FRIEND_USER_MAP_PAIR( pFriend->dwFriendGuid, mapFriendAtom ) ); } #ifdef _NA_0_20091104_FIRENDMAP_REFACTORYING }while( pFriend = pUser->GetFriendMap()->GetNextFriend() ); #else }while( pFriend = pUser->GetNextFriend() ); #endif } // ÀÌ¹Ì µî·ÏµÈ Á¤º¸µé Áß¿¡ ³ª¸¦ µî·ÏÇÑ Á¤º¸°¡ ÀÖÀ¸¸é ³Ö¾îÁØ´Ù iter = m_mapUserFriend.find( pUser->GetCharGuid() ); if( iter != m_mapUserFriend.end() ) { // ÀÖÀ¸¸é ÀÌ°É À¯Àú¿¡°Ô µî·Ï FRIEND_ATOM_MAP_ITER iterAtom; if( !(*iter).second.empty() ) { for( iterAtom = (*iter).second.begin(); iterAtom != (*iter).second.end(); iterAtom++ ) { // ³»°¡ ÀÌ À¯Àú¸¦ Â÷´ÜÇß´Ù¸é ¾Ë·ÁÁÖÁö ¾Ê´Â´Ù if( !pUser->FindBlock( (*iterAtom).second->GetCharGuid() ) ) { pUser->AddOnlineFriend( (*iterAtom).second ); } } } } // MessageOut( eFULL_LOG, "[%s] AddFriend Complete", pUser->GetCharName().c_str() ); return TRUE; } VOID UserManager::RemoveNewFriend( DWORD FriendCharGuid, User *pUser ) { FRIEND_USER_MAP_ITER iter; FRIEND_ATOM_MAP_ITER iterAtom; // Ä£±¸ ¸ñ·Ï µ¥ÀÌÅÍ¿¡¼­ ÀÌ »ç¿ëÀÚÀÇ Ä£±¸µéÀ» ã´Â´Ù iter = m_mapUserFriend.find( FriendCharGuid ); if( iter != m_mapUserFriend.end() ) { // µ¥ÀÌÅÍ ÀÖÀ¸¸é iterAtom = (*iter).second.find( pUser->GetCharGuid() ); if( iterAtom != (*iter).second.end() ) { // À̳ðÀ» Ä£±¸ »ïÀº ³ªÀÇ µ¥ÀÌÅ͵µ ÀÖÀ¸¸é Áö¿öÁØ´Ù! (*iter).second.erase( iterAtom ); // Áö¿ì°í ³µ´õ´Ï ¸ÊÀÌ ºñ¾úÀ¸¸é ¸Êµµ Áö¿öÁØ´Ù! if( (*iter).second.empty() ) { m_mapUserFriend.erase( iter ); } } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é ¹ö±× MessageOut( eCRITICAL_LOG, "[%s] RemoveNewFriend Error - No Data[CharGuid:%u]", pUser->GetCharName().c_str(), FriendCharGuid ); return; } } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é ¹ö±× MessageOut( eCRITICAL_LOG, "[%s] RemoveNewFriend Error - No Data[CharGuid:%u]", pUser->GetCharName().c_str(), FriendCharGuid ); return; } // ÀÌ Ä£±¸°¡ ¿Â¶óÀÎÀ̶ó¸é ÀÌÂÊ¿¡¼­µµ µ¥ÀÌÅÍ Áö¿ö Áà¾ß ÇÑ´Ù User* pFriend = FindUserByCharGuid( FriendCharGuid ); if( pFriend ) { pFriend->RemoveOnlineFriend( pUser ); } // MessageOut( eFULL_LOG, "[%s] RemoveNewFriend(%u)", pUser->GetCharName().c_str(), FriendCharGuid ); } // Ä£±¸ ¸ñ·Ï ¾÷µ¥ÀÌÆ® - Ä£±¸ Á¦°Å!! VOID UserManager::RemoveFriend( User *pUser ) { // ÀÌ »ç¿ëÀÚÀÇ Ä£±¸µé Á¤º¸¸¦ Á¦°ÅÇÑ´Ù #ifdef _NA_0_20091104_FIRENDMAP_REFACTORYING STRUCT_FRIEND_INFO* pFriend = pUser->GetFriendMap()->GetFirstFriend(); #else STRUCT_FRIEND_INFO* pFriend = pUser->GetFirstFriend(); #endif FRIEND_USER_MAP_ITER iter; FRIEND_ATOM_MAP_ITER iterAtom; User *pOnlineUser = NULL; // Ä£±¸ ¸ñ·Ï µ¥ÀÌÅÍ¿¡¼­ ÀÌ »ç¿ëÀÚÀÇ Ä£±¸µéÀ» ã´Â´Ù if( pFriend ) { do { // Ä£±¸ Á¤º¸ ÀÖ³Ä? iter = m_mapUserFriend.find( pFriend->dwFriendGuid ); if( iter != m_mapUserFriend.end() ) { // µ¥ÀÌÅÍ ÀÖÀ¸¸é iterAtom = (*iter).second.find( pUser->GetCharGuid() ); if( iterAtom != (*iter).second.end() ) { // À̳ðÀ» Ä£±¸ »ïÀº ³ªÀÇ µ¥ÀÌÅ͵µ ÀÖÀ¸¸é Áö¿öÁØ´Ù! (*iter).second.erase( iterAtom ); // Áö¿ì°í ³µ´õ´Ï ¸ÊÀÌ ºñ¾úÀ¸¸é ¸Êµµ Áö¿öÁØ´Ù! if( (*iter).second.empty() ) { m_mapUserFriend.erase( iter ); } // ÀÌ Ä£±¸³ðÀÌ ¿Â¶óÀÎÀ̸é if( pFriend->sPacketInfo.bOnline ) { // ½ÇÁ¦ Á¢¼ÓÁßÀÎÁö ã¾Æ¼­ ¿Â¶óÀΠüũ Ç®¾îÁØ´Ù pOnlineUser = FindUserByCharGuid( pFriend->dwFriendGuid ); if( pOnlineUser ) { pOnlineUser->RemoveOnlineFriend( pUser ); } } } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é ¹ö±× MessageOut( eCRITICAL_LOG, "[%s] RemoveFriend Error - No %s FriendAtomTable", pUser->GetCharName().c_str(), pFriend->sPacketInfo.ptszFriendName ); } } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é ¹ö±× MessageOut( eCRITICAL_LOG, "[%s] RemoveFriend Error - No %s FriendTable", pUser->GetCharName().c_str(), pFriend->sPacketInfo.ptszFriendName ); continue; } #ifdef _NA_0_20091104_FIRENDMAP_REFACTORYING }while( pFriend = pUser->GetFriendMap()->GetNextFriend() ); #else }while( pFriend = pUser->GetNextFriend() ); #endif } // User°¡ »èÁ¦µÇ¸é¼­ OnlineFriend Á¤º¸µµ °°ÀÌ »èÁ¦µÇ¹Ç·Î ±»ÀÌ ÀÌ User Ŭ·¡½º¿¡ ÀÖ´Â m_mapOnlineFriend¸¦ »èÁ¦ÇÒ ÇÊ¿ä´Â ¾ø´Ù // MessageOut( eFULL_LOG, "[%s] RemoveFriend Complete", pUser->GetCharName().c_str() ); } //////////////////////////////////////// // ¸®º¥Áö °ü·Ã // RevengeCharGuid¸¦ º¹¼ö ´ë»óÀ¸·Î ÁöÁ¤ÇÑ pUser Á¤º¸ Ãß°¡ BOOL UserManager::AddNewRevenge( DWORD RevengeCharGuid, User* pUser ) { // ÀÌ »ç¿ëÀÚÀÇ º¹¼ö ´ë»óµé ¸ñ·Ï Ãß°¡ FRIEND_USER_MAP_ITER iter; FRIEND_ATOM_MAP mapRevengeAtom; // ±×³ðÀÌ µé¾î¿À¸é ¹Ù·Î µ¥ÀÌÅÍ ¾òÀ» ¼ö ÀÖµµ·Ï ³» ¸®º¥Áö Á¤º¸¸¦ µî·ÏÇÑ´Ù iter = m_mapUserRevenge.find( RevengeCharGuid ); if( iter != m_mapUserRevenge.end() ) { // µ¥ÀÌÅÍ ÀÖÀ¸¸é ±× µÚ¿¡ Ãß°¡ (*iter).second.insert( FRIEND_ATOM_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é »õ·Î ¸¸µé¾î ³Ö´Â´Ù mapRevengeAtom.insert( FRIEND_ATOM_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); m_mapUserRevenge.insert( FRIEND_USER_MAP_PAIR( RevengeCharGuid, mapRevengeAtom ) ); } // À̳ðÀÌ ¿Â¶óÀÎÀ̶ó¸é ¸®º¥Áö ÀνºÅϽº¿¡ '³»°¡ ³Ê¸¦ º¹¼ö ´ë»óÀ¸·Î ÂòÇß´Ù!'°í ÀúÀå½ÃŲ´Ù // ÀÌÈÄ pRevenge°¡ ·Î±×¾Æ¿ôÇϸé pUser°¡ ¾Ë ¼ö ÀÖ´Ù User* pRevenge = FindUserByCharGuid( RevengeCharGuid ); if( pRevenge ) { pRevenge->AddOnlineRevenge( pUser ); } // MessageOut( eFULL_LOG, "[%s] AddNewFriend(%u)", pUser->GetCharName().c_str(), FriendCharGuid ); return TRUE; } BOOL UserManager::AddRevenge( User* pUser ) { // ÀÌ »ç¿ëÀÚÀÇ º¹¼ö ´ë»óµé ¸ñ·Ï Ãß°¡ STRUCT_REVENGE_INFO* pRevenge = pUser->GetFirstRevenge(); FRIEND_USER_MAP_ITER iter; FRIEND_ATOM_MAP mapRevengeAtom; // Ä£±¸°¡ µé¾î¿À¸é ¹Ù·Î µ¥ÀÌÅÍ ¾òÀ» ¼ö ÀÖµµ·Ï ³» Ä£±¸ Á¤º¸¸¦ µî·ÏÇÑ´Ù if( pRevenge ) { do { iter = m_mapUserRevenge.find( pRevenge->dwRevengeCharGuid ); if( iter != m_mapUserRevenge.end() ) { // µ¥ÀÌÅÍ ÀÖÀ¸¸é ±× µÚ¿¡ Ãß°¡ (*iter).second.insert( FRIEND_ATOM_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é »õ·Î ¸¸µé¾î ³Ö´Â´Ù mapRevengeAtom.insert( FRIEND_ATOM_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); m_mapUserRevenge.insert( FRIEND_USER_MAP_PAIR( pRevenge->dwRevengeCharGuid, mapRevengeAtom ) ); } }while( pRevenge = pUser->GetNextRevenge() ); } // ÀÌ¹Ì µî·ÏµÈ Á¤º¸µé Áß¿¡ ³ª¸¦ µî·ÏÇÑ Á¤º¸°¡ ÀÖÀ¸¸é ³Ö¾îÁØ´Ù iter = m_mapUserRevenge.find( pUser->GetCharGuid() ); if( iter != m_mapUserRevenge.end() ) { // ÀÖÀ¸¸é ÀÌ°É À¯Àú¿¡°Ô µî·Ï FRIEND_ATOM_MAP_ITER iterAtom; if( !(*iter).second.empty() ) { for( iterAtom = (*iter).second.begin(); iterAtom != (*iter).second.end(); iterAtom++ ) { pUser->AddOnlineRevenge( (*iterAtom).second ); } } } // MessageOut( eFULL_LOG, "[%s] AddFriend Complete", pUser->GetCharName().c_str() ); return TRUE; } VOID UserManager::RemoveNewRevenge( DWORD RevengeCharGuid, User *pUser ) { FRIEND_USER_MAP_ITER iter; FRIEND_ATOM_MAP_ITER iterAtom; // ¸®º¥Áö ¸ñ·Ï µ¥ÀÌÅÍ¿¡¼­ ÀÌ »ç¿ëÀÚÀÇ º¹¼ö ´ë»óÀ» ã´Â´Ù iter = m_mapUserRevenge.find( RevengeCharGuid ); if( iter != m_mapUserRevenge.end() ) { // µ¥ÀÌÅÍ ÀÖÀ¸¸é iterAtom = (*iter).second.find( pUser->GetCharGuid() ); if( iterAtom != (*iter).second.end() ) { // À̳ðÀ» º¹¼ö ´ë»ó »ïÀº ³ªÀÇ µ¥ÀÌÅ͵µ ÀÖÀ¸¸é Áö¿öÁØ´Ù! (*iter).second.erase( iterAtom ); // Áö¿ì°í ³µ´õ´Ï ¸ÊÀÌ ºñ¾úÀ¸¸é ¸Êµµ Áö¿öÁØ´Ù! if( (*iter).second.empty() ) { m_mapUserRevenge.erase( iter ); } } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é ¹ö±× MessageOut( eCRITICAL_LOG, "[%s] RemoveNewRevenge Error - No Data[CharGuid:%u]", pUser->GetCharName().c_str(), RevengeCharGuid ); return; } } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é ¹ö±× MessageOut( eCRITICAL_LOG, "[%s] RemoveNewRevenge Error - No Data[CharGuid:%u]", pUser->GetCharName().c_str(), RevengeCharGuid ); return; } // À̳ðÀÌ ¿Â¶óÀÎÀ̶ó¸é ÀÌÂÊ¿¡¼­µµ µ¥ÀÌÅÍ Áö¿ö Áà¾ß ÇÑ´Ù User* pRevenge = FindUserByCharGuid( RevengeCharGuid ); if( pRevenge ) { pRevenge->RemoveOnlineRevenge( pUser ); } // MessageOut( eFULL_LOG, "[%s] RemoveNewFriend(%u)", pUser->GetCharName().c_str(), FriendCharGuid ); } // ¸®º¥Áö ¸ñ·Ï ¾÷µ¥ÀÌÆ® - º¹¼ö ´ë»ó Á¦°Å!! VOID UserManager::RemoveRevenge( User *pUser ) { // ÀÌ »ç¿ëÀÚÀÇ º¹¼ö ´ë»óµé Á¤º¸¸¦ Á¦°ÅÇÑ´Ù STRUCT_REVENGE_INFO* pRevenge = pUser->GetFirstRevenge(); FRIEND_USER_MAP_ITER iter; FRIEND_ATOM_MAP_ITER iterAtom; User *pOnlineUser = NULL; // ¸®º¥Áö ¸ñ·Ï µ¥ÀÌÅÍ¿¡¼­ ÀÌ »ç¿ëÀÚÀÇ Ä£±¸µéÀ» ã´Â´Ù if( pRevenge ) { do { // ¸®º¥Áö Á¤º¸ ÀÖ³Ä? iter = m_mapUserRevenge.find( pRevenge->dwRevengeCharGuid ); if( iter != m_mapUserRevenge.end() ) { // µ¥ÀÌÅÍ ÀÖÀ¸¸é iterAtom = (*iter).second.find( pUser->GetCharGuid() ); if( iterAtom != (*iter).second.end() ) { // À̳ðÀ» º¹¼ö ´ë»ó »ïÀº ³ªÀÇ µ¥ÀÌÅ͵µ ÀÖÀ¸¸é Áö¿öÁØ´Ù! (*iter).second.erase( iterAtom ); // Áö¿ì°í ³µ´õ´Ï ¸ÊÀÌ ºñ¾úÀ¸¸é ¸Êµµ Áö¿öÁØ´Ù! if( (*iter).second.empty() ) { m_mapUserRevenge.erase( iter ); } // À̳ðÀÌ ¿Â¶óÀÎÀ̸é if( pRevenge->sPacketInfo.bOnline ) { // ½ÇÁ¦ Á¢¼ÓÁßÀÎÁö ã¾Æ¼­ ¿Â¶óÀΠüũ Ç®¾îÁØ´Ù pOnlineUser = FindUserByCharGuid( pRevenge->dwRevengeCharGuid ); if( pOnlineUser ) { pOnlineUser->RemoveOnlineRevenge( pUser ); } } } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é ¹ö±× MessageOut( eCRITICAL_LOG, "[%s] RemoveRevenge Error - No %s FriendAtomTable", pUser->GetCharName().c_str(), pRevenge->sPacketInfo.ptszRevengeName ); } } else { // µ¥ÀÌÅÍ ¾øÀ¸¸é ¹ö±× MessageOut( eCRITICAL_LOG, "[%s] RemoveRevenge Error - No %s RevengeTable", pUser->GetCharName().c_str(), pRevenge->sPacketInfo.ptszRevengeName ); continue; } }while( pRevenge = pUser->GetNextRevenge() ); } // User°¡ »èÁ¦µÇ¸é¼­ OnlineFriend Á¤º¸µµ °°ÀÌ »èÁ¦µÇ¹Ç·Î ±»ÀÌ ÀÌ User Ŭ·¡½º¿¡ ÀÖ´Â m_mapOnlineFriend¸¦ »èÁ¦ÇÒ ÇÊ¿ä´Â ¾ø´Ù // MessageOut( eFULL_LOG, "[%s] RemoveFriend Complete", pUser->GetCharName().c_str() ); } // ¾Ïȣȭ »ç¿ëÀÚ Ãß°¡ VOID UserManager::AddCryptoUser( User *pUser ) { m_vecUserCrypt.push_back( pUser ); pUser->SetCryptTime( GetTickCount() ); } VOID UserManager::UpdateCryptoUser() { CRYPTO_USER_VECTOR_ITER iter; User *pUser; DWORD dwTickCount = GetTickCount(); if( m_vecUserCrypt.empty() ) { return; } for( iter = m_vecUserCrypt.begin(); iter < m_vecUserCrypt.end(); iter++ ) { pUser = (*iter); // ¾Ïȣȭ°¡ ³¡³­ ³ðÀÌ¸é ¿©±â ³Ö¾îµÑ Çʿ䰡 ¾ø´Ù if( !pUser->IsCrypting() ) { m_vecUserCrypt.erase( iter ); continue; } // ½Ã°£ ¿À¹öµÇ¸é °­Á¦Á¾·á if( pUser->ISCryptTimeOut( dwTickCount ) ) { MessageOut( eFULL_LOG, "[GUID:%u] User Crypt TimeOut", pUser->GetGUID() ); pUser->Logout(); // Logout¿¡¼­ iterµµ Á¦°ÅÇÑ´Ù } } } // äÆÃ±ÝÁöÀÚ ¸ñ·Ï¿¡ Ãß°¡ VOID UserManager::InsertChatBlockUser( User *pUser, DWORD dwRemainTime ) { m_mapChatBlocked.insert( CHATBLOCK_USER_MAP_PAIR( pUser->GetCharGuid(), pUser ) ); pUser->SetChatBlock( dwRemainTime ); MessageOut( eFULL_LOG, "InsertChatBlockTime[%u]", pUser->GetCharGuid() ); } // äÆÃ±ÝÁöÀÚ ¸ñ·Ï¿¡¼­ Á¦°Å BOOL UserManager::RemoveChatBlockUser( User *pUser ) { CHATBLOCK_USER_MAP_ITER iter = m_mapChatBlocked.find( pUser->GetCharGuid() ); if( iter != m_mapChatBlocked.end() ) { User *pUser = (*iter).second; pUser->FreeChatBlock(); m_mapChatBlocked.erase( iter ); MessageOut( eFULL_LOG, "RemoveChatBlockTime[%u]", pUser->GetCharGuid() ); return TRUE; } MessageOut( eFULL_LOG, "RemoveChatBlockTime Failed[%u]", pUser->GetCharGuid() ); return FALSE; } // äÆÃ±ÝÁöÀÚ »óÅ ¾÷µ¥ÀÌÆ® VOID UserManager::UpdateChatBlockUser() { CHATBLOCK_USER_MAP_ITER iter; User *pUser; STLX_VECTOR vecRemoveUser; STLX_VECTOR::iterator iter_vec; vecRemoveUser.clear(); //__NA_000313_20070223_REALTIME_CHAT_BLOCK for( iter = m_mapChatBlocked.begin(); iter != m_mapChatBlocked.end(); ++iter ) { pUser = (*iter).second; if( !pUser ) { MessageOut( eCRITICAL_LOG, "UserManager ChatBlock Update Error - User NULL" ); break; } //__NA_000313_20070223_REALTIME_CHAT_BLOCK if( !pUser->UpdateBlockTime() ) { vecRemoveUser.push_back( pUser ); } } for( iter_vec = vecRemoveUser.begin(); iter_vec != vecRemoveUser.end(); ++iter_vec ) { pUser = (*iter_vec); if( !pUser ) { continue; } RemoveChatBlockUser( pUser ); } MessageOut( eFULL_LOG, "UpdateChatBlockTime[%u]", m_mapChatBlocked.size() ); } // Ä£±¸ Á¤º¸ ¸Þ¸ð¸® ÇÒ´ç STRUCT_FRIEND_INFO* UserManager::AllocFriendInfo() { return (STRUCT_FRIEND_INFO*)m_pFriendPool->Alloc(); } // Ä£±¸ Á¤º¸ ¸Þ¸ð¸® ¹Ýȯ VOID UserManager::FreeFriendInfo( STRUCT_FRIEND_INFO *pFriendInfo ) { if( !pFriendInfo ) { MessageOut( eCRITICAL_LOG, "FreeFriendInfo Error - No FriendInfo Pointer" ); return; } memset( pFriendInfo, 0, sizeof(STRUCT_FRIEND_INFO) ); m_pFriendPool->Free( pFriendInfo ); pFriendInfo = NULL; } // ¸®º¥Áö Á¤º¸ ¸Þ¸ð¸® ÇÒ´ç STRUCT_REVENGE_INFO* UserManager::AllocRevengeInfo() { return (STRUCT_REVENGE_INFO*)m_pRevengePool->Alloc(); } // ¸®º¥Áö Á¤º¸ ¸Þ¸ð¸® ¹Ýȯ VOID UserManager::FreeRevengeInfo( STRUCT_REVENGE_INFO *pRevengeInfo ) { if( !pRevengeInfo ) { MessageOut( eCRITICAL_LOG, "FreeRevengeInfo Error - No RevengeInfo Pointer" ); return; } memset( pRevengeInfo, 0, sizeof(STRUCT_REVENGE_INFO) ); m_pRevengePool->Free( pRevengeInfo ); pRevengeInfo = NULL; } // Â÷´Ü Á¤º¸ ¸Þ¸ð¸® ÇÒ´ç STRUCT_BLOCK_INFO* UserManager::AllocBlockInfo() { return (STRUCT_BLOCK_INFO*)m_pBlockPool->Alloc(); } // Â÷´Ü Á¤º¸ ¸Þ¸ð¸® ¹Ýȯ VOID UserManager::FreeBlockInfo( STRUCT_BLOCK_INFO *pBlockInfo ) { if( !pBlockInfo ) { MessageOut( eCRITICAL_LOG, "FreeBlockInfo Error - No FriendInfo Pointer" ); return; } memset( pBlockInfo, 0, sizeof(STRUCT_BLOCK_INFO) ); m_pBlockPool->Free( pBlockInfo ); pBlockInfo = NULL; } VOID UserManager::AddUser( DWORD dwGuid, User *pUser ) { m_pGuidUserList->Add( dwGuid, pUser ); // ij¸¯ÅÍ À̸§ÀÌ ÀÖÀ¸¸é CharNameUserList¿¡µµ Ãß°¡ if( !pUser->GetCharName().empty() ) { // string strName = pUser->GetCharName(); // transform( strName.begin(), strName.end(), strName.begin(), toupper ); m_pCharNameUserList->Add( pUser->GetCharName(), pUser ); //#ifdef _DEBUG // MessageOut( eFULL_LOG, "UserManager::AddUser(Name)[%s]", strName.c_str() ); //#endif } // ij¸¯ÅÍ guid ÀÖÀ¸¸é ¿©±âµµ Ãß°¡ if( pUser->GetCharGuid() ) { m_pCharGuidList->Add( pUser->GetCharGuid(), pUser ); Lotto::GetInstance().OnPlayerJoin(pUser->GetCharGuid()); } } VOID UserManager::RemoveUser( DWORD dwGuid ) { User *pUser = m_pGuidUserList->Find( dwGuid ); if( pUser ) { m_pGuidUserList->Remove( dwGuid ); // ij¸¯ÅÍ À̸§ÀÌ ÀÖÀ¸¸é CharNameUserList¿¡¼­µµ »èÁ¦ if( !pUser->GetCharName().empty() ) { m_pCharNameUserList->Remove( pUser->GetCharName() ); } if( pUser->GetCharGuid() ) { m_pCharGuidList->Remove( pUser->GetCharGuid() ); Lotto::GetInstance().OnPlayerLeave(pUser->GetCharGuid()); } } } BOOL UserManager::SetUserCharGuid( DWORD dwGuid, DWORD dwCharGuid ) { User *pUser = m_pGuidUserList->Find( dwGuid ); if( !pUser ) return FALSE; // ÀÌ¹Ì CharGuid¸®½ºÆ®¿¡ ÀÖ´Â °æ¿ì »èÁ¦ if( m_pCharGuidList->Find( pUser->GetCharGuid() ) ) { m_pCharGuidList->Remove( pUser->GetCharGuid() ); Lotto::GetInstance().OnPlayerLeave(pUser->GetCharGuid()); MessageOut( eFULL_LOG, "Prev Character(%u) ", pUser->GetCharGuid() ); } // »õ ij¸¯ÅÍ À̸§ ¼ÂÆÃ pUser->SetCharGuid( dwCharGuid ); // CharGuid ¸®½ºÆ®¿¡ Ãß°¡ m_pCharGuidList->Add( dwCharGuid, pUser ); Lotto::GetInstance().OnPlayerJoin(dwCharGuid); MessageOut( eFULL_LOG, "CharGuid(%u)", dwCharGuid ); return TRUE; } BOOL UserManager::SetUserCharName( DWORD dwGuid, std::string strCharName ) { User *pUser = m_pGuidUserList->Find( dwGuid ); if( !pUser ) return FALSE; MessageOut( eFULL_LOG, "Guid(%u)CharGuid(%u)Name(%s)", dwGuid, pUser->GetCharGuid(), pUser->GetCharName().c_str() ); // »õ ij¸¯ÅÍ À̸§ ¼ÂÆÃ pUser->SetCharName( strCharName ); // // CharName ¸®½ºÆ®¿¡ Ãß°¡ // transform( strCharName.begin(), strCharName.end(), strCharName.begin(), toupper ); // ÀÌ¹Ì CharName¸®½ºÆ®¿¡ ÀÖ´Â °æ¿ì »èÁ¦ if( m_pCharNameUserList->Find( strCharName ) ) { m_pCharNameUserList->Remove( strCharName ); MessageOut( eFULL_LOG, "Prev Character(%s) ", pUser->GetCharName().c_str() ); } m_pCharNameUserList->Add( strCharName, pUser ); #ifdef _DEBUG MessageOut( eFULL_LOG, "UserManager::AddUser(Name)[%s]", strCharName.c_str() ); #endif // m_pCharNameUserList->Add( strCharName, pUser ); MessageOut(eFULL_LOG, "Select Character(%s)", pUser->GetCharName().c_str() ); return TRUE; } BOOL UserManager::UnSetCharGuid( DWORD dwGuid ) { User *pUser = m_pCharGuidList->Find( dwGuid ); if( !pUser ) return FALSE; // CharGuid ¸®½ºÆ®¿¡¼­ »èÁ¦ m_pCharGuidList->Remove( pUser->GetCharGuid() ); Lotto::GetInstance().OnPlayerLeave(pUser->GetCharGuid()); return TRUE; } BOOL UserManager::UnsetUserCharName( DWORD dwGuid ) { User *pUser = m_pGuidUserList->Find( dwGuid ); if( !pUser ) return FALSE; // CharName ¸®½ºÆ®¿¡¼­ »èÁ¦ m_pCharNameUserList->Remove( pUser->GetCharName() ); return TRUE; } User* UserManager::FindUser( DWORD dwGuid ) { return m_pGuidUserList->Find( dwGuid ); } User* UserManager::FindUserByCharGuid( DWORD CharGuid ) { return m_pCharGuidList->Find( CharGuid ); } User* UserManager::FindUser( std::string strCharName ) { // transform( strCharName.begin(), strCharName.end(), strCharName.begin(), toupper ); //#ifdef _DEBUG // MessageOut( eFULL_LOG, "UserManager::FindUser[%s]", strCharName.c_str() ); //#endif return m_pCharNameUserList->Find( strCharName ); } VOID UserManager::SendToAll( BYTE *pMsg, WORD wSize ) { m_pGuidUserList->SendToAll( pMsg, wSize ); } DWORD UserManager::GetNumberOfGuidUsers() { return m_pGuidUserList->GetNumberOfUsers(); } DWORD UserManager::GetNumberOfCharNameUsers() { return m_pCharNameUserList->GetNumberOfUsers(); } BOOL UserManager::SetUserCharLevel(DWORD dwGuid, LEVELTYPE Level) { User *pUser = m_pGuidUserList->Find( dwGuid ); if( !pUser ) return FALSE; // »õ ij¸¯ÅÍ À̸§ ¼ÂÆÃ pUser->SetCharLevel(Level); return TRUE; } BOOL UserManager::SetUserCharClass(DWORD dwGuid, BYTE byClass) { User *pUser = m_pGuidUserList->Find( dwGuid ); if( !pUser ) return FALSE; pUser->SetCharClass( byClass ); return TRUE; } #ifdef _NA_006642_20120416_COMMUNITY_INFO_BUG_MODIFY BOOL UserManager::SetUserCharGender(DWORD guid, BYTE gender) { User* user = m_pGuidUserList->Find(guid); if(user == NULL) { return FALSE; } user->SetCharGender(gender); return TRUE; } #endif // _NA_006642_20120416_COMMUNITY_INFO_BUG_MODIFY //__NA_000313_20070223_REALTIME_CHAT_BLOCK