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

📄 mirgame.cpp

📁 传奇挂机源代码 自动练级功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MirGame.cpp: implementation of the CMirGame class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <windowsx.h>
#include "MirGame.h"
#include "mircode.h"
#include "mirmsg.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define	BUFFERLENGTH	4096
FILE	*	g_fpLog, *g_fpGetLog, * g_fpPutLog;
void	LogFile( char * pp )
{
	DWORD	dwTime = GetTickCount();
//	fprintf( g_fpLog, "Log at %d: %s\n", dwTime, pp );
}
typedef struct
{
	DWORD	dwGold;
	WORD	wCmd;
	BYTE	bProf;
	BYTE	bHair;
	BYTE	bSex;
	BYTE	bOO;
	WORD	wUnknow;
	BYTE	bLevel;
	BYTE	bunknow;
	BYTE	ACHi;
	BYTE	ACLow;
	BYTE	MACHi;
	BYTE	MACLow;
	BYTE	DCHi;
	BYTE	DCLow;
	BYTE	MCHi;
	BYTE	MCLow;
	BYTE	SCHi;
	BYTE	SCLow;
	WORD	Hp;
	WORD	Mp;
	WORD	MaxHp;
	WORD	MaxMp;
	DWORD	dwUnknow;
	DWORD	Exp;
	DWORD	MaxExp;
	WORD	BagWeight;
	WORD	MaxBagWeight;
	BYTE	BodyWeight;
	BYTE	MaxBodyWeight;
	BYTE	HandWeight;
	BYTE	MaxHandWeight;
}MMSGSETCHARINFO;

DWORD	MessageProc( PVOID * p )
{
	CMirGame	*	pGame = (CMirGame*)p;
	int		ierr = 0;
	int		i = 0;
	int		leftlen = 0;
	char	*	pSearchString = NULL;
	char	*	m_tmpBuffer;
	char	*	m_tmpBuffer2;


	if( pGame == 0 )
	{
		return 0;
	}

	m_tmpBuffer = new char[BUFFERLENGTH + 5];
	memset( (void*)m_tmpBuffer, 0, BUFFERLENGTH + 5 );
	m_tmpBuffer2 = new char[BUFFERLENGTH + 5];
	memset( (void*)m_tmpBuffer2, 0, BUFFERLENGTH + 5 );


	leftlen = 0;
	pGame->LogSystem( "进入接收消息进程!" );

	while( pGame->m_bInGame )
	{

		Sleep( 1 );
		ierr = recv( pGame->m_sGame, m_tmpBuffer, BUFFERLENGTH, 0 );
		if( ierr == 0 )
		{
			pGame->Logout();
			break;
		}
		if( ierr != -1 )
		{
			for( i = 0;i < ierr;i ++ )
			{
				if( m_tmpBuffer[i] != '*' )
				{
					m_tmpBuffer2[leftlen++] = m_tmpBuffer[i];
				}
				else
				{
					pGame->m_MirMsg.SendString( pGame->m_sGame, "*" );
				}
				if( m_tmpBuffer[i] == '!' )
				{
					m_tmpBuffer2[leftlen] = '\0';
					pGame->m_MsgQueue.PutMsg( m_tmpBuffer2 );
					leftlen = 0;
				}
			}
		}

	}
	pGame->LogSystem( "消息线程退出!" );
	delete	[]m_tmpBuffer;
	delete	[]m_tmpBuffer2;
	return 0;
}

CMirGame::CMirGame()
{
	m_MirSocket.NetStartup();
	m_LeftHours = 0;
	m_dwGameState = 0;
	m_tmpBuffer	=	new char[BUFFERLENGTH];
	m_tmpBuffer2=	new	char[BUFFERLENGTH];
	m_MsgLeftBuf=	new char[BUFFERLENGTH * 2];
	memset( (void*)m_MsgLeftBuf, 0, BUFFERLENGTH * 2);
	memset( &m_LastAction, 0, sizeof( ACTION_LAST ));
	m_MiniMap.InitMiniMap( "DATA\\mmap.wix", "DATA\\mmap.wil" );

	m_bInGame = FALSE;
}

CMirGame::~CMirGame()
{

}

BOOL CMirGame::OpenGateServer(char *ip)
{
	char	tmpBuffer[256];
	char	tmpBuffer2[256];
	int erri = 0;
	m_sGate = m_MirSocket.OpenConnection( ip, 7000 );
	LogSystem( "连接账号验证服务器..." );

	if( m_sGate == 0 )
	{
		LogSystem( "连接账号验证服务器出错!" );
		return 0;
	}

	m_dwGameState = MGS_GATECONNECTED;
	LogSystem( "服务器连接成功!" );

	erri = send( m_sGate, MIRVERSION, strlen( MIRVERSION), 0 );
	if( erri == -1 )
	{
		LogSystem( "发生错误,停止连接!\n" );
		goto err;
	}

	m_dwGameState = MGS_WAITINGCHECKINFO;

	erri = recv( m_sGate, m_tmpBuffer, BUFFERLENGTH, 0 );

	if( erri == -1 )
	{
		goto err;
	}
	else
	{
		m_dwGameState = MGS_MAKECLIENTINFO;
		LogSystem("验证客户端合法性..." );
		m_tmpBuffer[erri-1] = '\0';
		UnGateCode( &m_tmpBuffer[1], tmpBuffer );
		strcat( tmpBuffer, "/" );
		CodeGateCode( tmpBuffer, tmpBuffer2 );
		sprintf( tmpBuffer, "<%s>", tmpBuffer2 );
	}
	erri = send( m_sGate, tmpBuffer, strlen( tmpBuffer), 0 );
	if( erri == -1 )
	{
		LogSystem( "发送验证信息 %s 出错", tmpBuffer );
		goto err;
	}
	m_dwGameState = MGS_WAITINGCHECKPASS;
	erri = recv( m_sGate, m_tmpBuffer, BUFFERLENGTH, 0 );
	if( erri == -1 )
	{
		LogSystem( "接受验证结果出错!" );
		goto err;
	}
	else
		m_tmpBuffer[erri]  = '\0';
	if( stricmp( m_tmpBuffer, "<pass>" ) == 0)
	{
		LogSystem( "客户端验证通过!" );
		m_dwGameState = MGS_CLIENTCHECKPASSED;
		return TRUE;
	}
err:
	m_dwGameState = 0;
	CloseGateServer();
	return FALSE;
}

BOOL CMirGame::Login(char *username, char *password)
{
	MMSG	msg;
	int	erri;
	memset( &msg, 0, sizeof( MMSG ));
//	int msize;
	if( strlen( username ) == 0 || strlen( password ) <= 3 )
		goto err;
	if( m_dwGameState != MGS_CLIENTCHECKPASSED )
		goto err;
getpasswordret:

	msg.wCmd = 0x7d1;

	sprintf( msg.data, "%s/%s", username, password );
//	msize = MSGHEADERSIZE + strlen( msg.data );
//	LogSystem( msg.data );
	erri = 	m_MirMsg.SendGateMsg( m_sGate, &msg );
	if( erri == -1 )
	{
		LogSystem( "发送用户名和密码时出错!" );
		goto err;
	}
	LogSystem( "发送密码成功~" );

	m_dwGameState = MGS_LOGINWAITING;
	LogSystem( "等待接收验证结果~" );
	erri = m_MirMsg.RecvGateMsg( m_sGate, &msg );
	if( erri == -1 )
	{
		LogSystem( "接收验证结果处错!" );
		goto err;
	}
	LogSystem( "收到验证结果~" );
	if( msg.wCmd == 0x7d1 )
		goto getpasswordret;
	if( msg.wCmd == 0x211  )
	{
		LogSystem( "验证通过!" );
		if( msg.wb > 0 )
		{
			LogSystem( "你的账户还有 %d 小时.", msg.wb );
		}
		m_dwGameState = MGS_SELECTSERVER;
		strcpy( m_Account, username );
		return TRUE;
	}
	else
	{
		if( msg.wCmd == 0x1f7 )
		{
			if( msg.dwFlag == 0xffffffff )
			{
				LogSystem( "密码错误!" );
			}
			if( msg.dwFlag == 0 )
			{
				LogSystem( "此用户不存在!" );
			}
			if( msg.dwFlag == 0xfffffffe )
			{
				LogSystem( "三次密码错误,服务器拒绝!" );
			}
			if( msg.dwFlag == 0xfffffffd )
			{
				LogSystem( "该用户正在使用中,可能被踢出服务器。" );
			}
		}
		else
		{
			LogSystem( "未知错误,错误代号 0x%x, 0x%x", msg.dwFlag, msg.wCmd );
		}
	}
err:
	m_dwGameState = 0;
	CloseGateServer();
	return FALSE;
}

BOOL CMirGame::EnterServer(char *ServerName)
{
	MMSG msg;
	int erri;
	memset( &msg, 0, sizeof( MMSG ));
	msg.wCmd = 0x68;
	strcpy( msg.data, ServerName );
	erri = m_MirMsg.SendGateMsg( m_sGate, &msg );
	if( erri == -1 )
	{
		LogSystem( "发送服务器名字出错!" );
		goto err;
	}
	m_dwGameState = MGS_WAITFORSELCHARADDRESS;
	erri = m_MirMsg.RecvGateMsg( m_sGate, &msg );
	if( erri == -1 )
	{
		LogSystem( "接收结果时出错!" );
		goto err;
	}

	if( msg.wCmd != 0x212 )
	{
		LogSystem( "未得到服务器地址!" );
		goto err;
	}
	LogSystem( "得到服务器地址:%s", msg.data );
	m_dwGameState = MGS_GOTSELCHARADDRESS;
	GetString( msg.data );
	//printf( "%s %s %s\n", g_StringList[0], g_StringList[1], g_StringList[2] );
	strcpy( m_SelCharIp, m_StringList[0] );
	m_SelCharPort = atoi( m_StringList[1] );
	strcpy( m_SID, m_StringList[2] );
	
	CloseGateServer();

	return TRUE;
err:
	m_dwGameState = 0;
	CloseGateServer();
	return FALSE;

}

BOOL CMirGame::GetSelCharInfo(SELCHARINFO *pInfo)
{
	return FALSE;

}

BOOL CMirGame::SelectChar(char *charname)
{
	LogSystem( "使用角色[%s]登陆服务器。", charname );
	MMSG	msg;
	int erri;
	memset( &msg, 0, sizeof( MMSG ));

	msg.wCmd = 0x67;
	sprintf( msg.data, "%s/%s", m_Account, charname );
	erri = m_MirMsg.SendMsg( m_sSelChar, &msg );
	if( erri == -1 )
	{
		LogSystem( "发送选人请求时出错!" );
		goto err;
	}

	erri = m_MirMsg.RecvMsg( m_sSelChar, &msg );
	if( erri == -1 )
	{
		LogSystem( "接收选人结果时出错!" );
		goto err;
	}
	if( msg.wCmd != 0x20d )
	{
		LogSystem( "选人未被服务器接受!" );
		goto err;
	}
	LogSystem( "服务器接受所选角色信息!" );
	LogSystem( "正在准备登陆到游戏服务器!" );
	//printf( "%s\n", msg.data );
	GetString( msg.data );
	LogSystem( "服务器地址: %s 端口: %s\n", m_StringList[0], m_StringList[1] );

	return TRUE;
err:
	return FALSE;
}
int	xofs_walk[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int yofs_walk[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
void CMirGame::Walk(int dir)
{
	MMSG msg;
	
	int erri;
	int tx,ty;
	if( !CanDoAction())
		return;
	if( dir <0 || dir > 7 )
		return;
	tx = m_CharSelf.pos_x  + (xofs_walk[dir]);
	ty = m_CharSelf.pos_y  + (yofs_walk[dir]);
	if( !m_GameMap.TestMap( tx, ty ))
	{
		LogChat( "前方无法通过!" );
		return;
	}

	memset( &msg, 0, sizeof( MMSG ));
	msg.wa = tx;//g_pos_x;
	msg.wb = ty;//g_pos_y;
	msg.wCmd = 0xbc3;
	msg.w2 = dir;
	erri = m_MirMsg.SendMsg( m_sGame, &msg );
	if( erri == -1 )
		return;
	m_LastAction.action = ACTION_WALK;
	m_LastAction.x = tx;
	m_LastAction.y = ty;
	m_LastAction.dir = dir;
	return ;

}
void	CMirGame::LogToList( HWND hList, char * line )
{
	int cnt = 0;
	cnt = ListBox_GetCount( hList );
	if( cnt >= m_MaxLogLine )
	{
		ListBox_DeleteString( hList, 0 );
		cnt --;
	}
	ListBox_AddString( hList, line );
	ListBox_SetCurSel( hList, cnt );
}

void	CMirGame::LogChat( char * line,... )
{
	char	szBuff[2048];
	va_list	vl;
	va_start( vl, line );
	vsprintf( szBuff, line, vl );
	va_end( vl);
	LogToList( m_hChatLog, szBuff );
}

void	CMirGame::LogSystem( char * line,... )
{
	char	szBuff[2048];
	va_list	vl;
	va_start( vl, line );
	vsprintf( szBuff, line, vl );
	va_end( vl);
	LogToList( m_hSysLog, szBuff );
}

BOOL CMirGame::InitLogSystem(HWND hSysLog, HWND hChatLog, int MaxLine)
{
	m_hSysLog = hSysLog;
	m_hChatLog = hChatLog;
	m_MaxLogLine = MaxLine;
	return TRUE;
}

BOOL CMirGame::CloseGateServer()
{
	LogSystem( "断开密码验证服务器!" );
	closesocket(m_sGate);
//	m_MirSocket.NetCleanup();
	return TRUE;
}
int CMirGame::GetString( char * string )
{
	int ilen = strlen( string );
	int i = 0;
	int cnt = 0;
	int sptr = 0;
	for( i =0;i < ilen;i ++ )
	{
		if( string[i] == '/' && i != 0 )
		{
			m_StringList[cnt][sptr] = '\0';
			sptr = 0;
			cnt++;
		}
		else
		{
			m_StringList[cnt][sptr] = string[i];
			sptr ++;
		}
	}
	if( sptr > 0 )
	{
		m_StringList[cnt][sptr] = '\0';
		cnt++;
	}
	return cnt;
}

BOOL CMirGame::EnterSelCharServer()
{

	MMSG	msg;
	int i = 0;
	memset( &msg, 0, sizeof( MMSG ));
	int erri = 0;
	if( m_dwGameState != MGS_GOTSELCHARADDRESS )
		return 0;
	
	LogSystem( "连接角色服务器 %s:%d ...", m_SelCharIp, m_SelCharPort );
	m_sSelChar = m_MirSocket.OpenConnection( m_SelCharIp, m_SelCharPort );
	if( m_sSelChar== 0 )
	{
		LogSystem( "连接角色服务器出错!" );
		m_dwGameState = 0;
		CloseGateServer();
		return FALSE;
	}
	m_dwGameState = MGS_SELCHARCONNECTED;
	LogSystem( "验证用户SID\n" );

	msg.wCmd = 0x64;
	sprintf( msg.data, "%s/%s", m_Account, m_SID );
	erri = m_MirMsg.SendMsg( m_sSelChar, &msg );
	if( erri == -1 )
	{
		LogSystem( "发送验证信息时出错!" );
		goto err;
	}
	erri = m_MirMsg.RecvMsg( m_sSelChar, &msg );
	if( erri == -1 )
	{
		LogSystem( "接收验证结果时出错!" );
		goto err;
	}
	if( msg.wCmd != 0x208 )
	{
		LogSystem( "未得到角色列表!" );
		goto err;
	}
	erri = GetString( msg.data);
	LogSystem( "发现 %d 个角色", msg.wa & 0xff );
	m_SelCharInfo.CharCount = msg.wa & 0xff;
	for( i = 0;i < m_SelCharInfo.CharCount;i ++ )
	{
		if( m_StringList[5 * i][0] == '*' )
		{
			strcpy( m_SelCharInfo.Chars[i].Name, &m_StringList[5 * i][1] );
			m_SelCharInfo.ActiveChar = i;	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -