www.pudn.com > MirServer.rar > MirClient.cpp


#include "StdAfx.h" 
#include ".\mirclient.h" 
#include ".\mircode.h" 
#include "mirdef.h" 
#include "mirserver.h" 
#include "..\..\public\ini.h" 
CMirClient::CMirClient(void) 
{ 
	m_pMsg = (PMIRMSG)m_szMsgBuffer; 
	m_dwWaitTime = 0; 
} 
 
CMirClient::~CMirClient(void) 
{ 
} 
 
VOID CMirClient::SetConnection(CONNECTION* pConnection, int iClientType) 
{ 
	memcpy( &m_Connection, (void*)pConnection, sizeof( CONNECTION)); 
	m_iType = iClientType; 
	return VOID(); 
} 
 
VOID CMirClient::SetId(UINT nId) 
{ 
	m_Id = nId; 
	return VOID(); 
} 
 
UINT CMirClient::GetId(void) 
{ 
	return m_Id; 
} 
 
VOID CMirClient::OnData(CHAR* pBuffer, UINT iSize) 
{ 
	m_MsgQueue.SaveMsg(pBuffer, iSize); 
	while( m_MsgQueue.GetMsg(m_szTempBuffer)) 
	{ 
		//UnGameCode(m_szTempBuffer, (BYTE*)m_pMsg ); 
		switch(m_iType) 
		{ 
		case	CT_LOGIN: 
			OnLoginMessage( m_szTempBuffer+1 ); 
			break; 
		case	CT_SELCHAR: 
			OnSelcharMessage( m_szTempBuffer+1 ); 
			break; 
		case	CT_GAME: 
			OnGameMessage( m_szTempBuffer+1 ); 
			break; 
		default: 
			break; 
		} 
//		OnMessage(); 
	} 
	return VOID(); 
} 
//#define CM_LOGIN	0x7d1 
//#define SM_LOGINOK	0x211 
//#define SM_LOGINFAIL	0x1f7 
//#define CM_SELECTSERVER	0x68 
//#define SM_SELECTSERVEROK	0x212 
//#define SM_SELECTSERVERFAIL	0x1f8 
//#define CM_VERIFYSELECTCHAR	0x64 
//#define SM_VERIFYSELECTCHARFAIL	0x1f9 
//#define SM_CHARACTERLIST	0x208 
//#define CM_SELECTCHARACTER	0x67 
//#define SM_SELECTCHARACTEROK	0x20d 
//#define SM_SELECTCHARACTERFAIL	0x200 
VOID CMirClient::OnMessage(PMIRMSG pMsg, CHAR* pszParam) 
{ 
	switch(pMsg->wCmd) 
	{ 
	case	CM_LOGIN: 
		break; 
	case	CM_SELECTSERVER: 
		break; 
	case	CM_VERIFYSELECTCHAR: 
		break; 
	case	CM_SELECTCHARACTER: 
		break; 
	} 
	return VOID(); 
} 
 
VOID CMirClient::OnLoginMessage(CHAR* pszMsg) 
{ 
	MIRMSG	msg; 
	CHAR		szHeader[20],*p1,*p2, * pdata = (pszMsg +16); 
	CHAR		szDecode[128]; 
	CHAR	szLognDecode[2048]; 
	strncpy( szHeader, pszMsg, 16 ); 
	szHeader[16] = '\0'; 
	UnGameCode( szHeader, (BYTE*)&msg ); 
	switch( msg.wCmd ) 
	{ 
	case	2002: 
		{ 
			UnGameCode( pdata, (BYTE*)szLognDecode ); 
			*(szLognDecode + szLognDecode[0]+1)=0; 
			*(szLognDecode + 12 + szLognDecode[11]) = 0; 
			OnCreateAccount((szLognDecode + 1), (szLognDecode + 12) ); 
		} 
		break; 
	case	CM_LOGIN: 
		{ 
			UnGameCode( pdata,(BYTE*)szDecode ); 
			p2 = szDecode; 
			p1 = strchr( p2, '/' ); 
			if( p1 != NULL ) 
			{ 
				*p1 = 0; 
				printf( "Username: %s\n", p2 ); 
				strncpy( m_szUsername, p2, 64 ); 
			} 
			p2 = p1 +1; 
			if( *p2 != 0 ) 
			{ 
				printf( "Password: %s\n", p2 ); 
				//strncpy( m_szPassword, p2, 64 ); 
				OnLogin( m_szUsername, p2 ); 
			} 
			else 
			{ 
				OnError( 0 ); 
			} 
		} 
		break; 
	case	CM_SELECTSERVER: 
		{ 
			UnGameCode( pdata, (BYTE*)szDecode ); 
			printf( "用户选择服务器 %s\n", szDecode ); 
			OnSelectServer( szDecode ); 
		} 
		break; 
	} 
	return VOID(); 
} 
 
