📄 usertable.cpp
字号:
// UserTable.cpp: implementation of the CUserTable class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "UserTable.h"
#ifdef __MAPSERVER__
#ifndef _MURIMNET_
#include "SkillArea.h"
#include "CharMove.h"
#endif
#endif
#include "Network.h"
#ifdef _AGENTSERVER
#include "TrafficLog.h"
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUserTable * g_pUserTable = NULL;
CUserTable * g_pUserTableForUserID = NULL;
#ifdef __AGENTSERVER__
#include "AgentDBMsgParser.h"
CUserTable * g_pUserTableForObjectID = NULL;
#endif
CUserTable::CUserTable()
{
}
CUserTable::~CUserTable()
{
}
#ifndef __MAPSERVER__
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;
}
}
#else // __MAPSERVER__ 老锭 利侩
#ifndef _MURIMNET_
#include "ObjectFactory.h"
#endif
void CUserTable::Init(DWORD dwBucket)
{
CYHHashTable<CObject>::Initialize(dwBucket);
m_dwUserCount = 0;
m_dwMonsterCount = 0;
m_dwNpcCount = 0;
m_dwExtraCount = 0;
}
CObject* CUserTable::FindUser(DWORD dwKey)
{
return CYHHashTable<CObject>::GetData(dwKey);
}
//某腐磐 捞抚栏肺 茫扁. 蠢府促.
CObject* CUserTable::FindUserForName( char* strCharacterName )
{
SetPositionHead();
CObject* pObject = NULL;
char buf1[MAX_NAME_LENGTH+1];
char buf2[MAX_NAME_LENGTH+1];
SafeStrCpy( buf1, strCharacterName, MAX_NAME_LENGTH+1 );
strupr( buf1 );
while( pObject = (CObject*)GetData() )
{
SafeStrCpy( buf2, pObject->GetObjectName(), MAX_NAME_LENGTH+1 );
strupr( buf2 );
if( strncmp( buf2, buf1, MAX_NAME_LENGTH ) == 0 )
return pObject;
}
return NULL;
}
BOOL CUserTable::AddUser(CObject* pObject,DWORD dwKey)
{
switch(pObject->GetObjectKind())
{
case eObjectKind_Player:
{
++m_dwUserCount;
}
break;
case eObjectKind_Monster:
{
++m_dwMonsterCount;
}
break;
case eObjectKind_Npc:
{
++m_dwNpcCount;
}
break;
default:
{
++m_dwExtraCount;
}
break;
}
return CYHHashTable<CObject>::Add(pObject,dwKey);
}
CObject * CUserTable::RemoveUser(DWORD dwKey)
{
CObject * info = NULL;
info = (CObject *)GetData(dwKey);
Remove(dwKey);
switch(info->GetObjectKind())
{
case eObjectKind_Player:
{
--m_dwUserCount;
}
break;
case eObjectKind_Monster:
{
--m_dwMonsterCount;
}
break;
case eObjectKind_Npc:
{
--m_dwNpcCount;
}
break;
default:
{
--m_dwExtraCount;
}
break;
}
return info;
}
void CUserTable::RemoveAllUser()
{
SetPositionHead();
CObject * info = NULL;
while(info = (CObject *)GetData())
{
// Remove(info->dwConnectionIndex);
#ifndef _MURIMNET_
g_pObjectFactory->ReleaseObject(info);
#endif
}
m_dwUserCount = 0;
m_dwMonsterCount = 0;
m_dwNpcCount = 0;
m_dwExtraCount = 0;
}
void CUserTable::GetTargetInRange(VECTOR3* pPivotPos,float Radius,CTargetList* pTList)
{
#ifndef _MURIMNET_
pTList->Clear();
CTargetListIterator iter(pTList);
CObject* pObject;
VECTOR3* pObjectPos;
float dist;
float dx,dz;
SetPositionHead();
while(pObject = GetData())
{
if( pObject->GetObjectKind() == eObjectKind_Player ||
pObject->GetObjectKind() & eObjectKind_Monster ||
pObject->GetObjectKind() == eObjectKind_SkillObject )
continue;
if(pObject->GetState() == eObjectState_Die || pObject->GetState() == eObjectState_Immortal)
continue;
pObjectPos = CCharMove::GetPosition(pObject);
dx = (pPivotPos->x - pObjectPos->x);
dz = (pPivotPos->z - pObjectPos->z);
dist = sqrtf(dx*dx + dz*dz) - pObject->GetRadius();
if(dist <= Radius)
{
iter.AddTargetWithNoData(pObject->GetID(),SKILLRESULTKIND_NONE);
}
}
iter.Release();
#endif
}
void CUserTable::GetTargetInArea(CSkillArea* pSkillArea,CTargetList* pTList)
{
#ifndef _MURIMNET_
pTList->Clear();
CTargetListIterator iter(pTList);
CObject* pObject;
VECTOR3* pObjectPos;
SetPositionHead();
while(pObject = GetData())
{
if( pObject->GetObjectKind() == eObjectKind_Player ||
pObject->GetObjectKind() & eObjectKind_Monster ||
pObject->GetObjectKind() == eObjectKind_SkillObject )
continue;
if(pObject->GetState() == eObjectState_Die || pObject->GetState() == eObjectState_Immortal)
continue;
pObjectPos = CCharMove::GetPosition(pObject);
if(pSkillArea->IsInDamageTile(pObjectPos) == TRUE)
{
iter.AddTargetWithNoData(pObject->GetID(),SKILLRESULTKIND_NONE);
}
}
iter.Release();
#endif
}
#endif
#ifndef _MAPSERVER_
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;
}
extern CMemoryPoolTempl<USERINFO> g_UserInfoPool;
#ifdef _AGENTSERVER
BOOL CUserTable::OnDisconnectUser(DWORD dwKey)
{
USERINFO * pInfo = g_pUserTable->FindUser(dwKey);
if(pInfo == NULL)
return FALSE;
#ifdef _NETWORKTEST
TRAFFIC->LogUser(pInfo);
#endif
LoginCheckDelete(pInfo->dwUserID); // LOGOUT矫埃阑 诀单捞飘 钦聪促.
if(pInfo->dwCharacterID)
g_pUserTableForObjectID->RemoveUser(pInfo->dwCharacterID);
// 肺弊牢 UserID登菌绢乐绰 芭 DB鞘靛俊辑 力芭
ASSERT(pInfo->dwUserID);
g_pUserTableForUserID->RemoveUser(pInfo->dwUserID);
if(pInfo->dwCharacterID)
{
// 肺弊牢 Character_ID沥焊 檬扁拳
MSGBASE msg;
msg.Category = MP_USERCONN;
msg.Protocol = MP_USERCONN_DISCONNECTED;
msg.dwObjectID = pInfo->dwCharacterID;
g_Network.Send2Server(pInfo->dwMapServerConnectionIndex, (char*)&msg, sizeof(msg));
// ChangeMapPoint 檬扁拳
SaveMapChangePointUpdate(pInfo->dwCharacterID, 0);
}
// 蜡历 昏力
g_pUserTable->RemoveUser(dwKey);
//user count 拌魂==============================================================================
SERVERINFO * myInfo = g_pServerTable->GetSelfServer();
myInfo->wAgentUserCnt = GetUserCount();
MSG_WORD2 msg2;
msg2.Category = MP_SERVER;
msg2.Protocol = MP_SERVER_USERCNT;
msg2.wData1 = myInfo->wPortForServer;
msg2.wData2 = myInfo->wAgentUserCnt;
g_pServerTable->SetPositionHead();
SERVERINFO* pOtherAgentInfo = NULL;
while(pOtherAgentInfo = g_pServerTable->GetNextDistServer())
{
if(myInfo == pOtherAgentInfo)
continue;
g_Network.Send2Server(pOtherAgentInfo->dwConnectionIndex, (char *)&msg2, sizeof(msg2));
}
//user count 拌魂==============================================================================
g_Console.LOG(4, " User Disconnected UserIDx:%d CharID:%d (%d)",
pInfo->dwUserID, pInfo->dwCharacterID, GetUserCount());
// AuthKey Release
g_pServerSystem->ReleaseAuthKey(pInfo->dwUniqueConnectIdx);
// pool 庆力
g_UserInfoPool.Free(pInfo);
return TRUE;
}
#else
BOOL CUserTable::OnDisconnectUser(DWORD dwKey)
{
USERINFO* pUserInfo = FindUser(dwKey);
ASSERT(pUserInfo);
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;
}
#endif
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;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -