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

📄 mirgame.cpp

📁 传奇挂机源代码 自动练级功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			LogSystem( "上次使用角色 %s", &m_StringList[5 * i][1] );

		}
		else
			strcpy( m_SelCharInfo.Chars[i].Name, m_StringList[5 * i] );
		m_SelCharInfo.Chars[i].hair = atoi( m_StringList[5 * i + 1] );
		m_SelCharInfo.Chars[i].prof = atoi( m_StringList[5 * i + 2] );
		m_SelCharInfo.Chars[i].level = atoi( m_StringList[5 * i + 3] );
		m_SelCharInfo.Chars[i].sex = atoi( m_StringList[5 * i + 4] );
		LogSystem( "%d [%s] 等级[%s]", i, m_SelCharInfo.Chars[i].Name, m_StringList[5 * i + 3] );
	}
	return TRUE;
err:
	return FALSE;

}

BOOL CMirGame::CloseAll()
{
	return TRUE;
}

BOOL CMirGame::EnterGame(int CharIndex)
{	
	MMSG	msg;
	int erri;
	char	*	CharName = 0;
	g_fpLog	=	fopen( "d:\\msglog.txt", "w" );
	g_fpGetLog = fopen( "d:\\msggetlog.txt", "w" );
	g_fpPutLog = fopen( "d:\\msgputlog.txt", "w" );
	memset( &msg, 0, sizeof( MMSG ));
	if( m_SelCharInfo.CharCount  == 0 )
	{
		LogSystem( "没有角色,无法进入游戏!" );
		return FALSE;
	}
	if( CharIndex < 0 || CharIndex >= m_SelCharInfo.CharCount )
	{
		LogSystem( "所选择地角色不存在!" );
		return FALSE;
	}
	CharName = m_SelCharInfo.Chars[CharIndex].Name;

	LogSystem( "使用角色[%s]登陆服务器。", CharName );

	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( "选人未被服务器接受!" );
		LogSystem( "得到消息是: 0x%x  [%s]", msg.wCmd,msg.data );
		goto err;
	}
	LogSystem( "服务器接受所选角色信息!" );
	LogSystem( "正在准备登陆到游戏服务器!" );
	//printf( "%s\n", msg.data );
	GetString( msg.data );
	LogSystem( "服务器地址: %s 端口: %s", m_StringList[0], m_StringList[1] );

	CloseSelCharServer();

	LogSystem( "正在进入游戏服务器,请稍候..." );
	m_sGame = m_MirSocket.OpenConnection( m_StringList[0], atoi( m_StringList[1] ));
	if( m_sGame == 0 )
	{
		LogSystem( "连接游戏服务器出错!");
		goto err;
	}
	sprintf( m_tmpBuffer, "**%s/%s/%s/20020522/0", m_Account, CharName, m_SID );

	CodeGameCode( (BYTE*)m_tmpBuffer, strlen( m_tmpBuffer ), (BYTE*)m_tmpBuffer2 );
	sprintf( m_tmpBuffer, "#%c%s!", m_MirMsg.GetMsgFlag(), m_tmpBuffer2 );
	LogSystem( "验证用户合法性..." );
	erri = m_MirMsg.SendString( m_sGame, m_tmpBuffer );
	if( erri == -1 )
	{
		LogSystem( "发送用户验证信息出错!" );
		m_MirSocket.CloseConnection( m_sGame );
		goto err;
	}

	return StartGame();
