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 CMemoryPoolTempl g_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; 
}