VOID CMirClient::OnSelcharMessage(CHAR* pszMsg) 
{ 
	MIRMSG	msg; 
	CHAR		szHeader[20],*p1,*p2, * pdata = (pszMsg +16); 
	CHAR		szDecode[128]; 
	strncpy( szHeader, pszMsg, 16 ); 
	szHeader[16] = '\0'; 
	UnGameCode( szHeader, (BYTE*)&msg ); 
	switch( msg.wCmd ) 
	{ 
	case	CM_VERIFYSELECTCHAR: 
		{ 
			UnGameCode( pdata,(BYTE*)szDecode ); 
			p2 = szDecode; 
			p1 = strchr( p2, '/' ); 
			if( p1 != NULL ) 
			{ 
				*p1 = 0; 
				printf( "Username: %s\n", p2 ); 
				strncpy( m_szUsername, p2, 64 ); 
			} 
			p2 = p1 +1; 
			if( *p2 != 0 ) 
			{ 
				printf( "Sid: %s\n", p2 ); 
				//strncpy( m_szPassword, p2, 64 ); 
				OnQueryCharlist( m_szUsername, p2 ); 
			} 
			else 
			{ 
				OnError( 0 ); 
			} 
		} 
		break; 
	case	CM_DELETECHARACTER: 
		{ 
			UnGameCode( pdata, (BYTE*)szDecode ); 
			OnDeleteCharacter( szDecode ); 
		} 
		break; 
	case	CM_SELECTCHARACTER: 
		{ 
			UnGameCode( pdata, (BYTE*)szDecode ); 
			OnSelectCharacter( szDecode ); 
		} 
		break; 
	} 
	return VOID(); 
} 
 
VOID CMirClient::OnGameMessage(CHAR* pszMsg) 
{ 
	MIRMSG	msg; 
	CHAR		szHeader[20],*p1,*p2, * pdata = (pszMsg +16); 
	CHAR		szDecode[256]; 
	strncpy( szHeader, pszMsg, 16 ); 
	szHeader[16] = '\0'; 
	UnGameCode( szHeader, (BYTE*)&msg ); 
	if( *((CHAR*)&msg) == '*' && *(((CHAR*)&msg)+1) == '*' ) 
	{ 
		UINT	u1,u2; 
		UnGameCode( pszMsg, (BYTE*)szDecode ); 
		p2 = szDecode; 
		p1 = strchr( p2, '/' ); 
		if( p1 != NULL ) 
		{ 
			*p1 = 0; 
			while( *p2 == '*' ) 
				p2 ++; 
			strncpy( m_szUsername, p2, 64 ); 
			p2 = p1+1; 
			p1 = strchr( p2, '/' ); 
			if( p1 != NULL ) 
			{ 
				*p1 = 0; 
				strncpy( m_szCharname, p2, 64 ); 
				p2 = p1 + 1; 
				p1 = strchr( p2, '/' ); 
				if( p1 != NULL ) 
				{ 
					*p1 = 0; 
					strncpy( m_szSid, p2, 64 ); 
					p2 = p1 + 1; 
					p1 = strchr( p2, '/' ); 
					if( p1 != NULL ) 
					{ 
						*p1 = 0; 
						u1 = atoi( p2 ); 
						p2 = p1 + 1; 
						if( p2[0] != 0 ) 
						{ 
							u2 = atoi( p2 ); 
							OnEnterGame( m_szUsername, m_szCharname, m_szSid, u1, u2 ); 
							return; 
						} 
					} 
				} 
			} 
		} 
		OnError( 0 ); 
	} 
	switch( msg.wCmd ) 
	{ 
	case	CM_CONFIRMNOTICE: 
		{ 
			printf( "用户确认了提示!\n" ); 
			OnConfirmNotice(); 
		} 
		break; 
	case	CM_QUERYWALK: 
	case	CM_QUERYRUN: 
	case	CM_HIT: 
	case	CM_QUERYTURN: 
		{ 
			sprintf( szDecode, "#+GOOD/%d!", GetTickCount() ); 
			SendString( szDecode ); 
		} 
		break; 
	} 
	return VOID(); 
} 
 
VOID CMirClient::CleanMsg(void) 
{ 
	memset( (VOID*)m_pMsg, 0, sizeof( MIRMSG )); 
	return VOID(); 
} 
 
VOID CMirClient::OnLogin(CHAR* pszUsername, CHAR* pszPassword) 
{ 
	CleanMsg(); 
	if( CheckAccount( pszUsername, pszPassword ) ) 
	{ 
		m_pMsg->wCmd = SM_LOGINOK; 
		SendMsg( m_pMsg, 0 ); 
	} 
	else 
	{ 
		m_pMsg->dwFlag = 0xffffffff; 
		m_pMsg->wCmd = 0x1f7; 
		SendMsg( m_pMsg, 0 ); 
	} 
	return VOID(); 
} 
 
VOID CMirClient::OnError(DWORD dwError) 
{ 
	return VOID(); 
} 
 
VOID CMirClient::SendMsg(PMIRMSG pMsg, int datasize) 
{ 
	m_szTempBuffer[0]  = '#'; 
	int i = 0; 
	CodeGameCode( (BYTE*)pMsg, datasize + MSGHEADSIZE, (BYTE*)(m_szTempBuffer+1) ); 
	i = strlen( m_szTempBuffer ); 
	m_szTempBuffer[i++] = '!'; 
	m_szTempBuffer[i] = '\0'; 
	int ierr = send( m_Connection.Socket, m_szTempBuffer, i, 0 ); 
	return VOID(); 
} 
 
PCONNECTION CMirClient::GetConnection(void) 
{ 
	return &m_Connection; 
} 
 
VOID CMirClient::OnSelectServer(CHAR* pszServerName) 
{ 
	CleanMsg(); 
	CMirServer * pServer = CMirServer::GetTheServer(); 
	m_pMsg->wCmd = SM_SELECTSERVEROK; 
	sprintf( m_pMsg->data, "%s/%s/%s",pServer->m_Config.sIpAddress, "7100", "10283823" ); 
	SendMsg( m_pMsg , strlen( m_pMsg->data ) ); 
	return VOID(); 
} 
 
VOID CMirClient::OnQueryCharlist(CHAR* pszUsername, CHAR* pszSid) 
{ 
	CleanMsg(); 
	m_pMsg->wCmd = SM_CHARACTERLIST; 
	m_pMsg->dwFlag = 2; 
	m_pMsg->wParam[2] = 1; 
	sprintf( m_pMsg->data, "%s", "*test/0/1/1/0/3423423234234/0/3/0/0/");// "%s/%d/%d/%d/%d/*%s/%d/%d/%d/%d/", "test1", 0,1,1,0, "test1", 0,3,0,0 ); 
	SendMsg( m_pMsg, strlen( m_pMsg->data )); 
	return VOID(); 
} 
 
