Diff
checker
Texto
Texto
Imagens
Documentos
Excel
Pastas
Legal
Enterprise
Aplicativo para desktop
Preços
Fazer login
Baixar o Diffchecker Desktop
Comparar texto
Encontre a diferença entre dois arquivos de texto
Ferramentas
Histórico
Editor live
Ocultar espaços em branco
Recolher inalteradas
Sem quebra de linha
Layout
Dividido
Unificado
Nível de detalhe
Inteligente
Palavra
Caractere
Estilos de texto
Alterar aparência
Realce de sintaxe
Escolher sintaxe
Ignorar
Transformar texto
Ir à primeira mudança
Editar entrada
Diffchecker Desktop
A maneira mais segura de usar o Diffchecker. Obtenha o aplicativo Diffchecker Desktop: seus diffs nunca saem do seu computador!
Obter Desktop
Untitled diff
Criado
há 9 anos
O diff nunca expira
Limpar
Exportar
Compartilhar
Explicar
1 remoção
Linhas
Total
Removido
Caracteres
Total
Removido
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
488 linhas
Copiar tudo
492 adições
Linhas
Total
Adicionado
Caracteres
Total
Adicionado
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
977 linhas
Copiar tudo
<?php
<?php
Copiar
Copiado
Copiar
Copiado
/*
/*
Copiar
Copiado
Copiar
Copiado
LiveStats Library
LiveStats Library
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
version: 2.0
version: 2.0
Copiar
Copiado
Copiar
Copiado
query engines: Goldsource, Source, SA:MP
query engines: Goldsource, Source, SA:MP
Copiar
Copiado
Copiar
Copiado
protocol: 47, 48
protocol: 47, 48
Copiar
Copiado
Copiar
Copiado
author: nr913
author: nr913
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
visit www.
freakz
.ro
visit www.
foxh
.ro
*/
*/
Copiar
Copiado
Copiar
Copiado
define('HL_PACKET', -1);
define('HL_PACKET', -1);
Copiar
Copiado
Copiar
Copiado
define('HL_PACKET_SPLITTED', -2);
define('HL_PACKET_SPLITTED', -2);
Copiar
Copiado
Copiar
Copiado
define('SAMP_PACKET', 1347240275);
define('SAMP_PACKET', 1347240275);
Copiar
Copiado
Copiar
Copiado
class Player {
class Player {
Copiar
Copiado
Copiar
Copiado
var $ID;
var $ID;
Copiar
Copiado
Copiar
Copiado
var $Name;
var $Name;
Copiar
Copiado
Copiar
Copiado
var $Score;
var $Score;
Copiar
Copiado
Copiar
Copiado
var $TimePlayed;
var $TimePlayed;
Copiar
Copiado
Copiar
Copiado
var $Ping;
var $Ping;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
class Server {
class Server {
Copiar
Copiado
Copiar
Copiado
var $Type = 0;
var $Type = 0;
Copiar
Copiado
Copiar
Copiado
var $ProtocolVersion;
var $ProtocolVersion;
Copiar
Copiado
Copiar
Copiado
var $Address;
var $Address;
Copiar
Copiado
Copiar
Copiado
var $Hostname;
var $Hostname;
Copiar
Copiado
Copiar
Copiado
var $Map;
var $Map;
Copiar
Copiado
Copiar
Copiado
var $Directory;
var $Directory;
Copiar
Copiado
Copiar
Copiado
var $Description;
var $Description;
Copiar
Copiado
Copiar
Copiado
var $AppID;
var $AppID;
Copiar
Copiado
Copiar
Copiado
var $MaxPlayers;
var $MaxPlayers;
Copiar
Copiado
Copiar
Copiado
var $PlayerCount;
var $PlayerCount;
Copiar
Copiado
Copiar
Copiado
var $BotCount;
var $BotCount;
Copiar
Copiado
Copiar
Copiado
var $Dedicated;
var $Dedicated;
Copiar
Copiado
Copiar
Copiado
var $OS;
var $OS;
Copiar
Copiado
Copiar
Copiado
var $PasswordProtected;
var $PasswordProtected;
Copiar
Copiado
Copiar
Copiado
var $Secured;
var $Secured;
Copiar
Copiado
Copiar
Copiado
var $GameMode;
var $GameMode;
Copiar
Copiado
Copiar
Copiado
var $WitnessCount;
var $WitnessCount;
Copiar
Copiado
Copiar
Copiado
var $WitnessTime;
var $WitnessTime;
Copiar
Copiado
Copiar
Copiado
var $GameVersion;
var $GameVersion;
Copiar
Copiado
Copiar
Copiado
var $Players = array();
var $Players = array();
Copiar
Copiado
Copiar
Copiado
var $Rules = array();
var $Rules = array();
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
class Time {
class Time {
Copiar
Copiado
Copiar
Copiado
var $Hours;
var $Hours;
Copiar
Copiado
Copiar
Copiado
var $Minutes;
var $Minutes;
Copiar
Copiado
Copiar
Copiado
var $Seconds;
var $Seconds;
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function __construct($seconds) {
function __construct($seconds) {
Copiar
Copiado
Copiar
Copiado
$this->Hours = floor($seconds / 3600);
$this->Hours = floor($seconds / 3600);
Copiar
Copiado
Copiar
Copiado
$this->Minutes = floor($seconds / 60) % 60;
$this->Minutes = floor($seconds / 60) % 60;
Copiar
Copiado
Copiar
Copiado
$this->Seconds = floor($seconds) % 60;
$this->Seconds = floor($seconds) % 60;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function __toString() {
function __toString() {
Copiar
Copiado
Copiar
Copiado
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
Copiar
Copiado
Copiar
Copiado
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
Copiar
Copiado
Copiar
Copiado
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
Copiar
Copiado
Copiar
Copiado
return "$hours:$minutes:$seconds";
return "$hours:$minutes:$seconds";
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
class LSError extends Exception {
class LSError extends Exception {
Copiar
Copiado
Copiar
Copiado
var $ErrorMessage;
var $ErrorMessage;
Copiar
Copiado
Copiar
Copiado
var $ErrorCode;
var $ErrorCode;
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function __construct($errcode, $errmsg) {
function __construct($errcode, $errmsg) {
Copiar
Copiado
Copiar
Copiado
$this->ErrorCode = $errcode;
$this->ErrorCode = $errcode;
Copiar
Copiado
Copiar
Copiado
$this->ErrorMessage = $errmsg;
$this->ErrorMessage = $errmsg;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
class Utils {
class Utils {
Copiar
Copiado
Copiar
Copiado
static function getTime() {
static function getTime() {
Copiar
Copiado
Copiar
Copiado
list($u, $s) = explode(' ', microtime());
list($u, $s) = explode(' ', microtime());
Copiar
Copiado
Copiar
Copiado
return ((float)$u + (float)$s);
return ((float)$u + (float)$s);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
static function getString($packet, &$offset, $length = -1) {
static function getString($packet, &$offset, $length = -1) {
Copiar
Copiado
Copiar
Copiado
$len = strlen($packet);
$len = strlen($packet);
Copiar
Copiado
Copiar
Copiado
$i = 0;
$i = 0;
Copiar
Copiado
Copiar
Copiado
if ($length == -1) {
if ($length == -1) {
Copiar
Copiado
Copiar
Copiado
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
Copiar
Copiado
Copiar
Copiado
$i++;
$i++;
Copiar
Copiado
Copiar
Copiado
$offset += $i + 1;
$offset += $i + 1;
Copiar
Copiado
Copiar
Copiado
return substr($packet, $offset - $i - 1, $i);
return substr($packet, $offset - $i - 1, $i);
Copiar
Copiado
Copiar
Copiado
} else {
} else {
Copiar
Copiado
Copiar
Copiado
$i = $length;
$i = $length;
Copiar
Copiado
Copiar
Copiado
if ($len - $offset < $length)
if ($len - $offset < $length)
Copiar
Copiado
Copiar
Copiado
$i = $len - $offset;
$i = $len - $offset;
Copiar
Copiado
Copiar
Copiado
$offset += $i;
$offset += $i;
Copiar
Copiado
Copiar
Copiado
return substr($packet, $offset - $i, $i);
return substr($packet, $offset - $i, $i);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
static function getByte($packet, &$offset) {
static function getByte($packet, &$offset) {
Copiar
Copiado
Copiar
Copiado
if ($offset >= strlen($packet))
if ($offset >= strlen($packet))
Copiar
Copiado
Copiar
Copiado
return 0;
return 0;
Copiar
Copiado
Copiar
Copiado
$char = unpack('cchar', $packet[$offset]);
$char = unpack('cchar', $packet[$offset]);
Copiar
Copiado
Copiar
Copiado
$offset++;
$offset++;
Copiar
Copiado
Copiar
Copiado
return $char['char'];
return $char['char'];
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
static function getShort($packet, &$offset) {
static function getShort($packet, &$offset) {
Copiar
Copiado
Copiar
Copiado
if ($offset + 2 >= strlen($packet))
if ($offset + 2 >= strlen($packet))
Copiar
Copiado
Copiar
Copiado
return 0;
return 0;
Copiar
Copiado
Copiar
Copiado
$short = unpack('sshort', substr($packet, $offset, 2));
$short = unpack('sshort', substr($packet, $offset, 2));
Copiar
Copiado
Copiar
Copiado
$offset += 2;
$offset += 2;
Copiar
Copiado
Copiar
Copiado
return $short['short'];
return $short['short'];
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
static function getInt($packet, &$offset) {
static function getInt($packet, &$offset) {
Copiar
Copiado
Copiar
Copiado
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
Copiar
Copiado
Copiar
Copiado
return 0;
return 0;
Copiar
Copiado
Copiar
Copiado
$int = unpack('iint', substr($packet, $offset, 4));
$int = unpack('iint', substr($packet, $offset, 4));
Copiar
Copiado
Copiar
Copiado
$offset += 4;
$offset += 4;
Copiar
Copiado
Copiar
Copiado
return $int['int'];
return $int['int'];
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
static function getFloat($packet, &$offset) {
static function getFloat($packet, &$offset) {
Copiar
Copiado
Copiar
Copiado
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
Copiar
Copiado
Copiar
Copiado
return ((float)0.0);
return ((float)0.0);
Copiar
Copiado
Copiar
Copiado
$float = unpack('ffloat', substr($packet, $offset, 4));
$float = unpack('ffloat', substr($packet, $offset, 4));
Copiar
Copiado
Copiar
Copiado
$offset += 4;
$offset += 4;
Copiar
Copiado
Copiar
Copiado
return ((float)$float['float']);
return ((float)$float['float']);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
class LiveStats {
class LiveStats {
Copiar
Copiado
Copiar
Copiado
var $IP;
var $IP;
Copiar
Copiado
Copiar
Copiado
var $Port;
var $Port;
Copiar
Copiado
Copiar
Copiado
var $Sock;
var $Sock;
Copiar
Copiado
Copiar
Copiado
var $Challenge = "\xFF\xFF\xFF\xFF";
var $Challenge = "\xFF\xFF\xFF\xFF";
Copiar
Copiado
Copiar
Copiado
var $HaveInfo = false;
var $HaveInfo = false;
Copiar
Copiado
Copiar
Copiado
var $HavePlayer = false;
var $HavePlayer = false;
Copiar
Copiado
Copiar
Copiado
var $HaveRules = false;
var $HaveRules = false;
Copiar
Copiado
Copiar
Copiado
var $ResendPlayer = false;
var $ResendPlayer = false;
Copiar
Copiado
Copiar
Copiado
var $ResendRules = false;
var $ResendRules = false;
Copiar
Copiado
Copiar
Copiado
var $SendQueue = array();
var $SendQueue = array();
Copiar
Copiado
Copiar
Copiado
var $MaxExecutionTime = 2;
var $MaxExecutionTime = 2;
Copiar
Copiado
Copiar
Copiado
var $SplittedPackets = array();
var $SplittedPackets = array();
Copiar
Copiado
Copiar
Copiado
var $SAMPHeader = "SAMP";
var $SAMPHeader = "SAMP";
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
var $Server;
var $Server;
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
public function __construct($hostname, $port = 27015) {
public function __construct($hostname, $port = 27015) {
Copiar
Copiado
Copiar
Copiado
$this->IP = gethostbyname($hostname);
$this->IP = gethostbyname($hostname);
Copiar
Copiado
Copiar
Copiado
$this->Port = $port;
$this->Port = $port;
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$errno = 0; $errstr = '';
$errno = 0; $errstr = '';
Copiar
Copiado
Copiar
Copiado
$this->Sock = @stream_socket_client("udp://{$this->IP}:{$this->Port}", $errno, $errstr, 5);
$this->Sock = @stream_socket_client("udp://{$this->IP}:{$this->Port}", $errno, $errstr, 5);
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
if ($this->Sock === false)
if ($this->Sock === false)
Copiar
Copiado
Copiar
Copiado
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
Copiar
Copiado
Copiar
Copiado
if (stream_set_blocking($this->Sock, false) == false)
if (stream_set_blocking($this->Sock, false) == false)
Copiar
Copiado
Copiar
Copiado
throw new LSError(2, "Could not set to non-blocking mode.");
throw new LSError(2, "Could not set to non-blocking mode.");
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
if (stream_set_timeout($this->Sock, 3) == false)
if (stream_set_timeout($this->Sock, 3) == false)
Copiar
Copiado
Copiar
Copiado
throw new LSError(3, "Could not set timeout to 10 seconds.");
throw new LSError(3, "Could not set timeout to 10 seconds.");
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$this->Server = new Server;
$this->Server = new Server;
Copiar
Copiado
Copiar
Copiado
$this->Server->Address = "{$this->IP}:{$this->Port}";
$this->Server->Address = "{$this->IP}:{$this->Port}";
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$ip = explode('.', $this->IP);
$ip = explode('.', $this->IP);
Copiar
Copiado
Copiar
Copiado
$this->SAMPHeader .= chr($ip[0]) . chr($ip[1]) . chr($ip[2]) . chr($ip[3]) . chr($this->Port & 0xFF) . chr(($this->Port >> 8) & 0xFF);
$this->SAMPHeader .= chr($ip[0]) . chr($ip[1]) . chr($ip[2]) . chr($ip[3]) . chr($this->Port & 0xFF) . chr(($this->Port >> 8) & 0xFF);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function onSplittedPacketReceived($packet) {
function onSplittedPacketReceived($packet) {
Copiar
Copiado
Copiar
Copiado
$offset = 4;
$offset = 4;
Copiar
Copiado
Copiar
Copiado
$ReqID = Utils::getInt($packet, $offset);
$ReqID = Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
if (!isset($this->SplittedPackets[$ReqID])) {
if (!isset($this->SplittedPackets[$ReqID])) {
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID] = array(
$this->SplittedPackets[$ReqID] = array(
Copiar
Copiado
Copiar
Copiado
'Data' => array(),
'Data' => array(),
Copiar
Copiado
Copiar
Copiado
'Type' => -1,
'Type' => -1,
Copiar
Copiado
Copiar
Copiado
'Packets' => -1
'Packets' => -1
Copiar
Copiado
Copiar
Copiado
);
);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
Copiar
Copiado
Copiar
Copiado
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
Copiar
Copiado
Copiar
Copiado
$offset = 8;
$offset = 8;
Copiar
Copiado
Copiar
Copiado
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
Copiar
Copiado
Copiar
Copiado
$offset = 8;
$offset = 8;
Copiar
Copiado
Copiar
Copiado
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
Copiar
Copiado
Copiar
Copiado
if ($FB1 != $FB2) {
if ($FB1 != $FB2) {
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Type'] = 0;
$this->SplittedPackets[$ReqID]['Type'] = 0;
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
Copiar
Copiado
Copiar
Copiado
} else {
} else {
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Type'] = 1;
$this->SplittedPackets[$ReqID]['Type'] = 1;
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
Copiar
Copiado
Copiar
Copiado
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
Copiar
Copiado
Copiar
Copiado
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
Copiar
Copiado
Copiar
Copiado
$offset = 8;
$offset = 8;
Copiar
Copiado
Copiar
Copiado
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
Copiar
Copiado
Copiar
Copiado
if ($i != $PckID) {
if ($i != $PckID) {
Copiar
Copiado
Copiar
Copiado
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
Copiar
Copiado
Copiar
Copiado
$i--;
$i--;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
Copiar
Copiado
Copiar
Copiado
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
Copiar
Copiado
Copiar
Copiado
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
Copiar
Copiado
Copiar
Copiado
} else {
} else {
Copiar
Copiado
Copiar
Copiado
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
Copiar
Copiado
Copiar
Copiado
$offset = 9;
$offset = 9;
Copiar
Copiado
Copiar
Copiado
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
Copiar
Copiado
Copiar
Copiado
if ($i != $PckID) {
if ($i != $PckID) {
Copiar
Copiado
Copiar
Copiado
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
Copiar
Copiado
Copiar
Copiado
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
Copiar
Copiado
Copiar
Copiado
$i--;
$i--;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
Copiar
Copiado
Copiar
Copiado
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
Copiar
Copiado
Copiar
Copiado
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
unset($this->SplittedPackets[$ReqID]);
unset($this->SplittedPackets[$ReqID]);
Copiar
Copiado
Copiar
Copiado
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function onPacketReceived($packet) {
function onPacketReceived($packet) {
Copiar
Copiado
Copiar
Copiado
$offset = 4;
$offset = 4;
Copiar
Copiado
Copiar
Copiado
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
Copiar
Copiado
Copiar
Copiado
case 0x41: // challenge
case 0x41: // challenge
Copiar
Copiado
Copiar
Copiado
$this->Challenge = substr($packet, 5);
$this->Challenge = substr($packet, 5);
Copiar
Copiado
Copiar
Copiado
if ($this->ResendPlayer) {
if ($this->ResendPlayer) {
Copiar
Copiado
Copiar
Copiado
$this->ResendPlayer = false;
$this->ResendPlayer = false;
Copiar
Copiado
Copiar
Copiado
$this->requestPlayer();
$this->requestPlayer();
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
if ($this->ResendRules) {
if ($this->ResendRules) {
Copiar
Copiado
Copiar
Copiado
$this->ResendRules = false;
$this->ResendRules = false;
Copiar
Copiado
Copiar
Copiado
$this->requestRules();
$this->requestRules();
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
case 0x44: // player
case 0x44: // player
Copiar
Copiado
Copiar
Copiado
if ($this->HavePlayer)
if ($this->HavePlayer)
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$offset = 5;
$offset = 5;
Copiar
Copiado
Copiar
Copiado
$numplayers = Utils::getByte($packet, $offset);
$numplayers = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
while ($numplayers) {
while ($numplayers) {
Copiar
Copiado
Copiar
Copiado
$Player = new Player;
$Player = new Player;
Copiar
Copiado
Copiar
Copiado
$Player->ID = Utils::getByte($packet, $offset);
$Player->ID = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$Player->Name = Utils::getString($packet, $offset);
$Player->Name = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$len = strlen($Player->Name);
$len = strlen($Player->Name);
Copiar
Copiado
Copiar
Copiado
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
Copiar
Copiado
Copiar
Copiado
$numplayers--;
$numplayers--;
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$this->HavePlayer = true;
$this->HavePlayer = true;
Copiar
Copiado
Copiar
Copiado
$this->ResendPlayer = false;
$this->ResendPlayer = false;
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
case 0x49: // info, source
case 0x49: // info, source
Copiar
Copiado
Copiar
Copiado
if ($this->HaveInfo)
if ($this->HaveInfo)
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$offset = 5;
$offset = 5;
Copiar
Copiado
Copiar
Copiado
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->AppID = Utils::getShort($packet, $offset);
$this->Server->AppID = Utils::getShort($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
Copiar
Copiado
Copiar
Copiado
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
Copiar
Copiado
Copiar
Copiado
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copiar
Copiado
Copiar
Copiado
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copiar
Copiado
Copiar
Copiado
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
Copiar
Copiado
Copiar
Copiado
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
Copiar
Copiado
Copiar
Copiado
$gm = Utils::getByte($packet, $offset);
$gm = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
Copiar
Copiado
Copiar
Copiado
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
Copiar
Copiado
Copiar
Copiado
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$this->Server->GameVersion = Utils::getString($packet, $offset);
$this->Server->GameVersion = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->HaveInfo = true;
$this->HaveInfo = true;
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
case 0x6D: // info, goldsource
case 0x6D: // info, goldsource
Copiar
Copiado
Copiar
Copiado
if ($this->HaveInfo)
if ($this->HaveInfo)
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$offset = 5;
$offset = 5;
Copiar
Copiado
Copiar
Copiado
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
Copiar
Copiado
Copiar
Copiado
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
Copiar
Copiado
Copiar
Copiado
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
Copiar
Copiado
Copiar
Copiado
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copiar
Copiado
Copiar
Copiado
$IsMod = Utils::getByte($packet, $offset);
$IsMod = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
if ($IsMod == 1) {
if ($IsMod == 1) {
Copiar
Copiado
Copiar
Copiado
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copiar
Copiado
Copiar
Copiado
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->HaveInfo = true;
$this->HaveInfo = true;
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
case 0x45: // rules
case 0x45: // rules
Copiar
Copiado
Copiar
Copiado
if ($this->HaveRules)
if ($this->HaveRules)
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$offset = 5;
$offset = 5;
Copiar
Copiado
Copiar
Copiado
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
Copiar
Copiado
Copiar
Copiado
while ($rulesnum) {
while ($rulesnum) {
Copiar
Copiado
Copiar
Copiado
$Name = Utils::getString($packet, $offset);
$Name = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$Value = Utils::getString($packet, $offset);
$Value = Utils::getString($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$rulesnum--;
$rulesnum--;
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$this->HaveRules = true;
$this->HaveRules = true;
Copiar
Copiado
Copiar
Copiado
$this->ResendRules = false;
$this->ResendRules = false;
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
default:
default:
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function onSampPacketReceived($packet) {
function onSampPacketReceived($packet) {
Copiar
Copiado
Copiar
Copiado
$offset = 10;
$offset = 10;
Copiar
Copiado
Copiar
Copiado
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
Copiar
Copiado
Copiar
Copiado
case 0x69: // info
case 0x69: // info
Copiar
Copiado
Copiar
Copiado
if ($this->HaveInfo)
if ($this->HaveInfo)
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copiar
Copiado
Copiar
Copiado
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
Copiar
Copiado
Copiar
Copiado
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
Copiar
Copiado
Copiar
Copiado
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$this->Server->Map = Utils::getString($packet, $offset, $len);
$this->Server->Map = Utils::getString($packet, $offset, $len);
Copiar
Copiado
Copiar
Copiado
$this->HaveInfo = true;
$this->HaveInfo = true;
Copiar
Copiado
Copiar
Copiado
if ($this->Server->PlayerCount >= 100)
if ($this->Server->PlayerCount >= 100)
Copiar
Copiado
Copiar
Copiado
$this->HavePlayer = true;
$this->HavePlayer = true;
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
case 0x72: // rules
case 0x72: // rules
Copiar
Copiado
Copiar
Copiado
if ($this->HaveRules)
if ($this->HaveRules)
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
Copiar
Copiado
Copiar
Copiado
while ($rulesnum) {
while ($rulesnum) {
Copiar
Copiado
Copiar
Copiado
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$Name = Utils::getString($packet, $offset, $len);
$Name = Utils::getString($packet, $offset, $len);
Copiar
Copiado
Copiar
Copiado
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$Value = Utils::getString($packet, $offset, $len);
$Value = Utils::getString($packet, $offset, $len);
Copiar
Copiado
Copiar
Copiado
$rulesnum--;
$rulesnum--;
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$this->HaveRules = true;
$this->HaveRules = true;
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
case 0x64: // player
case 0x64: // player
Copiar
Copiado
Copiar
Copiado
if ($this->HavePlayer)
if ($this->HavePlayer)
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$numplayers = Utils::getShort($packet, $offset);
$numplayers = Utils::getShort($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$lastID = 0;
$lastID = 0;
Copiar
Copiado
Copiar
Copiado
$plusID = 0;
$plusID = 0;
Copiar
Copiado
Copiar
Copiado
while ($numplayers) {
while ($numplayers) {
Copiar
Copiado
Copiar
Copiado
$Player = new Player;
$Player = new Player;
Copiar
Copiado
Copiar
Copiado
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
Copiar
Copiado
Copiar
Copiado
if ($Player->ID < $lastID) {
if ($Player->ID < $lastID) {
Copiar
Copiado
Copiar
Copiado
$Player->ID += 256;
$Player->ID += 256;
Copiar
Copiado
Copiar
Copiado
$plusID += 256;
$plusID += 256;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$lastID = $Player->ID;
$lastID = $Player->ID;
Copiar
Copiado
Copiar
Copiado
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$Player->Name = Utils::getString($packet, $offset, $len);
$Player->Name = Utils::getString($packet, $offset, $len);
Copiar
Copiado
Copiar
Copiado
$len = strlen($Player->Name);
$len = strlen($Player->Name);
Copiar
Copiado
Copiar
Copiado
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$Player->Ping = Utils::getInt($packet, $offset);
$Player->Ping = Utils::getInt($packet, $offset);
Copiar
Copiado
Copiar
Copiado
$numplayers--;
$numplayers--;
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
$this->HavePlayer = true;
$this->HavePlayer = true;
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
default:
default:
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function requestInfo() {
function requestInfo() {
Copiar
Copiado
Copiar
Copiado
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
Copiar
Copiado
Copiar
Copiado
array_push($this->SendQueue, $this->SAMPHeader . "i");
array_push($this->SendQueue, $this->SAMPHeader . "i");
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function requestPlayer() {
function requestPlayer() {
Copiar
Copiado
Copiar
Copiado
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
Copiar
Copiado
Copiar
Copiado
array_push($this->SendQueue, $this->SAMPHeader . "d");
array_push($this->SendQueue, $this->SAMPHeader . "d");
Copiar
Copiado
Copiar
Copiado
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
Copiar
Copiado
Copiar
Copiado
$this->ResendPlayer = true;
$this->ResendPlayer = true;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function requestRules() {
function requestRules() {
Copiar
Copiado
Copiar
Copiado
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
Copiar
Copiado
Copiar
Copiado
array_push($this->SendQueue, $this->SAMPHeader . "r");
array_push($this->SendQueue, $this->SAMPHeader . "r");
Copiar
Copiado
Copiar
Copiado
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
Copiar
Copiado
Copiar
Copiado
$this->ResendRules = true;
$this->ResendRules = true;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
function GetServer() {
function GetServer() {
Copiar
Copiado
Copiar
Copiado
$start = Utils::getTime();
$start = Utils::getTime();
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$this->requestInfo();
$this->requestInfo();
Copiar
Copiado
Copiar
Copiado
$this->requestPlayer();
$this->requestPlayer();
Copiar
Copiado
Copiar
Copiado
$this->requestRules();
$this->requestRules();
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
Copiar
Copiado
Copiar
Copiado
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
Copiar
Copiado
Copiar
Copiado
if ($this->HaveInfo && $this->HavePlayer) {
if ($this->HaveInfo && $this->HavePlayer) {
Copiar
Copiado
Copiar
Copiado
$this->HaveRules = true;
$this->HaveRules = true;
Copiar
Copiado
Copiar
Copiado
} else {
} else {
Copiar
Copiado
Copiar
Copiado
throw new LSError(4, "Timed out.");
throw new LSError(4, "Timed out.");
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
if (count($this->SendQueue) > 0) {
if (count($this->SendQueue) > 0) {
Copiar
Copiado
Copiar
Copiado
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
Copiar
Copiado
Copiar
Copiado
if ($meta['timed_out'])
if ($meta['timed_out'])
Copiar
Copiado
Copiar
Copiado
throw new LSError(5, "Timed out.");
throw new LSError(5, "Timed out.");
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
usleep(50000);
usleep(50000);
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$packet = fread($this->Sock, 2048);
$packet = fread($this->Sock, 2048);
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
Copiar
Copiado
Copiar
Copiado
if ($meta['timed_out'])
if ($meta['timed_out'])
Copiar
Copiado
Copiar
Copiado
throw new LSError(6, "Timed out.");
throw new LSError(6, "Timed out.");
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
Copiar
Copiado
if (strlen($packet) > 0) {
if (strlen($packet) > 0) {
Copiar
Copiado
Copiar
Copiado
$offset = 0;
$offset = 0;
Copiar
Copiado
Copiar
Copiado
switch (Utils::getInt($packet, $offset)) {
switch (Utils::getInt($packet, $offset)) {
Copiar
Copiado
Copiar
Copiado
case HL_PACKET:
case HL_PACKET:
Copiar
Copiado
Copiar
Copiado
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$this->Server->Type = 1;
$this->Server->Type = 1;
Copiar
Copiado
Copiar
Copiado
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
case HL_PACKET_SPLITTED:
case HL_PACKET_SPLITTED:
Copiar
Copiado
Copiar
Copiado
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$this->Server->Type = 1;
$this->Server->Type = 1;
Copiar
Copiado
Copiar
Copiado
$this->onSplittedPacketReceived($packet);
$this->onSplittedPacketReceived($packet);
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
case SAMP_PACKET:
case SAMP_PACKET:
Copiar
Copiado
Copiar
Copiado
if (!in_array($this->Server->Type, array(0, 2)))
if (!in_array($this->Server->Type, array(0, 2)))
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
$this->Server->Type = 2;
$this->Server->Type = 2;
Copiar
Copiado
Copiar
Copiado
$this->onSampPacketReceived($packet);
$this->onSampPacketReceived($packet);
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
default:
default:
Copiar
Copiado
Copiar
Copiado
break;
break;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
return $this->Server;
return $this->Server;
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
}
}
Copiar
Copiado
Copiar
Copiado
?>
?>
Diferenças salvas
Texto original
Abrir arquivo
<?php /* LiveStats Library version: 2.0 query engines: Goldsource, Source, SA:MP protocol: 47, 48 author: nr913 visit www.freakz.ro */ define('HL_PACKET', -1); define('HL_PACKET_SPLITTED', -2); define('SAMP_PACKET', 1347240275); class Player { var $ID; var $Name; var $Score; var $TimePlayed; var $Ping; } class Server { var $Type = 0; var $ProtocolVersion; var $Address; var $Hostname; var $Map; var $Directory; var $Description; var $AppID; var $MaxPlayers; var $PlayerCount; var $BotCount; var $Dedicated; var $OS; var $PasswordProtected; var $Secured; var $GameMode; var $WitnessCount; var $WitnessTime; var $GameVersion; var $Players = array(); var $Rules = array(); } class Time { var $Hours; var $Minutes; var $Seconds; function __construct($seconds) { $this->Hours = floor($seconds / 3600); $this->Minutes = floor($seconds / 60) % 60; $this->Seconds = floor($seconds) % 60; } function __toString() { $hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours); $minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes); $seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds); return "$hours:$minutes:$seconds"; } } class LSError extends Exception { var $ErrorMessage; var $ErrorCode; function __construct($errcode, $errmsg) { $this->ErrorCode = $errcode; $this->ErrorMessage = $errmsg; } } class Utils { static function getTime() { list($u, $s) = explode(' ', microtime()); return ((float)$u + (float)$s); } static function getString($packet, &$offset, $length = -1) { $len = strlen($packet); $i = 0; if ($length == -1) { while ($offset + $i < $len && $packet[$offset + $i] != "\x00") $i++; $offset += $i + 1; return substr($packet, $offset - $i - 1, $i); } else { $i = $length; if ($len - $offset < $length) $i = $len - $offset; $offset += $i; return substr($packet, $offset - $i, $i); } } static function getByte($packet, &$offset) { if ($offset >= strlen($packet)) return 0; $char = unpack('cchar', $packet[$offset]); $offset++; return $char['char']; } static function getShort($packet, &$offset) { if ($offset + 2 >= strlen($packet)) return 0; $short = unpack('sshort', substr($packet, $offset, 2)); $offset += 2; return $short['short']; } static function getInt($packet, &$offset) { if ($offset + 4 >= strlen($packet)) return 0; $int = unpack('iint', substr($packet, $offset, 4)); $offset += 4; return $int['int']; } static function getFloat($packet, &$offset) { if ($offset + 4 >= strlen($packet)) return ((float)0.0); $float = unpack('ffloat', substr($packet, $offset, 4)); $offset += 4; return ((float)$float['float']); } } class LiveStats { var $IP; var $Port; var $Sock; var $Challenge = "\xFF\xFF\xFF\xFF"; var $HaveInfo = false; var $HavePlayer = false; var $HaveRules = false; var $ResendPlayer = false; var $ResendRules = false; var $SendQueue = array(); var $MaxExecutionTime = 2; var $SplittedPackets = array(); var $SAMPHeader = "SAMP"; var $Server; public function __construct($hostname, $port = 27015) { $this->IP = gethostbyname($hostname); $this->Port = $port; $errno = 0; $errstr = ''; $this->Sock = @stream_socket_client("udp://{$this->IP}:{$this->Port}", $errno, $errstr, 5); if ($this->Sock === false) throw new LSError(1, "Could not connect to specified host [$errno]: $errstr."); if (stream_set_blocking($this->Sock, false) == false) throw new LSError(2, "Could not set to non-blocking mode."); if (stream_set_timeout($this->Sock, 3) == false) throw new LSError(3, "Could not set timeout to 10 seconds."); $this->Server = new Server; $this->Server->Address = "{$this->IP}:{$this->Port}"; $ip = explode('.', $this->IP); $this->SAMPHeader .= chr($ip[0]) . chr($ip[1]) . chr($ip[2]) . chr($ip[3]) . chr($this->Port & 0xFF) . chr(($this->Port >> 8) & 0xFF); } function onSplittedPacketReceived($packet) { $offset = 4; $ReqID = Utils::getInt($packet, $offset); if (!isset($this->SplittedPackets[$ReqID])) { $this->SplittedPackets[$ReqID] = array( 'Data' => array(), 'Type' => -1, 'Packets' => -1 ); } $this->SplittedPackets[$ReqID]['Data'][] = $packet; if (count($this->SplittedPackets[$ReqID]['Data']) == 2) { $offset = 8; $FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset); $offset = 8; $FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset); if ($FB1 != $FB2) { $this->SplittedPackets[$ReqID]['Type'] = 0; $this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4; } else { $this->SplittedPackets[$ReqID]['Type'] = 1; $this->SplittedPackets[$ReqID]['Packets'] = $FB1; } } if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) { if ($this->SplittedPackets[$ReqID]['Type'] == 0) { for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) { $offset = 8; $PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4; if ($i != $PckID) { $aux = $this->SplittedPackets[$ReqID]['Data'][$PckID]; $this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i]; $this->SplittedPackets[$ReqID]['Data'][$i] = $aux; $i--; } } $packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13); for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) $packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9); } else { for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) { $offset = 9; $PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset); if ($i != $PckID) { $aux = $this->SplittedPackets[$ReqID]['Data'][$PckID]; $this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i]; $this->SplittedPackets[$ReqID]['Data'][$i] = $aux; $i--; } } $packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16); for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) $packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12); } unset($this->SplittedPackets[$ReqID]); $this->onPacketReceived($packet); } } function onPacketReceived($packet) { $offset = 4; switch (Utils::getByte($packet, $offset)) { case 0x41: // challenge $this->Challenge = substr($packet, 5); if ($this->ResendPlayer) { $this->ResendPlayer = false; $this->requestPlayer(); } if ($this->ResendRules) { $this->ResendRules = false; $this->requestRules(); } break; case 0x44: // player if ($this->HavePlayer) break; $offset = 5; $numplayers = Utils::getByte($packet, $offset); while ($numplayers) { $Player = new Player; $Player->ID = Utils::getByte($packet, $offset); $Player->Name = Utils::getString($packet, $offset); $len = strlen($Player->Name); $Player->Score = Utils::getInt($packet, $offset); $Player->TimePlayed = new Time(Utils::getFloat($packet, $offset)); $numplayers--; array_push($this->Server->Players, $Player); } $this->HavePlayer = true; $this->ResendPlayer = false; break; case 0x49: // info, source if ($this->HaveInfo) break; $offset = 5; $this->Server->ProtocolVersion = Utils::getByte($packet, $offset); $this->Server->Hostname = Utils::getString($packet, $offset); $this->Server->Map = Utils::getString($packet, $offset); $this->Server->Directory = Utils::getString($packet, $offset); $this->Server->Description = Utils::getString($packet, $offset); $this->Server->AppID = Utils::getShort($packet, $offset); $this->Server->PlayerCount = Utils::getByte($packet, $offset); $this->Server->MaxPlayers = Utils::getByte($packet, $offset); $this->Server->BotCount = Utils::getByte($packet, $offset); $this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false); $this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows'); $this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false); $this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false); $TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403); if (in_array($this->Server->AppID, $TheShipAppIDs)) { $gm = Utils::getByte($packet, $offset); $GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination'); $this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown'); $this->Server->WitnessCount = Utils::getByte($packet, $offset); $this->Server->WitnessTime = Utils::getByte($packet, $offset); } $this->Server->GameVersion = Utils::getString($packet, $offset); $this->HaveInfo = true; break; case 0x6D: // info, goldsource if ($this->HaveInfo) break; $offset = 5; Utils::getString($packet, $offset); $this->Server->Hostname = Utils::getString($packet, $offset); $this->Server->Map = Utils::getString($packet, $offset); $this->Server->Directory = Utils::getString($packet, $offset); $this->Server->Description = Utils::getString($packet, $offset); $this->Server->PlayerCount = Utils::getByte($packet, $offset); $this->Server->MaxPlayers = Utils::getByte($packet, $offset); $this->Server->ProtocolVersion = Utils::getByte($packet, $offset); $this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false); $this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows'); $this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5); $this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false); $IsMod = Utils::getByte($packet, $offset); if ($IsMod == 1) { Utils::getString($packet, $offset); Utils::getString($packet, $offset); Utils::getByte($packet, $offset); Utils::getInt($packet, $offset); Utils::getInt($packet, $offset); Utils::getByte($packet, $offset); Utils::getByte($packet, $offset); } $this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false); $this->Server->BotCount = Utils::getByte($packet, $offset); $this->HaveInfo = true; break; case 0x45: // rules if ($this->HaveRules) break; $offset = 5; $rulesnum = Utils::getShort($packet, $offset); while ($rulesnum) { $Name = Utils::getString($packet, $offset); $Value = Utils::getString($packet, $offset); $rulesnum--; $this->Server->Rules[$Name] = $Value; } $this->HaveRules = true; $this->ResendRules = false; break; default: break; } } function onSampPacketReceived($packet) { $offset = 10; switch (Utils::getByte($packet, $offset)) { case 0x69: // info if ($this->HaveInfo) break; $this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false); $this->Server->PlayerCount = Utils::getShort($packet, $offset); $this->Server->MaxPlayers = Utils::getShort($packet, $offset); $len = Utils::getInt($packet, $offset); $this->Server->Hostname = Utils::getString($packet, $offset, $len); $len = Utils::getInt($packet, $offset); $this->Server->GameMode = Utils::getString($packet, $offset, $len); $len = Utils::getInt($packet, $offset); $this->Server->Map = Utils::getString($packet, $offset, $len); $this->HaveInfo = true; if ($this->Server->PlayerCount >= 100) $this->HavePlayer = true; break; case 0x72: // rules if ($this->HaveRules) break; $rulesnum = Utils::getShort($packet, $offset); while ($rulesnum) { $len = Utils::getByte($packet, $offset); $Name = Utils::getString($packet, $offset, $len); $len = Utils::getByte($packet, $offset); $Value = Utils::getString($packet, $offset, $len); $rulesnum--; $this->Server->Rules[$Name] = $Value; } $this->HaveRules = true; break; case 0x64: // player if ($this->HavePlayer) break; $numplayers = Utils::getShort($packet, $offset); $lastID = 0; $plusID = 0; while ($numplayers) { $Player = new Player; $Player->ID = Utils::getByte($packet, $offset) + $plusID; if ($Player->ID < $lastID) { $Player->ID += 256; $plusID += 256; } $lastID = $Player->ID; $len = Utils::getByte($packet, $offset); $Player->Name = Utils::getString($packet, $offset, $len); $len = strlen($Player->Name); $Player->Score = Utils::getInt($packet, $offset); $Player->Ping = Utils::getInt($packet, $offset); $numplayers--; array_push($this->Server->Players, $Player); } $this->HavePlayer = true; break; default: break; } } function requestInfo() { array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00"); array_push($this->SendQueue, $this->SAMPHeader . "i"); } function requestPlayer() { array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge); array_push($this->SendQueue, $this->SAMPHeader . "d"); if ($this->Challenge == "\xFF\xFF\xFF\xFF") $this->ResendPlayer = true; } function requestRules() { array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge); array_push($this->SendQueue, $this->SAMPHeader . "r"); if ($this->Challenge == "\xFF\xFF\xFF\xFF") $this->ResendRules = true; } function GetServer() { $start = Utils::getTime(); $this->requestInfo(); $this->requestPlayer(); $this->requestRules(); while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) { if (Utils::getTime() - $start >= $this->MaxExecutionTime) { if ($this->HaveInfo && $this->HavePlayer) { $this->HaveRules = true; } else { throw new LSError(4, "Timed out."); } } if (count($this->SendQueue) > 0) { stream_socket_sendto($this->Sock, array_shift($this->SendQueue)); $meta = stream_get_meta_data($this->Sock); if ($meta['timed_out']) throw new LSError(5, "Timed out."); } usleep(50000); $packet = fread($this->Sock, 2048); $meta = stream_get_meta_data($this->Sock); if ($meta['timed_out']) throw new LSError(6, "Timed out."); if (strlen($packet) > 0) { $offset = 0; switch (Utils::getInt($packet, $offset)) { case HL_PACKET: if (!in_array($this->Server->Type, array(0, 1))) break; $this->Server->Type = 1; $this->onPacketReceived($packet); break; case HL_PACKET_SPLITTED: if (!in_array($this->Server->Type, array(0, 1))) break; $this->Server->Type = 1; $this->onSplittedPacketReceived($packet); break; case SAMP_PACKET: if (!in_array($this->Server->Type, array(0, 2))) break; $this->Server->Type = 2; $this->onSampPacketReceived($packet); break; default: break; } } } return $this->Server; } } ?>
Texto alterado
Abrir arquivo
<?php /* LiveStats Library version: 2.0 query engines: Goldsource, Source, SA:MP protocol: 47, 48 author: nr913 visit www.foxh.ro */ define('HL_PACKET', -1); define('HL_PACKET_SPLITTED', -2); define('SAMP_PACKET', 1347240275); class Player { var $ID; var $Name; var $Score; var $TimePlayed; var $Ping; } class Server { var $Type = 0; var $ProtocolVersion; var $Address; var $Hostname; var $Map; var $Directory; var $Description; var $AppID; var $MaxPlayers; var $PlayerCount; var $BotCount; var $Dedicated; var $OS; var $PasswordProtected; var $Secured; var $GameMode; var $WitnessCount; var $WitnessTime; var $GameVersion; var $Players = array(); var $Rules = array(); } class Time { var $Hours; var $Minutes; var $Seconds; function __construct($seconds) { $this->Hours = floor($seconds / 3600); $this->Minutes = floor($seconds / 60) % 60; $this->Seconds = floor($seconds) % 60; } function __toString() { $hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours); $minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes); $seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds); return "$hours:$minutes:$seconds"; } } class LSError extends Exception { var $ErrorMessage; var $ErrorCode; function __construct($errcode, $errmsg) { $this->ErrorCode = $errcode; $this->ErrorMessage = $errmsg; } } class Utils { static function getTime() { list($u, $s) = explode(' ', microtime()); return ((float)$u + (float)$s); } static function getString($packet, &$offset, $length = -1) { $len = strlen($packet); $i = 0; if ($length == -1) { while ($offset + $i < $len && $packet[$offset + $i] != "\x00") $i++; $offset += $i + 1; return substr($packet, $offset - $i - 1, $i); } else { $i = $length; if ($len - $offset < $length) $i = $len - $offset; $offset += $i; return substr($packet, $offset - $i, $i); } } static function getByte($packet, &$offset) { if ($offset >= strlen($packet)) return 0; $char = unpack('cchar', $packet[$offset]); $offset++; return $char['char']; } static function getShort($packet, &$offset) { if ($offset + 2 >= strlen($packet)) return 0; $short = unpack('sshort', substr($packet, $offset, 2)); $offset += 2; return $short['short']; } static function getInt($packet, &$offset) { if ($offset + 4 >= strlen($packet)) return 0; $int = unpack('iint', substr($packet, $offset, 4)); $offset += 4; return $int['int']; } static function getFloat($packet, &$offset) { if ($offset + 4 >= strlen($packet)) return ((float)0.0); $float = unpack('ffloat', substr($packet, $offset, 4)); $offset += 4; return ((float)$float['float']); } } class LiveStats { var $IP; var $Port; var $Sock; var $Challenge = "\xFF\xFF\xFF\xFF"; var $HaveInfo = false; var $HavePlayer = false; var $HaveRules = false; var $ResendPlayer = false; var $ResendRules = false; var $SendQueue = array(); var $MaxExecutionTime = 2; var $SplittedPackets = array(); var $SAMPHeader = "SAMP"; var $Server; public function __construct($hostname, $port = 27015) { $this->IP = gethostbyname($hostname); $this->Port = $port; $errno = 0; $errstr = ''; $this->Sock = @stream_socket_client("udp://{$this->IP}:{$this->Port}", $errno, $errstr, 5); if ($this->Sock === false) throw new LSError(1, "Could not connect to specified host [$errno]: $errstr."); if (stream_set_blocking($this->Sock, false) == false) throw new LSError(2, "Could not set to non-blocking mode."); if (stream_set_timeout($this->Sock, 3) == false) throw new LSError(3, "Could not set timeout to 10 seconds."); $this->Server = new Server; $this->Server->Address = "{$this->IP}:{$this->Port}"; $ip = explode('.', $this->IP); $this->SAMPHeader .= chr($ip[0]) . chr($ip[1]) . chr($ip[2]) . chr($ip[3]) . chr($this->Port & 0xFF) . chr(($this->Port >> 8) & 0xFF); } function onSplittedPacketReceived($packet) { $offset = 4; $ReqID = Utils::getInt($packet, $offset); if (!isset($this->SplittedPackets[$ReqID])) { $this->SplittedPackets[$ReqID] = array( 'Data' => array(), 'Type' => -1, 'Packets' => -1 ); } $this->SplittedPackets[$ReqID]['Data'][] = $packet; if (count($this->SplittedPackets[$ReqID]['Data']) == 2) { $offset = 8; $FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset); $offset = 8; $FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset); if ($FB1 != $FB2) { $this->SplittedPackets[$ReqID]['Type'] = 0; $this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4; } else { $this->SplittedPackets[$ReqID]['Type'] = 1; $this->SplittedPackets[$ReqID]['Packets'] = $FB1; } } if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) { if ($this->SplittedPackets[$ReqID]['Type'] == 0) { for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) { $offset = 8; $PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4; if ($i != $PckID) { $aux = $this->SplittedPackets[$ReqID]['Data'][$PckID]; $this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i]; $this->SplittedPackets[$ReqID]['Data'][$i] = $aux; $i--; } } $packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13); for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) $packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9); } else { for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) { $offset = 9; $PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset); if ($i != $PckID) { $aux = $this->SplittedPackets[$ReqID]['Data'][$PckID]; $this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i]; $this->SplittedPackets[$ReqID]['Data'][$i] = $aux; $i--; } } $packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16); for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) $packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12); } unset($this->SplittedPackets[$ReqID]); $this->onPacketReceived($packet); } } function onPacketReceived($packet) { $offset = 4; switch (Utils::getByte($packet, $offset)) { case 0x41: // challenge $this->Challenge = substr($packet, 5); if ($this->ResendPlayer) { $this->ResendPlayer = false; $this->requestPlayer(); } if ($this->ResendRules) { $this->ResendRules = false; $this->requestRules(); } break; case 0x44: // player if ($this->HavePlayer) break; $offset = 5; $numplayers = Utils::getByte($packet, $offset); while ($numplayers) { $Player = new Player; $Player->ID = Utils::getByte($packet, $offset); $Player->Name = Utils::getString($packet, $offset); $len = strlen($Player->Name); $Player->Score = Utils::getInt($packet, $offset); $Player->TimePlayed = new Time(Utils::getFloat($packet, $offset)); $numplayers--; array_push($this->Server->Players, $Player); } $this->HavePlayer = true; $this->ResendPlayer = false; break; case 0x49: // info, source if ($this->HaveInfo) break; $offset = 5; $this->Server->ProtocolVersion = Utils::getByte($packet, $offset); $this->Server->Hostname = Utils::getString($packet, $offset); $this->Server->Map = Utils::getString($packet, $offset); $this->Server->Directory = Utils::getString($packet, $offset); $this->Server->Description = Utils::getString($packet, $offset); $this->Server->AppID = Utils::getShort($packet, $offset); $this->Server->PlayerCount = Utils::getByte($packet, $offset); $this->Server->MaxPlayers = Utils::getByte($packet, $offset); $this->Server->BotCount = Utils::getByte($packet, $offset); $this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false); $this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows'); $this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false); $this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false); $TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403); if (in_array($this->Server->AppID, $TheShipAppIDs)) { $gm = Utils::getByte($packet, $offset); $GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination'); $this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown'); $this->Server->WitnessCount = Utils::getByte($packet, $offset); $this->Server->WitnessTime = Utils::getByte($packet, $offset); } $this->Server->GameVersion = Utils::getString($packet, $offset); $this->HaveInfo = true; break; case 0x6D: // info, goldsource if ($this->HaveInfo) break; $offset = 5; Utils::getString($packet, $offset); $this->Server->Hostname = Utils::getString($packet, $offset); $this->Server->Map = Utils::getString($packet, $offset); $this->Server->Directory = Utils::getString($packet, $offset); $this->Server->Description = Utils::getString($packet, $offset); $this->Server->PlayerCount = Utils::getByte($packet, $offset); $this->Server->MaxPlayers = Utils::getByte($packet, $offset); $this->Server->ProtocolVersion = Utils::getByte($packet, $offset); $this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false); $this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows'); $this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5); $this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false); $IsMod = Utils::getByte($packet, $offset); if ($IsMod == 1) { Utils::getString($packet, $offset); Utils::getString($packet, $offset); Utils::getByte($packet, $offset); Utils::getInt($packet, $offset); Utils::getInt($packet, $offset); Utils::getByte($packet, $offset); Utils::getByte($packet, $offset); } $this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false); $this->Server->BotCount = Utils::getByte($packet, $offset); $this->HaveInfo = true; break; case 0x45: // rules if ($this->HaveRules) break; $offset = 5; $rulesnum = Utils::getShort($packet, $offset); while ($rulesnum) { $Name = Utils::getString($packet, $offset); $Value = Utils::getString($packet, $offset); $rulesnum--; $this->Server->Rules[$Name] = $Value; } $this->HaveRules = true; $this->ResendRules = false; break; default: break; } } function onSampPacketReceived($packet) { $offset = 10; switch (Utils::getByte($packet, $offset)) { case 0x69: // info if ($this->HaveInfo) break; $this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false); $this->Server->PlayerCount = Utils::getShort($packet, $offset); $this->Server->MaxPlayers = Utils::getShort($packet, $offset); $len = Utils::getInt($packet, $offset); $this->Server->Hostname = Utils::getString($packet, $offset, $len); $len = Utils::getInt($packet, $offset); $this->Server->GameMode = Utils::getString($packet, $offset, $len); $len = Utils::getInt($packet, $offset); $this->Server->Map = Utils::getString($packet, $offset, $len); $this->HaveInfo = true; if ($this->Server->PlayerCount >= 100) $this->HavePlayer = true; break; case 0x72: // rules if ($this->HaveRules) break; $rulesnum = Utils::getShort($packet, $offset); while ($rulesnum) { $len = Utils::getByte($packet, $offset); $Name = Utils::getString($packet, $offset, $len); $len = Utils::getByte($packet, $offset); $Value = Utils::getString($packet, $offset, $len); $rulesnum--; $this->Server->Rules[$Name] = $Value; } $this->HaveRules = true; break; case 0x64: // player if ($this->HavePlayer) break; $numplayers = Utils::getShort($packet, $offset); $lastID = 0; $plusID = 0; while ($numplayers) { $Player = new Player; $Player->ID = Utils::getByte($packet, $offset) + $plusID; if ($Player->ID < $lastID) { $Player->ID += 256; $plusID += 256; } $lastID = $Player->ID; $len = Utils::getByte($packet, $offset); $Player->Name = Utils::getString($packet, $offset, $len); $len = strlen($Player->Name); $Player->Score = Utils::getInt($packet, $offset); $Player->Ping = Utils::getInt($packet, $offset); $numplayers--; array_push($this->Server->Players, $Player); } $this->HavePlayer = true; break; default: break; } } function requestInfo() { array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00"); array_push($this->SendQueue, $this->SAMPHeader . "i"); } function requestPlayer() { array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge); array_push($this->SendQueue, $this->SAMPHeader . "d"); if ($this->Challenge == "\xFF\xFF\xFF\xFF") $this->ResendPlayer = true; } function requestRules() { array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge); array_push($this->SendQueue, $this->SAMPHeader . "r"); if ($this->Challenge == "\xFF\xFF\xFF\xFF") $this->ResendRules = true; } function GetServer() { $start = Utils::getTime(); $this->requestInfo(); $this->requestPlayer(); $this->requestRules(); while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) { if (Utils::getTime() - $start >= $this->MaxExecutionTime) { if ($this->HaveInfo && $this->HavePlayer) { $this->HaveRules = true; } else { throw new LSError(4, "Timed out."); } } if (count($this->SendQueue) > 0) { stream_socket_sendto($this->Sock, array_shift($this->SendQueue)); $meta = stream_get_meta_data($this->Sock); if ($meta['timed_out']) throw new LSError(5, "Timed out."); } usleep(50000); $packet = fread($this->Sock, 2048); $meta = stream_get_meta_data($this->Sock); if ($meta['timed_out']) throw new LSError(6, "Timed out."); if (strlen($packet) > 0) { $offset = 0; switch (Utils::getInt($packet, $offset)) { case HL_PACKET: if (!in_array($this->Server->Type, array(0, 1))) break; $this->Server->Type = 1; $this->onPacketReceived($packet); break; case HL_PACKET_SPLITTED: if (!in_array($this->Server->Type, array(0, 1))) break; $this->Server->Type = 1; $this->onSplittedPacketReceived($packet); break; case SAMP_PACKET: if (!in_array($this->Server->Type, array(0, 2))) break; $this->Server->Type = 2; $this->onSampPacketReceived($packet); break; default: break; } } } return $this->Server; } } ?>
Encontrar Diferença