📄 mirgame.cpp
字号:
// 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 + -