err:
	CloseSelCharServer();
	return FALSE;
}
#define	CLEARMSG(a)	memset( &##a, 0, sizeof( MMSG ))
BOOL CMirGame::StartGame()
{
	int i2 = 10;
	MMSG	msg;
	char	pTxt[256];
	MMSGSETCHARINFO	*	pmsginfo;
	DWORD	dwTime,pid;
	BOOL	bInWorld = FALSE;
	int	ilen = 0;
	if( !m_MirSocket.SetNoBlock( m_sGame ))
	{
		goto err;
	}

	m_bInGame = TRUE;
	CreateThread( NULL, 1024 * 1024 * 1, (LPTHREAD_START_ROUTINE)MessageProc, (LPVOID)this, 0, &pid );
	dwTime = GetTickCount();
	memset( &m_LastAction, 0, sizeof( m_LastAction ));
	while( m_bInGame ) 
	{
		Sleep( 1 );
		if( GetTickCount() - dwTime >= 800 && bInWorld)
		{
			RunThrough( dwTime & 7 );
			dwTime = GetTickCount();
			LogChat( "do action!" );
		}
		if((ilen = GetMsg( &msg )) != 0)
		{
		//	Sleep( 1 );
			switch( msg.wCmd )
			{
			case	0x292:
				CLEARMSG( msg );
				msg.wCmd = 0x3fa;
				if( m_MirMsg.SendMsg( m_sGame, &msg ) == -1 )
				{
					goto err;
				}
				LogSystem( "进入游戏世界..." );
				break;
			case	0x33:
				m_CharSelf.pos_x = msg.w1;
				m_CharSelf.pos_y = msg.w2;
				LogChat( "出现在地图 %d, %d 处", msg.w1,msg.w2 );
				SetCharacterPos( msg.w1, msg.w2 );
				m_CharSelf.dwServerId = msg.dwFlag;
				m_GameMap.SetGameMap( msg.data, msg.w1, msg.w2 );
				break;
			case	0x22:
				if( msg.dwFlag == m_CharSelf.dwServerId )
				{
					LogChat( "你被杀死了!" );
				}
				else
				{
					LogChat( "ServerId = %d 被人杀死了!" );
				}
				break;
			case	0x1f:
				if( msg.dwFlag == m_CharSelf.dwServerId )
				{
					LogChat( "你被别人攻击 减少 %d 的生命,剩下 %d 的生命,总共 %d 的生命.", msg.w3, msg.w1, msg.w2 );
				}
				else
				{
					LogChat( "Serverid = %d 被别人攻击 减少 %d 的生命,剩下 %d 的生命,总共 %d 的生命.", msg.dwFlag, msg.w3, msg.w1, msg.w2  );
				}
				break;
			case	0x34:
				pmsginfo = (MMSGSETCHARINFO*)&msg;
				LogChat( "Level:%u Gold:%u AC:%u-%u MAC:%u-%u DC:%u-%u MC:%u-%u SC:%u-%u",pmsginfo->bLevel,
					pmsginfo->dwGold, pmsginfo->ACHi, pmsginfo->ACLow, pmsginfo->MACHi, pmsginfo->MACLow,
					pmsginfo->DCHi,pmsginfo->DCLow, pmsginfo->MCHi, pmsginfo->MCLow , pmsginfo->SCHi, pmsginfo->SCLow );

				break;
			case	0x36:
				LogChat( "地图名字是 %s.", msg.data );
				i2 = 0;
				CLEARMSG(msg);
				msg.wCmd = 0x409;
				if( m_MirMsg.SendMsg( m_sGame, &msg ) == -1 )
				{
					goto err;
				}
				bInWorld = TRUE;
				break;
			case	0x2c6:
				m_MiniMap.SetMMap( msg.w1 );
				break;
			case	0x64:
				LogChat( "系统信息: %s", msg.data );
				break;
			case	0x67:
				HandleCommand( msg.data );
				LogChat( msg.data );
				break;
			case	0x0a:
				if( msg.data[8] != (char)0 )
				{
					UnNameCode( &msg.data[8], pTxt );
					LogChat( " %s 出现在(%d,%d)处!", pTxt, msg.w1, msg.w2 );
					fprintf( g_fpPutLog, "id = 0x%08x w1 = 0x%04x w2 = 0x%04x w3 = 0x%04x d1 = 0x%08x d2 = 0x%08x name = %s\n",
						msg.dwFlag,msg.w1, msg.w2, msg.w3, ((DWORD*)msg.data)[0], ((DWORD*)msg.data)[1], pTxt );

					//Say( " %s 出现在(%d,%d)处!", pTxt, msg.w1, msg.w2 );
				}
				else
				{
					LogChat( " %d 出现在(%d,%d)处!", msg.dwFlag,  msg.w1, msg.w2 );
					fprintf( g_fpPutLog, "id = 0x%08x w1 = 0x%04x w2 = 0x%04x w3 = 0x%04x d1 = 0x%08x d2 = 0x%08x \n",
						msg.dwFlag,msg.w1, msg.w2, msg.w3, ((DWORD*)msg.data)[0], ((DWORD*)msg.data)[1] );
				
				}
				break;
			case	0x09:
				if( msg.dwFlag == m_CharSelf.dwServerId )
				{
					SetCharacterPos( msg.w1, msg.w2 );
					LogChat( "重新设置角色坐标在 %d, %d ...", msg.w1, msg.w2 );
					if( m_LastAction.action != 0 )
					{
						m_LastAction.x = msg.w1;
						m_LastAction.y = msg.w2;
					}
				}
				break;
			case	0x27a:
				if( msg.dwFlag == m_CharSelf.dwServerId )
				{
					SetCharacterPos( msg.w1, msg.w2 );
					LogChat( "切换地图后,重新设置角色坐标在 %d, %d ...", msg.w1, msg.w2 );
					if( m_LastAction.action != 0 )
					{
						m_LastAction.x = msg.w1;
						m_LastAction.y = msg.w2;
					}
				}
				break;
			case	0x279:
				LogChat( "切換地圖!" );
				break;
			case	0x28:
				//LogChat( "Chat" );
			case	0x68:
				LogChat( "Chat: %s", msg.data );
				break;
			default:
				fprintf( g_fpLog, "UNKNOW MSG: FLAG = 0x%08x wCmd = 0x%04x w1 = 0x%04x w2 = 0x%04x w3 = 0x%04x data = [%s] hex = [", msg.dwFlag, msg.wCmd, msg.w1, msg.w2, msg.w3, msg.data );
				for( i2 = 0;i2 < ilen - MSGHEADERSIZE;i2 ++ )
				{
					fprintf( g_fpLog, "%02x ", msg.data[i2] & 0xff );
				}
				fprintf( g_fpLog, "]\n" );
			}
		}
	}
	memset( &msg, 0,sizeof( MMSG ));
	msg.wCmd = 0x3f1;
	m_MirMsg.SendMsg( m_sGame, &msg );
	LogSystem( "断开游戏服务器!" );
	m_MirSocket.CloseConnection( m_sGame );

	return TRUE;
err:
	return FALSE;
}

