Diff
checker
Text
Text
Bilder
Dokumente
Excel
Ordner
Legal
Enterprise
Desktop-App
Preise
Einloggen
Diffchecker Desktop herunterladen
Texte vergleichen
Finde den Unterschied zwischen zwei Textdateien
Werkzeuge
Verlauf
Live-Editor
Leerzeichen ausblenden
Gleiches ausblenden
Zeilenumbruch aus
Ansicht
Zweispaltig
Einspaltig
Vergleichsgenauigkeit
Intelligent
Wort
Zeichen
Textstile
Darstellung ändern
Syntaxhervorhebung
Syntax auswählen
Ignorieren
Text umwandeln
Zur ersten Änderung
Eingabe bearbeiten
Diffchecker Desktop
Der sicherste Weg, Diffchecker zu nutzen. Hol dir die Desktop-App: Deine Diffs verlassen nie deinen Computer!
Desktop holen
Untitled diff
Erstellt
vor 9 Jahren
Diff läuft nie ab
Löschen
Exportieren
Teilen
Erklären
1 Entfernung
Zeilen
Gesamt
Entfernt
Zeichen
Gesamt
Entfernt
Um diese Funktion weiterhin zu nutzen, aktualisiere auf
Diff
checker
Pro
Preise anzeigen
488 Zeilen
Kopieren
492 Hinzufügungen
Zeilen
Gesamt
Hinzugefügt
Zeichen
Gesamt
Hinzugefügt
Um diese Funktion weiterhin zu nutzen, aktualisiere auf
Diff
checker
Pro
Preise anzeigen
977 Zeilen
Kopieren
<?php
<?php
Kopieren
Kopiert
Kopieren
Kopiert
/*
/*
Kopieren
Kopiert
Kopieren
Kopiert
LiveStats Library
LiveStats Library
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
version: 2.0
version: 2.0
Kopieren
Kopiert
Kopieren
Kopiert
query engines: Goldsource, Source, SA:MP
query engines: Goldsource, Source, SA:MP
Kopieren
Kopiert
Kopieren
Kopiert
protocol: 47, 48
protocol: 47, 48
Kopieren
Kopiert
Kopieren
Kopiert
author: nr913
author: nr913
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
visit www.
freakz
.ro
visit www.
foxh
.ro
*/
*/
Kopieren
Kopiert
Kopieren
Kopiert
define('HL_PACKET', -1);
define('HL_PACKET', -1);
Kopieren
Kopiert
Kopieren
Kopiert
define('HL_PACKET_SPLITTED', -2);
define('HL_PACKET_SPLITTED', -2);
Kopieren
Kopiert
Kopieren
Kopiert
define('SAMP_PACKET', 1347240275);
define('SAMP_PACKET', 1347240275);
Kopieren
Kopiert
Kopieren
Kopiert
class Player {
class Player {
Kopieren
Kopiert
Kopieren
Kopiert
var $ID;
var $ID;
Kopieren
Kopiert
Kopieren
Kopiert
var $Name;
var $Name;
Kopieren
Kopiert
Kopieren
Kopiert
var $Score;
var $Score;
Kopieren
Kopiert
Kopieren
Kopiert
var $TimePlayed;
var $TimePlayed;
Kopieren
Kopiert
Kopieren
Kopiert
var $Ping;
var $Ping;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
class Server {
class Server {
Kopieren
Kopiert
Kopieren
Kopiert
var $Type = 0;
var $Type = 0;
Kopieren
Kopiert
Kopieren
Kopiert
var $ProtocolVersion;
var $ProtocolVersion;
Kopieren
Kopiert
Kopieren
Kopiert
var $Address;
var $Address;
Kopieren
Kopiert
Kopieren
Kopiert
var $Hostname;
var $Hostname;
Kopieren
Kopiert
Kopieren
Kopiert
var $Map;
var $Map;
Kopieren
Kopiert
Kopieren
Kopiert
var $Directory;
var $Directory;
Kopieren
Kopiert
Kopieren
Kopiert
var $Description;
var $Description;
Kopieren
Kopiert
Kopieren
Kopiert
var $AppID;
var $AppID;
Kopieren
Kopiert
Kopieren
Kopiert
var $MaxPlayers;
var $MaxPlayers;
Kopieren
Kopiert
Kopieren
Kopiert
var $PlayerCount;
var $PlayerCount;
Kopieren
Kopiert
Kopieren
Kopiert
var $BotCount;
var $BotCount;
Kopieren
Kopiert
Kopieren
Kopiert
var $Dedicated;
var $Dedicated;
Kopieren
Kopiert
Kopieren
Kopiert
var $OS;
var $OS;
Kopieren
Kopiert
Kopieren
Kopiert
var $PasswordProtected;
var $PasswordProtected;
Kopieren
Kopiert
Kopieren
Kopiert
var $Secured;
var $Secured;
Kopieren
Kopiert
Kopieren
Kopiert
var $GameMode;
var $GameMode;
Kopieren
Kopiert
Kopieren
Kopiert
var $WitnessCount;
var $WitnessCount;
Kopieren
Kopiert
Kopieren
Kopiert
var $WitnessTime;
var $WitnessTime;
Kopieren
Kopiert
Kopieren
Kopiert
var $GameVersion;
var $GameVersion;
Kopieren
Kopiert
Kopieren
Kopiert
var $Players = array();
var $Players = array();
Kopieren
Kopiert
Kopieren
Kopiert
var $Rules = array();
var $Rules = array();
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
class Time {
class Time {
Kopieren
Kopiert
Kopieren
Kopiert
var $Hours;
var $Hours;
Kopieren
Kopiert
Kopieren
Kopiert
var $Minutes;
var $Minutes;
Kopieren
Kopiert
Kopieren
Kopiert
var $Seconds;
var $Seconds;
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function __construct($seconds) {
function __construct($seconds) {
Kopieren
Kopiert
Kopieren
Kopiert
$this->Hours = floor($seconds / 3600);
$this->Hours = floor($seconds / 3600);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Minutes = floor($seconds / 60) % 60;
$this->Minutes = floor($seconds / 60) % 60;
Kopieren
Kopiert
Kopieren
Kopiert
$this->Seconds = floor($seconds) % 60;
$this->Seconds = floor($seconds) % 60;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function __toString() {
function __toString() {
Kopieren
Kopiert
Kopieren
Kopiert
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
Kopieren
Kopiert
Kopieren
Kopiert
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
Kopieren
Kopiert
Kopieren
Kopiert
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
Kopieren
Kopiert
Kopieren
Kopiert
return "$hours:$minutes:$seconds";
return "$hours:$minutes:$seconds";
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
class LSError extends Exception {
class LSError extends Exception {
Kopieren
Kopiert
Kopieren
Kopiert
var $ErrorMessage;
var $ErrorMessage;
Kopieren
Kopiert
Kopieren
Kopiert
var $ErrorCode;
var $ErrorCode;
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function __construct($errcode, $errmsg) {
function __construct($errcode, $errmsg) {
Kopieren
Kopiert
Kopieren
Kopiert
$this->ErrorCode = $errcode;
$this->ErrorCode = $errcode;
Kopieren
Kopiert
Kopieren
Kopiert
$this->ErrorMessage = $errmsg;
$this->ErrorMessage = $errmsg;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
class Utils {
class Utils {
Kopieren
Kopiert
Kopieren
Kopiert
static function getTime() {
static function getTime() {
Kopieren
Kopiert
Kopieren
Kopiert
list($u, $s) = explode(' ', microtime());
list($u, $s) = explode(' ', microtime());
Kopieren
Kopiert
Kopieren
Kopiert
return ((float)$u + (float)$s);
return ((float)$u + (float)$s);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
static function getString($packet, &$offset, $length = -1) {
static function getString($packet, &$offset, $length = -1) {
Kopieren
Kopiert
Kopieren
Kopiert
$len = strlen($packet);
$len = strlen($packet);
Kopieren
Kopiert
Kopieren
Kopiert
$i = 0;
$i = 0;
Kopieren
Kopiert
Kopieren
Kopiert
if ($length == -1) {
if ($length == -1) {
Kopieren
Kopiert
Kopieren
Kopiert
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
Kopieren
Kopiert
Kopieren
Kopiert
$i++;
$i++;
Kopieren
Kopiert
Kopieren
Kopiert
$offset += $i + 1;
$offset += $i + 1;
Kopieren
Kopiert
Kopieren
Kopiert
return substr($packet, $offset - $i - 1, $i);
return substr($packet, $offset - $i - 1, $i);
Kopieren
Kopiert
Kopieren
Kopiert
} else {
} else {
Kopieren
Kopiert
Kopieren
Kopiert
$i = $length;
$i = $length;
Kopieren
Kopiert
Kopieren
Kopiert
if ($len - $offset < $length)
if ($len - $offset < $length)
Kopieren
Kopiert
Kopieren
Kopiert
$i = $len - $offset;
$i = $len - $offset;
Kopieren
Kopiert
Kopieren
Kopiert
$offset += $i;
$offset += $i;
Kopieren
Kopiert
Kopieren
Kopiert
return substr($packet, $offset - $i, $i);
return substr($packet, $offset - $i, $i);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
static function getByte($packet, &$offset) {
static function getByte($packet, &$offset) {
Kopieren
Kopiert
Kopieren
Kopiert
if ($offset >= strlen($packet))
if ($offset >= strlen($packet))
Kopieren
Kopiert
Kopieren
Kopiert
return 0;
return 0;
Kopieren
Kopiert
Kopieren
Kopiert
$char = unpack('cchar', $packet[$offset]);
$char = unpack('cchar', $packet[$offset]);
Kopieren
Kopiert
Kopieren
Kopiert
$offset++;
$offset++;
Kopieren
Kopiert
Kopieren
Kopiert
return $char['char'];
return $char['char'];
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
static function getShort($packet, &$offset) {
static function getShort($packet, &$offset) {
Kopieren
Kopiert
Kopieren
Kopiert
if ($offset + 2 >= strlen($packet))
if ($offset + 2 >= strlen($packet))
Kopieren
Kopiert
Kopieren
Kopiert
return 0;
return 0;
Kopieren
Kopiert
Kopieren
Kopiert
$short = unpack('sshort', substr($packet, $offset, 2));
$short = unpack('sshort', substr($packet, $offset, 2));
Kopieren
Kopiert
Kopieren
Kopiert
$offset += 2;
$offset += 2;
Kopieren
Kopiert
Kopieren
Kopiert
return $short['short'];
return $short['short'];
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
static function getInt($packet, &$offset) {
static function getInt($packet, &$offset) {
Kopieren
Kopiert
Kopieren
Kopiert
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
Kopieren
Kopiert
Kopieren
Kopiert
return 0;
return 0;
Kopieren
Kopiert
Kopieren
Kopiert
$int = unpack('iint', substr($packet, $offset, 4));
$int = unpack('iint', substr($packet, $offset, 4));
Kopieren
Kopiert
Kopieren
Kopiert
$offset += 4;
$offset += 4;
Kopieren
Kopiert
Kopieren
Kopiert
return $int['int'];
return $int['int'];
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
static function getFloat($packet, &$offset) {
static function getFloat($packet, &$offset) {
Kopieren
Kopiert
Kopieren
Kopiert
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
Kopieren
Kopiert
Kopieren
Kopiert
return ((float)0.0);
return ((float)0.0);
Kopieren
Kopiert
Kopieren
Kopiert
$float = unpack('ffloat', substr($packet, $offset, 4));
$float = unpack('ffloat', substr($packet, $offset, 4));
Kopieren
Kopiert
Kopieren
Kopiert
$offset += 4;
$offset += 4;
Kopieren
Kopiert
Kopieren
Kopiert
return ((float)$float['float']);
return ((float)$float['float']);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
class LiveStats {
class LiveStats {
Kopieren
Kopiert
Kopieren
Kopiert
var $IP;
var $IP;
Kopieren
Kopiert
Kopieren
Kopiert
var $Port;
var $Port;
Kopieren
Kopiert
Kopieren
Kopiert
var $Sock;
var $Sock;
Kopieren
Kopiert
Kopieren
Kopiert
var $Challenge = "\xFF\xFF\xFF\xFF";
var $Challenge = "\xFF\xFF\xFF\xFF";
Kopieren
Kopiert
Kopieren
Kopiert
var $HaveInfo = false;
var $HaveInfo = false;
Kopieren
Kopiert
Kopieren
Kopiert
var $HavePlayer = false;
var $HavePlayer = false;
Kopieren
Kopiert
Kopieren
Kopiert
var $HaveRules = false;
var $HaveRules = false;
Kopieren
Kopiert
Kopieren
Kopiert
var $ResendPlayer = false;
var $ResendPlayer = false;
Kopieren
Kopiert
Kopieren
Kopiert
var $ResendRules = false;
var $ResendRules = false;
Kopieren
Kopiert
Kopieren
Kopiert
var $SendQueue = array();
var $SendQueue = array();
Kopieren
Kopiert
Kopieren
Kopiert
var $MaxExecutionTime = 2;
var $MaxExecutionTime = 2;
Kopieren
Kopiert
Kopieren
Kopiert
var $SplittedPackets = array();
var $SplittedPackets = array();
Kopieren
Kopiert
Kopieren
Kopiert
var $SAMPHeader = "SAMP";
var $SAMPHeader = "SAMP";
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
var $Server;
var $Server;
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
public function __construct($hostname, $port = 27015) {
public function __construct($hostname, $port = 27015) {
Kopieren
Kopiert
Kopieren
Kopiert
$this->IP = gethostbyname($hostname);
$this->IP = gethostbyname($hostname);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Port = $port;
$this->Port = $port;
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$errno = 0; $errstr = '';
$errno = 0; $errstr = '';
Kopieren
Kopiert
Kopieren
Kopiert
$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);
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->Sock === false)
if ($this->Sock === false)
Kopieren
Kopiert
Kopieren
Kopiert
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
Kopieren
Kopiert
Kopieren
Kopiert
if (stream_set_blocking($this->Sock, false) == false)
if (stream_set_blocking($this->Sock, false) == false)
Kopieren
Kopiert
Kopieren
Kopiert
throw new LSError(2, "Could not set to non-blocking mode.");
throw new LSError(2, "Could not set to non-blocking mode.");
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
if (stream_set_timeout($this->Sock, 3) == false)
if (stream_set_timeout($this->Sock, 3) == false)
Kopieren
Kopiert
Kopieren
Kopiert
throw new LSError(3, "Could not set timeout to 10 seconds.");
throw new LSError(3, "Could not set timeout to 10 seconds.");
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server = new Server;
$this->Server = new Server;
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Address = "{$this->IP}:{$this->Port}";
$this->Server->Address = "{$this->IP}:{$this->Port}";
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$ip = explode('.', $this->IP);
$ip = explode('.', $this->IP);
Kopieren
Kopiert
Kopieren
Kopiert
$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);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function onSplittedPacketReceived($packet) {
function onSplittedPacketReceived($packet) {
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 4;
$offset = 4;
Kopieren
Kopiert
Kopieren
Kopiert
$ReqID = Utils::getInt($packet, $offset);
$ReqID = Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
if (!isset($this->SplittedPackets[$ReqID])) {
if (!isset($this->SplittedPackets[$ReqID])) {
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID] = array(
$this->SplittedPackets[$ReqID] = array(
Kopieren
Kopiert
Kopieren
Kopiert
'Data' => array(),
'Data' => array(),
Kopieren
Kopiert
Kopieren
Kopiert
'Type' => -1,
'Type' => -1,
Kopieren
Kopiert
Kopieren
Kopiert
'Packets' => -1
'Packets' => -1
Kopieren
Kopiert
Kopieren
Kopiert
);
);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
Kopieren
Kopiert
Kopieren
Kopiert
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 8;
$offset = 8;
Kopieren
Kopiert
Kopieren
Kopiert
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 8;
$offset = 8;
Kopieren
Kopiert
Kopieren
Kopiert
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
Kopieren
Kopiert
Kopieren
Kopiert
if ($FB1 != $FB2) {
if ($FB1 != $FB2) {
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Type'] = 0;
$this->SplittedPackets[$ReqID]['Type'] = 0;
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
Kopieren
Kopiert
Kopieren
Kopiert
} else {
} else {
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Type'] = 1;
$this->SplittedPackets[$ReqID]['Type'] = 1;
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
Kopieren
Kopiert
Kopieren
Kopiert
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 8;
$offset = 8;
Kopieren
Kopiert
Kopieren
Kopiert
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
Kopieren
Kopiert
Kopieren
Kopiert
if ($i != $PckID) {
if ($i != $PckID) {
Kopieren
Kopiert
Kopieren
Kopiert
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
Kopieren
Kopiert
Kopieren
Kopiert
$i--;
$i--;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
Kopieren
Kopiert
Kopieren
Kopiert
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
Kopieren
Kopiert
Kopieren
Kopiert
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
Kopieren
Kopiert
Kopieren
Kopiert
} else {
} else {
Kopieren
Kopiert
Kopieren
Kopiert
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 9;
$offset = 9;
Kopieren
Kopiert
Kopieren
Kopiert
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
Kopieren
Kopiert
Kopieren
Kopiert
if ($i != $PckID) {
if ($i != $PckID) {
Kopieren
Kopiert
Kopieren
Kopiert
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
Kopieren
Kopiert
Kopieren
Kopiert
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
Kopieren
Kopiert
Kopieren
Kopiert
$i--;
$i--;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
Kopieren
Kopiert
Kopieren
Kopiert
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
Kopieren
Kopiert
Kopieren
Kopiert
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
unset($this->SplittedPackets[$ReqID]);
unset($this->SplittedPackets[$ReqID]);
Kopieren
Kopiert
Kopieren
Kopiert
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function onPacketReceived($packet) {
function onPacketReceived($packet) {
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 4;
$offset = 4;
Kopieren
Kopiert
Kopieren
Kopiert
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
Kopieren
Kopiert
Kopieren
Kopiert
case 0x41: // challenge
case 0x41: // challenge
Kopieren
Kopiert
Kopieren
Kopiert
$this->Challenge = substr($packet, 5);
$this->Challenge = substr($packet, 5);
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->ResendPlayer) {
if ($this->ResendPlayer) {
Kopieren
Kopiert
Kopieren
Kopiert
$this->ResendPlayer = false;
$this->ResendPlayer = false;
Kopieren
Kopiert
Kopieren
Kopiert
$this->requestPlayer();
$this->requestPlayer();
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->ResendRules) {
if ($this->ResendRules) {
Kopieren
Kopiert
Kopieren
Kopiert
$this->ResendRules = false;
$this->ResendRules = false;
Kopieren
Kopiert
Kopieren
Kopiert
$this->requestRules();
$this->requestRules();
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
case 0x44: // player
case 0x44: // player
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->HavePlayer)
if ($this->HavePlayer)
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 5;
$offset = 5;
Kopieren
Kopiert
Kopieren
Kopiert
$numplayers = Utils::getByte($packet, $offset);
$numplayers = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
while ($numplayers) {
while ($numplayers) {
Kopieren
Kopiert
Kopieren
Kopiert
$Player = new Player;
$Player = new Player;
Kopieren
Kopiert
Kopieren
Kopiert
$Player->ID = Utils::getByte($packet, $offset);
$Player->ID = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$Player->Name = Utils::getString($packet, $offset);
$Player->Name = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$len = strlen($Player->Name);
$len = strlen($Player->Name);
Kopieren
Kopiert
Kopieren
Kopiert
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
Kopieren
Kopiert
Kopieren
Kopiert
$numplayers--;
$numplayers--;
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$this->HavePlayer = true;
$this->HavePlayer = true;
Kopieren
Kopiert
Kopieren
Kopiert
$this->ResendPlayer = false;
$this->ResendPlayer = false;
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
case 0x49: // info, source
case 0x49: // info, source
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->HaveInfo)
if ($this->HaveInfo)
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 5;
$offset = 5;
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->AppID = Utils::getShort($packet, $offset);
$this->Server->AppID = Utils::getShort($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
Kopieren
Kopiert
Kopieren
Kopiert
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
Kopieren
Kopiert
Kopieren
Kopiert
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
Kopieren
Kopiert
Kopieren
Kopiert
$gm = Utils::getByte($packet, $offset);
$gm = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->GameVersion = Utils::getString($packet, $offset);
$this->Server->GameVersion = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->HaveInfo = true;
$this->HaveInfo = true;
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
case 0x6D: // info, goldsource
case 0x6D: // info, goldsource
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->HaveInfo)
if ($this->HaveInfo)
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 5;
$offset = 5;
Kopieren
Kopiert
Kopieren
Kopiert
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Kopieren
Kopiert
Kopieren
Kopiert
$IsMod = Utils::getByte($packet, $offset);
$IsMod = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
if ($IsMod == 1) {
if ($IsMod == 1) {
Kopieren
Kopiert
Kopieren
Kopiert
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->HaveInfo = true;
$this->HaveInfo = true;
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
case 0x45: // rules
case 0x45: // rules
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->HaveRules)
if ($this->HaveRules)
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 5;
$offset = 5;
Kopieren
Kopiert
Kopieren
Kopiert
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
while ($rulesnum) {
while ($rulesnum) {
Kopieren
Kopiert
Kopieren
Kopiert
$Name = Utils::getString($packet, $offset);
$Name = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$Value = Utils::getString($packet, $offset);
$Value = Utils::getString($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$rulesnum--;
$rulesnum--;
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$this->HaveRules = true;
$this->HaveRules = true;
Kopieren
Kopiert
Kopieren
Kopiert
$this->ResendRules = false;
$this->ResendRules = false;
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
default:
default:
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function onSampPacketReceived($packet) {
function onSampPacketReceived($packet) {
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 10;
$offset = 10;
Kopieren
Kopiert
Kopieren
Kopiert
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
Kopieren
Kopiert
Kopieren
Kopiert
case 0x69: // info
case 0x69: // info
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->HaveInfo)
if ($this->HaveInfo)
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
Kopieren
Kopiert
Kopieren
Kopiert
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
Kopieren
Kopiert
Kopieren
Kopiert
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Map = Utils::getString($packet, $offset, $len);
$this->Server->Map = Utils::getString($packet, $offset, $len);
Kopieren
Kopiert
Kopieren
Kopiert
$this->HaveInfo = true;
$this->HaveInfo = true;
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->Server->PlayerCount >= 100)
if ($this->Server->PlayerCount >= 100)
Kopieren
Kopiert
Kopieren
Kopiert
$this->HavePlayer = true;
$this->HavePlayer = true;
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
case 0x72: // rules
case 0x72: // rules
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->HaveRules)
if ($this->HaveRules)
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
while ($rulesnum) {
while ($rulesnum) {
Kopieren
Kopiert
Kopieren
Kopiert
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$Name = Utils::getString($packet, $offset, $len);
$Name = Utils::getString($packet, $offset, $len);
Kopieren
Kopiert
Kopieren
Kopiert
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$Value = Utils::getString($packet, $offset, $len);
$Value = Utils::getString($packet, $offset, $len);
Kopieren
Kopiert
Kopieren
Kopiert
$rulesnum--;
$rulesnum--;
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$this->HaveRules = true;
$this->HaveRules = true;
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
case 0x64: // player
case 0x64: // player
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->HavePlayer)
if ($this->HavePlayer)
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$numplayers = Utils::getShort($packet, $offset);
$numplayers = Utils::getShort($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$lastID = 0;
$lastID = 0;
Kopieren
Kopiert
Kopieren
Kopiert
$plusID = 0;
$plusID = 0;
Kopieren
Kopiert
Kopieren
Kopiert
while ($numplayers) {
while ($numplayers) {
Kopieren
Kopiert
Kopieren
Kopiert
$Player = new Player;
$Player = new Player;
Kopieren
Kopiert
Kopieren
Kopiert
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
Kopieren
Kopiert
Kopieren
Kopiert
if ($Player->ID < $lastID) {
if ($Player->ID < $lastID) {
Kopieren
Kopiert
Kopieren
Kopiert
$Player->ID += 256;
$Player->ID += 256;
Kopieren
Kopiert
Kopieren
Kopiert
$plusID += 256;
$plusID += 256;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$lastID = $Player->ID;
$lastID = $Player->ID;
Kopieren
Kopiert
Kopieren
Kopiert
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$Player->Name = Utils::getString($packet, $offset, $len);
$Player->Name = Utils::getString($packet, $offset, $len);
Kopieren
Kopiert
Kopieren
Kopiert
$len = strlen($Player->Name);
$len = strlen($Player->Name);
Kopieren
Kopiert
Kopieren
Kopiert
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$Player->Ping = Utils::getInt($packet, $offset);
$Player->Ping = Utils::getInt($packet, $offset);
Kopieren
Kopiert
Kopieren
Kopiert
$numplayers--;
$numplayers--;
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
$this->HavePlayer = true;
$this->HavePlayer = true;
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
default:
default:
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function requestInfo() {
function requestInfo() {
Kopieren
Kopiert
Kopieren
Kopiert
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
Kopieren
Kopiert
Kopieren
Kopiert
array_push($this->SendQueue, $this->SAMPHeader . "i");
array_push($this->SendQueue, $this->SAMPHeader . "i");
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function requestPlayer() {
function requestPlayer() {
Kopieren
Kopiert
Kopieren
Kopiert
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
Kopieren
Kopiert
Kopieren
Kopiert
array_push($this->SendQueue, $this->SAMPHeader . "d");
array_push($this->SendQueue, $this->SAMPHeader . "d");
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
Kopieren
Kopiert
Kopieren
Kopiert
$this->ResendPlayer = true;
$this->ResendPlayer = true;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function requestRules() {
function requestRules() {
Kopieren
Kopiert
Kopieren
Kopiert
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
Kopieren
Kopiert
Kopieren
Kopiert
array_push($this->SendQueue, $this->SAMPHeader . "r");
array_push($this->SendQueue, $this->SAMPHeader . "r");
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
Kopieren
Kopiert
Kopieren
Kopiert
$this->ResendRules = true;
$this->ResendRules = true;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
function GetServer() {
function GetServer() {
Kopieren
Kopiert
Kopieren
Kopiert
$start = Utils::getTime();
$start = Utils::getTime();
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$this->requestInfo();
$this->requestInfo();
Kopieren
Kopiert
Kopieren
Kopiert
$this->requestPlayer();
$this->requestPlayer();
Kopieren
Kopiert
Kopieren
Kopiert
$this->requestRules();
$this->requestRules();
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
Kopieren
Kopiert
Kopieren
Kopiert
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
Kopieren
Kopiert
Kopieren
Kopiert
if ($this->HaveInfo && $this->HavePlayer) {
if ($this->HaveInfo && $this->HavePlayer) {
Kopieren
Kopiert
Kopieren
Kopiert
$this->HaveRules = true;
$this->HaveRules = true;
Kopieren
Kopiert
Kopieren
Kopiert
} else {
} else {
Kopieren
Kopiert
Kopieren
Kopiert
throw new LSError(4, "Timed out.");
throw new LSError(4, "Timed out.");
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
if (count($this->SendQueue) > 0) {
if (count($this->SendQueue) > 0) {
Kopieren
Kopiert
Kopieren
Kopiert
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
Kopieren
Kopiert
Kopieren
Kopiert
if ($meta['timed_out'])
if ($meta['timed_out'])
Kopieren
Kopiert
Kopieren
Kopiert
throw new LSError(5, "Timed out.");
throw new LSError(5, "Timed out.");
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
usleep(50000);
usleep(50000);
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$packet = fread($this->Sock, 2048);
$packet = fread($this->Sock, 2048);
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
Kopieren
Kopiert
Kopieren
Kopiert
if ($meta['timed_out'])
if ($meta['timed_out'])
Kopieren
Kopiert
Kopieren
Kopiert
throw new LSError(6, "Timed out.");
throw new LSError(6, "Timed out.");
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
Kopieren
Kopiert
if (strlen($packet) > 0) {
if (strlen($packet) > 0) {
Kopieren
Kopiert
Kopieren
Kopiert
$offset = 0;
$offset = 0;
Kopieren
Kopiert
Kopieren
Kopiert
switch (Utils::getInt($packet, $offset)) {
switch (Utils::getInt($packet, $offset)) {
Kopieren
Kopiert
Kopieren
Kopiert
case HL_PACKET:
case HL_PACKET:
Kopieren
Kopiert
Kopieren
Kopiert
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Type = 1;
$this->Server->Type = 1;
Kopieren
Kopiert
Kopieren
Kopiert
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
case HL_PACKET_SPLITTED:
case HL_PACKET_SPLITTED:
Kopieren
Kopiert
Kopieren
Kopiert
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Type = 1;
$this->Server->Type = 1;
Kopieren
Kopiert
Kopieren
Kopiert
$this->onSplittedPacketReceived($packet);
$this->onSplittedPacketReceived($packet);
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
case SAMP_PACKET:
case SAMP_PACKET:
Kopieren
Kopiert
Kopieren
Kopiert
if (!in_array($this->Server->Type, array(0, 2)))
if (!in_array($this->Server->Type, array(0, 2)))
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
$this->Server->Type = 2;
$this->Server->Type = 2;
Kopieren
Kopiert
Kopieren
Kopiert
$this->onSampPacketReceived($packet);
$this->onSampPacketReceived($packet);
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
default:
default:
Kopieren
Kopiert
Kopieren
Kopiert
break;
break;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
return $this->Server;
return $this->Server;
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
}
}
Kopieren
Kopiert
Kopieren
Kopiert
?>
?>
Gespeicherte Diffs
Originaltext
Datei öffnen
<?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; } } ?>
Bearbeitung
Datei öffnen
<?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; } } ?>
Unterschied finden