www.pudn.com > [Server]Distribute.rar > UserTable.cpp
// UserTable.cpp: implementation of the CUserTable class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "UserTable.h" #include "Network.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CUserTable * g_pUserTable = NULL; extern CMemoryPoolTemplg_UserInfoPool; CUserTable::CUserTable() { } CUserTable::~CUserTable() { } void CUserTable::Init(DWORD dwBucket) { CYHHashTable ::Initialize(dwBucket); m_MaxUserCount = 0; m_dwUserCount = 0; m_addCount = 0; m_removeCount = 0; } USERINFO* CUserTable::FindUser(DWORD dwKey) { return CYHHashTable ::GetData(dwKey); } BOOL CUserTable::AddUser(USERINFO* pObject,DWORD dwKey) { ASSERT(!FindUser(dwKey)); ++m_dwUserCount; ++ m_addCount; return CYHHashTable ::Add(pObject,dwKey); } USERINFO * CUserTable::RemoveUser(DWORD dwKey) { USERINFO * info = NULL; info = (USERINFO *)GetData(dwKey); Remove(dwKey); --m_dwUserCount; ++m_removeCount; return info; } void CUserTable::RemoveAllUser() { SetPositionHead(); USERINFO * info = NULL; while(info = (USERINFO *)GetData()) { Remove(info->dwConnectionIndex); info = NULL; } m_dwUserCount = 0; CYHHashTable ::RemoveAll(); } void CUserTable::SetCalcMaxCount(DWORD CurCount) { if(m_MaxUserCount < CurCount) { m_MaxUserCount = CurCount; } } BOOL CUserTable::SendToUser(DWORD dwKey,DWORD dwUniqueConnectIdx,MSGBASE* pmsg,DWORD size) { USERINFO* pUserInfo = FindUser(dwKey); if(pUserInfo == NULL) return FALSE; if(pUserInfo->dwUniqueConnectIdx != dwUniqueConnectIdx) return FALSE; g_Network.Send2User(pUserInfo->dwConnectionIndex,(char*)pmsg,size); return TRUE; } BOOL CUserTable::OnDisconnectUser(DWORD dwKey) { USERINFO* pUserInfo = FindUser(dwKey); if(pUserInfo==NULL) return FALSE; if( pUserInfo->dwUserID != 0 && pUserInfo->bRecvDistOut == FALSE) { // Send Msg To Agent MSG_DWORD msg; msg.Category = MP_USERCONN; msg.Protocol = MP_USERCONN_DISCONNECTED_ON_LOGIN; msg.dwObjectID = pUserInfo->dwUserID; msg.dwData = pUserInfo->dwUniqueConnectIdx; g_Network.Broadcast2AgentServer((char*)&msg,sizeof(msg)); } g_pServerSystem->ReleaseAuthKey(pUserInfo->dwUniqueConnectIdx); RemoveUser(dwKey); g_UserInfoPool.Free(pUserInfo); // g_Console.LOG(4, " User Disconnected UserIDx:%d CharID:%d (%d)", // pUserInfo->dwUserID, pUserInfo->dwCharacterID, GetUserCount()); return TRUE; } BOOL DisconnectUser(DWORD dwConnectionIndex) { // g_Console.LOG(4, "CompulsiveDisconnect ConnectionIndex : %d",dwConnectionIndex); USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIndex); if(pUserInfo) { // g_Console.LOG(4, " User CompulsiveDisconnected UserIDx:%d CharID:%d (%d)", // pUserInfo->dwUserID, pUserInfo->dwCharacterID, g_pUserTable->GetUserCount()); // } g_Network.DisconnectUser(dwConnectionIndex); return TRUE; } BOOL DisconnectUser(DWORD dwConnectionIndex, int flag ) { // g_Console.LOG(4, "CompulsiveDisconnect ConnectionIndex : %d",dwConnectionIndex); USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIndex); if(pUserInfo) { // g_Console.LOG(4, " User CompulsiveDisconnected UserIDx:%d CharID:%d (%d)", // pUserInfo->dwUserID, pUserInfo->dwCharacterID, g_pUserTable->GetUserCount()); // } g_Network.DisconnectUser(dwConnectionIndex); /* switch( flag ) { case 1: // connection check g_Console.LOG(4, "DisconnectUser : Connection Check", dwConnectionIndex ); break; case 2: // mapserver down g_Console.LOG(4, "DisconnectUser : Map Down", dwConnectionIndex ); break; case 3: // GMTool Ban g_Console.LOG(4, "DisconnectUser : GMTool Ban", dwConnectionIndex ); break; case 4: // Overlapped Login g_Console.LOG(4, "DisconnectUser : Overlapped Login", dwConnectionIndex ); break; case 5: // MP_USERCONN_DISCONNECT_SYN g_Console.LOG(4, "DisconnectUser : MP_USERCONN_DISCONNECT_SYN", dwConnectionIndex ); break; case 6: // MP_CHEAT_BANCHARACTER_SYN g_Console.LOG(4, "DisconnectUser : MP_CHEAT_BANCHARACTER_SYN", dwConnectionIndex ); break; case 7: // MP_HACKCHECK_SPEEDHACK g_Console.LOG(4, "DisconnectUser : MP_HACKCHECK_SPEEDHACK", dwConnectionIndex ); break; } */ return TRUE; }