Mensajes: 42
Temas: 2
Registro en: Jan 2019
Reputación:
0
Simplemente alguna función que envie A2S_PLAYER para obtener los jugadores online de un server. Gracias
Mensajes: 1,450
Temas: 59
Registro en: Feb 2015
Reputación:
20
Código PHP:
public function GetPlayers ( ) { if( ! $this -> Connected ) { throw new SocketException ( 'Not connected.' , SocketException :: NOT_CONNECTED ); } $this -> GetChallenge ( self :: A2S_PLAYER , self :: S2A_PLAYER ); $this -> Socket -> Write ( self :: A2S_PLAYER , $this -> Challenge ); $Buffer = $this -> Socket -> Read ( 14000 ); // Moronic Arma 3 developers do not split their packets, so we have to read more data // This violates the protocol spec, and they probably should fix it: https://developer.valvesoftware.com/wiki/Server_queries#Protocol $Type = $Buffer -> GetByte ( ); if( $Type !== self :: S2A_PLAYER ) { throw new InvalidPacketException ( 'GetPlayers: Packet header mismatch. (0x' . DecHex ( $Type ) . ')' , InvalidPacketException :: PACKET_HEADER_MISMATCH ); } $Players = []; $Count = $Buffer -> GetByte ( ); while( $Count -- > 0 && $Buffer -> Remaining ( ) > 0 ) { $Player [ 'Id' ] = $Buffer -> GetByte ( ); // PlayerID, is it just always 0? $Player [ 'Name' ] = $Buffer -> GetString ( ); $Player [ 'Frags' ] = $Buffer -> GetLong ( ); $Player [ 'Time' ] = (int) $Buffer -> GetFloat ( ); $Player [ 'TimeF' ] = GMDate ( ( $Player [ 'Time' ] > 3600 ? "H:i:s" : "i:s" ), $Player [ 'Time' ] ); $Players [ ] = $Player ; } return $Players ; }
Source:
https://github.com/xPaw/PHP-Source-Query...eQuery.php
Mensajes: 1,933
Temas: 39
Registro en: Jul 2014
Reputación:
23
08/02/2019, 06:37 PM
(Última modificación: 08/02/2019, 06:37 PM por Sugisaki . Edited 1 time in total.)
(01/04/2017, 05:15 PM) Sugisaki escribió: hacer un server query es mas facil de lo que creia
por si alguien lo quiere
Código PHP:
<?php $server = get_server_status ( "127.0.0.1" , "27015" ); if(! $server ) { die(); } echo( $server [ 'ip' ]. "<br>" ); echo( $server [ 'name' ]. "<br>" ); echo( $server [ 'map' ]. "<br>" ); echo( $server [ 'gamename' ]. "<br>" ); echo( $server [ 'players' ]. "<br>" ); echo( $server [ 'maxplayers' ]. "<br>" ); ?> <?php function get_server_status ( $ip , $port ) { $socket = @ fsockopen ( "udp://" . $ip , $port , $errno , $errstr , 1 ); if(! $socket ) { die( "Servidor no responde..." ); } fwrite ( $socket , "\xFF\xFF\xFF\xFFTSource Engine Query\x00" ); $r = fread ( $socket , 4096 ); @ fclose ( $socket ); $server = array(); if( $r [ 4 ] == 'm' ) // Este tipo de query es si Dpronto quiero ver otro tipo de sv { $data = explode ( "\x00" , substr ( $r , 5 )); $server [ 'ip' ] = $data [ 0 ]; $server [ 'name' ] = $data [ 1 ]; $server [ 'map' ] = $data [ 2 ]; $server [ 'mod' ] = $data [ 3 ]; $server [ 'gamename' ] = $data [ 4 ]; $l = 5 ; $l += strlen ( $data [ 0 ]) + 1 ; $l += strlen ( $data [ 1 ]) + 1 ; $l += strlen ( $data [ 2 ]) + 1 ; $l += strlen ( $data [ 3 ]) + 1 ; $l += strlen ( $data [ 4 ]) + 1 ; $server [ 'players' ] = ord ( $r [ $l ]); $l += 1 ; $server [ 'maxplayers' ] = ord ( $r [ $l ]); return $server ; } else if( $r [ 4 ] == 'I' ) { $data = explode ( "\x00" , substr ( $r , 6 )); $server [ 'ip' ] = sprintf ( "%s:%s" , $ip , $port ); $server [ 'name' ] = $data [ 0 ]; $server [ 'map' ] = $data [ 1 ]; $server [ 'mod' ] = $data [ 2 ]; $server [ 'gamename' ] = $data [ 3 ]; $l = 6 ; $l += strlen ( $data [ 0 ]) + 1 ; $l += strlen ( $data [ 1 ]) + 1 ; $l += strlen ( $data [ 2 ]) + 1 ; $l += strlen ( $data [ 3 ]) + 3 ; $server [ 'players' ] = ord ( $r [ $l ]); $l += 1 ; $server [ 'maxplayers' ] = ord ( $r [ $l ]); return $server ; } else { die( "Servidor no responde..." ); } return false ; }
Mensajes: 42
Temas: 2
Registro en: Jan 2019
Reputación:
0
09/02/2019, 12:14 PM
(Última modificación: 09/02/2019, 12:15 PM por Kreeze . Edited 1 time in total.)
Ahí envias Source Engine Query, yo estoy intentando enviar este formato:
https://developer.valvesoftware.com/wiki...A2S_PLAYER
[ÿÿÿÿUÿÿÿÿ] -> [\xff\xff\xff\xff U $numberchallenge];
(CREO que es así, pero sí yo envio eso, me devuelve una A) nomás..
Mensajes: 1,933
Temas: 39
Registro en: Jul 2014
Reputación:
23
Cita: Example challenge request:Código PHP:
FF FF FF FF 55 FF FF FF FF ÿÿÿÿUÿÿÿÿ "
y retorna
Código PHP:
FF FF FF FF 41 4B A1 D5 22 ÿÿÿÿAÿÿÿÿ "
Esa es la "A" que te sale pero la primera peticion es para obtener el "challenge" lo cual nos retorno
solo queda hacer el AS2_PLAYER
que seria
Código PHP:
FF FF FF FF 55 4B A1 D5 22
y nos retornaria algo asi
Código PHP:
<?php class sv { function __construct ( $ip , $port ) { $socket = @ fsockopen ( "udp://" . $ip , $port , $errno , $errstr , 1.0 ); if(! $socket ) { echo( "Servidor No responde" ); return; } $as2player = "\xFF\xFF\xFF\xFF\x55\xFF\xFF\xFF\xFF" ; fwrite ( $socket , $as2player ); $r = fread ( $socket , 4096 ); $r = substr ( $r , 5 ); $as2player2 = "\xFF\xFF\xFF\xFF\x55" . $r ; fwrite ( $socket , $as2player2 ); $r = fread ( $socket , 4096 ); echo $r ; } } $server = new sv ( "127.0.0.1" , "27015" ); ?>
le hace falta splitear los nombres de los users y bueh!! ya estaria
Archivos adjuntos
Miniatura(s)