VOID CMirClient::OnDeleteCharacter(CHAR* pszCharName) 
{ 
	printf( "用户删除角色 %s\n", pszCharName ); 
	CleanMsg(); 
	m_pMsg->wCmd = SM_DELETECHARACTEROK; 
	SendMsg( m_pMsg, 0 ); 
	return VOID(); 
} 
 
VOID CMirClient::OnEnterGame(CHAR* pszUsername, CHAR* pszCharname, CHAR* pszSid, UINT nVersion, UINT nFlag) 
{ 
	printf( "用户 %s 使用角色 %s 进入游戏世界!\n", pszUsername, pszCharname ); 
	CleanMsg(); 
	m_pMsg->wCmd = SM_SERVERNOTICE; 
	strcpy( m_pMsg->data, "测试服务器\r\n请多关照\r\n" ); 
	SendMsg( m_pMsg, strlen( m_pMsg->data ) ); 
	return VOID(); 
} 
 
VOID CMirClient::OnSelectCharacter(CHAR* pszCharname) 
{ 
	CleanMsg(); 
	CMirServer * pServer = CMirServer::GetTheServer(); 
	m_pMsg->wCmd = SM_SELECTCHARACTEROK; 
	sprintf( m_pMsg->data, "%s/%d", pServer->m_Config.sIpAddress, 7200 ); 
	SendMsg( m_pMsg, strlen( m_pMsg->data )); 
	return VOID(); 
} 
 
VOID CMirClient::OnConfirmNotice(void) 
{ 
	CleanMsg(); 
	m_pMsg->dwFlag = GetTickCount(); 
	m_Ident = m_pMsg->dwFlag; 
	m_pMsg->wCmd = SM_NEWMAP; 
	m_pMsg->wParam[0] = 640; 
	m_pMsg->wParam[1] = 630; 
	sprintf( m_pMsg->data, "%s", "0" ); 
	SendMsg( m_pMsg, strlen( m_pMsg->data )); 
	//CleanMsg(); 
	//m_pMsg->dwFlag = m_Ident; 
	m_pMsg->wCmd = SM_LOGON; 
	m_pMsg->wParam[3] = 4; 
	((DWORD*)m_pMsg->data)[0] = CMirServer::GetTheServer()->m_dwParam; 
	((DWORD*)m_pMsg->data)[1] = 0; 
	((DWORD*)m_pMsg->data)[2] = 0; 
	((DWORD*)m_pMsg->data)[3] = 0; 
	SendMsg( m_pMsg, 16 ); 
	CleanMsg(); 
	m_pMsg->wCmd = SM_UNKNOW1; 
	m_pMsg->dwFlag = 0xf2d505d7; 
	SendMsg( m_pMsg, 0 ); 
	CleanMsg(); 
	m_pMsg->wCmd = SM_MAPDESCRIPTION; 
	strcpy( m_pMsg->data, "欢迎测试" ); 
	SendMsg( m_pMsg, strlen( m_pMsg->data )); 
	ABILITYDESC * pAbility = ( ABILITYDESC*)m_pMsg; 
	memset( pAbility, 0, sizeof( ABILITYDESC )); 
	pAbility->ACHi = 9; 
	pAbility->ACLow = 1; 
	pAbility->BagWeight = 300; 
	pAbility->bHair = 1; 
	pAbility->bLevel = 250; 
	pAbility->BodyWeight = 200; 
	pAbility->bProf = 0; 
	pAbility->bSex = 0; 
	pAbility->DCHi = 200; 
	pAbility->DCLow = 200; 
	pAbility->dwGold = 4000000; 
	pAbility->Exp = 20; 
	pAbility->HandWeight = 200; 
	pAbility->Hp = 20000; 
	pAbility->MaxBagWeight = 500; 
	pAbility->MaxBodyWeight = 500; 
	pAbility->MaxExp = 30; 
	pAbility->MaxHandWeight = 500; 
	pAbility->MaxHp = 30000; 
	pAbility->MaxMp = 20000; 
	pAbility->wCmd = SM_ABILITY; 
	SendMsg( m_pMsg, sizeof( ABILITYDESC) - MSGHEADSIZE); 
	CleanMsg(); 
	m_pMsg->wCmd = SM_SUBABILITY; 
	SendMsg( m_pMsg, 0 ); 
	CleanMsg(); 
	m_pMsg->wCmd = SM_USERNAME; 
	strcpy( m_pMsg->data, "欢迎测试" ); 
	SendMsg( m_pMsg, strlen( m_pMsg->data ) ); 
	return VOID(); 
} 
 
