|
Senior Member
Join Date: Mar 2012
Location: Braila, Romania
|

07-13-2013
, 21:23
A2S_PLAYER ( resolved ) & A2S_RULES ( need help )
|
#1
|
hi again, it seems i need some help.. so after i searched.. like 2 hours.. i decided to ask for it
i took some code from Sylvester's dsi ( duplucate server info ) plugin and i played a little bit with sockets.
the problem is that i cant get each player's played time.. it always says it's 0.0.
i must say that i tried like 5 types of getting it.. no chance.
i don't wanna use server querries.. its too complexe.
here's the code:
PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx> #include <sockets>
#define PLUGIN "Socket !!!" #define VERSION "1.0"
new g_ch_ret[4] = {255,255,255,255}
new g_szHost[ 32 ]; new g_szPort[ 10 ]
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_iSocket = 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( ); 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; 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 ); for( new i = 0;i < g_iPlayers; i++ ) 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; } 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; while( 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; new szRequest[ 32 ]; //http://developer.valvesoftware.com/wiki/Server_Queries#A2S_INFO format( szRequest, 25, "%c%c%c%c%c%s%c", 255, 255, 255, 255, 84, "Source Engine Query", 0 ); socket_send2( g_iSocket, szRequest, 25 ); //http://developer.valvesoftware.com/wiki/Server_Queries#A2S_PLAYER format(szRequest, 9, "%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); }
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 ) ) return; if( szBuffer[ 4 ] == 'D' ) { //(players details) A2S_PLAYER reply if sent challange number is correct 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]); /*Here i need the code for getting played time.. i tried lots of things.. it's always 0.0 or 23742983749.0 */ g_fPlayersTime[ i ] = str_to_float( szBuffer[ j +1 ] ); j+= 8; } }
if( szBuffer[ 4 ] == 'I' ) { //(server details) A2S_INFO reply 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 += copyc( g_szPassword, sizeof ( g_szPassword ) -1, szBuffer[ i +7 ], 0 ); if( g_iPlayers > g_iMaxPlayers ) g_iPlayers = g_iMaxPlayers; } }
public ret_ac(num){ //change byte -128..127 into 0..255 if(num<0) return 256+num return num } /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ froman\\ fcharset0 Times New Roman;}}\n{\\ colortbl ;\\ red0\\ green0\\ blue0;}\n\\ viewkind4\\ uc1\\ pard\\ cf1\\ lang11274\\ f0\\ fs24 \n\\ par } */
thanks in advance.
Last edited by red_bull2oo6; 07-17-2013 at 10:30.
Reason: editting title
|
|