📄 usertable.cpp
字号:
// UserTable.cpp: implementation of the CUserTable class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "UserTable.h"
#include "Network.h"
#include "DistributeDBMsgParser.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUserTable * g_pUserTable = NULL;
CLoginUser g_pLoginUser;
extern CMemoryPoolTempl<USERINFO> g_UserInfoPool;
CUserTable::CUserTable()
{
}
CUserTable::~CUserTable()
{
}
void CUserTable::Init(DWORD dwBucket)
{
CYHHashTable<USERINFO>::Initialize(dwBucket);
m_MaxUserCount = 0;
m_dwUserCount = 0;
m_addCount = 0;
m_removeCount = 0;
}
USERINFO* CUserTable::FindUser(DWORD dwKey)
{
return CYHHashTable<USERINFO>::GetData(dwKey);
}
BOOL CUserTable::AddUser(USERINFO* pObject,DWORD dwKey)
{
ASSERT(!FindUser(dwKey));
++m_dwUserCount;
++ m_addCount;
return CYHHashTable<USERINFO>::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<USERINFO>::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;
}
CLoginUser::CLoginUser()
{
m_User.Initialize( 1000 );
}
CLoginUser::~CLoginUser()
{
sLOGINUSER* pData = NULL;
m_User.SetPositionHead();
while( pData = m_User.GetData() )
delete pData;
m_User.RemoveAll();
}
void CLoginUser::SetCount( DWORD dwUserIdx, WORD wNum )
{
Remove( dwUserIdx );
sLOGINUSER* pData = new sLOGINUSER;
pData->dwTime = GetTickCount();
pData->dwCount = wNum;
m_User.Add( pData, dwUserIdx );
}
void CLoginUser::Receive( DWORD dwUserIdx )
{
sLOGINUSER* pData = NULL;
if( pData = m_User.GetData( dwUserIdx ) )
{
pData->dwCount = pData->dwCount - 1;
if( pData->dwCount == 0 )
{
LoginCheckDelete( dwUserIdx );
Remove( dwUserIdx );
}
}
}
void CLoginUser::Remove( DWORD dwUserIdx )
{
sLOGINUSER* pData = m_User.GetData( dwUserIdx );
if( pData )
{
delete pData;
m_User.Remove( dwUserIdx );
}
}
int CLoginUser::Check( DWORD dwUserIdx )
{
sLOGINUSER* pData = m_User.GetData( dwUserIdx );
if( pData )
{
if( GetTickCount() - pData->dwTime > 18000 )
return 2;
else
return 1;
}
else
{
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -