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

📄 mircore.cpp

📁 传奇世界网络游戏的一个小外挂,大家可以参考借鉴一下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	MMSG msg;
	char	tmpBuffer[2048];
	int erri;
	int tx,ty;
	if( dir <0 || dir > 7 )
		return 0;
	tx = g_pos_x + (xofs_walk[dir]*2);
	ty = g_pos_y + (yofs_walk[dir]*2);
	memset( &msg, 0, sizeof( MMSG ));
	msg.wa = tx;//g_pos_x;
	msg.wb = ty;//g_pos_y;
	msg.wCmd = 0xbc5;
	msg.w2 = dir;
	erri = SendMsg( s, &msg );
	if( erri == -1 )
		return 0;
	g_LastAction.action = ACTION_RUN;
	g_LastAction.x = tx;
	g_LastAction.y = ty;
	g_LastAction.dir = dir;
	return 1;
}
int Attack( SOCKET s, int dir )
{
	MMSG msg;
	char	tmpBuffer[2048];
	int erri;
	int tx,ty;
	if( dir <0 || dir > 7 )
		return 0;
	//tx = g_pos_x + (xofs_walk[dir]*2);
	//ty = g_pos_y + (yofs_walk[dir]*2);
	memset( &msg, 0, sizeof( MMSG ));
	//msg.dwFlag = 0x6000e;
	msg.wa = g_pos_x;
	msg.wb = g_pos_y;
	msg.wCmd = 0xbc8;
	msg.w2 = dir;
	erri = SendMsg( s, &msg );
	if( erri == -1 )
		return -1;
	erri = RecvString( s, tmpBuffer, 256 );
	if( erri == -1 )
		return 0;
//	printf( "%s\n", tmpBuffer );
	tmpBuffer[6] = '\0';
	if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
	{
		printf( "Good!!\n" );
		return 1;
	}
	return 0;
}

int GetMsgInfo( SOCKET	s )
{
	char	tmpBuffer[2048];
	static char	tmpLeft[4096] = "";
	char	tmpMsg[2048];
	int	ierr = 0;
	int iptr = 0;
	int i = 0;
	ierr = recv( s, tmpBuffer, 2048, 0 );
	if( ierr == -1 )
		return 0;
	if( ierr > 0 )
	{
		tmpBuffer[ierr] = '\0';
		printf( "Recv:%s\n", tmpBuffer );
		printf( "Left:%s\n", tmpLeft );
		strcat( tmpLeft, tmpBuffer );
		for( i = 0;i < (int)strlen( tmpLeft) ;i ++ )
		{
			if( tmpLeft[i] == '*' )
				continue;
			if( tmpLeft[i] == '#' )
			{
				iptr = i;
			}
			if( tmpLeft[i] == '!' )
			{
				memcpy( (void*)tmpMsg, (void*)&tmpLeft[iptr], i - iptr + 1 );
				tmpMsg[i-iptr+1] = '\0';
				if( !g_MsgQueue.PutMsg( tmpMsg ) )
				{
					break;
				}
//				printf( "Put msg: %s\n", tmpMsg );
				iptr = 0;
			}
		}
		if( iptr > 0 )
		{
			memcpy( (void*)tmpBuffer, (void*)&tmpLeft[iptr], ierr - iptr );
			tmpBuffer[ierr - iptr] = '\0';
			strcpy( tmpLeft, tmpBuffer );
		}
		else
		{
			tmpLeft[0]='\0';
		}
	}
	return 1;
}
int GetMsgInfo2( char * s )
{
	char	tmpBuffer[2048];
	static char	tmpLeft[4096] = "";
	static BOOL	bLeft = FALSE;
	char	tmpMsg[2048];
	int	ierr = 0;
	int iptr = 0;
	int i = 0;
	//ierr = recv( s, tmpBuffer, 2048, 0 );
	ierr = strlen( s );
	if( ierr == -1 )
		return 0;
	if( ierr > 0 )
	{
		tmpBuffer[ierr] = '\0';
		strcat( tmpLeft, s );//tmpBuffer );
		for( i = 0;i < ierr;i ++ )
		{
			if( tmpLeft[i] == '*' )
				continue;
			if( tmpLeft[i] == '#' )
			{
				iptr = i;
			}
			if( tmpLeft[i] == '!' )
			{
				memcpy( (void*)tmpMsg, (void*)&tmpLeft[iptr], i - iptr + 1 );
				tmpMsg[i-iptr+1] = '\0';
				if( !g_MsgQueue.PutMsg( tmpMsg ) )
				{
					break;
				}
				iptr = 0;
			}
		}
		if( iptr > 0 )
		{
			memcpy( (void*)tmpBuffer, (void*)&tmpLeft[iptr], ierr - iptr );
			tmpBuffer[ierr - iptr] = '\0';
			strcpy( tmpLeft, tmpBuffer );
		}
		else
		{
			tmpLeft[0] = '\0';
		}
		printf( "%s\n" , tmpLeft);
	}
	return 1;
}

int HandleAppearMsg( MMSG * pmsg )
{
	char	tmpBuffer[2048];
	char	strs[200];
	UnNameCode( &pmsg->data[8],  tmpBuffer );
	printf( "%s 出现在坐标 %d, %d 处\n", tmpBuffer, pmsg->w1, pmsg->w2 );
	sprintf( strs, "%s 出现在坐标 %d, %d 处\n", tmpBuffer, pmsg->w1, pmsg->w2 );
	SendWords( (SOCKET)pmsg->dwFlag, strs );
	printf( "Name code is %s\n", pmsg->data );
	return 0;
}
int EnterGame( char * serverip, int port, char * charname, char * sid )
{
	LPHOSTENT m_pHost;
	WSADATA m_wsaData;
	int		m_SockFD;
	struct	sockaddr_in ServAddr;
	char	tmpBuffer[1024];
	char	tmpBuffer2[1024];
	MMSG		msg;
	int msize = 0;
	int mdir = 0;
	int mmmtime = 0;
	memset( &msg, 0, sizeof( MMSG ));

	WSAStartup(MAKEWORD(2,2), &m_wsaData);

	m_pHost = gethostbyname(serverip);

	m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	ServAddr.sin_family	= AF_INET;
	ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
	ServAddr.sin_port = htons(port);

	printf( "正在连接游戏服务器...\n" );
	int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
	if( erri == -1) return 0;
	printf( "游戏服务器连接成功!\n" );
	sprintf( tmpBuffer, "**%s/%s/%s/20020522/0", ACCOUNT, charname, sid );
	CodeGameCode( (BYTE*)tmpBuffer, strlen( tmpBuffer ), (BYTE*)tmpBuffer2 );
	sprintf( tmpBuffer, "#%c%s!", g_msgflag, tmpBuffer2 );
	printf( "验证用户合法性...\n", tmpBuffer );
	erri = SendString( m_SockFD, tmpBuffer );
	if( erri == -1 )
		return 0;
	printf( "接收用户守则...\n" );
	erri = RecvMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	//printf( "%s\n", msg.data );
	erri = RecvString( m_SockFD, tmpBuffer, 2048 );
	if( erri > 0 )
	{
		printf( "%s\n", tmpBuffer );
	}
	memset( &msg, 0, sizeof( MMSG ));

	msg.wCmd = 0x3fa;
	printf( "确认同意用户守则...\n");
	erri = SendMsg( m_SockFD, &msg );
	if( erri == -1 )
		return -1;

	printf( "进入游戏!\n" );
	SetNoBlock( m_SockFD );
	int bflag = 0;
	while( 1 )
	{
		Sleep( 600 );
		mmmtime ++;
		GetMsgInfo( m_SockFD );

		while( GetMsg( &msg ))//RecvMsg( m_SockFD, &msg );
		{
		if( msg.wCmd == 0x33 )
		{
			printf( "人物出现在地图 %s.map 坐标 ( %d, %d )\n", msg.data ,msg.w1, msg.w2 );
			g_pos_x = msg.w1;
			g_pos_y = msg.w2;
		}
		if( msg.wCmd == 0x36 )
		{
			strcpy( g_mapname, msg.data );
			printf( "Location at map: %s\n", msg.data );
			
		}
		if( msg.wCmd == 0x0a )
		{
			msg.dwFlag = m_SockFD;
			HandleAppearMsg( &msg );
		}
		printf( "%s\n", msg.data );
		}
		//if( mdir == 6 )
		//	SendWords( m_SockFD, WORDS  );
		if( mmmtime > 50 )
		{
		if( CanDoAction())
		{
			printf( "跑步中!..\n" );
			SendWords( m_SockFD, WORDS );
			Run( m_SockFD, mdir );
		mdir ++;
		if( mdir >= 8 )
			mdir = 0;
		}
		}
		printf( "Pos: %d, %d\n", g_pos_x, g_pos_y );
		
	}

	closesocket(m_SockFD);
	WSACleanup();
	return 1;
}
int SelChar( char * serverip, int port, char * sid )
{
	LPHOSTENT m_pHost;
	WSADATA m_wsaData;
	int		m_SockFD;
	struct	sockaddr_in ServAddr;
//	char	tmpBuffer[1024];
//	char	tmpBuffer2[1024];
	MMSG		msg;
	int msize = 0;
	memset( &msg, 0, sizeof( MMSG ));

	WSAStartup(MAKEWORD(2,2), &m_wsaData);

	m_pHost = gethostbyname(serverip);

	m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	ServAddr.sin_family	= AF_INET;
	ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
	ServAddr.sin_port = htons(port);

	printf( "连接角色服务器...\n" );
	int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
	if( erri == -1) return 0;
	printf( "角色服务器连接成功!\n" );
	printf( "验证用户SID\n" );

	msg.wCmd = 0x64;
	sprintf( msg.data, "%s/%s", ACCOUNT, sid );
	//printf( "Test String is:%s\n", msg.data );
	erri = SendMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	erri = RecvMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	if( msg.wCmd != 0x208 )
		return 0;
	printf( "角色列表:%s\n", msg.data );

	memset( &msg, 0, sizeof( MMSG ));
	msg.wCmd = 0x67;
	sprintf( msg.data, "%s/%s", ACCOUNT, "开福の名人" );
	erri = SendMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	erri = RecvMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	if( msg.wCmd != 0x20d )
	{
		return 0;
	}
	printf( "%s\n", msg.data );
	GetString( msg.data );
	EnterGame( g_StringList[0], atoi(g_StringList[1]), "开福の名人", sid );

	closesocket(m_SockFD);
	WSACleanup();
	return 1;
}

int CrossGate( char * username, char * password, char * servername )
{
	LPHOSTENT m_pHost;
	WSADATA m_wsaData;
	int		m_SockFD;
	struct	sockaddr_in ServAddr;
	char	tmpBuffer[1024];
	char	tmpBuffer2[1024];
	MMSG		msg;
	int msize = 0;
	memset( &msg, 0, sizeof( MMSG ));

	WSAStartup(MAKEWORD(2,2), &m_wsaData);

	m_pHost = gethostbyname(CGIP);

	m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	ServAddr.sin_family	= AF_INET;
	ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
	ServAddr.sin_port = htons(7000);
	
	int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
	printf( "连接账号验证服务器...\n" );
	if( erri == -1) return 0;
	printf( "服务器连接成功!\n" );
	erri = send( m_SockFD, "<mir152>", 8, 0 );
	printf( "发送版本信息:%s\n", "<mir152>" );
	if( erri == -1 )
	{
		printf( "Error occured!\n" );
		return 0;
	}
	erri = recv( m_SockFD, rcBuffer, 4096, 0 );
	if( erri == -1 )
	{
		return 0;
	}
	else
	{
		printf("验证客户端合法性...\n" );
		//printf( "Get remote code: %s\n", rcBuffer );
		rcBuffer[erri-1] = '\0';
		UnGateCode( &rcBuffer[1], tmpBuffer );
		//printf( "%s\n", tmpBuffer );
		strcat( tmpBuffer, "/" );
		CodeGateCode( tmpBuffer, tmpBuffer2 );
		//printf( "%s\n", tmpBuffer2 );
		sprintf( tmpBuffer, "<%s>", tmpBuffer2 );
		//printf( "Gen local code: %s\n", tmpBuffer );
	}
	erri = send( m_SockFD, tmpBuffer, strlen( tmpBuffer), 0 );
	if( erri == -1 )
		return 0;
	erri = recv( m_SockFD, rcBuffer, 4096, 0 );
	if( erri == -1 )
		return 0;
	else
		rcBuffer[erri]  = '\0';
	printf( "%s\n", rcBuffer );
	if( stricmp( rcBuffer, "<pass>" ) == 0)
	{
		printf( "验证通过,开始验证用户名和密码\n" );
	}
	msg.wCmd = 0x7d1;
	sprintf( msg.data, "%s/%s", ACCOUNT, PASSWORD );
	msize = MSGHEADERSIZE + strlen( msg.data );
	erri = 	SendGateMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	//printf( "Password sended!\n" );
	erri = RecvGateMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	if( msg.wCmd == 0x211 )
		printf( "验证通过!\n" );
	else
		return 0;
	msg.wCmd = 0x68;
	strcpy( msg.data, servername );
	erri = SendGateMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	erri = RecvGateMsg( m_SockFD, &msg );
	if( erri == -1 )
		return 0;
	if( msg.wCmd != 0x212 )
		return 0;
	printf( "得到服务器地址:%s\n", msg.data );

	GetString( msg.data );
	//printf( "%s %s %s\n", g_StringList[0], g_StringList[1], g_StringList[2] );
	
	SelChar( g_StringList[0], atoi( g_StringList[1]), g_StringList[2] );

	closesocket(m_SockFD);
	WSACleanup();
	return 1;
}

⌨️ 快捷键说明

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