int CMirGame::GetMsg( MMSG * pMsg )
{
	int ilen = 0;
	if( m_MsgQueue.GetMsg( m_tmpBuffer ))
	{
		ilen = strlen( m_tmpBuffer );
		//LogFile( m_tmpBuffer );
		fprintf( g_fpGetLog, "%s\n", m_tmpBuffer );
		if( m_tmpBuffer[ilen-1] == '!' )
		{
			m_tmpBuffer[ilen-1] = '\0';
		}
		if( m_tmpBuffer[1] == '+' )
		{
			m_tmpBuffer[6] = '\0';
			//LogChat( "GetWords %s", m_tmpBuffer );
			if( stricmp( m_tmpBuffer, "#+GOOD" ) == 0 )
			{
				ActionOk();
			}
			else if( stricmp( m_tmpBuffer, "#+FAIL" ) == 0 )
			{
				ActionFail();
			}
			return GetMsg( pMsg );
			
		}
		ilen = UnGameCode( &m_tmpBuffer[1], (BYTE*)pMsg );
		
		if( pMsg->wCmd == 0x0a || pMsg->wCmd == 0x26d )
		{
			UnNameCode( &pMsg->data[8], m_tmpBuffer2 );
		//	fprintf( g_fpLog, "%s!\n", m_tmpBuffer );
		//	fprintf( g_fpGetLog, "NAME:%s\n", m_tmpBuffer2 );
		}
		return ilen;	
	}
	return 0;
}

void CMirGame::ActionOk()
{
	LogChat( "Action Ok!" );
	switch( m_LastAction.action )
	{
	case	ACTION_RUN:
		//LogFile( "End Run!");
	case	ACTION_WALK:
		SetCharacterPos( m_LastAction.x, m_LastAction.y );
		break;
	case	ACTION_TRUN:
		LogChat( "转身OK!" );
		break;
	}
	LogChat( "Pos( %d, %d)", m_CharSelf.pos_x , m_CharSelf.pos_y );
	m_LastAction.action = 0;
	memset( &m_LastAction, 0, sizeof( m_LastAction ));
}

void CMirGame::ActionFail()
{
	//LogFile( "Action Fail!" );
	LogChat( "Action Fail!" );
	m_LastAction.action = 0;
	memset( &m_LastAction, 0, sizeof( m_LastAction ));
}

BOOL CMirGame::CanDoAction()
{
	if( m_LastAction.action == 0 )
		return 1;
	return 0;
}

BOOL CMirGame::Say(char *word,...)
{
	MMSG msg;
	char	szBuff[2048];
	va_list	vl;
	va_start( vl, word );
	vsprintf( szBuff, word, vl );
	va_end( vl);

	memset( &msg, 0, sizeof( MMSG ));
	strcpy( msg.data , szBuff );
	//sprintf( msg.data, "#(%03d,%03d)-%s", g_pos_x, g_pos_y, word );
	msg.wCmd = 0xbd6;
	int erri;
	erri = m_MirMsg.SendMsg( m_sGame, &msg );
	return (erri!= -1);
}

BOOL CMirGame::Logout()
{
	m_bInGame = FALSE;

	return TRUE;
}

BOOL CMirGame::CloseSelCharServer()
{
	LogSystem( "断开角色服务器!" );
	m_MirSocket.CloseConnection( m_sSelChar );
	return TRUE;
}

