Diff
checker
Testo
Testo
Immagini
Documenti
Excel
Cartelle
Legal
Enterprise
Applicazione per desktop
Prezzi
Accedi
Scarica Diffchecker Desktop
Confronta il testo
Trova la differenza tra due file di testo
Strumenti
Cronologia
Editor live
Nascondi spazi bianchi
Comprimi invariate
Senza a capo
Layout
Diviso
Unificato
Livello di dettaglio
Intelligente
Parola
Carattere
Stili testo
Modifica aspetto
Evidenziazione sintassi
Scegli sintassi
Ignora
Trasforma testo
Vai alla prima modifica
Modifica input
Diffchecker Desktop
Il modo più sicuro per usare Diffchecker. Ottieni l'app Diffchecker Desktop: i tuoi diff non lasciano mai il tuo computer!
Ottieni Desktop
Untitled diff
Creato
9 anni fa
Il diff non scade mai
Eliminare
Esporta
Condividere
Spiegare
1 rimozione
Linee
Totale
Rimosso
Caratteri
Totale
Rimosso
Per continuare a utilizzare questa funzione, aggiorna a
Diff
checker
Pro
Visualizza prezzi
488 linee
Copia tutti
492 aggiunte
Linee
Totale
Aggiunto
Caratteri
Totale
Aggiunto
Per continuare a utilizzare questa funzione, aggiorna a
Diff
checker
Pro
Visualizza prezzi
977 linee
Copia tutti
<?php
<?php
Copia
Copiato
Copia
Copiato
/*
/*
Copia
Copiato
Copia
Copiato
LiveStats Library
LiveStats Library
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
version: 2.0
version: 2.0
Copia
Copiato
Copia
Copiato
query engines: Goldsource, Source, SA:MP
query engines: Goldsource, Source, SA:MP
Copia
Copiato
Copia
Copiato
protocol: 47, 48
protocol: 47, 48
Copia
Copiato
Copia
Copiato
author: nr913
author: nr913
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
visit www.
freakz
.ro
visit www.
foxh
.ro
*/
*/
Copia
Copiato
Copia
Copiato
define('HL_PACKET', -1);
define('HL_PACKET', -1);
Copia
Copiato
Copia
Copiato
define('HL_PACKET_SPLITTED', -2);
define('HL_PACKET_SPLITTED', -2);
Copia
Copiato
Copia
Copiato
define('SAMP_PACKET', 1347240275);
define('SAMP_PACKET', 1347240275);
Copia
Copiato
Copia
Copiato
class Player {
class Player {
Copia
Copiato
Copia
Copiato
var $ID;
var $ID;
Copia
Copiato
Copia
Copiato
var $Name;
var $Name;
Copia
Copiato
Copia
Copiato
var $Score;
var $Score;
Copia
Copiato
Copia
Copiato
var $TimePlayed;
var $TimePlayed;
Copia
Copiato
Copia
Copiato
var $Ping;
var $Ping;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
class Server {
class Server {
Copia
Copiato
Copia
Copiato
var $Type = 0;
var $Type = 0;
Copia
Copiato
Copia
Copiato
var $ProtocolVersion;
var $ProtocolVersion;
Copia
Copiato
Copia
Copiato
var $Address;
var $Address;
Copia
Copiato
Copia
Copiato
var $Hostname;
var $Hostname;
Copia
Copiato
Copia
Copiato
var $Map;
var $Map;
Copia
Copiato
Copia
Copiato
var $Directory;
var $Directory;
Copia
Copiato
Copia
Copiato
var $Description;
var $Description;
Copia
Copiato
Copia
Copiato
var $AppID;
var $AppID;
Copia
Copiato
Copia
Copiato
var $MaxPlayers;
var $MaxPlayers;
Copia
Copiato
Copia
Copiato
var $PlayerCount;
var $PlayerCount;
Copia
Copiato
Copia
Copiato
var $BotCount;
var $BotCount;
Copia
Copiato
Copia
Copiato
var $Dedicated;
var $Dedicated;
Copia
Copiato
Copia
Copiato
var $OS;
var $OS;
Copia
Copiato
Copia
Copiato
var $PasswordProtected;
var $PasswordProtected;
Copia
Copiato
Copia
Copiato
var $Secured;
var $Secured;
Copia
Copiato
Copia
Copiato
var $GameMode;
var $GameMode;
Copia
Copiato
Copia
Copiato
var $WitnessCount;
var $WitnessCount;
Copia
Copiato
Copia
Copiato
var $WitnessTime;
var $WitnessTime;
Copia
Copiato
Copia
Copiato
var $GameVersion;
var $GameVersion;
Copia
Copiato
Copia
Copiato
var $Players = array();
var $Players = array();
Copia
Copiato
Copia
Copiato
var $Rules = array();
var $Rules = array();
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
class Time {
class Time {
Copia
Copiato
Copia
Copiato
var $Hours;
var $Hours;
Copia
Copiato
Copia
Copiato
var $Minutes;
var $Minutes;
Copia
Copiato
Copia
Copiato
var $Seconds;
var $Seconds;
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function __construct($seconds) {
function __construct($seconds) {
Copia
Copiato
Copia
Copiato
$this->Hours = floor($seconds / 3600);
$this->Hours = floor($seconds / 3600);
Copia
Copiato
Copia
Copiato
$this->Minutes = floor($seconds / 60) % 60;
$this->Minutes = floor($seconds / 60) % 60;
Copia
Copiato
Copia
Copiato
$this->Seconds = floor($seconds) % 60;
$this->Seconds = floor($seconds) % 60;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function __toString() {
function __toString() {
Copia
Copiato
Copia
Copiato
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
Copia
Copiato
Copia
Copiato
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
Copia
Copiato
Copia
Copiato
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
Copia
Copiato
Copia
Copiato
return "$hours:$minutes:$seconds";
return "$hours:$minutes:$seconds";
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
class LSError extends Exception {
class LSError extends Exception {
Copia
Copiato
Copia
Copiato
var $ErrorMessage;
var $ErrorMessage;
Copia
Copiato
Copia
Copiato
var $ErrorCode;
var $ErrorCode;
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function __construct($errcode, $errmsg) {
function __construct($errcode, $errmsg) {
Copia
Copiato
Copia
Copiato
$this->ErrorCode = $errcode;
$this->ErrorCode = $errcode;
Copia
Copiato
Copia
Copiato
$this->ErrorMessage = $errmsg;
$this->ErrorMessage = $errmsg;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
class Utils {
class Utils {
Copia
Copiato
Copia
Copiato
static function getTime() {
static function getTime() {
Copia
Copiato
Copia
Copiato
list($u, $s) = explode(' ', microtime());
list($u, $s) = explode(' ', microtime());
Copia
Copiato
Copia
Copiato
return ((float)$u + (float)$s);
return ((float)$u + (float)$s);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
static function getString($packet, &$offset, $length = -1) {
static function getString($packet, &$offset, $length = -1) {
Copia
Copiato
Copia
Copiato
$len = strlen($packet);
$len = strlen($packet);
Copia
Copiato
Copia
Copiato
$i = 0;
$i = 0;
Copia
Copiato
Copia
Copiato
if ($length == -1) {
if ($length == -1) {
Copia
Copiato
Copia
Copiato
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
Copia
Copiato
Copia
Copiato
$i++;
$i++;
Copia
Copiato
Copia
Copiato
$offset += $i + 1;
$offset += $i + 1;
Copia
Copiato
Copia
Copiato
return substr($packet, $offset - $i - 1, $i);
return substr($packet, $offset - $i - 1, $i);
Copia
Copiato
Copia
Copiato
} else {
} else {
Copia
Copiato
Copia
Copiato
$i = $length;
$i = $length;
Copia
Copiato
Copia
Copiato
if ($len - $offset < $length)
if ($len - $offset < $length)
Copia
Copiato
Copia
Copiato
$i = $len - $offset;
$i = $len - $offset;
Copia
Copiato
Copia
Copiato
$offset += $i;
$offset += $i;
Copia
Copiato
Copia
Copiato
return substr($packet, $offset - $i, $i);
return substr($packet, $offset - $i, $i);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
static function getByte($packet, &$offset) {
static function getByte($packet, &$offset) {
Copia
Copiato
Copia
Copiato
if ($offset >= strlen($packet))
if ($offset >= strlen($packet))
Copia
Copiato
Copia
Copiato
return 0;
return 0;
Copia
Copiato
Copia
Copiato
$char = unpack('cchar', $packet[$offset]);
$char = unpack('cchar', $packet[$offset]);
Copia
Copiato
Copia
Copiato
$offset++;
$offset++;
Copia
Copiato
Copia
Copiato
return $char['char'];
return $char['char'];
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
static function getShort($packet, &$offset) {
static function getShort($packet, &$offset) {
Copia
Copiato
Copia
Copiato
if ($offset + 2 >= strlen($packet))
if ($offset + 2 >= strlen($packet))
Copia
Copiato
Copia
Copiato
return 0;
return 0;
Copia
Copiato
Copia
Copiato
$short = unpack('sshort', substr($packet, $offset, 2));
$short = unpack('sshort', substr($packet, $offset, 2));
Copia
Copiato
Copia
Copiato
$offset += 2;
$offset += 2;
Copia
Copiato
Copia
Copiato
return $short['short'];
return $short['short'];
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
static function getInt($packet, &$offset) {
static function getInt($packet, &$offset) {
Copia
Copiato
Copia
Copiato
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
Copia
Copiato
Copia
Copiato
return 0;
return 0;
Copia
Copiato
Copia
Copiato
$int = unpack('iint', substr($packet, $offset, 4));
$int = unpack('iint', substr($packet, $offset, 4));
Copia
Copiato
Copia
Copiato
$offset += 4;
$offset += 4;
Copia
Copiato
Copia
Copiato
return $int['int'];
return $int['int'];
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
static function getFloat($packet, &$offset) {
static function getFloat($packet, &$offset) {
Copia
Copiato
Copia
Copiato
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
Copia
Copiato
Copia
Copiato
return ((float)0.0);
return ((float)0.0);
Copia
Copiato
Copia
Copiato
$float = unpack('ffloat', substr($packet, $offset, 4));
$float = unpack('ffloat', substr($packet, $offset, 4));
Copia
Copiato
Copia
Copiato
$offset += 4;
$offset += 4;
Copia
Copiato
Copia
Copiato
return ((float)$float['float']);
return ((float)$float['float']);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
class LiveStats {
class LiveStats {
Copia
Copiato
Copia
Copiato
var $IP;
var $IP;
Copia
Copiato
Copia
Copiato
var $Port;
var $Port;
Copia
Copiato
Copia
Copiato
var $Sock;
var $Sock;
Copia
Copiato
Copia
Copiato
var $Challenge = "\xFF\xFF\xFF\xFF";
var $Challenge = "\xFF\xFF\xFF\xFF";
Copia
Copiato
Copia
Copiato
var $HaveInfo = false;
var $HaveInfo = false;
Copia
Copiato
Copia
Copiato
var $HavePlayer = false;
var $HavePlayer = false;
Copia
Copiato
Copia
Copiato
var $HaveRules = false;
var $HaveRules = false;
Copia
Copiato
Copia
Copiato
var $ResendPlayer = false;
var $ResendPlayer = false;
Copia
Copiato
Copia
Copiato
var $ResendRules = false;
var $ResendRules = false;
Copia
Copiato
Copia
Copiato
var $SendQueue = array();
var $SendQueue = array();
Copia
Copiato
Copia
Copiato
var $MaxExecutionTime = 2;
var $MaxExecutionTime = 2;
Copia
Copiato
Copia
Copiato
var $SplittedPackets = array();
var $SplittedPackets = array();
Copia
Copiato
Copia
Copiato
var $SAMPHeader = "SAMP";
var $SAMPHeader = "SAMP";
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
var $Server;
var $Server;
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
public function __construct($hostname, $port = 27015) {
public function __construct($hostname, $port = 27015) {
Copia
Copiato
Copia
Copiato
$this->IP = gethostbyname($hostname);
$this->IP = gethostbyname($hostname);
Copia
Copiato
Copia
Copiato
$this->Port = $port;
$this->Port = $port;
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$errno = 0; $errstr = '';
$errno = 0; $errstr = '';
Copia
Copiato
Copia
Copiato
$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);
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
if ($this->Sock === false)
if ($this->Sock === false)
Copia
Copiato
Copia
Copiato
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
Copia
Copiato
Copia
Copiato
if (stream_set_blocking($this->Sock, false) == false)
if (stream_set_blocking($this->Sock, false) == false)
Copia
Copiato
Copia
Copiato
throw new LSError(2, "Could not set to non-blocking mode.");
throw new LSError(2, "Could not set to non-blocking mode.");
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
if (stream_set_timeout($this->Sock, 3) == false)
if (stream_set_timeout($this->Sock, 3) == false)
Copia
Copiato
Copia
Copiato
throw new LSError(3, "Could not set timeout to 10 seconds.");
throw new LSError(3, "Could not set timeout to 10 seconds.");
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$this->Server = new Server;
$this->Server = new Server;
Copia
Copiato
Copia
Copiato
$this->Server->Address = "{$this->IP}:{$this->Port}";
$this->Server->Address = "{$this->IP}:{$this->Port}";
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$ip = explode('.', $this->IP);
$ip = explode('.', $this->IP);
Copia
Copiato
Copia
Copiato
$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);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function onSplittedPacketReceived($packet) {
function onSplittedPacketReceived($packet) {
Copia
Copiato
Copia
Copiato
$offset = 4;
$offset = 4;
Copia
Copiato
Copia
Copiato
$ReqID = Utils::getInt($packet, $offset);
$ReqID = Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
if (!isset($this->SplittedPackets[$ReqID])) {
if (!isset($this->SplittedPackets[$ReqID])) {
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID] = array(
$this->SplittedPackets[$ReqID] = array(
Copia
Copiato
Copia
Copiato
'Data' => array(),
'Data' => array(),
Copia
Copiato
Copia
Copiato
'Type' => -1,
'Type' => -1,
Copia
Copiato
Copia
Copiato
'Packets' => -1
'Packets' => -1
Copia
Copiato
Copia
Copiato
);
);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
Copia
Copiato
Copia
Copiato
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
Copia
Copiato
Copia
Copiato
$offset = 8;
$offset = 8;
Copia
Copiato
Copia
Copiato
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
Copia
Copiato
Copia
Copiato
$offset = 8;
$offset = 8;
Copia
Copiato
Copia
Copiato
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
Copia
Copiato
Copia
Copiato
if ($FB1 != $FB2) {
if ($FB1 != $FB2) {
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Type'] = 0;
$this->SplittedPackets[$ReqID]['Type'] = 0;
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
Copia
Copiato
Copia
Copiato
} else {
} else {
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Type'] = 1;
$this->SplittedPackets[$ReqID]['Type'] = 1;
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
Copia
Copiato
Copia
Copiato
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
Copia
Copiato
Copia
Copiato
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
Copia
Copiato
Copia
Copiato
$offset = 8;
$offset = 8;
Copia
Copiato
Copia
Copiato
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
Copia
Copiato
Copia
Copiato
if ($i != $PckID) {
if ($i != $PckID) {
Copia
Copiato
Copia
Copiato
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
Copia
Copiato
Copia
Copiato
$i--;
$i--;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
Copia
Copiato
Copia
Copiato
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
Copia
Copiato
Copia
Copiato
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
Copia
Copiato
Copia
Copiato
} else {
} else {
Copia
Copiato
Copia
Copiato
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
Copia
Copiato
Copia
Copiato
$offset = 9;
$offset = 9;
Copia
Copiato
Copia
Copiato
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
Copia
Copiato
Copia
Copiato
if ($i != $PckID) {
if ($i != $PckID) {
Copia
Copiato
Copia
Copiato
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
Copia
Copiato
Copia
Copiato
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
Copia
Copiato
Copia
Copiato
$i--;
$i--;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
Copia
Copiato
Copia
Copiato
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
Copia
Copiato
Copia
Copiato
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
unset($this->SplittedPackets[$ReqID]);
unset($this->SplittedPackets[$ReqID]);
Copia
Copiato
Copia
Copiato
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function onPacketReceived($packet) {
function onPacketReceived($packet) {
Copia
Copiato
Copia
Copiato
$offset = 4;
$offset = 4;
Copia
Copiato
Copia
Copiato
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
Copia
Copiato
Copia
Copiato
case 0x41: // challenge
case 0x41: // challenge
Copia
Copiato
Copia
Copiato
$this->Challenge = substr($packet, 5);
$this->Challenge = substr($packet, 5);
Copia
Copiato
Copia
Copiato
if ($this->ResendPlayer) {
if ($this->ResendPlayer) {
Copia
Copiato
Copia
Copiato
$this->ResendPlayer = false;
$this->ResendPlayer = false;
Copia
Copiato
Copia
Copiato
$this->requestPlayer();
$this->requestPlayer();
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
if ($this->ResendRules) {
if ($this->ResendRules) {
Copia
Copiato
Copia
Copiato
$this->ResendRules = false;
$this->ResendRules = false;
Copia
Copiato
Copia
Copiato
$this->requestRules();
$this->requestRules();
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
case 0x44: // player
case 0x44: // player
Copia
Copiato
Copia
Copiato
if ($this->HavePlayer)
if ($this->HavePlayer)
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$offset = 5;
$offset = 5;
Copia
Copiato
Copia
Copiato
$numplayers = Utils::getByte($packet, $offset);
$numplayers = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
while ($numplayers) {
while ($numplayers) {
Copia
Copiato
Copia
Copiato
$Player = new Player;
$Player = new Player;
Copia
Copiato
Copia
Copiato
$Player->ID = Utils::getByte($packet, $offset);
$Player->ID = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$Player->Name = Utils::getString($packet, $offset);
$Player->Name = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$len = strlen($Player->Name);
$len = strlen($Player->Name);
Copia
Copiato
Copia
Copiato
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
Copia
Copiato
Copia
Copiato
$numplayers--;
$numplayers--;
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$this->HavePlayer = true;
$this->HavePlayer = true;
Copia
Copiato
Copia
Copiato
$this->ResendPlayer = false;
$this->ResendPlayer = false;
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
case 0x49: // info, source
case 0x49: // info, source
Copia
Copiato
Copia
Copiato
if ($this->HaveInfo)
if ($this->HaveInfo)
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$offset = 5;
$offset = 5;
Copia
Copiato
Copia
Copiato
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->AppID = Utils::getShort($packet, $offset);
$this->Server->AppID = Utils::getShort($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
Copia
Copiato
Copia
Copiato
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
Copia
Copiato
Copia
Copiato
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copia
Copiato
Copia
Copiato
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copia
Copiato
Copia
Copiato
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
Copia
Copiato
Copia
Copiato
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
Copia
Copiato
Copia
Copiato
$gm = Utils::getByte($packet, $offset);
$gm = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
Copia
Copiato
Copia
Copiato
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
Copia
Copiato
Copia
Copiato
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$this->Server->GameVersion = Utils::getString($packet, $offset);
$this->Server->GameVersion = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->HaveInfo = true;
$this->HaveInfo = true;
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
case 0x6D: // info, goldsource
case 0x6D: // info, goldsource
Copia
Copiato
Copia
Copiato
if ($this->HaveInfo)
if ($this->HaveInfo)
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$offset = 5;
$offset = 5;
Copia
Copiato
Copia
Copiato
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
Copia
Copiato
Copia
Copiato
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
Copia
Copiato
Copia
Copiato
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
Copia
Copiato
Copia
Copiato
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copia
Copiato
Copia
Copiato
$IsMod = Utils::getByte($packet, $offset);
$IsMod = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
if ($IsMod == 1) {
if ($IsMod == 1) {
Copia
Copiato
Copia
Copiato
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copia
Copiato
Copia
Copiato
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->HaveInfo = true;
$this->HaveInfo = true;
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
case 0x45: // rules
case 0x45: // rules
Copia
Copiato
Copia
Copiato
if ($this->HaveRules)
if ($this->HaveRules)
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$offset = 5;
$offset = 5;
Copia
Copiato
Copia
Copiato
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
Copia
Copiato
Copia
Copiato
while ($rulesnum) {
while ($rulesnum) {
Copia
Copiato
Copia
Copiato
$Name = Utils::getString($packet, $offset);
$Name = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$Value = Utils::getString($packet, $offset);
$Value = Utils::getString($packet, $offset);
Copia
Copiato
Copia
Copiato
$rulesnum--;
$rulesnum--;
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$this->HaveRules = true;
$this->HaveRules = true;
Copia
Copiato
Copia
Copiato
$this->ResendRules = false;
$this->ResendRules = false;
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
default:
default:
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function onSampPacketReceived($packet) {
function onSampPacketReceived($packet) {
Copia
Copiato
Copia
Copiato
$offset = 10;
$offset = 10;
Copia
Copiato
Copia
Copiato
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
Copia
Copiato
Copia
Copiato
case 0x69: // info
case 0x69: // info
Copia
Copiato
Copia
Copiato
if ($this->HaveInfo)
if ($this->HaveInfo)
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copia
Copiato
Copia
Copiato
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
Copia
Copiato
Copia
Copiato
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
Copia
Copiato
Copia
Copiato
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
Copia
Copiato
Copia
Copiato
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
$this->Server->Map = Utils::getString($packet, $offset, $len);
$this->Server->Map = Utils::getString($packet, $offset, $len);
Copia
Copiato
Copia
Copiato
$this->HaveInfo = true;
$this->HaveInfo = true;
Copia
Copiato
Copia
Copiato
if ($this->Server->PlayerCount >= 100)
if ($this->Server->PlayerCount >= 100)
Copia
Copiato
Copia
Copiato
$this->HavePlayer = true;
$this->HavePlayer = true;
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
case 0x72: // rules
case 0x72: // rules
Copia
Copiato
Copia
Copiato
if ($this->HaveRules)
if ($this->HaveRules)
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
Copia
Copiato
Copia
Copiato
while ($rulesnum) {
while ($rulesnum) {
Copia
Copiato
Copia
Copiato
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$Name = Utils::getString($packet, $offset, $len);
$Name = Utils::getString($packet, $offset, $len);
Copia
Copiato
Copia
Copiato
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$Value = Utils::getString($packet, $offset, $len);
$Value = Utils::getString($packet, $offset, $len);
Copia
Copiato
Copia
Copiato
$rulesnum--;
$rulesnum--;
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$this->HaveRules = true;
$this->HaveRules = true;
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
case 0x64: // player
case 0x64: // player
Copia
Copiato
Copia
Copiato
if ($this->HavePlayer)
if ($this->HavePlayer)
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$numplayers = Utils::getShort($packet, $offset);
$numplayers = Utils::getShort($packet, $offset);
Copia
Copiato
Copia
Copiato
$lastID = 0;
$lastID = 0;
Copia
Copiato
Copia
Copiato
$plusID = 0;
$plusID = 0;
Copia
Copiato
Copia
Copiato
while ($numplayers) {
while ($numplayers) {
Copia
Copiato
Copia
Copiato
$Player = new Player;
$Player = new Player;
Copia
Copiato
Copia
Copiato
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
Copia
Copiato
Copia
Copiato
if ($Player->ID < $lastID) {
if ($Player->ID < $lastID) {
Copia
Copiato
Copia
Copiato
$Player->ID += 256;
$Player->ID += 256;
Copia
Copiato
Copia
Copiato
$plusID += 256;
$plusID += 256;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$lastID = $Player->ID;
$lastID = $Player->ID;
Copia
Copiato
Copia
Copiato
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copia
Copiato
Copia
Copiato
$Player->Name = Utils::getString($packet, $offset, $len);
$Player->Name = Utils::getString($packet, $offset, $len);
Copia
Copiato
Copia
Copiato
$len = strlen($Player->Name);
$len = strlen($Player->Name);
Copia
Copiato
Copia
Copiato
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
$Player->Ping = Utils::getInt($packet, $offset);
$Player->Ping = Utils::getInt($packet, $offset);
Copia
Copiato
Copia
Copiato
$numplayers--;
$numplayers--;
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
$this->HavePlayer = true;
$this->HavePlayer = true;
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
default:
default:
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function requestInfo() {
function requestInfo() {
Copia
Copiato
Copia
Copiato
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
Copia
Copiato
Copia
Copiato
array_push($this->SendQueue, $this->SAMPHeader . "i");
array_push($this->SendQueue, $this->SAMPHeader . "i");
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function requestPlayer() {
function requestPlayer() {
Copia
Copiato
Copia
Copiato
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
Copia
Copiato
Copia
Copiato
array_push($this->SendQueue, $this->SAMPHeader . "d");
array_push($this->SendQueue, $this->SAMPHeader . "d");
Copia
Copiato
Copia
Copiato
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
Copia
Copiato
Copia
Copiato
$this->ResendPlayer = true;
$this->ResendPlayer = true;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function requestRules() {
function requestRules() {
Copia
Copiato
Copia
Copiato
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
Copia
Copiato
Copia
Copiato
array_push($this->SendQueue, $this->SAMPHeader . "r");
array_push($this->SendQueue, $this->SAMPHeader . "r");
Copia
Copiato
Copia
Copiato
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
Copia
Copiato
Copia
Copiato
$this->ResendRules = true;
$this->ResendRules = true;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
function GetServer() {
function GetServer() {
Copia
Copiato
Copia
Copiato
$start = Utils::getTime();
$start = Utils::getTime();
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$this->requestInfo();
$this->requestInfo();
Copia
Copiato
Copia
Copiato
$this->requestPlayer();
$this->requestPlayer();
Copia
Copiato
Copia
Copiato
$this->requestRules();
$this->requestRules();
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
Copia
Copiato
Copia
Copiato
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
Copia
Copiato
Copia
Copiato
if ($this->HaveInfo && $this->HavePlayer) {
if ($this->HaveInfo && $this->HavePlayer) {
Copia
Copiato
Copia
Copiato
$this->HaveRules = true;
$this->HaveRules = true;
Copia
Copiato
Copia
Copiato
} else {
} else {
Copia
Copiato
Copia
Copiato
throw new LSError(4, "Timed out.");
throw new LSError(4, "Timed out.");
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
if (count($this->SendQueue) > 0) {
if (count($this->SendQueue) > 0) {
Copia
Copiato
Copia
Copiato
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
Copia
Copiato
Copia
Copiato
if ($meta['timed_out'])
if ($meta['timed_out'])
Copia
Copiato
Copia
Copiato
throw new LSError(5, "Timed out.");
throw new LSError(5, "Timed out.");
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
usleep(50000);
usleep(50000);
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$packet = fread($this->Sock, 2048);
$packet = fread($this->Sock, 2048);
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
Copia
Copiato
Copia
Copiato
if ($meta['timed_out'])
if ($meta['timed_out'])
Copia
Copiato
Copia
Copiato
throw new LSError(6, "Timed out.");
throw new LSError(6, "Timed out.");
Copia
Copiato
Copia
Copiato
Copia
Copiato
Copia
Copiato
if (strlen($packet) > 0) {
if (strlen($packet) > 0) {
Copia
Copiato
Copia
Copiato
$offset = 0;
$offset = 0;
Copia
Copiato
Copia
Copiato
switch (Utils::getInt($packet, $offset)) {
switch (Utils::getInt($packet, $offset)) {
Copia
Copiato
Copia
Copiato
case HL_PACKET:
case HL_PACKET:
Copia
Copiato
Copia
Copiato
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$this->Server->Type = 1;
$this->Server->Type = 1;
Copia
Copiato
Copia
Copiato
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
case HL_PACKET_SPLITTED:
case HL_PACKET_SPLITTED:
Copia
Copiato
Copia
Copiato
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$this->Server->Type = 1;
$this->Server->Type = 1;
Copia
Copiato
Copia
Copiato
$this->onSplittedPacketReceived($packet);
$this->onSplittedPacketReceived($packet);
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
case SAMP_PACKET:
case SAMP_PACKET:
Copia
Copiato
Copia
Copiato
if (!in_array($this->Server->Type, array(0, 2)))
if (!in_array($this->Server->Type, array(0, 2)))
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
$this->Server->Type = 2;
$this->Server->Type = 2;
Copia
Copiato
Copia
Copiato
$this->onSampPacketReceived($packet);
$this->onSampPacketReceived($packet);
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
default:
default:
Copia
Copiato
Copia
Copiato
break;
break;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
return $this->Server;
return $this->Server;
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
}
}
Copia
Copiato
Copia
Copiato
?>
?>
Diff salvati
Testo originale
Apri file
<?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; } } ?>
Testo modificato
Apri file
<?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; } } ?>
Trovare la differenza