📄 user.cpp
字号:
#include "stdafx.h"
#include "User.h"
#include "UserManager.h"
#include "ChannelManager.h"
#include "Zone.h"
#include "Channel.h"
#include "WaitingUserList.h"
// 模备 沥焊 困秦
#include <Struct.h>
#include <PacketStruct_CW.h>
User::User()
{
}
User::~User()
{
}
VOID User::Init()
{
m_bLogoutProcessed = FALSE;
m_userType = INVALID_USER;
m_dwNetworkIndex = 0;
m_dwGUID = 0;
m_strCharName.clear();
m_CharGuid = 0;
m_dwTimeoutTick = 0;
ZeroMemory( m_szAuthIP, IP_MAX_LEN );
m_status = eZONETYPE_CHARSELECT;
SetWhisper();
m_dwZoneKey = 0;
m_dwFieldCode = 0;
m_dwSectorIndex = 0;
// 模备 汲沥
m_mapFriend.clear();
m_bFriendChatBlock = FALSE;
m_iterNowFriend = NULL;
m_bFriendList = FALSE;
m_mapOnlineFriend.clear();
// 瞒窜 汲沥
m_mapBlock.clear();
m_iterNowBlock = NULL;
m_bBlockList = FALSE;
// 辨靛 汲沥
m_bGuildList = FALSE;
m_GuildGuid = 0;
}
VOID User::Release()
{
m_strCharName.clear();
m_bWhisper = FALSE;
m_dwFieldCode = 0;
m_dwSectorIndex = 0;
// 模备 汲沥
STRUCT_FRIEND_INFO *pFriend;
while( !m_mapFriend.empty() )
{
m_iterNowFriend = m_mapFriend.begin();
pFriend = (*m_iterNowFriend).second;
free(pFriend);
m_mapFriend.erase( m_iterNowFriend );
}
m_bFriendChatBlock = FALSE;
m_bFriendList = FALSE;
m_mapOnlineFriend.clear();
// 瞒窜 汲沥
STRUCT_BLOCK_INFO *pBlock;
while( !m_mapBlock.empty() )
{
m_iterNowBlock = m_mapBlock.begin();
pBlock = (*m_iterNowBlock).second;
free(pBlock);
m_mapBlock.erase( m_iterNowBlock );
}
// 辨靛 汲沥
m_bGuildList = FALSE;
m_GuildGuid = 0;
}
VOID User::Update()
{
}
BOOL User::CheckFriendList()
{
if( m_bFriendList )
{
MessageOut( eCRITICAL_LOG, "[%s] Friend List Hack Check", m_strCharName.c_str() );
return FALSE;
}
m_bFriendList = TRUE;
return TRUE;
}
STRUCT_FRIEND_INFO* User::GetFirstFriend()
{
// if( !CheckFriendList() )
// {
// return NULL;
// }
m_iterNowFriend = m_mapFriend.begin();
if( m_iterNowFriend == m_mapFriend.end() )
{
return NULL;
}
return ( (*m_iterNowFriend).second );
}
STRUCT_FRIEND_INFO* User::GetNextFriend()
{
if(/* !CheckFriendList() || */m_iterNowFriend == m_mapFriend.end() )
{
return NULL;
}
m_iterNowFriend++;
if( m_iterNowFriend == m_mapFriend.end() )
{
return NULL;
}
return ( (*m_iterNowFriend).second );
}
BOOL User::AddFriendInfo( STRUCT_FRIEND_INFO* pFriend )
{
STRUCT_FRIEND_INFO *pNowFriend = new STRUCT_FRIEND_INFO;
memcpy( pNowFriend, pFriend, sizeof(STRUCT_FRIEND_INFO) );
// 捞固 鞍篮 沥焊啊 乐栏搁 俊矾
if( FindFriend( pFriend->dwFriendGuid ) != NULL )
{
return FALSE;
}
m_mapFriend.insert( FRIEND_INFO_MAP_PAIR( pFriend->dwFriendGuid, pNowFriend ) );
return TRUE;
}
STRUCT_FRIEND_INFO* User::FindFriend( DWORD dwCharGuid )
{
FRIEND_INFO_MAP_ITER iter = m_mapFriend.find( dwCharGuid );
if( iter == m_mapFriend.end() )
{
return NULL;
}
STRUCT_FRIEND_INFO *pFriendInfo = (*iter).second;
return pFriendInfo;
}
STRUCT_FRIEND_INFO* User::FindFriend( TCHAR* ptszFriendName )
{
FRIEND_INFO_MAP_ITER iter = m_mapFriend.begin();
if( iter == m_mapFriend.end() )
{
return NULL;
}
for( iter = m_mapFriend.begin(); iter != m_mapFriend.end(); iter++ )
{
STRUCT_FRIEND_INFO *pFriendInfo = (*iter).second;
if( !_tcsncmp( pFriendInfo->sPacketInfo.ptszFriendName, ptszFriendName, MAX_CHARNAME_LENGTH - 1 ) )
{
return pFriendInfo;
}
}
return NULL;
}
VOID User::RemoveFriend( DWORD dwGuid )
{
FRIEND_INFO_MAP_ITER iter = m_mapFriend.find( dwGuid );
if( iter == m_mapFriend.end() )
{
return;
}
STRUCT_FRIEND_INFO *pFriend = (*iter).second;
delete pFriend;
m_mapFriend.erase(iter);
}
VOID User::AddOnlineFriend( User *pUser )
{
// 格废俊 眠啊
m_mapOnlineFriend.insert( FRIEND_ONLINE_MAP_PAIR( pUser->GetCharGuid(), pUser ) );
// 郴啊 甸绢吭促! 舅酒葛寂扼!!!
pUser->AlarmFriendStatChange( FRIEND_STAT_LOGIN, this );
}
VOID User::RemoveOnlineFriend( User *pUser )
{
FRIEND_ONLINE_MAP_ITER iter = m_mapOnlineFriend.find( pUser->GetCharGuid() );
if( iter != m_mapOnlineFriend.end() )
{
m_mapOnlineFriend.erase( iter );
// 郴啊 甸绢吭促! 舅酒葛寂扼!!!
pUser->AlarmFriendStatChange( FRIEND_STAT_LOGOUT, this );
}
}
User* User::FindOnlineFriend( DWORD CharGuid )
{
FRIEND_ONLINE_MAP_ITER iter = m_mapOnlineFriend.find( CharGuid );
if( iter == m_mapOnlineFriend.end() )
{
return NULL;
}
return (*iter).second;
}
VOID User::AlarmFriendStatChange( int nFlag, User *pUser )
{
switch( nFlag )
{
case FRIEND_STAT_LOGIN: // Login
{
// 模备 沥焊俊辑 柯扼牢栏肺 函版!
STRUCT_FRIEND_INFO *pFriendInfo = FindFriend( pUser->GetCharGuid() );
if( !pFriendInfo )
{
MessageOut( eCRITICAL_LOG, "[%s] AlarmFriend Error - No Friend %s", GetCharName().c_str(), pUser->GetCharName().c_str() );
break;
}
pFriendInfo->sPacketInfo.bOnline = TRUE; // 柯扼牢捞促!!!
MSG_CW_FRIEND_LOGIN_BRD sendMsg;
memcpy( sendMsg.ptszFriendName, pUser->GetCharName().c_str(), sizeof(sendMsg.ptszFriendName) );
Send( (BYTE*)&sendMsg, sizeof(MSG_CW_FRIEND_LOGIN_BRD) );
break;
}
case FRIEND_STAT_LOGOUT: // Logout
{
// 模备 沥焊俊辑 坷橇扼牢栏肺 函版!
STRUCT_FRIEND_INFO *pFriendInfo = FindFriend( pUser->GetCharGuid() );
if( !pFriendInfo )
{
MessageOut( eCRITICAL_LOG, "[%s] AlarmFriend_Logout Error - No Friend %s", GetCharName().c_str(), pUser->GetCharName().c_str() );
break;
}
pFriendInfo->sPacketInfo.bOnline = FALSE; // 坷橇扼牢捞促!!!
MSG_CW_FRIEND_LOGOUT_BRD sendMsg;
memcpy( sendMsg.ptszFriendName, pUser->GetCharName().c_str(), sizeof(sendMsg.ptszFriendName) );
Send( (BYTE*)&sendMsg, sizeof(MSG_CW_FRIEND_LOGOUT_BRD) );
break;
}
}
}
// 瞒窜 沥焊 包府侩
STRUCT_BLOCK_INFO* User::GetFirstBlock()
{
if( !CheckBlockList() )
{
return NULL;
}
m_iterNowBlock = m_mapBlock.begin();
if( m_iterNowBlock == m_mapBlock.end() )
{
return NULL;
}
return ( (*m_iterNowBlock).second );
}
STRUCT_BLOCK_INFO* User::GetNextBlock()
{
if( !CheckBlockList() || m_iterNowBlock == m_mapBlock.end() )
{
return NULL;
}
m_iterNowBlock++;
if( m_iterNowBlock == m_mapBlock.end() )
{
return NULL;
}
return ( (*m_iterNowBlock).second );
}
BOOL User::AddBlockInfo( STRUCT_BLOCK_INFO* pBlock )
{
STRUCT_BLOCK_INFO *pNowBlock = new STRUCT_BLOCK_INFO;
memcpy( pNowBlock, pBlock, sizeof(STRUCT_BLOCK_INFO) );
// 捞固 鞍篮 沥焊啊 乐栏搁 俊矾
if( FindBlock( pBlock->dwBlockGuid ) != NULL )
{
return FALSE;
}
m_mapBlock.insert( BLOCK_INFO_MAP_PAIR( pBlock->dwBlockGuid, pNowBlock ) );
return TRUE;
}
STRUCT_BLOCK_INFO* User::FindBlock( DWORD dwGuid )
{
BLOCK_INFO_MAP_ITER iter = m_mapBlock.find( dwGuid );
if( iter == m_mapBlock.end() )
{
return NULL;
}
STRUCT_BLOCK_INFO *pBlockInfo = (*iter).second;
return pBlockInfo;
}
STRUCT_BLOCK_INFO* User::FindBlock( TCHAR* ptszBlockName )
{
BLOCK_INFO_MAP_ITER iter = m_mapBlock.begin();
if( iter == m_mapBlock.end() )
{
return NULL;
}
for( iter = m_mapBlock.begin(); iter != m_mapBlock.end(); iter++ )
{
STRUCT_BLOCK_INFO *pBlockInfo = (*iter).second;
if( !_tcsncmp( pBlockInfo->ptszBlockName, ptszBlockName, MAX_CHARNAME_LENGTH - 1 ) )
{
return pBlockInfo;
}
}
return NULL;
}
VOID User::RemoveBlock( DWORD dwGuid )
{
BLOCK_INFO_MAP_ITER iter = m_mapBlock.find( dwGuid );
if( iter == m_mapBlock.end() )
{
return;
}
STRUCT_BLOCK_INFO *pBlock = (*iter).second;
delete pBlock;
m_mapBlock.erase(iter);
}
VOID User::RemoveBlock( TCHAR* ptszBlockedName )
{
BLOCK_INFO_MAP_ITER iter = m_mapBlock.begin();
if( iter == m_mapBlock.end() )
{
return;
}
STRUCT_BLOCK_INFO* pBlock;
for( iter = m_mapBlock.begin(); iter != m_mapBlock.end(); iter++ )
{
pBlock = (*iter).second;
if( !_tcsncmp( pBlock->ptszBlockName, ptszBlockedName, MAX_CHARNAME_LENGTH - 1 ) )
{
delete pBlock;
m_mapBlock.erase(iter);
// MessageOut( eFULL_LOG, "[%s] Remove Block %s", GetCharName().c_str(), ptszBlockedName );
break;
}
}
}
VOID User::OnAccept( DWORD dwNetworkIndex )
{
SetNetworkIndex( dwNetworkIndex );
}
VOID User::OnDisconnect()
{
if( !m_bLogoutProcessed )
{
ProcessLogout();
}
else
{
MessageOut( eFULL_LOG, "蜡历啊 立加 辆丰[C:%u][Guid:%u][IP:%s]", GetChannelID(), GetGUID(), GetAuthIP() );
}
}
VOID User::OnRecv( BYTE *pMsg, WORD wSize )
{
}
VOID User::OnEnterZone( Zone *pZone )
{
SetZoneKey( pZone->GetKey() );
}
VOID User::OnLeaveZone( Zone *pZone )
{
SetZoneKey( 0 );
SetStatus( eZONETYPE_MAX ); // 唱埃 惑怕促 捞仇篮!!!
}
VOID User::OnEnterSector( Zone *pZone )
{
SetSectorIndex( pZone->GetKey() );
}
VOID User::OnLeaveSector( Zone *pZone )
{
SetSectorIndex( 0 );
}
VOID User::Logout()
{
MessageOut( eFULL_LOG, "蜡廉 立加 秦力 盲澄(%d) Guid(%d) IP(%s)", GetChannelID(), GetGUID(), GetAuthIP() );
// 肺弊酒眶矫狼 贸府
ProcessLogout();
// 匙飘亏 谗扁
Disconnect();
}
VOID User::ProcessLogout()
{
m_bLogoutProcessed = TRUE;
// 盲澄俊辑 力芭
Channel *pChannel = ChannelManager::Instance()->GetChannel( GetChannelID() );
if( pChannel )
{
pChannel->RemoveUser( this );
}
// 唱甫 模备 伙篮 仇甸俊霸 绊茄促~唱 唱埃促~
if( !m_mapOnlineFriend.empty() )
{
FRIEND_ONLINE_MAP_ITER iter;
for( iter = m_mapOnlineFriend.begin(); iter != m_mapOnlineFriend.end(); iter++ )
{
(*iter).second->AlarmFriendStatChange( FRIEND_STAT_LOGOUT, this ); // 唱埃促绊 舅妨霖促!!!
}
}
// 郴 模备 沥焊绰 歹捞惑 鞘夸绝促
UserManager::Instance()->RemoveFriend( this );
}
void User::OnLogString(char *pszLog)
{
MessageOut(eCRITICAL_LOG, pszLog);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -