Diff
checker
Text
Text
Images
Documents
Excel
Folders
Legal
Enterprise
Desktop
Pricing
Sign in
Download Diffchecker Desktop
Compare text
Find the difference between two text files
Tools
History
Real-time editor
Hide whitespace changes
Hide unchanged lines
Disable line wrap
Layout
Split
Unified
Diff precision
Smart
Word
Char
Text styles
Change appearance
Syntax highlighting
Choose syntax
Ignore
Transform text
Go to first change
Edit input
Diffchecker Desktop
The most secure way to run Diffchecker. Get the Diffchecker Desktop app: your diffs never leave your computer!
Get Desktop
Untitled diff
Created
9 years ago
Diff never expires
Clear
Export
Share
Explain
1 removal
Lines
Total
Removed
Characters
Total
Removed
To continue using this feature, upgrade to
Diff
checker
Pro
View Pricing
488 lines
Copy
492 additions
Lines
Total
Added
Characters
Total
Added
To continue using this feature, upgrade to
Diff
checker
Pro
View Pricing
977 lines
Copy
<?php
<?php
Copy
Copied
Copy
Copied
/*
/*
Copy
Copied
Copy
Copied
LiveStats Library
LiveStats Library
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
version: 2.0
version: 2.0
Copy
Copied
Copy
Copied
query engines: Goldsource, Source, SA:MP
query engines: Goldsource, Source, SA:MP
Copy
Copied
Copy
Copied
protocol: 47, 48
protocol: 47, 48
Copy
Copied
Copy
Copied
author: nr913
author: nr913
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
visit www.
freakz
.ro
visit www.
foxh
.ro
*/
*/
Copy
Copied
Copy
Copied
define('HL_PACKET', -1);
define('HL_PACKET', -1);
Copy
Copied
Copy
Copied
define('HL_PACKET_SPLITTED', -2);
define('HL_PACKET_SPLITTED', -2);
Copy
Copied
Copy
Copied
define('SAMP_PACKET', 1347240275);
define('SAMP_PACKET', 1347240275);
Copy
Copied
Copy
Copied
class Player {
class Player {
Copy
Copied
Copy
Copied
var $ID;
var $ID;
Copy
Copied
Copy
Copied
var $Name;
var $Name;
Copy
Copied
Copy
Copied
var $Score;
var $Score;
Copy
Copied
Copy
Copied
var $TimePlayed;
var $TimePlayed;
Copy
Copied
Copy
Copied
var $Ping;
var $Ping;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
class Server {
class Server {
Copy
Copied
Copy
Copied
var $Type = 0;
var $Type = 0;
Copy
Copied
Copy
Copied
var $ProtocolVersion;
var $ProtocolVersion;
Copy
Copied
Copy
Copied
var $Address;
var $Address;
Copy
Copied
Copy
Copied
var $Hostname;
var $Hostname;
Copy
Copied
Copy
Copied
var $Map;
var $Map;
Copy
Copied
Copy
Copied
var $Directory;
var $Directory;
Copy
Copied
Copy
Copied
var $Description;
var $Description;
Copy
Copied
Copy
Copied
var $AppID;
var $AppID;
Copy
Copied
Copy
Copied
var $MaxPlayers;
var $MaxPlayers;
Copy
Copied
Copy
Copied
var $PlayerCount;
var $PlayerCount;
Copy
Copied
Copy
Copied
var $BotCount;
var $BotCount;
Copy
Copied
Copy
Copied
var $Dedicated;
var $Dedicated;
Copy
Copied
Copy
Copied
var $OS;
var $OS;
Copy
Copied
Copy
Copied
var $PasswordProtected;
var $PasswordProtected;
Copy
Copied
Copy
Copied
var $Secured;
var $Secured;
Copy
Copied
Copy
Copied
var $GameMode;
var $GameMode;
Copy
Copied
Copy
Copied
var $WitnessCount;
var $WitnessCount;
Copy
Copied
Copy
Copied
var $WitnessTime;
var $WitnessTime;
Copy
Copied
Copy
Copied
var $GameVersion;
var $GameVersion;
Copy
Copied
Copy
Copied
var $Players = array();
var $Players = array();
Copy
Copied
Copy
Copied
var $Rules = array();
var $Rules = array();
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
class Time {
class Time {
Copy
Copied
Copy
Copied
var $Hours;
var $Hours;
Copy
Copied
Copy
Copied
var $Minutes;
var $Minutes;
Copy
Copied
Copy
Copied
var $Seconds;
var $Seconds;
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function __construct($seconds) {
function __construct($seconds) {
Copy
Copied
Copy
Copied
$this->Hours = floor($seconds / 3600);
$this->Hours = floor($seconds / 3600);
Copy
Copied
Copy
Copied
$this->Minutes = floor($seconds / 60) % 60;
$this->Minutes = floor($seconds / 60) % 60;
Copy
Copied
Copy
Copied
$this->Seconds = floor($seconds) % 60;
$this->Seconds = floor($seconds) % 60;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function __toString() {
function __toString() {
Copy
Copied
Copy
Copied
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
Copy
Copied
Copy
Copied
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
Copy
Copied
Copy
Copied
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
Copy
Copied
Copy
Copied
return "$hours:$minutes:$seconds";
return "$hours:$minutes:$seconds";
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
class LSError extends Exception {
class LSError extends Exception {
Copy
Copied
Copy
Copied
var $ErrorMessage;
var $ErrorMessage;
Copy
Copied
Copy
Copied
var $ErrorCode;
var $ErrorCode;
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function __construct($errcode, $errmsg) {
function __construct($errcode, $errmsg) {
Copy
Copied
Copy
Copied
$this->ErrorCode = $errcode;
$this->ErrorCode = $errcode;
Copy
Copied
Copy
Copied
$this->ErrorMessage = $errmsg;
$this->ErrorMessage = $errmsg;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
class Utils {
class Utils {
Copy
Copied
Copy
Copied
static function getTime() {
static function getTime() {
Copy
Copied
Copy
Copied
list($u, $s) = explode(' ', microtime());
list($u, $s) = explode(' ', microtime());
Copy
Copied
Copy
Copied
return ((float)$u + (float)$s);
return ((float)$u + (float)$s);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
static function getString($packet, &$offset, $length = -1) {
static function getString($packet, &$offset, $length = -1) {
Copy
Copied
Copy
Copied
$len = strlen($packet);
$len = strlen($packet);
Copy
Copied
Copy
Copied
$i = 0;
$i = 0;
Copy
Copied
Copy
Copied
if ($length == -1) {
if ($length == -1) {
Copy
Copied
Copy
Copied
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
Copy
Copied
Copy
Copied
$i++;
$i++;
Copy
Copied
Copy
Copied
$offset += $i + 1;
$offset += $i + 1;
Copy
Copied
Copy
Copied
return substr($packet, $offset - $i - 1, $i);
return substr($packet, $offset - $i - 1, $i);
Copy
Copied
Copy
Copied
} else {
} else {
Copy
Copied
Copy
Copied
$i = $length;
$i = $length;
Copy
Copied
Copy
Copied
if ($len - $offset < $length)
if ($len - $offset < $length)
Copy
Copied
Copy
Copied
$i = $len - $offset;
$i = $len - $offset;
Copy
Copied
Copy
Copied
$offset += $i;
$offset += $i;
Copy
Copied
Copy
Copied
return substr($packet, $offset - $i, $i);
return substr($packet, $offset - $i, $i);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
static function getByte($packet, &$offset) {
static function getByte($packet, &$offset) {
Copy
Copied
Copy
Copied
if ($offset >= strlen($packet))
if ($offset >= strlen($packet))
Copy
Copied
Copy
Copied
return 0;
return 0;
Copy
Copied
Copy
Copied
$char = unpack('cchar', $packet[$offset]);
$char = unpack('cchar', $packet[$offset]);
Copy
Copied
Copy
Copied
$offset++;
$offset++;
Copy
Copied
Copy
Copied
return $char['char'];
return $char['char'];
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
static function getShort($packet, &$offset) {
static function getShort($packet, &$offset) {
Copy
Copied
Copy
Copied
if ($offset + 2 >= strlen($packet))
if ($offset + 2 >= strlen($packet))
Copy
Copied
Copy
Copied
return 0;
return 0;
Copy
Copied
Copy
Copied
$short = unpack('sshort', substr($packet, $offset, 2));
$short = unpack('sshort', substr($packet, $offset, 2));
Copy
Copied
Copy
Copied
$offset += 2;
$offset += 2;
Copy
Copied
Copy
Copied
return $short['short'];
return $short['short'];
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
static function getInt($packet, &$offset) {
static function getInt($packet, &$offset) {
Copy
Copied
Copy
Copied
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
Copy
Copied
Copy
Copied
return 0;
return 0;
Copy
Copied
Copy
Copied
$int = unpack('iint', substr($packet, $offset, 4));
$int = unpack('iint', substr($packet, $offset, 4));
Copy
Copied
Copy
Copied
$offset += 4;
$offset += 4;
Copy
Copied
Copy
Copied
return $int['int'];
return $int['int'];
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
static function getFloat($packet, &$offset) {
static function getFloat($packet, &$offset) {
Copy
Copied
Copy
Copied
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
Copy
Copied
Copy
Copied
return ((float)0.0);
return ((float)0.0);
Copy
Copied
Copy
Copied
$float = unpack('ffloat', substr($packet, $offset, 4));
$float = unpack('ffloat', substr($packet, $offset, 4));
Copy
Copied
Copy
Copied
$offset += 4;
$offset += 4;
Copy
Copied
Copy
Copied
return ((float)$float['float']);
return ((float)$float['float']);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
class LiveStats {
class LiveStats {
Copy
Copied
Copy
Copied
var $IP;
var $IP;
Copy
Copied
Copy
Copied
var $Port;
var $Port;
Copy
Copied
Copy
Copied
var $Sock;
var $Sock;
Copy
Copied
Copy
Copied
var $Challenge = "\xFF\xFF\xFF\xFF";
var $Challenge = "\xFF\xFF\xFF\xFF";
Copy
Copied
Copy
Copied
var $HaveInfo = false;
var $HaveInfo = false;
Copy
Copied
Copy
Copied
var $HavePlayer = false;
var $HavePlayer = false;
Copy
Copied
Copy
Copied
var $HaveRules = false;
var $HaveRules = false;
Copy
Copied
Copy
Copied
var $ResendPlayer = false;
var $ResendPlayer = false;
Copy
Copied
Copy
Copied
var $ResendRules = false;
var $ResendRules = false;
Copy
Copied
Copy
Copied
var $SendQueue = array();
var $SendQueue = array();
Copy
Copied
Copy
Copied
var $MaxExecutionTime = 2;
var $MaxExecutionTime = 2;
Copy
Copied
Copy
Copied
var $SplittedPackets = array();
var $SplittedPackets = array();
Copy
Copied
Copy
Copied
var $SAMPHeader = "SAMP";
var $SAMPHeader = "SAMP";
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
var $Server;
var $Server;
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
public function __construct($hostname, $port = 27015) {
public function __construct($hostname, $port = 27015) {
Copy
Copied
Copy
Copied
$this->IP = gethostbyname($hostname);
$this->IP = gethostbyname($hostname);
Copy
Copied
Copy
Copied
$this->Port = $port;
$this->Port = $port;
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$errno = 0; $errstr = '';
$errno = 0; $errstr = '';
Copy
Copied
Copy
Copied
$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);
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
if ($this->Sock === false)
if ($this->Sock === false)
Copy
Copied
Copy
Copied
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
Copy
Copied
Copy
Copied
if (stream_set_blocking($this->Sock, false) == false)
if (stream_set_blocking($this->Sock, false) == false)
Copy
Copied
Copy
Copied
throw new LSError(2, "Could not set to non-blocking mode.");
throw new LSError(2, "Could not set to non-blocking mode.");
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
if (stream_set_timeout($this->Sock, 3) == false)
if (stream_set_timeout($this->Sock, 3) == false)
Copy
Copied
Copy
Copied
throw new LSError(3, "Could not set timeout to 10 seconds.");
throw new LSError(3, "Could not set timeout to 10 seconds.");
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$this->Server = new Server;
$this->Server = new Server;
Copy
Copied
Copy
Copied
$this->Server->Address = "{$this->IP}:{$this->Port}";
$this->Server->Address = "{$this->IP}:{$this->Port}";
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$ip = explode('.', $this->IP);
$ip = explode('.', $this->IP);
Copy
Copied
Copy
Copied
$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);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function onSplittedPacketReceived($packet) {
function onSplittedPacketReceived($packet) {
Copy
Copied
Copy
Copied
$offset = 4;
$offset = 4;
Copy
Copied
Copy
Copied
$ReqID = Utils::getInt($packet, $offset);
$ReqID = Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
if (!isset($this->SplittedPackets[$ReqID])) {
if (!isset($this->SplittedPackets[$ReqID])) {
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID] = array(
$this->SplittedPackets[$ReqID] = array(
Copy
Copied
Copy
Copied
'Data' => array(),
'Data' => array(),
Copy
Copied
Copy
Copied
'Type' => -1,
'Type' => -1,
Copy
Copied
Copy
Copied
'Packets' => -1
'Packets' => -1
Copy
Copied
Copy
Copied
);
);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
Copy
Copied
Copy
Copied
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
Copy
Copied
Copy
Copied
$offset = 8;
$offset = 8;
Copy
Copied
Copy
Copied
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
Copy
Copied
Copy
Copied
$offset = 8;
$offset = 8;
Copy
Copied
Copy
Copied
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
Copy
Copied
Copy
Copied
if ($FB1 != $FB2) {
if ($FB1 != $FB2) {
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Type'] = 0;
$this->SplittedPackets[$ReqID]['Type'] = 0;
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
Copy
Copied
Copy
Copied
} else {
} else {
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Type'] = 1;
$this->SplittedPackets[$ReqID]['Type'] = 1;
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
Copy
Copied
Copy
Copied
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
Copy
Copied
Copy
Copied
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
Copy
Copied
Copy
Copied
$offset = 8;
$offset = 8;
Copy
Copied
Copy
Copied
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
Copy
Copied
Copy
Copied
if ($i != $PckID) {
if ($i != $PckID) {
Copy
Copied
Copy
Copied
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
Copy
Copied
Copy
Copied
$i--;
$i--;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
Copy
Copied
Copy
Copied
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
Copy
Copied
Copy
Copied
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
Copy
Copied
Copy
Copied
} else {
} else {
Copy
Copied
Copy
Copied
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
Copy
Copied
Copy
Copied
$offset = 9;
$offset = 9;
Copy
Copied
Copy
Copied
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
Copy
Copied
Copy
Copied
if ($i != $PckID) {
if ($i != $PckID) {
Copy
Copied
Copy
Copied
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
Copy
Copied
Copy
Copied
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
Copy
Copied
Copy
Copied
$i--;
$i--;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
Copy
Copied
Copy
Copied
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
Copy
Copied
Copy
Copied
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
unset($this->SplittedPackets[$ReqID]);
unset($this->SplittedPackets[$ReqID]);
Copy
Copied
Copy
Copied
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function onPacketReceived($packet) {
function onPacketReceived($packet) {
Copy
Copied
Copy
Copied
$offset = 4;
$offset = 4;
Copy
Copied
Copy
Copied
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
Copy
Copied
Copy
Copied
case 0x41: // challenge
case 0x41: // challenge
Copy
Copied
Copy
Copied
$this->Challenge = substr($packet, 5);
$this->Challenge = substr($packet, 5);
Copy
Copied
Copy
Copied
if ($this->ResendPlayer) {
if ($this->ResendPlayer) {
Copy
Copied
Copy
Copied
$this->ResendPlayer = false;
$this->ResendPlayer = false;
Copy
Copied
Copy
Copied
$this->requestPlayer();
$this->requestPlayer();
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
if ($this->ResendRules) {
if ($this->ResendRules) {
Copy
Copied
Copy
Copied
$this->ResendRules = false;
$this->ResendRules = false;
Copy
Copied
Copy
Copied
$this->requestRules();
$this->requestRules();
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
case 0x44: // player
case 0x44: // player
Copy
Copied
Copy
Copied
if ($this->HavePlayer)
if ($this->HavePlayer)
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$offset = 5;
$offset = 5;
Copy
Copied
Copy
Copied
$numplayers = Utils::getByte($packet, $offset);
$numplayers = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
while ($numplayers) {
while ($numplayers) {
Copy
Copied
Copy
Copied
$Player = new Player;
$Player = new Player;
Copy
Copied
Copy
Copied
$Player->ID = Utils::getByte($packet, $offset);
$Player->ID = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$Player->Name = Utils::getString($packet, $offset);
$Player->Name = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$len = strlen($Player->Name);
$len = strlen($Player->Name);
Copy
Copied
Copy
Copied
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
Copy
Copied
Copy
Copied
$numplayers--;
$numplayers--;
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$this->HavePlayer = true;
$this->HavePlayer = true;
Copy
Copied
Copy
Copied
$this->ResendPlayer = false;
$this->ResendPlayer = false;
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
case 0x49: // info, source
case 0x49: // info, source
Copy
Copied
Copy
Copied
if ($this->HaveInfo)
if ($this->HaveInfo)
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$offset = 5;
$offset = 5;
Copy
Copied
Copy
Copied
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->AppID = Utils::getShort($packet, $offset);
$this->Server->AppID = Utils::getShort($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
Copy
Copied
Copy
Copied
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
Copy
Copied
Copy
Copied
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copy
Copied
Copy
Copied
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copy
Copied
Copy
Copied
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
Copy
Copied
Copy
Copied
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
Copy
Copied
Copy
Copied
$gm = Utils::getByte($packet, $offset);
$gm = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
Copy
Copied
Copy
Copied
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
Copy
Copied
Copy
Copied
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$this->Server->GameVersion = Utils::getString($packet, $offset);
$this->Server->GameVersion = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->HaveInfo = true;
$this->HaveInfo = true;
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
case 0x6D: // info, goldsource
case 0x6D: // info, goldsource
Copy
Copied
Copy
Copied
if ($this->HaveInfo)
if ($this->HaveInfo)
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$offset = 5;
$offset = 5;
Copy
Copied
Copy
Copied
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
Copy
Copied
Copy
Copied
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
Copy
Copied
Copy
Copied
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
Copy
Copied
Copy
Copied
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copy
Copied
Copy
Copied
$IsMod = Utils::getByte($packet, $offset);
$IsMod = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
if ($IsMod == 1) {
if ($IsMod == 1) {
Copy
Copied
Copy
Copied
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copy
Copied
Copy
Copied
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$this->HaveInfo = true;
$this->HaveInfo = true;
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
case 0x45: // rules
case 0x45: // rules
Copy
Copied
Copy
Copied
if ($this->HaveRules)
if ($this->HaveRules)
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$offset = 5;
$offset = 5;
Copy
Copied
Copy
Copied
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
Copy
Copied
Copy
Copied
while ($rulesnum) {
while ($rulesnum) {
Copy
Copied
Copy
Copied
$Name = Utils::getString($packet, $offset);
$Name = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$Value = Utils::getString($packet, $offset);
$Value = Utils::getString($packet, $offset);
Copy
Copied
Copy
Copied
$rulesnum--;
$rulesnum--;
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$this->HaveRules = true;
$this->HaveRules = true;
Copy
Copied
Copy
Copied
$this->ResendRules = false;
$this->ResendRules = false;
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
default:
default:
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function onSampPacketReceived($packet) {
function onSampPacketReceived($packet) {
Copy
Copied
Copy
Copied
$offset = 10;
$offset = 10;
Copy
Copied
Copy
Copied
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
Copy
Copied
Copy
Copied
case 0x69: // info
case 0x69: // info
Copy
Copied
Copy
Copied
if ($this->HaveInfo)
if ($this->HaveInfo)
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
Copy
Copied
Copy
Copied
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
Copy
Copied
Copy
Copied
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
Copy
Copied
Copy
Copied
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
Copy
Copied
Copy
Copied
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
$this->Server->Map = Utils::getString($packet, $offset, $len);
$this->Server->Map = Utils::getString($packet, $offset, $len);
Copy
Copied
Copy
Copied
$this->HaveInfo = true;
$this->HaveInfo = true;
Copy
Copied
Copy
Copied
if ($this->Server->PlayerCount >= 100)
if ($this->Server->PlayerCount >= 100)
Copy
Copied
Copy
Copied
$this->HavePlayer = true;
$this->HavePlayer = true;
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
case 0x72: // rules
case 0x72: // rules
Copy
Copied
Copy
Copied
if ($this->HaveRules)
if ($this->HaveRules)
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
Copy
Copied
Copy
Copied
while ($rulesnum) {
while ($rulesnum) {
Copy
Copied
Copy
Copied
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$Name = Utils::getString($packet, $offset, $len);
$Name = Utils::getString($packet, $offset, $len);
Copy
Copied
Copy
Copied
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$Value = Utils::getString($packet, $offset, $len);
$Value = Utils::getString($packet, $offset, $len);
Copy
Copied
Copy
Copied
$rulesnum--;
$rulesnum--;
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$this->HaveRules = true;
$this->HaveRules = true;
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
case 0x64: // player
case 0x64: // player
Copy
Copied
Copy
Copied
if ($this->HavePlayer)
if ($this->HavePlayer)
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$numplayers = Utils::getShort($packet, $offset);
$numplayers = Utils::getShort($packet, $offset);
Copy
Copied
Copy
Copied
$lastID = 0;
$lastID = 0;
Copy
Copied
Copy
Copied
$plusID = 0;
$plusID = 0;
Copy
Copied
Copy
Copied
while ($numplayers) {
while ($numplayers) {
Copy
Copied
Copy
Copied
$Player = new Player;
$Player = new Player;
Copy
Copied
Copy
Copied
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
Copy
Copied
Copy
Copied
if ($Player->ID < $lastID) {
if ($Player->ID < $lastID) {
Copy
Copied
Copy
Copied
$Player->ID += 256;
$Player->ID += 256;
Copy
Copied
Copy
Copied
$plusID += 256;
$plusID += 256;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$lastID = $Player->ID;
$lastID = $Player->ID;
Copy
Copied
Copy
Copied
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
Copy
Copied
Copy
Copied
$Player->Name = Utils::getString($packet, $offset, $len);
$Player->Name = Utils::getString($packet, $offset, $len);
Copy
Copied
Copy
Copied
$len = strlen($Player->Name);
$len = strlen($Player->Name);
Copy
Copied
Copy
Copied
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
$Player->Ping = Utils::getInt($packet, $offset);
$Player->Ping = Utils::getInt($packet, $offset);
Copy
Copied
Copy
Copied
$numplayers--;
$numplayers--;
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
$this->HavePlayer = true;
$this->HavePlayer = true;
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
default:
default:
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function requestInfo() {
function requestInfo() {
Copy
Copied
Copy
Copied
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
Copy
Copied
Copy
Copied
array_push($this->SendQueue, $this->SAMPHeader . "i");
array_push($this->SendQueue, $this->SAMPHeader . "i");
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function requestPlayer() {
function requestPlayer() {
Copy
Copied
Copy
Copied
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
Copy
Copied
Copy
Copied
array_push($this->SendQueue, $this->SAMPHeader . "d");
array_push($this->SendQueue, $this->SAMPHeader . "d");
Copy
Copied
Copy
Copied
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
Copy
Copied
Copy
Copied
$this->ResendPlayer = true;
$this->ResendPlayer = true;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function requestRules() {
function requestRules() {
Copy
Copied
Copy
Copied
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
Copy
Copied
Copy
Copied
array_push($this->SendQueue, $this->SAMPHeader . "r");
array_push($this->SendQueue, $this->SAMPHeader . "r");
Copy
Copied
Copy
Copied
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
Copy
Copied
Copy
Copied
$this->ResendRules = true;
$this->ResendRules = true;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
function GetServer() {
function GetServer() {
Copy
Copied
Copy
Copied
$start = Utils::getTime();
$start = Utils::getTime();
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$this->requestInfo();
$this->requestInfo();
Copy
Copied
Copy
Copied
$this->requestPlayer();
$this->requestPlayer();
Copy
Copied
Copy
Copied
$this->requestRules();
$this->requestRules();
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
Copy
Copied
Copy
Copied
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
Copy
Copied
Copy
Copied
if ($this->HaveInfo && $this->HavePlayer) {
if ($this->HaveInfo && $this->HavePlayer) {
Copy
Copied
Copy
Copied
$this->HaveRules = true;
$this->HaveRules = true;
Copy
Copied
Copy
Copied
} else {
} else {
Copy
Copied
Copy
Copied
throw new LSError(4, "Timed out.");
throw new LSError(4, "Timed out.");
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
if (count($this->SendQueue) > 0) {
if (count($this->SendQueue) > 0) {
Copy
Copied
Copy
Copied
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
Copy
Copied
Copy
Copied
if ($meta['timed_out'])
if ($meta['timed_out'])
Copy
Copied
Copy
Copied
throw new LSError(5, "Timed out.");
throw new LSError(5, "Timed out.");
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
usleep(50000);
usleep(50000);
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$packet = fread($this->Sock, 2048);
$packet = fread($this->Sock, 2048);
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
Copy
Copied
Copy
Copied
if ($meta['timed_out'])
if ($meta['timed_out'])
Copy
Copied
Copy
Copied
throw new LSError(6, "Timed out.");
throw new LSError(6, "Timed out.");
Copy
Copied
Copy
Copied
Copy
Copied
Copy
Copied
if (strlen($packet) > 0) {
if (strlen($packet) > 0) {
Copy
Copied
Copy
Copied
$offset = 0;
$offset = 0;
Copy
Copied
Copy
Copied
switch (Utils::getInt($packet, $offset)) {
switch (Utils::getInt($packet, $offset)) {
Copy
Copied
Copy
Copied
case HL_PACKET:
case HL_PACKET:
Copy
Copied
Copy
Copied
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$this->Server->Type = 1;
$this->Server->Type = 1;
Copy
Copied
Copy
Copied
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
case HL_PACKET_SPLITTED:
case HL_PACKET_SPLITTED:
Copy
Copied
Copy
Copied
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$this->Server->Type = 1;
$this->Server->Type = 1;
Copy
Copied
Copy
Copied
$this->onSplittedPacketReceived($packet);
$this->onSplittedPacketReceived($packet);
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
case SAMP_PACKET:
case SAMP_PACKET:
Copy
Copied
Copy
Copied
if (!in_array($this->Server->Type, array(0, 2)))
if (!in_array($this->Server->Type, array(0, 2)))
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
$this->Server->Type = 2;
$this->Server->Type = 2;
Copy
Copied
Copy
Copied
$this->onSampPacketReceived($packet);
$this->onSampPacketReceived($packet);
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
default:
default:
Copy
Copied
Copy
Copied
break;
break;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
return $this->Server;
return $this->Server;
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
}
}
Copy
Copied
Copy
Copied
?>
?>
Saved diffs
Original text
Open 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; } } ?>
Changed text
Open 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; } } ?>
Find difference