MirGame.cpp
资源名称:盛大传奇外挂原代码.rar [点击查看]
上传用户:marco7834
上传日期:2010-02-24
资源大小:82k
文件大小:24k
源码类别:
游戏引擎
开发平台:
Visual C++
- // 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: %sn", 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] = ' ';
- 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] = ' ';
- 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] = ' ';
- 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 %sn", 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( "%sn", msg.data );
- GetString( msg.data );
- LogSystem( "服务器地址: %s 端口: %sn", 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] = ' ';
- sptr = 0;
- cnt++;
- }
- else
- {
- m_StringList[cnt][sptr] = string[i];
- sptr ++;
- }
- }
- if( sptr > 0 )
- {
- m_StringList[cnt][sptr] = ' ';
- 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( "验证用户SIDn" );
- 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;
- 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( "%sn", 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 = %sn",
- 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, "%sn", m_tmpBuffer );
- if( m_tmpBuffer[ilen-1] == '!' )
- {
- m_tmpBuffer[ilen-1] = ' ';
- }
- if( m_tmpBuffer[1] == '+' )
- {
- m_tmpBuffer[6] = ' ';
- //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:%sn", 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] = ' ';
- char cmd[20];
- char param[260];
- memcpy( (void*)cmd, (void*)command, 8 );
- cmd[8] = ' ';
- if( stricmp( cmd, "渴望5222" ) == 0 )
- {
- LogChat( "发现控制者,处理控制者指令!" );
- }
- else
- {
- return;
- }
- memcpy( (void*)cmd,(void*)&command[11],4 );
- cmd[4] = ' ';
- memcpy( (void*)param, (void*)&command[16], 255 );
- //param[2] = ' ';
- 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;
- }