VOID CMirClient::SendString(CHAR* pszString) 
{ 
	int ierr = send( m_Connection.Socket, pszString, strlen( pszString), 0 ); 
 
	return VOID(); 
} 
 
VOID CMirClient::Update(DWORD	dwTime) 
{ 
	if( dwTime - m_dwWaitTime >= 1000 ) 
	{ 
		m_dwWaitTime = dwTime; 
		//printf( "更新,1秒种\n" ); 
	} 
	return VOID(); 
} 
 
VOID CMirClient::OnTest(DWORD dwParam) 
{ 
	DWORD	dwParams[4]; 
	CHAR		szEncode[256]; 
	CHAR		szName[200] = "欢迎测试/255"; 
	dwParams[0] = dwParam; 
	CleanMsg(); 
	m_pMsg->dwFlag = 0xa5a500a5+Getrand( 1024 ); 
	m_pMsg->wCmd = 0x0a; 
	m_pMsg->wParam[0] = 640 + Getrand( 20 ) - 10; 
	m_pMsg->wParam[1] = 630 + Getrand( 20 ) - 10; 
	m_pMsg->wParam[2] = 4; 
	((DWORD*)m_pMsg->data)[0]  = dwParam; 
	((DWORD*)m_pMsg->data)[1] = 0; 
	((DWORD*)m_pMsg->data)[2] = 0; 
	((DWORD*)m_pMsg->data)[3] = 0; 
	CodeGameCode( (BYTE*)m_pMsg, MSGHEADSIZE + 12, (BYTE*)(szEncode+1) ); 
	CodeGameCode( (BYTE*)szName, 12, (BYTE*)(szEncode + 16 + 12) ); 
	*szEncode = '#'; 
	int i = strlen( szEncode ); 
	szEncode[i] = '!'; 
	szEncode[i+1] = 0; 
	SendString( szEncode ); 
	return VOID(); 
} 
 
BOOL CMirClient::LoadCharacter(CHAR* pszAccount) 
{ 
	return 0; 
} 
 
BOOL CMirClient::CheckAccount(CHAR* pszUsername, CHAR* pszPassword) 
{ 
	CMirServer * pServer = CMirServer::GetTheServer(); 
	CHAR	szFilename[256]; 
	sprintf( szFilename, "%s%s.inf", pServer->m_Config.sAccountPath, pszUsername ); 
	INIHANDLE	hIni; 
	hIni = iniopen(szFilename); 
	if( hIni ) 
	{ 
		inigetstring(hIni, "account", "PASS", szFilename ); 
		iniclose(hIni ); 
		if( strcmp( szFilename, pszPassword ) == 0 ) 
		{ 
			return TRUE; 
		} 
	} 
	return 0; 
} 
 
BOOL CMirClient::CreateAccount(CHAR* pszUsername, CHAR* pszPassword) 
{ 
	return 0; 
} 
 
VOID CMirClient::OnCreateAccount(CHAR* pszUsername, CHAR* pszPassword) 
{ 
	DWORD	dwError; 
	CMirServer * pServer = CMirServer::GetTheServer(); 
	CleanMsg(); 
	if( !pServer->CreateAccount(pszUsername, pszPassword, dwError)) 
	{ 
		m_pMsg->wCmd = SM_CREATEACCOUNTOK; 
		SendMsg(m_pMsg, 0 ); 
	} 
	else 
	{ 
 
	} 
	return VOID(); 
}