void CMirGame::HandleCommand(char *command)
{
	//command[9] = '\0';
	char	cmd[20];
	char	param[260];
	memcpy( (void*)cmd, (void*)command, 8 );
	cmd[8] = '\0';
	if( stricmp( cmd, "渴望5222" ) == 0 )
	{
		LogChat( "发现控制者,处理控制者指令!" );
	}
	else
	{
		return;
	}
	memcpy( (void*)cmd,(void*)&command[11],4 );
	cmd[4] = '\0';
	memcpy( (void*)param, (void*)&command[16], 255 );
	//param[2] = '\0';
	if( stricmp( cmd, "link" )== 0 )
	{
		Say( "控制者 渴望5222 已经连接!" );
	}else if( stricmp( cmd, "talk" ) == 0 )
	{
		Say( param );
	}else if( stricmp( cmd, "setx" )== 0)
	{
		m_CharSelf.pos_x = atoi( param );
		Say( "设置新X坐标:%d", m_CharSelf.pos_x );
	}else if( stricmp( cmd, "sety" )== 0)
	{
		m_CharSelf.pos_y = atoi( param );
		Say( "设置新Y坐标:%d", m_CharSelf.pos_y );
	}else if( stricmp( cmd, "walk" ) == 0 )
	{
		Walk( atoi( param ));
	}else if( stricmp( cmd, "frun" ) == 0 )
	{
		RunThrough( atoi( param ));
	}else if( stricmp( cmd, "turn" ) == 0 )
	{
		Turn( atoi( param ));
	}
	else
	{
		Say( &command[11] );
	}

	LogChat( "控制者命令 %s(%s)", cmd, param );
}

void CMirGame::Run(int dir)
{
	MMSG msg;
	
	int erri;
	int tx,ty;
	if( !CanDoAction())
		return;
	
	if( dir <0 || dir > 7 )
		return;
	//LogFile( "Start Run!" );
	LogChat( "Start Run at ( %d, %d )", m_CharSelf.pos_x,m_CharSelf.pos_y );
	tx = m_CharSelf.pos_x  + (xofs_walk[dir]*2);
	ty = m_CharSelf.pos_y  + (yofs_walk[dir]*2);
	if( !m_GameMap.TestMap( tx, ty ) || !m_GameMap.TestMap(m_CharSelf.pos_x  + xofs_walk[dir], m_CharSelf.pos_y  + yofs_walk[dir]))
	{
		LogChat( "前方无法通过!" );
		return;
	}
	memset( &msg, 0, sizeof( MMSG ));
	msg.wa = tx;
	msg.wb = ty;
	msg.wCmd = 0xbc5;
	msg.w2 = dir;
	erri = m_MirMsg.SendMsg( m_sGame, &msg );
	if( erri == -1 )
		return;
	m_LastAction.action = ACTION_RUN;
	m_LastAction.x = tx;
	m_LastAction.y = ty;
	m_LastAction.dir = dir;
	return ;
}

void CMirGame::Turn(int dir)
{
	MMSG msg;
	
	int erri;
	int tx,ty;
	if( !CanDoAction())
		return;
	if( dir <0 || dir > 7 )
		return;
	tx = m_CharSelf.pos_x;
	ty = m_CharSelf.pos_y;
	memset( &msg, 0, sizeof( MMSG ));
	msg.wa = tx;//g_pos_x;
	msg.wb = ty;//g_pos_y;
	msg.wCmd = 0xbc2;
	msg.w2 = dir;
	erri = m_MirMsg.SendMsg( m_sGame, &msg );
	if( erri == -1 )
		return;
	m_LastAction.action = ACTION_TRUN;
	m_LastAction.x = tx;
	m_LastAction.y = ty;
	m_LastAction.dir = dir;
	return ;
}

void CMirGame::SetCharacterPos(int x, int y)
{
	m_CharSelf.pos_x = x;
	m_CharSelf.pos_y = y;
	m_MiniMap.SetCurPos( x, y);
	m_GameMap.SetPersonInfo( x, y, 0 );
}

CMirGameMap * CMirGame::GetGameMap()
{
	return &m_GameMap;

}

CMirMiniMap * CMirGame::GetMiniMap()
{
	return &m_MiniMap;
}

BOOL CMirGame::RunThrough(int dir)
{
	MMSG msg;
	
	int erri;
	int tx,ty;
	if( !CanDoAction())
		return FALSE;
	if( dir <0 || dir > 7 )
		return FALSE;
	tx = m_CharSelf.pos_x;
	ty = m_CharSelf.pos_y;

	memset( &msg, 0, sizeof( MMSG ));
	msg.wa = m_CharSelf.pos_x;//  + (xofs_walk[dir]);//g_pos_x;
	msg.wb = m_CharSelf.pos_y;//  + (yofs_walk[dir]);//g_pos_y;
	msg.wCmd = 0xbc8;
	msg.w2 = dir;
	erri = m_MirMsg.SendMsg( m_sGame, &msg );
	if( erri == -1 )
		return FALSE;
	m_LastAction.action = ACTION_RUNTHROUGH+1;
	m_LastAction.x = tx;
	m_LastAction.y = ty;
	m_LastAction.dir = dir;
	return TRUE;
}

⌨️ 快捷键说明

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