⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 user.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -