Senior Member
Join Date: Mar 2012
Location: Braila, Romania
|
07-17-2013
, 18:08
Re: A2S_PLAYER ( resolved ) & A2S_RULES ( need help )
|
#6
|
thanks for your reply.
i kept trying and i finally got it working but i still have some problems when i parse the cvars..
PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx> #include <sockets>
#define PLUGIN "Socket !!!" #define VERSION "1.0"
new g_szHost[ 32 ]; new g_szPort[ 10 ];
new g_ch_ret[4] = {255,255,255,255}
new g_szHostName[ 128 ]; new g_szMapName[ 64 ]; new g_szDescription[ 64 ]; new g_iMaxPlayers; new g_iPlayers; new g_iBots; new g_szDir[ 64 ]; new g_szPlayersNames[ 33 ][ 33 ]; new g_iPlayersKills[ 33 ]; new Float:g_fPlayersTime[ 33 ]; new g_szPassword[ 24 ]; new g_szRules[256][ 32 ]; new g_szRulesValue[ 256 ][ 10 ]; new g_iSocket = 0;
new szRequest[ 32 ];
new part = 0; new total = 0;
new iRules = 0;
public plugin_init( ) { register_plugin( PLUGIN, VERSION, "Sylwester & Askhanar" ); register_clcmd( "amx_serverinfo", "svinfo" ); // Add your code here... }
public svinfo( id ) { new szServer[ 64 ]; read_argv( 1, szServer, 63 ); strtok( szServer, g_szHost, 31, g_szPort, 9, ':', 1 ); if( connect_server( ) ) { send_request( ); if( id == 0 ) server_print( " Waiting for server infos" ); else client_cmd( id, "echo Waiting for server infos" ); set_task( 10.0, "task_info", id + 1122 ); } else { client_cmd( id, "echo ERROR" ); } return PLUGIN_HANDLED; }
public task_info( id ) { id -= 1122; if( !is_user_connected( id ) ) return; if( id == 0 ) { server_print( " HostName: %s", g_szHostName ); server_print( " Map: %s", g_szMapName ); server_print( " Description: %s", g_szDescription ); server_print( " Slots: %i", g_iMaxPlayers ); server_print( " Players %i/%i", g_iPlayers, g_iMaxPlayers ); server_print( " Bots: %i", g_iBots ); server_print( " Dir: %s", g_szDir ); server_print( " Password: %s", g_szPassword ); for( new i = 0; i < iRules;i++ ) server_print( "%s %s", g_szRules[ i ], g_szRulesValue[ i ] ); } else { client_cmd( id, "echo HostName: %s", g_szHostName ); client_cmd( id, "echo Map: %s", g_szMapName ); client_cmd( id, "echo Description: %s", g_szDescription ); client_cmd( id, "echo Slots: %i", g_iMaxPlayers ); client_cmd( id, "echo Players %i/%i", g_iPlayers, g_iMaxPlayers ); client_cmd( id, "echo Bots: %i", g_iBots ); client_cmd( id, "echo Dir: %s", g_szDir ); client_cmd( id, "echo Pasword: %s", g_szPassword ); for( new i = 0; i < iRules;i++ ) client_cmd( id, "echo %s %s", g_szRules[ i ], g_szRulesValue[ i ] ); } for( new i = 0;i < g_iPlayers; i++ ) { if( id == 0 ) server_print( "Nick: %s Frags: %i Time: %.1f", g_szPlayersNames[ i ], g_iPlayersKills[ i ], g_fPlayersTime[ i ] ); else client_cmd(id, "echo Nick: %s Frags: %i Time: %.1f", g_szPlayersNames[ i ], g_iPlayersKills[ i ], g_fPlayersTime[ i ] ); } } public connect_server() { new iError, szError[ 64 ]; new iPort = str_to_num( g_szPort ); if( strlen( g_szHost ) < 2 || iPort <=0 || iPort >= 65536){ log_amx("incorrect datas ( ^"IP/DNS: %s | PORT: %s^" ), must be ^"ip:port^" or ^"dns:port^"", g_szHost, g_szPort ); return false; } if( g_iSocket > 0 ) { socket_close( g_iSocket ); g_iSocket = 0; } g_iSocket = socket_open( g_szHost, iPort, SOCKET_UDP, iError ); if( g_iSocket <= 0 || iError ) { switch( iError ) { case 0: szError = "unknown" case 1: szError = "error while creating socket" case 2: szError = "could not resolve hostname" case 3: format( szError, sizeof ( szError ) -1, "could not connect to %s:%d", g_szHost, iPort ); } log_amx( "Socket error: %s", szError ); return false; } iRules = 0; log_amx( "Connected to socket %i", g_iSocket ); set_task( 1.0, "task_recive", 112233, _, _, "b" ); return true; }
public task_recive( ) { check_socket( ); }
public check_socket() { if( g_iSocket <= 0) return new iCnt; if( socket_change( g_iSocket, 1 ) && iCnt < 10 ) { iCnt++ receive_data( ); } }
public disconnect_server() { if( g_iSocket > 0 ) { socket_close( g_iSocket ); g_iSocket = 0; } }
public send_request() { if( g_iSocket <= 0 ) return; //http://developer.valvesoftware.com/wiki/Server_Queries#A2S_INFO format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c%s%c", 255, 255, 255, 255, 84, "Source Engine Query", 0 ); socket_send2( g_iSocket, szRequest, 25 ); log_amx( "sent INFO: %s", szRequest ); /*//http://developer.valvesoftware.com/wiki/Server_Queries#A2S_PLAYER format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c%c%c%c%c", 255, 255, 255, 255, 85, g_ch_ret[0], g_ch_ret[1], g_ch_ret[2], g_ch_ret[3]) //ping socket_send2( g_iSocket, szRequest, 9 ); log_amx( "sent PLAYERS: %s", szRequest );*/ //http://developer.valvesoftware.com/wiki/Server_Queries#A2S_RULES format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c%c%c%c%c", 255, 255, 255, 255, 86, g_ch_ret[0], g_ch_ret[1], g_ch_ret[2], g_ch_ret[3]); socket_send2( g_iSocket, szRequest, 9 ); log_amx( "sent RULES: %s", szRequest ); /* format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c", -1,-1,-1,-1, 87 ); socket_send2( g_iSocket, szRequest, 5 ); log_amx( "sent CHALANGE: %s", szRequest );*/ }
public receive_data() { static szBuffer[ 2048 ], iLen; iLen = socket_recv( g_iSocket, szBuffer, sizeof( szBuffer ) -1 ); if( iLen < 5 ) return; if( equal( szBuffer, { -1, -1, -1, -1 }, 4 ) || equal( szBuffer, { -2, -1, -1, -1 }, 4 ) ) { new end = strlen(szBuffer)+1; switch( szBuffer[ 4 ] ) { //(correct challange number) A2S_PLAYER reply if sent challange number is unknown/incorrect case 'A': { log_amx( "RECIVED CHALANGE: %s", szBuffer ); /*if( g_ch_ret[ 0 ] == 255 && g_ch_ret[ 1 ] == 255 && g_ch_ret[ 2 ] == 255 && g_ch_ret[ 3 ] == 255 ) {*/ log_amx( "Changed chalange" ); for( new i = 0; i < 4; i++ ) g_ch_ret[i] = szBuffer[i+5]; //http://developer.valvesoftware.com/wiki/Server_Queries#A2S_RULES format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c%c%c%c%c", 255, 255, 255, 255, 86, g_ch_ret[0], g_ch_ret[1], g_ch_ret[2], g_ch_ret[3]); socket_send2( g_iSocket, szRequest, 9 ); log_amx( "sent RULES FROM A: %s", szRequest ); } case 'D': { //(players details) A2S_PLAYER reply if sent challange number is correct log_amx( "RECIVED PLAYERS: %s", szBuffer ); g_iPlayers = szBuffer[ 5 ]; new j=6; for(new i=0; i<g_iPlayers; i++){ j++ j += copyc(g_szPlayersNames[i], 31, szBuffer[j], 0)+1 g_iPlayersKills[i] = ret_ac(szBuffer[j+3])<<24|ret_ac(szBuffer[j+2])<<16|ret_ac(szBuffer[j+1])<<8|ret_ac(szBuffer[j]); g_fPlayersTime[ i ] = Float:( ret_ac(szBuffer[j+7])<<24|ret_ac(szBuffer[j+6])<<16|ret_ac(szBuffer[j+5])<<8|ret_ac(szBuffer[j+4]) ); j+= 8; } } case 'I': { //(server details) A2S_INFO reply log_amx( "RECIVED INFO: %s", szBuffer ); new i = 6; i += copyc( g_szHostName, sizeof ( g_szHostName ) -1, szBuffer[ i ], 0 ) +1; i += copyc( g_szMapName, sizeof ( g_szMapName ) -1, szBuffer[ i ], 0 ) +1; i += copyc( g_szDir, sizeof ( g_szDir ) -1, szBuffer[ i ], 0 ) +1; i += copyc( g_szDescription, sizeof ( g_szDescription ) -1, szBuffer[ i ], 0 ) +1; g_iMaxPlayers = szBuffer[ i +3 ]; g_iBots = szBuffer[ i +4 ]; i += copy( g_szPassword, sizeof ( g_szPassword ) -1, szBuffer[ i +7 ] ? "Yes" : "No" ); if( g_iPlayers > g_iMaxPlayers ) g_iPlayers = g_iMaxPlayers; } default: { if( szBuffer[ 0 ] == -2 ) { if( !part ) total = szBuffer[ 8 ]; if( 0 < part < total ) end = 0; else end = 16; } else end = 7; //new name[64], rlen while(end < iLen) { //end += copyc(name,63, szBuffer[end], 0) end += copy( g_szRules[ iRules ], sizeof ( g_szRules[] ) -1, szBuffer[ end ] ); end += 1; end += copy( g_szRulesValue[ iRules ], sizeof ( g_szRulesValue[] ) -1, szBuffer[end] ) // end += rlen+1 //skip cvar name //end += strlen(szBuffer[end])+1 //skip cvar value iRules++; } part++; //log_amx( "%i, %i, %i, %i", iLen, end, total, part ); for( new z = 0; z < iRules; z++ ) { log_amx( "%s | %s", g_szRules[ z ], g_szRulesValue[ z ] ); } } } } /*else if( equal( szBuffer, { -2, -1, -1, -1 }, 4 ) ) { log_amx( "RECIVED RULES: %s", szBuffer ); if( szBuffer[ 4 ] == 'E' || szBuffer[ 4 ] == 'V' ) { } }*/
}
public ret_ac(num){ //change byte -128..127 into 0..255 if(num<0) return 256+num return num }
it was suposed to be: CvarName | CvarValue but its like this:
Code:
L 07/18/2013 - 02:50:13: [1.amxx] aesp_version | 1.3
L 07/18/2013 - 02:50:13: [1.amxx] | afkslay_v
L 07/18/2013 - 02:50:13: [1.amxx] ersion | 2.5.2
L 07/18/2013 - 02:50:13: [1.amxx] | allow_spe
L 07/18/2013 - 02:50:13: [1.amxx] ctators | 1.0
L 07/18/2013 - 02:50:13: [1.amxx] | amxmodx_v
L 07/18/2013 - 02:50:13: [1.amxx] ersion | 1.8.2
L 07/18/2013 - 02:50:13: [1.amxx] | amx_clien
L 07/18/2013 - 02:50:13: [1.amxx] t_languages | 1
L 07/18/2013 - 02:50:13: [1.amxx] | amx_langu
L 07/18/2013 - 02:50:13: [1.amxx] age | en
L 07/18/2013 - 02:50:13: [1.amxx] | amx_nextm
L 07/18/2013 - 02:50:13: [1.amxx] ap | de_westwo
L 07/18/2013 - 02:50:13: [1.amxx] od_big | amx_ptb_v
L 07/18/2013 - 02:50:13: [1.amxx] ersion | 1.8b3
L 07/18/2013 - 02:50:13: [1.amxx] | coop
L 07/18/2013 - 02:50:13: [1.amxx] | 0
L 07/18/2013 - 02:50:13: [1.amxx] | deathmatc
L 07/18/2013 - 02:50:13: [1.amxx] h | 1
L 07/18/2013 - 02:50:13: [1.amxx] | decalfreq
L 07/18/2013 - 02:50:13: [1.amxx] uency | 30
L 07/18/2013 - 02:50:13: [1.amxx] | edgefrict
L 07/18/2013 - 02:50:13: [1.amxx] ion | 2
L 07/18/2013 - 02:50:13: [1.amxx] | hostage_d
L 07/18/2013 - 02:50:13: [1.amxx] ebug | 0
L 07/18/2013 - 02:50:13: [1.amxx] | hostage_s
L 07/18/2013 - 02:50:13: [1.amxx] top | 0
L 07/18/2013 - 02:50:13: [1.amxx] | humans_jo
L 07/18/2013 - 02:50:13: [1.amxx] in_team | any
L 07/18/2013 - 02:50:13: [1.amxx] | kgbbots
L 07/18/2013 - 02:50:13: [1.amxx] | 1
L 07/18/2013 - 02:50:13: [1.amxx] | map_spawn
L 07/18/2013 - 02:50:13: [1.amxx] s | T(16) CT(
L 07/18/2013 - 02:50:13: [1.amxx] 16) | max_queri
L 07/18/2013 - 02:50:13: [1.amxx] es_sec | 1
L 07/18/2013 - 02:50:13: [1.amxx] | max_queri
L 07/18/2013 - 02:50:13: [1.amxx] es_sec_global | 1
L 07/18/2013 - 02:50:13: [1.amxx] | max_queri
L 07/18/2013 - 02:50:13: [1.amxx] es_window | 1
L 07/18/2013 - 02:50:13: [1.amxx] | mdbBans
L 07/18/2013 - 02:50:13: [1.amxx] | 4.2
L 07/18/2013 - 02:50:13: [1.amxx] | metamod_v
L 07/18/2013 - 02:50:13: [1.amxx] ersion | 1.21-am
L 07/18/2013 - 02:50:13: [1.amxx] | mp_allowm
L 07/18/2013 - 02:50:13: [1.amxx] onsters | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_autoki
L 07/18/2013 - 02:50:13: [1.amxx] ck | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_autote
L 07/18/2013 - 02:50:13: [1.amxx] ambalance | 1
L 07/18/2013 - 02:50:13: [1.amxx] | mp_buytim
L 07/18/2013 - 02:50:13: [1.amxx] e | 0.35
L 07/18/2013 - 02:50:13: [1.amxx] | mp_c4time
L 07/18/2013 - 02:50:13: [1.amxx] r | 35
L 07/18/2013 - 02:50:13: [1.amxx] | mp_chatti
L 07/18/2013 - 02:50:13: [1.amxx] me | 3
L 07/18/2013 - 02:50:13: [1.amxx] | mp_consis
L 07/18/2013 - 02:50:13: [1.amxx] | mp_kickpe
L 07/18/2013 - 02:50:13: [1.amxx] rcent | 0.66
L 07/18/2013 - 02:50:13: [1.amxx] | mp_limitt
L 07/18/2013 - 02:50:13: [1.amxx] eams | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_logdet
L 07/18/2013 - 02:50:13: [1.amxx] ail | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_logfil
L 07/18/2013 - 02:50:13: [1.amxx] e | 1
L 07/18/2013 - 02:50:13: [1.amxx] | mp_logmes
L 07/18/2013 - 02:50:13: [1.amxx] sages | 1
L 07/18/2013 - 02:50:13: [1.amxx] | mp_mapvot
L 07/18/2013 - 02:50:13: [1.amxx] eratio | 0.66
L 07/18/2013 - 02:50:13: [1.amxx] | mp_maxrou
L 07/18/2013 - 02:50:13: [1.amxx] nds | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_mirror
L 07/18/2013 - 02:50:13: [1.amxx] damage | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_player
L 07/18/2013 - 02:50:13: [1.amxx] id | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_roundt
L 07/18/2013 - 02:50:13: [1.amxx] ime | 2
L 07/18/2013 - 02:50:13: [1.amxx] | mp_slaylo
L 07/18/2013 - 02:50:13: [1.amxx] sers | 1
L 07/18/2013 - 02:50:13: [1.amxx] | mp_startm
L 07/18/2013 - 02:50:13: [1.amxx] oney | 850
L 07/18/2013 - 02:50:13: [1.amxx] | mp_timele
L 07/18/2013 - 02:50:13: [1.amxx] ft | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_timeli
L 07/18/2013 - 02:50:13: [1.amxx] mit | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_tkpuni
L 07/18/2013 - 02:50:13: [1.amxx] sh | 0
L 07/18/2013 - 02:50:13: [1.amxx] | mp_windif
L 07/18/2013 - 02:50:13: [1.amxx] tround | 0
L 07/18/2013 - 02:50:13: [1.amxx] | sv_stepsi
L 07/18/2013 - 02:50:13: [1.amxx] ze | 18
L 07/18/2013 - 02:50:13: [1.amxx] | sv_stopsp
L 07/18/2013 - 02:50:13: [1.amxx] eed | 75
L 07/18/2013 - 02:50:13: [1.amxx] | sv_upload
L 07/18/2013 - 02:50:13: [1.amxx] max | 0.5
LE: I finally got it working, thanks again.
if any1 needs the code..
PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx> #include <sockets>
#define PLUGIN "Socket !!!" #define VERSION "1.0"
new g_szHost[ 32 ]; new g_szPort[ 10 ];
new g_ch_ret[4] = {255,255,255,255}
new g_szHostName[ 128 ]; new g_szMapName[ 64 ]; new g_szDescription[ 64 ]; new g_iMaxPlayers; new g_iPlayers; new g_iBots; new g_szDir[ 64 ]; new g_szPlayersNames[ 33 ][ 33 ]; new g_iPlayersKills[ 33 ]; new Float:g_fPlayersTime[ 33 ]; new g_szPassword[ 24 ]; new g_szRules[256][ 64 ]; new g_szRulesValue[ 256 ][ 64 ]; new g_iSocket = 0;
new szRequest[ 32 ];
new part = 0; new total = 0;
new iRules = 0;
public plugin_init( ) { register_plugin( PLUGIN, VERSION, "Sylwester & Askhanar" ); register_clcmd( "amx_serverinfo", "svinfo" ); // Add your code here... }
public svinfo( id ) { new szServer[ 64 ]; read_argv( 1, szServer, 63 ); strtok( szServer, g_szHost, 31, g_szPort, 9, ':', 1 ); if( connect_server( ) ) { send_request( ); if( id == 0 ) server_print( " Waiting for server infos" ); else client_cmd( id, "echo Waiting for server infos" ); set_task( 10.0, "task_info", id + 1122 ); } else { client_cmd( id, "echo ERROR" ); } return PLUGIN_HANDLED; }
public task_info( id ) { id -= 1122; if( !is_user_connected( id ) ) return; if( id == 0 ) { server_print( " HostName: %s", g_szHostName ); server_print( " Map: %s", g_szMapName ); server_print( " Description: %s", g_szDescription ); server_print( " Slots: %i", g_iMaxPlayers ); server_print( " Players %i/%i", g_iPlayers, g_iMaxPlayers ); server_print( " Bots: %i", g_iBots ); server_print( " Dir: %s", g_szDir ); server_print( " Password: %s", g_szPassword ); for( new i = 0; i < iRules;i++ ) server_print( "%s %s", g_szRules[ i ], g_szRulesValue[ i ] ); } else { client_cmd( id, "echo HostName: %s", g_szHostName ); client_cmd( id, "echo Map: %s", g_szMapName ); client_cmd( id, "echo Description: %s", g_szDescription ); client_cmd( id, "echo Slots: %i", g_iMaxPlayers ); client_cmd( id, "echo Players %i/%i", g_iPlayers, g_iMaxPlayers ); client_cmd( id, "echo Bots: %i", g_iBots ); client_cmd( id, "echo Dir: %s", g_szDir ); client_cmd( id, "echo Pasword: %s", g_szPassword ); for( new i = 0; i < iRules;i++ ) client_cmd( id, "echo %s %s", g_szRules[ i ], g_szRulesValue[ i ] ); } for( new i = 0;i < g_iPlayers; i++ ) { if( id == 0 ) server_print( "Nick: %s Frags: %i Time: %.1f", g_szPlayersNames[ i ], g_iPlayersKills[ i ], g_fPlayersTime[ i ] ); else client_cmd(id, "echo Nick: %s Frags: %i Time: %.1f", g_szPlayersNames[ i ], g_iPlayersKills[ i ], g_fPlayersTime[ i ] ); } } public connect_server() { new iError, szError[ 64 ]; new iPort = str_to_num( g_szPort ); if( strlen( g_szHost ) < 2 || iPort <=0 || iPort >= 65536){ log_amx("incorrect datas ( ^"IP/DNS: %s | PORT: %s^" ), must be ^"ip:port^" or ^"dns:port^"", g_szHost, g_szPort ); return false; } if( g_iSocket > 0 ) { socket_close( g_iSocket ); g_iSocket = 0; } g_iSocket = socket_open( g_szHost, iPort, SOCKET_UDP, iError ); if( g_iSocket <= 0 || iError ) { switch( iError ) { case 0: szError = "unknown" case 1: szError = "error while creating socket" case 2: szError = "could not resolve hostname" case 3: format( szError, sizeof ( szError ) -1, "could not connect to %s:%d", g_szHost, iPort ); } log_amx( "Socket error: %s", szError ); return false; } iRules = 0; log_amx( "Connected to socket %i", g_iSocket ); set_task( 1.0, "task_recive", 112233, _, _, "b" ); return true; }
public task_recive( ) { check_socket( ); }
public check_socket() { if( g_iSocket <= 0) return new iCnt; if( socket_change( g_iSocket, 1 ) && iCnt < 10 ) { iCnt++ receive_data( ); } }
public disconnect_server() { if( g_iSocket > 0 ) { socket_close( g_iSocket ); g_iSocket = 0; } }
public send_request() { if( g_iSocket <= 0 ) return; //http://developer.valvesoftware.com/wiki/Server_Queries#A2S_INFO format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c%s%c", 255, 255, 255, 255, 84, "Source Engine Query", 0 ); socket_send2( g_iSocket, szRequest, 25 ); log_amx( "sent INFO: %s", szRequest ); /*//http://developer.valvesoftware.com/wiki/Server_Queries#A2S_PLAYER format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c%c%c%c%c", 255, 255, 255, 255, 85, g_ch_ret[0], g_ch_ret[1], g_ch_ret[2], g_ch_ret[3]) //ping socket_send2( g_iSocket, szRequest, 9 ); log_amx( "sent PLAYERS: %s", szRequest );*/ //http://developer.valvesoftware.com/wiki/Server_Queries#A2S_RULES format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c%c%c%c%c", 255, 255, 255, 255, 86, g_ch_ret[0], g_ch_ret[1], g_ch_ret[2], g_ch_ret[3]); socket_send2( g_iSocket, szRequest, 9 ); log_amx( "sent RULES: %s", szRequest ); /* format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c", -1,-1,-1,-1, 87 ); socket_send2( g_iSocket, szRequest, 5 ); log_amx( "sent CHALANGE: %s", szRequest );*/ }
public receive_data() { static szBuffer[ 2048 ], iLen; iLen = socket_recv( g_iSocket, szBuffer, sizeof( szBuffer ) -1 ); if( iLen < 5 ) return; if( equal( szBuffer, { -1, -1, -1, -1 }, 4 ) || equal( szBuffer, { -2, -1, -1, -1 }, 4 ) ) { new end = strlen(szBuffer)+1; switch( szBuffer[ 4 ] ) { //(correct challange number) A2S_PLAYER reply if sent challange number is unknown/incorrect case 'A': { log_amx( "RECIVED CHALANGE: %s", szBuffer ); /*if( g_ch_ret[ 0 ] == 255 && g_ch_ret[ 1 ] == 255 && g_ch_ret[ 2 ] == 255 && g_ch_ret[ 3 ] == 255 ) {*/ log_amx( "Changed chalange" ); for( new i = 0; i < 4; i++ ) g_ch_ret[i] = szBuffer[i+5]; //http://developer.valvesoftware.com/wiki/Server_Queries#A2S_RULES format( szRequest, sizeof ( szRequest ) -1, "%c%c%c%c%c%c%c%c%c", 255, 255, 255, 255, 86, g_ch_ret[0], g_ch_ret[1], g_ch_ret[2], g_ch_ret[3]); socket_send2( g_iSocket, szRequest, 9 ); log_amx( "sent RULES FROM A: %s", szRequest ); } case 'D': { //(players details) A2S_PLAYER reply if sent challange number is correct log_amx( "RECIVED PLAYERS: %s", szBuffer ); g_iPlayers = szBuffer[ 5 ]; new j=6; for(new i=0; i<g_iPlayers; i++){ j++ j += copyc(g_szPlayersNames[i], 31, szBuffer[j], 0)+1 g_iPlayersKills[i] = ret_ac(szBuffer[j+3])<<24|ret_ac(szBuffer[j+2])<<16|ret_ac(szBuffer[j+1])<<8|ret_ac(szBuffer[j]); g_fPlayersTime[ i ] = Float:( ret_ac(szBuffer[j+7])<<24|ret_ac(szBuffer[j+6])<<16|ret_ac(szBuffer[j+5])<<8|ret_ac(szBuffer[j+4]) ); j+= 8; } } case 'I': { //(server details) A2S_INFO reply log_amx( "RECIVED INFO: %s", szBuffer ); new i = 6; i += copyc( g_szHostName, sizeof ( g_szHostName ) -1, szBuffer[ i ], 0 ) +1; i += copyc( g_szMapName, sizeof ( g_szMapName ) -1, szBuffer[ i ], 0 ) +1; i += copyc( g_szDir, sizeof ( g_szDir ) -1, szBuffer[ i ], 0 ) +1; i += copyc( g_szDescription, sizeof ( g_szDescription ) -1, szBuffer[ i ], 0 ) +1; g_iMaxPlayers = szBuffer[ i +3 ]; g_iBots = szBuffer[ i +4 ]; i += copy( g_szPassword, sizeof ( g_szPassword ) -1, szBuffer[ i +7 ] ? "Yes" : "No" ); if( g_iPlayers > g_iMaxPlayers ) g_iPlayers = g_iMaxPlayers; } default: { if( szBuffer[ 0 ] == -2 ) { if( !part ) total = szBuffer[ 8 ]; if( 0 < part < total ) end = 0; else end = 16; } else end = 7; //new name[64], rlen while(end < iLen) { //end += copyc(name,63, szBuffer[end], 0) end += copy( g_szRules[ iRules ], sizeof ( g_szRules[] ) -1, szBuffer[ end ] ); end += 1; end += copy( g_szRulesValue[ iRules ], sizeof ( g_szRulesValue[] ) -1, szBuffer[end] ) end += 1; // end += rlen+1 //skip cvar name //end += strlen(szBuffer[end])+1 //skip cvar value iRules++; } part++; //log_amx( "%i, %i, %i, %i", iLen, end, total, part ); for( new z = 0; z < iRules; z++ ) { log_amx( "%s | %s", g_szRules[ z ], g_szRulesValue[ z ] ); } } } } /*else if( equal( szBuffer, { -2, -1, -1, -1 }, 4 ) ) { log_amx( "RECIVED RULES: %s", szBuffer ); if( szBuffer[ 4 ] == 'E' || szBuffer[ 4 ] == 'V' ) { } }*/
}
public ret_ac(num){ //change byte -128..127 into 0..255 if(num<0) return 256+num return num }
it's ugly coded.. for test.
Last edited by red_bull2oo6; 07-17-2013 at 20:08.
|
|