www.pudn.com > MirServer.rar > MirClient.cpp
#include "StdAfx.h"
#include ".\mirclient.h"
#include ".\mircode.h"
#include "mirdef.h"
#include "mirserver.h"
#include "..\..\public\ini.h"
CMirClient::CMirClient(void)
{
m_pMsg = (PMIRMSG)m_szMsgBuffer;
m_dwWaitTime = 0;
}
CMirClient::~CMirClient(void)
{
}
VOID CMirClient::SetConnection(CONNECTION* pConnection, int iClientType)
{
memcpy( &m_Connection, (void*)pConnection, sizeof( CONNECTION));
m_iType = iClientType;
return VOID();
}
VOID CMirClient::SetId(UINT nId)
{
m_Id = nId;
return VOID();
}
UINT CMirClient::GetId(void)
{
return m_Id;
}
VOID CMirClient::OnData(CHAR* pBuffer, UINT iSize)
{
m_MsgQueue.SaveMsg(pBuffer, iSize);
while( m_MsgQueue.GetMsg(m_szTempBuffer))
{
//UnGameCode(m_szTempBuffer, (BYTE*)m_pMsg );
switch(m_iType)
{
case CT_LOGIN:
OnLoginMessage( m_szTempBuffer+1 );
break;
case CT_SELCHAR:
OnSelcharMessage( m_szTempBuffer+1 );
break;
case CT_GAME:
OnGameMessage( m_szTempBuffer+1 );
break;
default:
break;
}
// OnMessage();
}
return VOID();
}
//#define CM_LOGIN 0x7d1
//#define SM_LOGINOK 0x211
//#define SM_LOGINFAIL 0x1f7
//#define CM_SELECTSERVER 0x68
//#define SM_SELECTSERVEROK 0x212
//#define SM_SELECTSERVERFAIL 0x1f8
//#define CM_VERIFYSELECTCHAR 0x64
//#define SM_VERIFYSELECTCHARFAIL 0x1f9
//#define SM_CHARACTERLIST 0x208
//#define CM_SELECTCHARACTER 0x67
//#define SM_SELECTCHARACTEROK 0x20d
//#define SM_SELECTCHARACTERFAIL 0x200
VOID CMirClient::OnMessage(PMIRMSG pMsg, CHAR* pszParam)
{
switch(pMsg->wCmd)
{
case CM_LOGIN:
break;
case CM_SELECTSERVER:
break;
case CM_VERIFYSELECTCHAR:
break;
case CM_SELECTCHARACTER:
break;
}
return VOID();
}
VOID CMirClient::OnLoginMessage(CHAR* pszMsg)
{
MIRMSG msg;
CHAR szHeader[20],*p1,*p2, * pdata = (pszMsg +16);
CHAR szDecode[128];
CHAR szLognDecode[2048];
strncpy( szHeader, pszMsg, 16 );
szHeader[16] = '\0';
UnGameCode( szHeader, (BYTE*)&msg );
switch( msg.wCmd )
{
case 2002:
{
UnGameCode( pdata, (BYTE*)szLognDecode );
*(szLognDecode + szLognDecode[0]+1)=0;
*(szLognDecode + 12 + szLognDecode[11]) = 0;
OnCreateAccount((szLognDecode + 1), (szLognDecode + 12) );
}
break;
case CM_LOGIN:
{
UnGameCode( pdata,(BYTE*)szDecode );
p2 = szDecode;
p1 = strchr( p2, '/' );
if( p1 != NULL )
{
*p1 = 0;
printf( "Username: %s\n", p2 );
strncpy( m_szUsername, p2, 64 );
}
p2 = p1 +1;
if( *p2 != 0 )
{
printf( "Password: %s\n", p2 );
//strncpy( m_szPassword, p2, 64 );
OnLogin( m_szUsername, p2 );
}
else
{
OnError( 0 );
}
}
break;
case CM_SELECTSERVER:
{
UnGameCode( pdata, (BYTE*)szDecode );
printf( "用户选择服务器 %s\n", szDecode );
OnSelectServer( szDecode );
}
break;
}
return VOID();
}
VOID CMirClient::OnSelcharMessage(CHAR* pszMsg)
{
MIRMSG msg;
CHAR szHeader[20],*p1,*p2, * pdata = (pszMsg +16);
CHAR szDecode[128];
strncpy( szHeader, pszMsg, 16 );
szHeader[16] = '\0';
UnGameCode( szHeader, (BYTE*)&msg );
switch( msg.wCmd )
{
case CM_VERIFYSELECTCHAR:
{
UnGameCode( pdata,(BYTE*)szDecode );
p2 = szDecode;
p1 = strchr( p2, '/' );
if( p1 != NULL )
{
*p1 = 0;
printf( "Username: %s\n", p2 );
strncpy( m_szUsername, p2, 64 );
}
p2 = p1 +1;
if( *p2 != 0 )
{
printf( "Sid: %s\n", p2 );
//strncpy( m_szPassword, p2, 64 );
OnQueryCharlist( m_szUsername, p2 );
}
else
{
OnError( 0 );
}
}
break;
case CM_DELETECHARACTER:
{
UnGameCode( pdata, (BYTE*)szDecode );
OnDeleteCharacter( szDecode );
}
break;
case CM_SELECTCHARACTER:
{
UnGameCode( pdata, (BYTE*)szDecode );
OnSelectCharacter( szDecode );
}
break;
}
return VOID();
}
VOID CMirClient::OnGameMessage(CHAR* pszMsg)
{
MIRMSG msg;
CHAR szHeader[20],*p1,*p2, * pdata = (pszMsg +16);
CHAR szDecode[256];
strncpy( szHeader, pszMsg, 16 );
szHeader[16] = '\0';
UnGameCode( szHeader, (BYTE*)&msg );
if( *((CHAR*)&msg) == '*' && *(((CHAR*)&msg)+1) == '*' )
{
UINT u1,u2;
UnGameCode( pszMsg, (BYTE*)szDecode );
p2 = szDecode;
p1 = strchr( p2, '/' );
if( p1 != NULL )
{
*p1 = 0;
while( *p2 == '*' )
p2 ++;
strncpy( m_szUsername, p2, 64 );
p2 = p1+1;
p1 = strchr( p2, '/' );
if( p1 != NULL )
{
*p1 = 0;
strncpy( m_szCharname, p2, 64 );
p2 = p1 + 1;
p1 = strchr( p2, '/' );
if( p1 != NULL )
{
*p1 = 0;
strncpy( m_szSid, p2, 64 );
p2 = p1 + 1;
p1 = strchr( p2, '/' );
if( p1 != NULL )
{
*p1 = 0;
u1 = atoi( p2 );
p2 = p1 + 1;
if( p2[0] != 0 )
{
u2 = atoi( p2 );
OnEnterGame( m_szUsername, m_szCharname, m_szSid, u1, u2 );
return;
}
}
}
}
}
OnError( 0 );
}
switch( msg.wCmd )
{
case CM_CONFIRMNOTICE:
{
printf( "用户确认了提示!\n" );
OnConfirmNotice();
}
break;
case CM_QUERYWALK:
case CM_QUERYRUN:
case CM_HIT:
case CM_QUERYTURN:
{
sprintf( szDecode, "#+GOOD/%d!", GetTickCount() );
SendString( szDecode );
}
break;
}
return VOID();
}
VOID CMirClient::CleanMsg(void)
{
memset( (VOID*)m_pMsg, 0, sizeof( MIRMSG ));
return VOID();
}
VOID CMirClient::OnLogin(CHAR* pszUsername, CHAR* pszPassword)
{
CleanMsg();
if( CheckAccount( pszUsername, pszPassword ) )
{
m_pMsg->wCmd = SM_LOGINOK;
SendMsg( m_pMsg, 0 );
}
else
{
m_pMsg->dwFlag = 0xffffffff;
m_pMsg->wCmd = 0x1f7;
SendMsg( m_pMsg, 0 );
}
return VOID();
}
VOID CMirClient::OnError(DWORD dwError)
{
return VOID();
}
VOID CMirClient::SendMsg(PMIRMSG pMsg, int datasize)
{
m_szTempBuffer[0] = '#';
int i = 0;
CodeGameCode( (BYTE*)pMsg, datasize + MSGHEADSIZE, (BYTE*)(m_szTempBuffer+1) );
i = strlen( m_szTempBuffer );
m_szTempBuffer[i++] = '!';
m_szTempBuffer[i] = '\0';
int ierr = send( m_Connection.Socket, m_szTempBuffer, i, 0 );
return VOID();
}
PCONNECTION CMirClient::GetConnection(void)
{
return &m_Connection;
}
VOID CMirClient::OnSelectServer(CHAR* pszServerName)
{
CleanMsg();
CMirServer * pServer = CMirServer::GetTheServer();
m_pMsg->wCmd = SM_SELECTSERVEROK;
sprintf( m_pMsg->data, "%s/%s/%s",pServer->m_Config.sIpAddress, "7100", "10283823" );
SendMsg( m_pMsg , strlen( m_pMsg->data ) );
return VOID();
}
VOID CMirClient::OnQueryCharlist(CHAR* pszUsername, CHAR* pszSid)
{
CleanMsg();
m_pMsg->wCmd = SM_CHARACTERLIST;
m_pMsg->dwFlag = 2;
m_pMsg->wParam[2] = 1;
sprintf( m_pMsg->data, "%s", "*test/0/1/1/0/3423423234234/0/3/0/0/");// "%s/%d/%d/%d/%d/*%s/%d/%d/%d/%d/", "test1", 0,1,1,0, "test1", 0,3,0,0 );
SendMsg( m_pMsg, strlen( m_pMsg->data ));
return VOID();
}
VOID CMirClient::OnDeleteCharacter(CHAR* pszCharName)
{
printf( "用户删除角色 %s\n", pszCharName );
CleanMsg();
m_pMsg->wCmd = SM_DELETECHARACTEROK;
SendMsg( m_pMsg, 0 );
return VOID();
}
VOID CMirClient::OnEnterGame(CHAR* pszUsername, CHAR* pszCharname, CHAR* pszSid, UINT nVersion, UINT nFlag)
{
printf( "用户 %s 使用角色 %s 进入游戏世界!\n", pszUsername, pszCharname );
CleanMsg();
m_pMsg->wCmd = SM_SERVERNOTICE;
strcpy( m_pMsg->data, "测试服务器\r\n请多关照\r\n" );
SendMsg( m_pMsg, strlen( m_pMsg->data ) );
return VOID();
}
VOID CMirClient::OnSelectCharacter(CHAR* pszCharname)
{
CleanMsg();
CMirServer * pServer = CMirServer::GetTheServer();
m_pMsg->wCmd = SM_SELECTCHARACTEROK;
sprintf( m_pMsg->data, "%s/%d", pServer->m_Config.sIpAddress, 7200 );
SendMsg( m_pMsg, strlen( m_pMsg->data ));
return VOID();
}
VOID CMirClient::OnConfirmNotice(void)
{
CleanMsg();
m_pMsg->dwFlag = GetTickCount();
m_Ident = m_pMsg->dwFlag;
m_pMsg->wCmd = SM_NEWMAP;
m_pMsg->wParam[0] = 640;
m_pMsg->wParam[1] = 630;
sprintf( m_pMsg->data, "%s", "0" );
SendMsg( m_pMsg, strlen( m_pMsg->data ));
//CleanMsg();
//m_pMsg->dwFlag = m_Ident;
m_pMsg->wCmd = SM_LOGON;
m_pMsg->wParam[3] = 4;
((DWORD*)m_pMsg->data)[0] = CMirServer::GetTheServer()->m_dwParam;
((DWORD*)m_pMsg->data)[1] = 0;
((DWORD*)m_pMsg->data)[2] = 0;
((DWORD*)m_pMsg->data)[3] = 0;
SendMsg( m_pMsg, 16 );
CleanMsg();
m_pMsg->wCmd = SM_UNKNOW1;
m_pMsg->dwFlag = 0xf2d505d7;
SendMsg( m_pMsg, 0 );
CleanMsg();
m_pMsg->wCmd = SM_MAPDESCRIPTION;
strcpy( m_pMsg->data, "欢迎测试" );
SendMsg( m_pMsg, strlen( m_pMsg->data ));
ABILITYDESC * pAbility = ( ABILITYDESC*)m_pMsg;
memset( pAbility, 0, sizeof( ABILITYDESC ));
pAbility->ACHi = 9;
pAbility->ACLow = 1;
pAbility->BagWeight = 300;
pAbility->bHair = 1;
pAbility->bLevel = 250;
pAbility->BodyWeight = 200;
pAbility->bProf = 0;
pAbility->bSex = 0;
pAbility->DCHi = 200;
pAbility->DCLow = 200;
pAbility->dwGold = 4000000;
pAbility->Exp = 20;
pAbility->HandWeight = 200;
pAbility->Hp = 20000;
pAbility->MaxBagWeight = 500;
pAbility->MaxBodyWeight = 500;
pAbility->MaxExp = 30;
pAbility->MaxHandWeight = 500;
pAbility->MaxHp = 30000;
pAbility->MaxMp = 20000;
pAbility->wCmd = SM_ABILITY;
SendMsg( m_pMsg, sizeof( ABILITYDESC) - MSGHEADSIZE);
CleanMsg();
m_pMsg->wCmd = SM_SUBABILITY;
SendMsg( m_pMsg, 0 );
CleanMsg();
m_pMsg->wCmd = SM_USERNAME;
strcpy( m_pMsg->data, "欢迎测试" );
SendMsg( m_pMsg, strlen( m_pMsg->data ) );
return VOID();
}
VOID CMirClient::SendString(CHAR* pszString)
{
int ierr = send( m_Connection.Socket, pszString, strlen( pszString), 0 );
return VOID();
}
VOID CMirClient::Update(DWORD dwTime)
{
if( dwTime - m_dwWaitTime >= 1000 )
{
m_dwWaitTime = dwTime;
//printf( "更新,1秒种\n" );
}
return VOID();
}
VOID CMirClient::OnTest(DWORD dwParam)
{
DWORD dwParams[4];
CHAR szEncode[256];
CHAR szName[200] = "欢迎测试/255";
dwParams[0] = dwParam;
CleanMsg();
m_pMsg->dwFlag = 0xa5a500a5+Getrand( 1024 );
m_pMsg->wCmd = 0x0a;
m_pMsg->wParam[0] = 640 + Getrand( 20 ) - 10;
m_pMsg->wParam[1] = 630 + Getrand( 20 ) - 10;
m_pMsg->wParam[2] = 4;
((DWORD*)m_pMsg->data)[0] = dwParam;
((DWORD*)m_pMsg->data)[1] = 0;
((DWORD*)m_pMsg->data)[2] = 0;
((DWORD*)m_pMsg->data)[3] = 0;
CodeGameCode( (BYTE*)m_pMsg, MSGHEADSIZE + 12, (BYTE*)(szEncode+1) );
CodeGameCode( (BYTE*)szName, 12, (BYTE*)(szEncode + 16 + 12) );
*szEncode = '#';
int i = strlen( szEncode );
szEncode[i] = '!';
szEncode[i+1] = 0;
SendString( szEncode );
return VOID();
}
BOOL CMirClient::LoadCharacter(CHAR* pszAccount)
{
return 0;
}
BOOL CMirClient::CheckAccount(CHAR* pszUsername, CHAR* pszPassword)
{
CMirServer * pServer = CMirServer::GetTheServer();
CHAR szFilename[256];
sprintf( szFilename, "%s%s.inf", pServer->m_Config.sAccountPath, pszUsername );
INIHANDLE hIni;
hIni = iniopen(szFilename);
if( hIni )
{
inigetstring(hIni, "account", "PASS", szFilename );
iniclose(hIni );
if( strcmp( szFilename, pszPassword ) == 0 )
{
return TRUE;
}
}
return 0;
}
BOOL CMirClient::CreateAccount(CHAR* pszUsername, CHAR* pszPassword)
{
return 0;
}
VOID CMirClient::OnCreateAccount(CHAR* pszUsername, CHAR* pszPassword)
{
DWORD dwError;
CMirServer * pServer = CMirServer::GetTheServer();
CleanMsg();
if( !pServer->CreateAccount(pszUsername, pszPassword, dwError))
{
m_pMsg->wCmd = SM_CREATEACCOUNTOK;
SendMsg(m_pMsg, 0 );
}
else
{
}
return VOID();
}