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

📄 mirgame.cpp

📁 传奇的脱机源代码 非常的好 供大家学习 谢谢
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MirGame.cpp: implementation of the CMirGame class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MirRobot.h"
#include "MirGame.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//#define	BUFFERLENGTH 4096
DWORD MessageProc(PVOID*p)
{
	CMirGame * pGame=(CMirGame*)p;
	int retval=0;
	int i=0;
	int leftlen=0;
	char*pSearchString=NULL;
	char*m_tmpBuffer;
	char*m_tmpBuffer2;

	if(pGame==NULL)
	{
		return FALSE;
	}

	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);
		retval=recv(pGame->m_sGame,m_tmpBuffer,BUFFERLENGTH,0);
		if(retval==0)
		{
			pGame->Logout();
			retval=FALSE;
			break;
		}
		if(retval!=-1)
		{
			for(i=0;i<retval;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 retval;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

// 构造函数
CMirGame::CMirGame()
{
	m_bInWorld=FALSE;
	tmpBuffer=new char[BUFFERLENGTH];
	tmpBuffer2=new char[BUFFERLENGTH];
	m_bInGame=FALSE;
	m_MirSocket.NetStartup();
}

// 解构函数
CMirGame::~CMirGame()
{

}

int CMirGame::GetString(char *string)
{
	int ilen=strlen(string);
	int i=0;
	int cnt=0;
	int sptr=0;
	for(i=0;i<20;i++)
		m_StringList[i].Empty();
	for(i=0;i<ilen;i++)
	{
		if(string[i]=='/' && i!=0 )
		{
			m_StringList[cnt]+='\0';
			sptr = 0;
			cnt++;
		}
		else
		{
			m_StringList[cnt]+=string[i];
			sptr++;
		}
	}
	if(sptr>0)
	{
		m_StringList[cnt]+='\0';
		cnt++;
	}
	return cnt;
}

// 开始游戏
BOOL CMirGame::BeginGame(CString ServerName, CString ServerIP, CString Account, 
						 CString Password, int Character)
{
	LogSystem("");
#ifdef MIR_SF_CLIENT
	m_sGate=m_MirSocket.OpenConnection(ServerIP,7000);// 打开连接
	m_dwGameState=MGS_CLIENTCHECKPASSED;
#else
	if(OpenGataServer(ServerIP))
#endif
		if(Login(Account,Password))
			if(EnterServer(ServerName))
				if(EnterSelCharServer())
					if(EnterGame(Character))
						if(StartGame())
						{
							LogSystem("    完成登陆!!");
							return TRUE;
						}
	return FALSE;
}

// 连接游戏服务器
BOOL CMirGame::OpenGataServer(LPCTSTR ServerIP)
{
	int retval=0;
	/*char tmpBuffer[256];
	char tmpBuffer2[256];*/

	LogSystem("连接服务器...");
	m_sGate=m_MirSocket.OpenConnection(ServerIP,7000);// 打开连接
	if(!m_sGate)
	{
		LogSystem("连接失败!");
		return FALSE;
	}

	m_dwGameState=MGS_GATECONNECTED;

	retval=send(m_sGate,MIRVERSION,strlen(MIRVERSION),0);// 发送客户端版本
	if(retval==-1)goto __err;

	m_dwGameState=MGS_WAITINGCHECKINFO;

	retval=recv(m_sGate,tmpBuffer,BUFFERLENGTH,0);// 接收服务器端验证信息
	if(retval==-1)goto __err;

	m_dwGameState=MGS_MAKECLIENTINFO;

	strcpy(tmpBuffer2,tmpBuffer);
	tmpBuffer2[retval-1]='\0';
	UnGateCode(&tmpBuffer2[1],tmpBuffer);// 解码验证信息
	strcat(tmpBuffer,"/");
	CodeGateCode(tmpBuffer,tmpBuffer2);
	sprintf(tmpBuffer,"<%s>",tmpBuffer2);// 转换验证信息

	retval=send(m_sGate,tmpBuffer,strlen(tmpBuffer),0);// 发送处理后的验证信息
	if(retval==-1)goto __err;

	m_dwGameState=MGS_WAITINGCHECKPASS;
	retval=recv(m_sGate,tmpBuffer,BUFFERLENGTH,0);// 接收服务器处理结果
	if(retval==-1)goto __err;

	tmpBuffer[retval]='\0';
	if(stricmp(tmpBuffer,"<pass>")==0)
	{
		// 客户端验证通过!
		LogSystem("客户端验证通过!");
		m_dwGameState=MGS_CLIENTCHECKPASSED;
		return TRUE;
	}
__err:
	return FALSE;// 连接失败
}

// 登陆游戏. in:账号/密码
BOOL CMirGame::Login(LPCTSTR username,LPCTSTR password)
{
	int	retval;
	CString s;

	MMSG msg;
	memset( &msg, 0, sizeof( MMSG ));

	if(strlen(username)==0 || strlen(password)<=3)// 验证账号密码长度
		goto __err;

	if(m_dwGameState!=MGS_CLIENTCHECKPASSED)// 验证当前客户端状态
		goto __err;

	LogSystem("正在验证账号/密码...");
getpasswordret:

	msg.wCmd = 0x7d1;

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

	m_dwGameState = MGS_LOGINWAITING;
	//LogSystem("等待接收验证结果~");
	memset( &msg, 0, sizeof( MMSG ));

	retval=m_MirMsg.RecvGateMsg(m_sGate,&msg);
	if(retval==-1 )
	{
		LogSystem("接收验证结果处错!");
		goto __err;
	}
	//LogSystem("收到验证结果~");
	if(msg.wCmd==0x7d1)
	{
		LogSystem("重新发送账号/密码");
		goto getpasswordret;
	}
	if(msg.wCmd==0x211 )
	{
		LogSystem("账号/密码验证通过!");
		if(msg.wb>0)
		{
			s.Format("你的账户还有%d小时.",msg.wb);
			LogSystem(s);
		}
		
		m_dwGameState=MGS_SELECTSERVER;
		m_Account=username;
		//LogSystem(m_Account);
		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
		{
			s.Format("未知错误,错误代号 0x%x, 0x%x",msg.dwFlag,msg.wCmd);
			LogSystem(s);
		}
	}
__err:
	m_dwGameState=0;
	CloseGateServer();
	return FALSE;
}

BOOL CMirGame::EnterServer(LPCTSTR ServerName)
{
	MMSG msg;
	int retval;
	memset(&msg,0,sizeof(MMSG));

	msg.wCmd=0x68;
	strcpy(msg.data,ServerName);
	//LogSystem("服务器:%s!",ServerName);

	retval=m_MirMsg.SendGateMsg(m_sGate,&msg);
	if(retval==-1)
	{
		LogSystem("发送服务器名字出错!");
		goto __err;
	}

	m_dwGameState=MGS_WAITFORSELCHARADDRESS;
	retval=m_MirMsg.RecvGateMsg(m_sGate,&msg);
	if(retval==-1)
	{
		LogSystem("接收结果时出错!");
		goto __err;
	}

	if(msg.wCmd!=0x212)
	{
		LogSystem("未得到服务器地址!");
		goto __err;
	}
	m_dwGameState=MGS_GOTSELCHARADDRESS;
	GetString(msg.data);

	m_SelCharIP=m_StringList[0];
	m_SelCharPort=atoi(m_StringList[1]);
	m_SID=m_StringList[2];

	//LogSystem("得到服务器地址:"+m_SelCharIP);
	
	CloseGateServer();

	return TRUE;
__err:
	m_dwGameState=0;
	CloseGateServer();
	return FALSE;
}

BOOL CMirGame::CloseGateServer()
{
	//LogSystem( "断开密码验证服务器!" );
	closesocket(m_sGate);
	return TRUE;
}


BOOL CMirGame::EnterSelCharServer()
{
	int retval=0;
	int i=0;
	MMSG msg;
	memset(&msg,0,sizeof(MMSG));

	CString s;

	if(m_dwGameState!=MGS_GOTSELCHARADDRESS)
		return FALSE;
	LogSystem("正在获取角色信息...");
	m_sSelChar=m_MirSocket.OpenConnection(m_SelCharIP,m_SelCharPort);
	if(m_sSelChar==0)
	{
		LogSystem("连接角色服务器出错!");
		m_dwGameState=0;
		CloseGateServer();
		return FALSE;
	}

	m_dwGameState=MGS_SELCHARCONNECTED;

	msg.wCmd=0x64;
	sprintf(msg.data,"%s/%s",m_Account,m_SID);
	retval=m_MirMsg.SendMsg(m_sSelChar,&msg);
	if(retval==-1)
	{
		LogSystem( "发送验证信息时出错!" );
		goto __err;
	}

	retval=m_MirMsg.RecvMsg(m_sSelChar,&msg);
	if(retval==-1)
	{
		LogSystem("接收验证结果时出错!");
		goto __err;
	}
	if(msg.wCmd!=0x208)
	{
		LogSystem("未得到角色列表!");
		goto __err;
	}

	LogSystem("");
	retval=GetString(msg.data);
	s.Format("当前账号下有 %d 个角色:",msg.wa&0xff);
	LogSystem(s);
	LogSystem("===========================");

	m_SelCharInfo.CharCount=msg.wa&0xff;
	for(i=0;i<m_SelCharInfo.CharCount;i++)
	{
		if(m_StringList[5*i].Left(1)=="*")
		{
			strcpy(m_SelCharInfo.Chars[i].Name,m_StringList[5*i].Mid(1));
			m_SelCharInfo.ActiveChar=i;	
			//LogSystem("上次使用角色:"+m_StringList[5*i].Mid(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]);
		s.Format("%d.[%s]等级[%d]%d",i,m_SelCharInfo.Chars[i].Name,
			m_SelCharInfo.Chars[i].level,m_SelCharInfo.Chars[i].prof);
		LogSystem(s);
	}
	LogSystem("===========================");
	for(i=0;i<20;i++)
	{
		LogSystem(m_StringList[i]);
	}
	return TRUE;
__err:
	return FALSE;
}

void CMirGame::LogSystem(LPCTSTR line)
{
	CString s=line;
	SendMessage(AfxGetMainWnd()->m_hWnd,WM_LOG_SYSTEM,NULL,(LPARAM)&s);
}

BOOL CMirGame::EnterGame(int CharIndex)
{
	MMSG msg;
	memset(&msg,0,sizeof(MMSG));
	int retval;
	char*CharName=NULL;
	//char*tmpBuffer=new char[BUFFERLENGTH];
	//char*tmpBuffer2=new char[BUFFERLENGTH];
	CString s;
	//g_fpLog=fopen("d:\\msglog.txt","w");
	//g_fpGetLog=fopen("d:\\msggetlog.txt","w");
	//g_fpPutLog=fopen("d:\\msgputlog.txt","w");

	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.Format("使用角色[%s]登陆服务器。",CharName);
	LogSystem(s);

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

	retval=m_MirMsg.RecvMsg(m_sSelChar,&msg);
	if(retval==-1)
	{
		LogSystem("接收选人结果时出错!");
		goto __err;
	}
	if(msg.wCmd!=0x20d)
	{
		LogSystem("选人未被服务器接受!");
		s.Format("得到消息是: 0x%x  [%s]",msg.wCmd,msg.data);
		LogSystem(s);
		goto __err;
	}
	//LogSystem("服务器接受所选角色信息!");
	//LogSystem("正在准备登陆到游戏服务器!");

	GetString(msg.data);
	s.Format("服务器地址: %s 端口: %s",m_StringList[0],m_StringList[1]);
	//LogSystem(s);

	CloseSelCharServer();

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

	CodeGameCode((BYTE*)tmpBuffer,strlen(tmpBuffer),(BYTE*)tmpBuffer2);
	sprintf(tmpBuffer,"#%c%s!",m_MirMsg.GetMsgFlag(),tmpBuffer2);
	//LogSystem("验证用户合法性...");
	retval=m_MirMsg.SendString(m_sGame,tmpBuffer);
	if(retval==-1)
	{
		LogSystem("发送用户验证信息出错!");
		m_MirSocket.CloseConnection(m_sGame);
		goto __err;
	}
	return TRUE;//StartGame();
__err:
	CloseSelCharServer();
	return FALSE;
}

⌨️ 快捷键说明

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