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