SF游戏辅助开发(关于技术开发的说明)
近期有不少网友来咨询详细的技术开发问题,比如编程,调用数据等详细的开发技术问题,有的甚至还问到是否收徒,在这里我们做个关于这些的必要说明;
我们不收徒,其次关于问到开发上的问题,因为这些不是一句两句可以说清楚的,因为开发上不只是涉及代码,还有动态数据库调用、组件调用、dll、封装等,所以我们建议是去经过系统性的编程方面的培训学习;
下面放出一个成品辅助以及部分核心代码以供热爱学习的网友做个参考
首先我们这里是定制型技术开发,就是只负责技术开发,不运维任何辅助,是谁定制的就做完后连同源码及原始数据一起打包发给谁,
我们只负责技术开发,至于客户是绑卡卖还是自己用以及产生的任何纠纷都和我们无关;
baidu网盘下载: https://pan.baidu.com/s/1RdK5CuCbrjFDhocXxAtd9Q?pwd=rybe 提取码: rybe
以下是部分重点代码以作参考
头部基础部分
public:
CMsgQueue()
{
m_iGet = 0;
m_iPut = 0;
Clear();
};
virtual ~CMsgQueue()
{
Clear();
};
int NextPos( int now )
{
now++;
if( now >= MSGQUEUELEN )
now = 0;
return now;
}
int PutMsg( char * pMsg )
{
int iNext = NextPos( m_iPut );
if( pMsg == NULL )
return 0;
if( iNext == m_iGet )
{
return 0;
}
strcpy( m_Msgs[m_iPut], pMsg );
m_iPut = iNext;
return 1;
};
int GetMsg( char * pMsg )
{
if( m_iGet == m_iPut )
return 0;
strcpy( pMsg, m_Msgs[m_iGet] );
// printf( "m_iPut = %d, m_iGet = %d\n", m_iPut, m_iGet );
m_iGet = NextPos( m_iGet );
return 1;
};
int Clear()
{
memset( (void*)m_Msgs, 0, sizeof( TMSGLINE ) * MSGQUEUELEN );
return 1;
};
private:
TMSGLINE m_Msgs[MSGQUEUELEN];
int m_iGet;
int m_iPut;
};
CMsgQueue g_MsgQueue;
HWND m_hSysLog = NULL;
HWND m_hChatLog = NULL;
HWND m_hMainDlg = NULL;
int m_MaxLogLine = 100;
BOOL InitZtCore( HWND hMainWnd, HWND hSysLog, HWND hChatLog, int MaxLogLine )
{
m_hSysLog = hSysLog;
m_hChatLog = hChatLog;
m_hMainDlg = hMainWnd;
m_MaxLogLine = MaxLogLine;
return TRUE;
}
void 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 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 LogSystem( char * line,... )
{
char szBuff[2048];
va_list vl;
va_start( vl, line );
vsprintf( szBuff, line, vl );
va_end( vl);
LogToList( m_hSysLog, szBuff );
}
int ActionOk()
{
printf( "Action Ok!\n" );
switch( g_LastAction.action )
{
case ACTION_RUN:
case ACTION_WALK:
g_pos_x = g_LastAction.x;
g_pos_y = g_LastAction.y;
break;
}
g_LastAction.action = 0;
return 1;
}
int ActionFail()
{
printf( "Action Fail!\n" );
g_LastAction.action = 0;
return 1;
}
int CanDoAction()
{
if( g_LastAction.action == 0 )
return 1;
return 0;
}
int 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 )
{
g_StringList[cnt][sptr] = '\0';
sptr = 0;
cnt++;
}
else
{
g_StringList[cnt][sptr] = string[i];
sptr ++;
}
}
if( sptr > 0 )
{
g_StringList[cnt][sptr] = '\0';
cnt++;
}
return cnt;
}
int SendString( SOCKET s, char * string )
{
int ierr = 0;
int ilen = strlen( string );
// printf( "Send: %s\n", string );
ierr = send( s, string, strlen( string), 0 );
if( ierr == ilen )
{
g_msgflag ++;
if( g_msgflag > '9' )
g_msgflag = '1';
}
return ierr;
}
int RecvString( SOCKET s, char * string, int maxlen )
{
int ierr = 0;
char tmpBuffer[2048];
ierr = recv( s, tmpBuffer, 2048, 0 );
if( ierr !=- 1)
{
if( tmpBuffer[0] == '*' )
{
strcpy( string, &tmpBuffer[1]);
ierr --;
}
else
{
strcpy( string, tmpBuffer );
}
string[ierr] = '\0';
// printf( "Recv:%s\n", string );
}
return ierr;
}
int RecvMsg( SOCKET s, MMSG * pmsg )
{
char tmpBuffer[2048];
// char tmpBuffer2[2048];
int ierr;
ierr = RecvString( s, tmpBuffer, 2048 );
if( ierr == -1 )
{
return -1;
}
if(tmpBuffer[ierr-1] == '!' )
{
tmpBuffer[ierr-1] = '\0';
}
UnGameCode( &tmpBuffer[1], (BYTE*)pmsg );
if( pmsg->wCmd == 0x0a )
{
//printf( "Code is %s\n", tmpBuffer );
}
return ierr;
}
int GetMsg( MMSG * pMsg )
{
char tmpBuffer[1024];
int ilen = 0;
if( g_MsgQueue.GetMsg( tmpBuffer ))
{
ilen = strlen( tmpBuffer );
if( tmpBuffer[ilen-1] == '!' )
{
tmpBuffer[ilen-1] = '\0';
}
printf( "Msg: %s\n", tmpBuffer );
if( tmpBuffer[1] == '+' )
{
tmpBuffer[6] = '\0';
printf( "GetWords %s\n", tmpBuffer );
if( stricmp( tmpBuffer, "#+GOOD" ) == 0 )
{
ActionOk();
}
else if( stricmp( tmpBuffer, "#+FAIL" ) == 0 )
{
ActionFail();
}
return 0;
}
UnGameCode( &tmpBuffer[1], (BYTE*)pMsg );
return 1;
}
return 0;
}
int SetNoBlock( SOCKET s )
{
unsigned long mode = 1;
if( ioctlsocket( s, FIONBIO, &mode ) == -1 )
return 0;
return 1;
}
int RecvGateMsg( SOCKET s, MMSG * pmsg )
{
char tmpBuffer[2048];
char tmpBuffer2[2048];
int ierr;
ierr = RecvString( s, tmpBuffer, 2048 );
if( ierr == -1 )
{
return -1;
}
tmpBuffer[ierr-1] = '\0';
UnGateCode( &tmpBuffer[1], tmpBuffer2 );
ierr = strlen( tmpBuffer2 );
if(tmpBuffer2[ierr-1] == '!' )
{
tmpBuffer2[ierr-1] = '\0';
}
UnGameCode( &tmpBuffer2[1], (BYTE*)pmsg );
return ierr;
}
int SendMsg( SOCKET s, MMSG * pmsg )
{
char tmpBuffer[2048];
char tmpBuffer2[2048];
int msize = 0;
msize = strlen(pmsg->data ) + MSGHEADERSIZE;
CodeGameCode( (BYTE*)pmsg, msize, (BYTE*)tmpBuffer );
sprintf( tmpBuffer2, "#%c%s!",g_msgflag, tmpBuffer );
return SendString( s,tmpBuffer2 );
}
int SendGateMsg( SOCKET s, MMSG * pmsg )
{
char tmpBuffer[2048];
char tmpBuffer2[2048];
int msize = 0;
msize = strlen(pmsg->data ) + MSGHEADERSIZE;
CodeGameCode( (BYTE*)pmsg, msize, (BYTE*)tmpBuffer );
sprintf( tmpBuffer2, "#%c%s!",g_msgflag, tmpBuffer );
CodeGateCode( tmpBuffer2, tmpBuffer );
sprintf( tmpBuffer2, "<%s>", tmpBuffer );
return SendString( s, tmpBuffer2 );
}
int SendWords( SOCKET s , char * word )
{
MMSG msg;
memset( &msg, 0, sizeof( MMSG ));
sprintf( msg.data, "#(%03d,%03d)-%s", g_pos_x, g_pos_y, word );
msg.wCmd = 0xbd6;
int erri;
erri = SendMsg( s, &msg );
return erri;
}
int TurnDirect( SOCKET s, int dir )
{
MMSG msg;
char tmpBuffer[2048];
int erri;
memset( &msg, 0, sizeof( MMSG ));
//msg.dwFlag = 0x6000e;
msg.wa = g_pos_x;
msg.wb = g_pos_y;
msg.wCmd = 0xbc2;
msg.w2 = dir;
erri = SendMsg( s, &msg );
if( erri == -1 )
return -1;
erri = RecvString( s, tmpBuffer, 256 );
if( erri == -1 )
return 0;
//printf( "%s\n", tmpBuffer );
tmpBuffer[6] = '\0';
if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
{
//g_pos_x += xofs_walk[dir];
//g_pos_y += yofs_walk[dir];
return 1;
}
return 0;
}
int xofs_walk[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int yofs_walk[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
int Walk( SOCKET s, int dir )
{
MMSG msg;
char tmpBuffer[2048];
int erri;
int tx,ty;
if( dir <0 || dir > 7 )
return 0;
tx = g_pos_x + xofs_walk[dir];
ty = g_pos_y + yofs_walk[dir];
memset( &msg, 0, sizeof( MMSG ));
//msg.dwFlag = 0x6000e;
msg.wa = tx;//g_pos_x;
msg.wb = ty;//g_pos_y;
msg.wCmd = 0xbc3;
msg.w2 = dir;
erri = SendMsg( s, &msg );
if( erri == -1 )
return -1;
erri = RecvString( s, tmpBuffer, 256 );
if( erri == -1 )
return 0;
// printf( "%s\n", tmpBuffer );
tmpBuffer[6] = '\0';
if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
{
printf( "Good!!\n" );
g_pos_x = tx;// xofs_walk[dir];
g_pos_y = ty;//+= yofs_walk[dir];
return 1;
}
return 0;
}
int Run( SOCKET s, int dir )
{
MMSG msg;
char tmpBuffer[2048];
int erri;
int tx,ty;
if( dir <0 || dir > 7 )
return 0;
tx = g_pos_x + (xofs_walk[dir]*2);
ty = g_pos_y + (yofs_walk[dir]*2);
memset( &msg, 0, sizeof( MMSG ));
msg.wa = tx;//g_pos_x;
msg.wb = ty;//g_pos_y;
msg.wCmd = 0xbc5;
msg.w2 = dir;
erri = SendMsg( s, &msg );
if( erri == -1 )
return 0;
g_LastAction.action = ACTION_RUN;
g_LastAction.x = tx;
g_LastAction.y = ty;
g_LastAction.dir = dir;
return 1;
}
int Attack( SOCKET s, int dir )
{
MMSG msg;
char tmpBuffer[2048];
int erri;
int tx,ty;
if( dir <0 || dir > 7 )
return 0;
//tx = g_pos_x + (xofs_walk[dir]*2);
//ty = g_pos_y + (yofs_walk[dir]*2);
memset( &msg, 0, sizeof( MMSG ));
//msg.dwFlag = 0x6000e;
msg.wa = g_pos_x;
msg.wb = g_pos_y;
msg.wCmd = 0xbc8;
msg.w2 = dir;
erri = SendMsg( s, &msg );
if( erri == -1 )
return -1;
erri = RecvString( s, tmpBuffer, 256 );
if( erri == -1 )
return 0;
// printf( "%s\n", tmpBuffer );
tmpBuffer[6] = '\0';
if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
{
printf( "Good!!\n" );
return 1;
}
return 0;
}
int GetMsgInfo( SOCKET s )
{
char tmpBuffer[2048];
static char tmpLeft[4096] = "";
char tmpMsg[2048];
int ierr = 0;
int iptr = 0;
int i = 0;
ierr = recv( s, tmpBuffer, 2048, 0 );
if( ierr == -1 )
return 0;
if( ierr > 0 )
{
tmpBuffer[ierr] = '\0';
printf( "Recv:%s\n", tmpBuffer );
printf( "Left:%s\n", tmpLeft );
strcat( tmpLeft, tmpBuffer );
for( i = 0;i < (int)strlen( tmpLeft) ;i ++ )
{
if( tmpLeft[i] == '*' )
continue;
if( tmpLeft[i] == '#' )
{
iptr = i;
}
if( tmpLeft[i] == '!' )
{
memcpy( (void*)tmpMsg, (void*)&tmpLeft[iptr], i - iptr + 1 );
tmpMsg[i-iptr+1] = '\0';
if( !g_MsgQueue.PutMsg( tmpMsg ) )
{
break;
}
// printf( "Put msg: %s\n", tmpMsg );
iptr = 0;
}
}
if( iptr > 0 )
{
memcpy( (void*)tmpBuffer, (void*)&tmpLeft[iptr], ierr - iptr );
tmpBuffer[ierr - iptr] = '\0';
strcpy( tmpLeft, tmpBuffer );
}
else
{
tmpLeft[0]='\0';
}
}
return 1;
}
int GetMsgInfo2( char * s )
{
char tmpBuffer[2048];
static char tmpLeft[4096] = "";
static BOOL bLeft = FALSE;
char tmpMsg[2048];
int ierr = 0;
int iptr = 0;
int i = 0;
//ierr = recv( s, tmpBuffer, 2048, 0 );
ierr = strlen( s );
if( ierr == -1 )
return 0;
if( ierr > 0 )
{
tmpBuffer[ierr] = '\0';
strcat( tmpLeft, s );//tmpBuffer );
for( i = 0;i < ierr;i ++ )
{
if( tmpLeft[i] == '*' )
continue;
if( tmpLeft[i] == '#' )
{
iptr = i;
}
if( tmpLeft[i] == '!' )
{
memcpy( (void*)tmpMsg, (void*)&tmpLeft[iptr], i - iptr + 1 );
tmpMsg[i-iptr+1] = '\0';
if( !g_MsgQueue.PutMsg( tmpMsg ) )
{
break;
}
iptr = 0;
}
}
if( iptr > 0 )
{
memcpy( (void*)tmpBuffer, (void*)&tmpLeft[iptr], ierr - iptr );
tmpBuffer[ierr - iptr] = '\0';
strcpy( tmpLeft, tmpBuffer );
}
else
{
tmpLeft[0] = '\0';
}
printf( "%s\n" , tmpLeft);
}
return 1;
}
int HandleAppearMsg( MMSG * pmsg )
{
char tmpBuffer[2048];
char strs[200];
UnNameCode( &pmsg->data[8], tmpBuffer );
printf( "%s 出现在坐标 %d, %d 处\n", tmpBuffer, pmsg->w1, pmsg->w2 );
sprintf( strs, "%s 出现在坐标 %d, %d 处\n", tmpBuffer, pmsg->w1, pmsg->w2 );
SendWords( (SOCKET)pmsg->dwFlag, strs );
printf( "Name code is %s\n", pmsg->data );
return 0;
}
int EnterGame( char * serverip, int port, char * charname, char * sid )
{
LPHOSTENT m_pHost;
WSADATA m_wsaData;
int m_SockFD;
struct sockaddr_in ServAddr;
char tmpBuffer[1024];
char tmpBuffer2[1024];
MMSG msg;
int msize = 0;
int mdir = 0;
int mmmtime = 0;
memset( &msg, 0, sizeof( MMSG ));
WSAStartup(MAKEWORD(2,2), &m_wsaData);
m_pHost = gethostbyname(serverip);
m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ServAddr.sin_family = AF_INET;
ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
ServAddr.sin_port = htons(port);
printf( "正在连接server...\n" );
int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
if( erri == -1) return 0;
printf( "GameSer连接成功!\n" );
sprintf( tmpBuffer, "**%s/%s/%s/20020522/0", ACCOUNT, charname, sid );
CodeGameCode( (BYTE*)tmpBuffer, strlen( tmpBuffer ), (BYTE*)tmpBuffer2 );
sprintf( tmpBuffer, "#%c%s!", g_msgflag, tmpBuffer2 );
printf( "验证USER合法性...\n", tmpBuffer );
erri = SendString( m_SockFD, tmpBuffer );
if( erri == -1 )
return 0;
printf( "接收USER守则...\n" );
erri = RecvMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
//printf( "%s\n", msg.data );
erri = RecvString( m_SockFD, tmpBuffer, 2048 );
if( erri > 0 )
{
printf( "%s\n", tmpBuffer );
}
memset( &msg, 0, sizeof( MMSG ));
msg.wCmd = 0x3fa;
printf( "确认同意USER守则...\n");
erri = SendMsg( m_SockFD, &msg );
if( erri == -1 )
return -1;
printf( "进入游戏!\n" );
SetNoBlock( m_SockFD );
int bflag = 0;
while( 1 )
{
Sleep( 600 );
mmmtime ++;
GetMsgInfo( m_SockFD );
while( GetMsg( &msg ))//RecvMsg( m_SockFD, &msg );
{
if( msg.wCmd == 0x33 )
{
printf( "人物出现在地图 %s.map 坐标 ( %d, %d )\n", msg.data ,msg.w1, msg.w2 );
g_pos_x = msg.w1;
g_pos_y = msg.w2;
}
if( msg.wCmd == 0x36 )
{
strcpy( g_mapname, msg.data );
printf( "Location at map: %s\n", msg.data );
}
if( msg.wCmd == 0x0a )
{
msg.dwFlag = m_SockFD;
HandleAppearMsg( &msg );
}
printf( "%s\n", msg.data );
}
//if( mdir == 6 )
// SendWords( m_SockFD, WORDS );
if( mmmtime > 50 )
{
if( CanDoAction())
{
printf( "跑步中!..\n" );
SendWords( m_SockFD, WORDS );
Run( m_SockFD, mdir );
mdir ++;
if( mdir >= 8 )
mdir = 0;
}
}
printf( "Pos: %d, %d\n", g_pos_x, g_pos_y );
}
closesocket(m_SockFD);
WSACleanup();
return 1;
}
int SelChar( char * serverip, int port, char * sid )
{
LPHOSTENT m_pHost;
WSADATA m_wsaData;
int m_SockFD;
struct sockaddr_in ServAddr;
// char tmpBuffer[1024];
// char tmpBuffer2[1024];
MMSG msg;
int msize = 0;
memset( &msg, 0, sizeof( MMSG ));
WSAStartup(MAKEWORD(2,2), &m_wsaData);
m_pHost = gethostbyname(serverip);
m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ServAddr.sin_family = AF_INET;
ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
ServAddr.sin_port = htons(port);
printf( "连接RoleSer...\n" );
int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
if( erri == -1) return 0;
printf( "RoleSer连接成功!\n" );
printf( "验证USERSID\n" );
msg.wCmd = 0x64;
sprintf( msg.data, "%s/%s", ACCOUNT, sid );
//printf( "Test String is:%s\n", msg.data );
erri = SendMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
erri = RecvMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
if( msg.wCmd != 0x208 )
return 0;
printf( "角色列表:%s\n", msg.data );
memset( &msg, 0, sizeof( MMSG ));
msg.wCmd = 0x67;
sprintf( msg.data, "%s/%s", ACCOUNT, "XX" );
erri = SendMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
erri = RecvMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
if( msg.wCmd != 0x20d )
{
return 0;
}
printf( "%s\n", msg.data );
GetString( msg.data );
EnterGame( g_StringList[0], atoi(g_StringList[1]), "XX", sid );
closesocket(m_SockFD);
WSACleanup();
return 1;
}
int CrossGate( char * username, char * password, char * servername )
{
LPHOSTENT m_pHost;
WSADATA m_wsaData;
int m_SockFD;
struct sockaddr_in ServAddr;
char tmpBuffer[1024];
char tmpBuffer2[1024];
MMSG msg;
int msize = 0;
memset( &msg, 0, sizeof( MMSG ));
WSAStartup(MAKEWORD(2,2), &m_wsaData);
m_pHost = gethostbyname(CGIP);
m_SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ServAddr.sin_family = AF_INET;
ServAddr.sin_addr.s_addr = *(ULONG *)m_pHost->h_addr_list[0];
ServAddr.sin_port = htons(7000);
int erri = connect(m_SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));
printf( "连接账号验证服务器...\n" );
if( erri == -1) return 0;
printf( "服务器连接成功!\n" );
erri = send( m_SockFD, "<Zt152>", 8, 0 );
printf( "发送版本信息:%s\n", "<Zt152>" );
if( erri == -1 )
{
printf( "Error occured!\n" );
return 0;
}
erri = recv( m_SockFD, rcBuffer, 4096, 0 );
if( erri == -1 )
{
return 0;
}
else
{
printf("验证客户端合法性...\n" );
//printf( "Get remote code: %s\n", rcBuffer );
rcBuffer[erri-1] = '\0';
UnGateCode( &rcBuffer[1], tmpBuffer );
//printf( "%s\n", tmpBuffer );
strcat( tmpBuffer, "/" );
CodeGateCode( tmpBuffer, tmpBuffer2 );
//printf( "%s\n", tmpBuffer2 );
sprintf( tmpBuffer, "<%s>", tmpBuffer2 );
//printf( "Gen local code: %s\n", tmpBuffer );
}
erri = send( m_SockFD, tmpBuffer, strlen( tmpBuffer), 0 );
if( erri == -1 )
return 0;
erri = recv( m_SockFD, rcBuffer, 4096, 0 );
if( erri == -1 )
return 0;
else
rcBuffer[erri] = '\0';
printf( "%s\n", rcBuffer );
if( stricmp( rcBuffer, "<pass>" ) == 0)
{
printf( "验证通过,开始验证USER名和Password\n" );
}
msg.wCmd = 0x7d1;
sprintf( msg.data, "%s/%s", ACCOUNT, PASSWORD );
msize = MSGHEADERSIZE + strlen( msg.data );
erri = SendGateMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
//printf( "Password sended!\n" );
erri = RecvGateMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
if( msg.wCmd == 0x211 )
printf( "验证通过!\n" );
else
return 0;
msg.wCmd = 0x68;
strcpy( msg.data, servername );
erri = SendGateMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
erri = RecvGateMsg( m_SockFD, &msg );
if( erri == -1 )
return 0;
if( msg.wCmd != 0x212 )
return 0;
printf( "得到服务器地址:%s\n", msg.data );
GetString( msg.data );
//printf( "%s %s %s\n", g_StringList[0], g_StringList[1], g_StringList[2] );
SelChar( g_StringList[0], atoi( g_StringList[1]), g_StringList[2] );
closesocket(m_SockFD);
WSACleanup();
return 1;
}




