Diff
checker
文本
文本
图像
文档
Excel
文件夹
Legal
Enterprise
桌面版
定价
登录
下载 Diffchecker 桌面版
比较文本
查找两个文本文件之间的差异
工具
历史
实时编辑器
隐藏空白更改
折叠未更改行
关闭换行
视图
拆分
统一
比对精度
智能
单词
字符
文本样式
更改外观
语法高亮
选择语法
忽略
文本转换
转到第一个差异
编辑输入
Diffchecker Desktop
运行Diffchecker最安全的方式。获取Diffchecker桌面应用:您的差异永远不会离开您的电脑!
获取桌面版
Untitled diff
创建于
9年前
差异永不过期
清除
导出
分享
解释
1 删除
行
总计
删除
字符
总计
删除
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
488 行
全部复制
492 添加
行
总计
添加
字符
总计
添加
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
977 行
全部复制
<?php
<?php
复制
已复制
复制
已复制
/*
/*
复制
已复制
复制
已复制
LiveStats Library
LiveStats Library
复制
已复制
复制
已复制
复制
已复制
复制
已复制
version: 2.0
version: 2.0
复制
已复制
复制
已复制
query engines: Goldsource, Source, SA:MP
query engines: Goldsource, Source, SA:MP
复制
已复制
复制
已复制
protocol: 47, 48
protocol: 47, 48
复制
已复制
复制
已复制
author: nr913
author: nr913
复制
已复制
复制
已复制
复制
已复制
复制
已复制
visit www.
freakz
.ro
visit www.
foxh
.ro
*/
*/
复制
已复制
复制
已复制
define('HL_PACKET', -1);
define('HL_PACKET', -1);
复制
已复制
复制
已复制
define('HL_PACKET_SPLITTED', -2);
define('HL_PACKET_SPLITTED', -2);
复制
已复制
复制
已复制
define('SAMP_PACKET', 1347240275);
define('SAMP_PACKET', 1347240275);
复制
已复制
复制
已复制
class Player {
class Player {
复制
已复制
复制
已复制
var $ID;
var $ID;
复制
已复制
复制
已复制
var $Name;
var $Name;
复制
已复制
复制
已复制
var $Score;
var $Score;
复制
已复制
复制
已复制
var $TimePlayed;
var $TimePlayed;
复制
已复制
复制
已复制
var $Ping;
var $Ping;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
class Server {
class Server {
复制
已复制
复制
已复制
var $Type = 0;
var $Type = 0;
复制
已复制
复制
已复制
var $ProtocolVersion;
var $ProtocolVersion;
复制
已复制
复制
已复制
var $Address;
var $Address;
复制
已复制
复制
已复制
var $Hostname;
var $Hostname;
复制
已复制
复制
已复制
var $Map;
var $Map;
复制
已复制
复制
已复制
var $Directory;
var $Directory;
复制
已复制
复制
已复制
var $Description;
var $Description;
复制
已复制
复制
已复制
var $AppID;
var $AppID;
复制
已复制
复制
已复制
var $MaxPlayers;
var $MaxPlayers;
复制
已复制
复制
已复制
var $PlayerCount;
var $PlayerCount;
复制
已复制
复制
已复制
var $BotCount;
var $BotCount;
复制
已复制
复制
已复制
var $Dedicated;
var $Dedicated;
复制
已复制
复制
已复制
var $OS;
var $OS;
复制
已复制
复制
已复制
var $PasswordProtected;
var $PasswordProtected;
复制
已复制
复制
已复制
var $Secured;
var $Secured;
复制
已复制
复制
已复制
var $GameMode;
var $GameMode;
复制
已复制
复制
已复制
var $WitnessCount;
var $WitnessCount;
复制
已复制
复制
已复制
var $WitnessTime;
var $WitnessTime;
复制
已复制
复制
已复制
var $GameVersion;
var $GameVersion;
复制
已复制
复制
已复制
var $Players = array();
var $Players = array();
复制
已复制
复制
已复制
var $Rules = array();
var $Rules = array();
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
class Time {
class Time {
复制
已复制
复制
已复制
var $Hours;
var $Hours;
复制
已复制
复制
已复制
var $Minutes;
var $Minutes;
复制
已复制
复制
已复制
var $Seconds;
var $Seconds;
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function __construct($seconds) {
function __construct($seconds) {
复制
已复制
复制
已复制
$this->Hours = floor($seconds / 3600);
$this->Hours = floor($seconds / 3600);
复制
已复制
复制
已复制
$this->Minutes = floor($seconds / 60) % 60;
$this->Minutes = floor($seconds / 60) % 60;
复制
已复制
复制
已复制
$this->Seconds = floor($seconds) % 60;
$this->Seconds = floor($seconds) % 60;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function __toString() {
function __toString() {
复制
已复制
复制
已复制
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
$hours = ($this->Hours < 10 ? '0' . $this->Hours : $this->Hours);
复制
已复制
复制
已复制
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
$minutes = ($this->Minutes < 10 ? '0' . $this->Minutes : $this->Minutes);
复制
已复制
复制
已复制
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
$seconds = ($this->Seconds < 10 ? '0' . $this->Seconds : $this->Seconds);
复制
已复制
复制
已复制
return "$hours:$minutes:$seconds";
return "$hours:$minutes:$seconds";
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
class LSError extends Exception {
class LSError extends Exception {
复制
已复制
复制
已复制
var $ErrorMessage;
var $ErrorMessage;
复制
已复制
复制
已复制
var $ErrorCode;
var $ErrorCode;
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function __construct($errcode, $errmsg) {
function __construct($errcode, $errmsg) {
复制
已复制
复制
已复制
$this->ErrorCode = $errcode;
$this->ErrorCode = $errcode;
复制
已复制
复制
已复制
$this->ErrorMessage = $errmsg;
$this->ErrorMessage = $errmsg;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
class Utils {
class Utils {
复制
已复制
复制
已复制
static function getTime() {
static function getTime() {
复制
已复制
复制
已复制
list($u, $s) = explode(' ', microtime());
list($u, $s) = explode(' ', microtime());
复制
已复制
复制
已复制
return ((float)$u + (float)$s);
return ((float)$u + (float)$s);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
static function getString($packet, &$offset, $length = -1) {
static function getString($packet, &$offset, $length = -1) {
复制
已复制
复制
已复制
$len = strlen($packet);
$len = strlen($packet);
复制
已复制
复制
已复制
$i = 0;
$i = 0;
复制
已复制
复制
已复制
if ($length == -1) {
if ($length == -1) {
复制
已复制
复制
已复制
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
while ($offset + $i < $len && $packet[$offset + $i] != "\x00")
复制
已复制
复制
已复制
$i++;
$i++;
复制
已复制
复制
已复制
$offset += $i + 1;
$offset += $i + 1;
复制
已复制
复制
已复制
return substr($packet, $offset - $i - 1, $i);
return substr($packet, $offset - $i - 1, $i);
复制
已复制
复制
已复制
} else {
} else {
复制
已复制
复制
已复制
$i = $length;
$i = $length;
复制
已复制
复制
已复制
if ($len - $offset < $length)
if ($len - $offset < $length)
复制
已复制
复制
已复制
$i = $len - $offset;
$i = $len - $offset;
复制
已复制
复制
已复制
$offset += $i;
$offset += $i;
复制
已复制
复制
已复制
return substr($packet, $offset - $i, $i);
return substr($packet, $offset - $i, $i);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
static function getByte($packet, &$offset) {
static function getByte($packet, &$offset) {
复制
已复制
复制
已复制
if ($offset >= strlen($packet))
if ($offset >= strlen($packet))
复制
已复制
复制
已复制
return 0;
return 0;
复制
已复制
复制
已复制
$char = unpack('cchar', $packet[$offset]);
$char = unpack('cchar', $packet[$offset]);
复制
已复制
复制
已复制
$offset++;
$offset++;
复制
已复制
复制
已复制
return $char['char'];
return $char['char'];
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
static function getShort($packet, &$offset) {
static function getShort($packet, &$offset) {
复制
已复制
复制
已复制
if ($offset + 2 >= strlen($packet))
if ($offset + 2 >= strlen($packet))
复制
已复制
复制
已复制
return 0;
return 0;
复制
已复制
复制
已复制
$short = unpack('sshort', substr($packet, $offset, 2));
$short = unpack('sshort', substr($packet, $offset, 2));
复制
已复制
复制
已复制
$offset += 2;
$offset += 2;
复制
已复制
复制
已复制
return $short['short'];
return $short['short'];
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
static function getInt($packet, &$offset) {
static function getInt($packet, &$offset) {
复制
已复制
复制
已复制
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
复制
已复制
复制
已复制
return 0;
return 0;
复制
已复制
复制
已复制
$int = unpack('iint', substr($packet, $offset, 4));
$int = unpack('iint', substr($packet, $offset, 4));
复制
已复制
复制
已复制
$offset += 4;
$offset += 4;
复制
已复制
复制
已复制
return $int['int'];
return $int['int'];
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
static function getFloat($packet, &$offset) {
static function getFloat($packet, &$offset) {
复制
已复制
复制
已复制
if ($offset + 4 >= strlen($packet))
if ($offset + 4 >= strlen($packet))
复制
已复制
复制
已复制
return ((float)0.0);
return ((float)0.0);
复制
已复制
复制
已复制
$float = unpack('ffloat', substr($packet, $offset, 4));
$float = unpack('ffloat', substr($packet, $offset, 4));
复制
已复制
复制
已复制
$offset += 4;
$offset += 4;
复制
已复制
复制
已复制
return ((float)$float['float']);
return ((float)$float['float']);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
class LiveStats {
class LiveStats {
复制
已复制
复制
已复制
var $IP;
var $IP;
复制
已复制
复制
已复制
var $Port;
var $Port;
复制
已复制
复制
已复制
var $Sock;
var $Sock;
复制
已复制
复制
已复制
var $Challenge = "\xFF\xFF\xFF\xFF";
var $Challenge = "\xFF\xFF\xFF\xFF";
复制
已复制
复制
已复制
var $HaveInfo = false;
var $HaveInfo = false;
复制
已复制
复制
已复制
var $HavePlayer = false;
var $HavePlayer = false;
复制
已复制
复制
已复制
var $HaveRules = false;
var $HaveRules = false;
复制
已复制
复制
已复制
var $ResendPlayer = false;
var $ResendPlayer = false;
复制
已复制
复制
已复制
var $ResendRules = false;
var $ResendRules = false;
复制
已复制
复制
已复制
var $SendQueue = array();
var $SendQueue = array();
复制
已复制
复制
已复制
var $MaxExecutionTime = 2;
var $MaxExecutionTime = 2;
复制
已复制
复制
已复制
var $SplittedPackets = array();
var $SplittedPackets = array();
复制
已复制
复制
已复制
var $SAMPHeader = "SAMP";
var $SAMPHeader = "SAMP";
复制
已复制
复制
已复制
复制
已复制
复制
已复制
var $Server;
var $Server;
复制
已复制
复制
已复制
复制
已复制
复制
已复制
public function __construct($hostname, $port = 27015) {
public function __construct($hostname, $port = 27015) {
复制
已复制
复制
已复制
$this->IP = gethostbyname($hostname);
$this->IP = gethostbyname($hostname);
复制
已复制
复制
已复制
$this->Port = $port;
$this->Port = $port;
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$errno = 0; $errstr = '';
$errno = 0; $errstr = '';
复制
已复制
复制
已复制
$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);
复制
已复制
复制
已复制
复制
已复制
复制
已复制
if ($this->Sock === false)
if ($this->Sock === false)
复制
已复制
复制
已复制
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
throw new LSError(1, "Could not connect to specified host [$errno]: $errstr.");
复制
已复制
复制
已复制
if (stream_set_blocking($this->Sock, false) == false)
if (stream_set_blocking($this->Sock, false) == false)
复制
已复制
复制
已复制
throw new LSError(2, "Could not set to non-blocking mode.");
throw new LSError(2, "Could not set to non-blocking mode.");
复制
已复制
复制
已复制
复制
已复制
复制
已复制
if (stream_set_timeout($this->Sock, 3) == false)
if (stream_set_timeout($this->Sock, 3) == false)
复制
已复制
复制
已复制
throw new LSError(3, "Could not set timeout to 10 seconds.");
throw new LSError(3, "Could not set timeout to 10 seconds.");
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$this->Server = new Server;
$this->Server = new Server;
复制
已复制
复制
已复制
$this->Server->Address = "{$this->IP}:{$this->Port}";
$this->Server->Address = "{$this->IP}:{$this->Port}";
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$ip = explode('.', $this->IP);
$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);
$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) {
function onSplittedPacketReceived($packet) {
复制
已复制
复制
已复制
$offset = 4;
$offset = 4;
复制
已复制
复制
已复制
$ReqID = Utils::getInt($packet, $offset);
$ReqID = Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
if (!isset($this->SplittedPackets[$ReqID])) {
if (!isset($this->SplittedPackets[$ReqID])) {
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID] = array(
$this->SplittedPackets[$ReqID] = array(
复制
已复制
复制
已复制
'Data' => array(),
'Data' => array(),
复制
已复制
复制
已复制
'Type' => -1,
'Type' => -1,
复制
已复制
复制
已复制
'Packets' => -1
'Packets' => -1
复制
已复制
复制
已复制
);
);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
$this->SplittedPackets[$ReqID]['Data'][] = $packet;
复制
已复制
复制
已复制
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
if (count($this->SplittedPackets[$ReqID]['Data']) == 2) {
复制
已复制
复制
已复制
$offset = 8;
$offset = 8;
复制
已复制
复制
已复制
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
$FB1 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][0], $offset);
复制
已复制
复制
已复制
$offset = 8;
$offset = 8;
复制
已复制
复制
已复制
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
$FB2 = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][1], $offset);
复制
已复制
复制
已复制
if ($FB1 != $FB2) {
if ($FB1 != $FB2) {
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Type'] = 0;
$this->SplittedPackets[$ReqID]['Type'] = 0;
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
$this->SplittedPackets[$ReqID]['Packets'] = ($FB1<<4)>>4;
复制
已复制
复制
已复制
} else {
} else {
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Type'] = 1;
$this->SplittedPackets[$ReqID]['Type'] = 1;
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
$this->SplittedPackets[$ReqID]['Packets'] = $FB1;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
if (count($this->SplittedPackets[$ReqID]['Data']) == $this->SplittedPackets[$ReqID]['Packets']) {
复制
已复制
复制
已复制
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
if ($this->SplittedPackets[$ReqID]['Type'] == 0) {
复制
已复制
复制
已复制
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
复制
已复制
复制
已复制
$offset = 8;
$offset = 8;
复制
已复制
复制
已复制
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset)>>4;
复制
已复制
复制
已复制
if ($i != $PckID) {
if ($i != $PckID) {
复制
已复制
复制
已复制
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
复制
已复制
复制
已复制
$i--;
$i--;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 13);
复制
已复制
复制
已复制
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
复制
已复制
复制
已复制
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 9);
复制
已复制
复制
已复制
} else {
} else {
复制
已复制
复制
已复制
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
for ($i = 0; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++) {
复制
已复制
复制
已复制
$offset = 9;
$offset = 9;
复制
已复制
复制
已复制
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
$PckID = Utils::getByte($this->SplittedPackets[$ReqID]['Data'][$i], $offset);
复制
已复制
复制
已复制
if ($i != $PckID) {
if ($i != $PckID) {
复制
已复制
复制
已复制
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
$aux = $this->SplittedPackets[$ReqID]['Data'][$PckID];
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
$this->SplittedPackets[$ReqID]['Data'][$PckID] = $this->SplittedPackets[$ReqID]['Data'][$i];
复制
已复制
复制
已复制
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
$this->SplittedPackets[$ReqID]['Data'][$i] = $aux;
复制
已复制
复制
已复制
$i--;
$i--;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
$packet = "\xFF\xFF\xFF\xFF" . substr($this->SplittedPackets[$ReqID]['Data'][0], 16);
复制
已复制
复制
已复制
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
for ($i = 1; $i < $this->SplittedPackets[$ReqID]['Packets']; $i++)
复制
已复制
复制
已复制
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
$packet .= substr($this->SplittedPackets[$ReqID]['Data'][$i], 12);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
unset($this->SplittedPackets[$ReqID]);
unset($this->SplittedPackets[$ReqID]);
复制
已复制
复制
已复制
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function onPacketReceived($packet) {
function onPacketReceived($packet) {
复制
已复制
复制
已复制
$offset = 4;
$offset = 4;
复制
已复制
复制
已复制
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
复制
已复制
复制
已复制
case 0x41: // challenge
case 0x41: // challenge
复制
已复制
复制
已复制
$this->Challenge = substr($packet, 5);
$this->Challenge = substr($packet, 5);
复制
已复制
复制
已复制
if ($this->ResendPlayer) {
if ($this->ResendPlayer) {
复制
已复制
复制
已复制
$this->ResendPlayer = false;
$this->ResendPlayer = false;
复制
已复制
复制
已复制
$this->requestPlayer();
$this->requestPlayer();
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
if ($this->ResendRules) {
if ($this->ResendRules) {
复制
已复制
复制
已复制
$this->ResendRules = false;
$this->ResendRules = false;
复制
已复制
复制
已复制
$this->requestRules();
$this->requestRules();
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
case 0x44: // player
case 0x44: // player
复制
已复制
复制
已复制
if ($this->HavePlayer)
if ($this->HavePlayer)
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$offset = 5;
$offset = 5;
复制
已复制
复制
已复制
$numplayers = Utils::getByte($packet, $offset);
$numplayers = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
while ($numplayers) {
while ($numplayers) {
复制
已复制
复制
已复制
$Player = new Player;
$Player = new Player;
复制
已复制
复制
已复制
$Player->ID = Utils::getByte($packet, $offset);
$Player->ID = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$Player->Name = Utils::getString($packet, $offset);
$Player->Name = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$len = strlen($Player->Name);
$len = strlen($Player->Name);
复制
已复制
复制
已复制
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
$Player->TimePlayed = new Time(Utils::getFloat($packet, $offset));
复制
已复制
复制
已复制
$numplayers--;
$numplayers--;
复制
已复制
复制
已复制
复制
已复制
复制
已复制
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$this->HavePlayer = true;
$this->HavePlayer = true;
复制
已复制
复制
已复制
$this->ResendPlayer = false;
$this->ResendPlayer = false;
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
case 0x49: // info, source
case 0x49: // info, source
复制
已复制
复制
已复制
if ($this->HaveInfo)
if ($this->HaveInfo)
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$offset = 5;
$offset = 5;
复制
已复制
复制
已复制
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->AppID = Utils::getShort($packet, $offset);
$this->Server->AppID = Utils::getShort($packet, $offset);
复制
已复制
复制
已复制
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
复制
已复制
复制
已复制
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
复制
已复制
复制
已复制
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
复制
已复制
复制
已复制
$this->Server->Secured = (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);
$TheShipAppIDs = array(2400, 2401, 2402, 2412, 2430, 2406, 2405, 2403);
复制
已复制
复制
已复制
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
if (in_array($this->Server->AppID, $TheShipAppIDs)) {
复制
已复制
复制
已复制
$gm = Utils::getByte($packet, $offset);
$gm = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
$GameModes = array('Hunt', 'Elimination', 'Duel', 'Deathmatch', 'Team VIP', 'Team Elimination');
复制
已复制
复制
已复制
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
$this->Server->GameMode = (isset($GameModes[$gm]) ? $GameModes[$gm] : 'Unknown');
复制
已复制
复制
已复制
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
$this->Server->WitnessCount = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
$this->Server->WitnessTime = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$this->Server->GameVersion = Utils::getString($packet, $offset);
$this->Server->GameVersion = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->HaveInfo = true;
$this->HaveInfo = true;
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
case 0x6D: // info, goldsource
case 0x6D: // info, goldsource
复制
已复制
复制
已复制
if ($this->HaveInfo)
if ($this->HaveInfo)
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$offset = 5;
$offset = 5;
复制
已复制
复制
已复制
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Hostname = Utils::getString($packet, $offset);
$this->Server->Hostname = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Map = Utils::getString($packet, $offset);
$this->Server->Map = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Directory = Utils::getString($packet, $offset);
$this->Server->Directory = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Description = Utils::getString($packet, $offset);
$this->Server->Description = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
$this->Server->PlayerCount = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
$this->Server->MaxPlayers = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
$this->Server->ProtocolVersion = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
$this->Server->Dedicated = (Utils::getByte($packet, $offset) == ord('d') ? true : false);
复制
已复制
复制
已复制
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
$this->Server->OS = (Utils::getByte($packet, $offset) == 'l' ? 'Linux' : 'Windows');
复制
已复制
复制
已复制
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
$this->Server->AppID = ($this->Server->OS == 'Linux' ? 4 : 5);
复制
已复制
复制
已复制
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
复制
已复制
复制
已复制
$IsMod = Utils::getByte($packet, $offset);
$IsMod = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
if ($IsMod == 1) {
if ($IsMod == 1) {
复制
已复制
复制
已复制
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
复制
已复制
复制
已复制
Utils::getString($packet, $offset);
Utils::getString($packet, $offset);
复制
已复制
复制
已复制
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
Utils::getInt($packet, $offset);
Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
Utils::getByte($packet, $offset);
Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->Secured = (Utils::getByte($packet, $offset) == 1 ? true : false);
复制
已复制
复制
已复制
$this->Server->BotCount = Utils::getByte($packet, $offset);
$this->Server->BotCount = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$this->HaveInfo = true;
$this->HaveInfo = true;
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
case 0x45: // rules
case 0x45: // rules
复制
已复制
复制
已复制
if ($this->HaveRules)
if ($this->HaveRules)
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$offset = 5;
$offset = 5;
复制
已复制
复制
已复制
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
复制
已复制
复制
已复制
while ($rulesnum) {
while ($rulesnum) {
复制
已复制
复制
已复制
$Name = Utils::getString($packet, $offset);
$Name = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$Value = Utils::getString($packet, $offset);
$Value = Utils::getString($packet, $offset);
复制
已复制
复制
已复制
$rulesnum--;
$rulesnum--;
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$this->HaveRules = true;
$this->HaveRules = true;
复制
已复制
复制
已复制
$this->ResendRules = false;
$this->ResendRules = false;
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
default:
default:
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function onSampPacketReceived($packet) {
function onSampPacketReceived($packet) {
复制
已复制
复制
已复制
$offset = 10;
$offset = 10;
复制
已复制
复制
已复制
switch (Utils::getByte($packet, $offset)) {
switch (Utils::getByte($packet, $offset)) {
复制
已复制
复制
已复制
case 0x69: // info
case 0x69: // info
复制
已复制
复制
已复制
if ($this->HaveInfo)
if ($this->HaveInfo)
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
$this->Server->PasswordProtected = (Utils::getByte($packet, $offset) == 1 ? true : false);
复制
已复制
复制
已复制
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
$this->Server->PlayerCount = Utils::getShort($packet, $offset);
复制
已复制
复制
已复制
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
$this->Server->MaxPlayers = Utils::getShort($packet, $offset);
复制
已复制
复制
已复制
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
$this->Server->Hostname = Utils::getString($packet, $offset, $len);
复制
已复制
复制
已复制
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
$this->Server->GameMode = Utils::getString($packet, $offset, $len);
复制
已复制
复制
已复制
$len = Utils::getInt($packet, $offset);
$len = Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
$this->Server->Map = Utils::getString($packet, $offset, $len);
$this->Server->Map = Utils::getString($packet, $offset, $len);
复制
已复制
复制
已复制
$this->HaveInfo = true;
$this->HaveInfo = true;
复制
已复制
复制
已复制
if ($this->Server->PlayerCount >= 100)
if ($this->Server->PlayerCount >= 100)
复制
已复制
复制
已复制
$this->HavePlayer = true;
$this->HavePlayer = true;
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
case 0x72: // rules
case 0x72: // rules
复制
已复制
复制
已复制
if ($this->HaveRules)
if ($this->HaveRules)
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$rulesnum = Utils::getShort($packet, $offset);
$rulesnum = Utils::getShort($packet, $offset);
复制
已复制
复制
已复制
while ($rulesnum) {
while ($rulesnum) {
复制
已复制
复制
已复制
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$Name = Utils::getString($packet, $offset, $len);
$Name = Utils::getString($packet, $offset, $len);
复制
已复制
复制
已复制
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$Value = Utils::getString($packet, $offset, $len);
$Value = Utils::getString($packet, $offset, $len);
复制
已复制
复制
已复制
$rulesnum--;
$rulesnum--;
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$this->Server->Rules[$Name] = $Value;
$this->Server->Rules[$Name] = $Value;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$this->HaveRules = true;
$this->HaveRules = true;
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
case 0x64: // player
case 0x64: // player
复制
已复制
复制
已复制
if ($this->HavePlayer)
if ($this->HavePlayer)
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$numplayers = Utils::getShort($packet, $offset);
$numplayers = Utils::getShort($packet, $offset);
复制
已复制
复制
已复制
$lastID = 0;
$lastID = 0;
复制
已复制
复制
已复制
$plusID = 0;
$plusID = 0;
复制
已复制
复制
已复制
while ($numplayers) {
while ($numplayers) {
复制
已复制
复制
已复制
$Player = new Player;
$Player = new Player;
复制
已复制
复制
已复制
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
$Player->ID = Utils::getByte($packet, $offset) + $plusID;
复制
已复制
复制
已复制
if ($Player->ID < $lastID) {
if ($Player->ID < $lastID) {
复制
已复制
复制
已复制
$Player->ID += 256;
$Player->ID += 256;
复制
已复制
复制
已复制
$plusID += 256;
$plusID += 256;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$lastID = $Player->ID;
$lastID = $Player->ID;
复制
已复制
复制
已复制
$len = Utils::getByte($packet, $offset);
$len = Utils::getByte($packet, $offset);
复制
已复制
复制
已复制
$Player->Name = Utils::getString($packet, $offset, $len);
$Player->Name = Utils::getString($packet, $offset, $len);
复制
已复制
复制
已复制
$len = strlen($Player->Name);
$len = strlen($Player->Name);
复制
已复制
复制
已复制
$Player->Score = Utils::getInt($packet, $offset);
$Player->Score = Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
$Player->Ping = Utils::getInt($packet, $offset);
$Player->Ping = Utils::getInt($packet, $offset);
复制
已复制
复制
已复制
$numplayers--;
$numplayers--;
复制
已复制
复制
已复制
复制
已复制
复制
已复制
array_push($this->Server->Players, $Player);
array_push($this->Server->Players, $Player);
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
$this->HavePlayer = true;
$this->HavePlayer = true;
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
default:
default:
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function requestInfo() {
function requestInfo() {
复制
已复制
复制
已复制
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
array_push($this->SendQueue, "\xFF\xFF\xFF\xFFTSource Engine Query\x00");
复制
已复制
复制
已复制
array_push($this->SendQueue, $this->SAMPHeader . "i");
array_push($this->SendQueue, $this->SAMPHeader . "i");
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function requestPlayer() {
function requestPlayer() {
复制
已复制
复制
已复制
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x55" . $this->Challenge);
复制
已复制
复制
已复制
array_push($this->SendQueue, $this->SAMPHeader . "d");
array_push($this->SendQueue, $this->SAMPHeader . "d");
复制
已复制
复制
已复制
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
复制
已复制
复制
已复制
$this->ResendPlayer = true;
$this->ResendPlayer = true;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function requestRules() {
function requestRules() {
复制
已复制
复制
已复制
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
array_push($this->SendQueue, "\xFF\xFF\xFF\xFF\x56" . $this->Challenge);
复制
已复制
复制
已复制
array_push($this->SendQueue, $this->SAMPHeader . "r");
array_push($this->SendQueue, $this->SAMPHeader . "r");
复制
已复制
复制
已复制
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
if ($this->Challenge == "\xFF\xFF\xFF\xFF")
复制
已复制
复制
已复制
$this->ResendRules = true;
$this->ResendRules = true;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
function GetServer() {
function GetServer() {
复制
已复制
复制
已复制
$start = Utils::getTime();
$start = Utils::getTime();
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$this->requestInfo();
$this->requestInfo();
复制
已复制
复制
已复制
$this->requestPlayer();
$this->requestPlayer();
复制
已复制
复制
已复制
$this->requestRules();
$this->requestRules();
复制
已复制
复制
已复制
复制
已复制
复制
已复制
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
while (!($this->HaveRules && $this->HaveInfo && $this->HavePlayer)) {
复制
已复制
复制
已复制
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
if (Utils::getTime() - $start >= $this->MaxExecutionTime) {
复制
已复制
复制
已复制
if ($this->HaveInfo && $this->HavePlayer) {
if ($this->HaveInfo && $this->HavePlayer) {
复制
已复制
复制
已复制
$this->HaveRules = true;
$this->HaveRules = true;
复制
已复制
复制
已复制
} else {
} else {
复制
已复制
复制
已复制
throw new LSError(4, "Timed out.");
throw new LSError(4, "Timed out.");
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
if (count($this->SendQueue) > 0) {
if (count($this->SendQueue) > 0) {
复制
已复制
复制
已复制
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
stream_socket_sendto($this->Sock, array_shift($this->SendQueue));
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
复制
已复制
复制
已复制
if ($meta['timed_out'])
if ($meta['timed_out'])
复制
已复制
复制
已复制
throw new LSError(5, "Timed out.");
throw new LSError(5, "Timed out.");
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
复制
已复制
复制
已复制
usleep(50000);
usleep(50000);
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$packet = fread($this->Sock, 2048);
$packet = fread($this->Sock, 2048);
复制
已复制
复制
已复制
复制
已复制
复制
已复制
$meta = stream_get_meta_data($this->Sock);
$meta = stream_get_meta_data($this->Sock);
复制
已复制
复制
已复制
if ($meta['timed_out'])
if ($meta['timed_out'])
复制
已复制
复制
已复制
throw new LSError(6, "Timed out.");
throw new LSError(6, "Timed out.");
复制
已复制
复制
已复制
复制
已复制
复制
已复制
if (strlen($packet) > 0) {
if (strlen($packet) > 0) {
复制
已复制
复制
已复制
$offset = 0;
$offset = 0;
复制
已复制
复制
已复制
switch (Utils::getInt($packet, $offset)) {
switch (Utils::getInt($packet, $offset)) {
复制
已复制
复制
已复制
case HL_PACKET:
case HL_PACKET:
复制
已复制
复制
已复制
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$this->Server->Type = 1;
$this->Server->Type = 1;
复制
已复制
复制
已复制
$this->onPacketReceived($packet);
$this->onPacketReceived($packet);
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
case HL_PACKET_SPLITTED:
case HL_PACKET_SPLITTED:
复制
已复制
复制
已复制
if (!in_array($this->Server->Type, array(0, 1)))
if (!in_array($this->Server->Type, array(0, 1)))
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$this->Server->Type = 1;
$this->Server->Type = 1;
复制
已复制
复制
已复制
$this->onSplittedPacketReceived($packet);
$this->onSplittedPacketReceived($packet);
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
case SAMP_PACKET:
case SAMP_PACKET:
复制
已复制
复制
已复制
if (!in_array($this->Server->Type, array(0, 2)))
if (!in_array($this->Server->Type, array(0, 2)))
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
$this->Server->Type = 2;
$this->Server->Type = 2;
复制
已复制
复制
已复制
$this->onSampPacketReceived($packet);
$this->onSampPacketReceived($packet);
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
default:
default:
复制
已复制
复制
已复制
break;
break;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
return $this->Server;
return $this->Server;
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
}
}
复制
已复制
复制
已复制
?>
?>
已保存差异
原始文本
打开文件
<?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; } } ?>
更改后文本
打开文件
<?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; } } ?>
查找差异