public function handle($address, $port, $packet)
{
$offset = 2;
$packetType = ord($packet[$offset++]);
$sessionID = Binary::readInt(substr($packet, $offset, 4));
$offset += 4;
$payload = substr($packet, $offset);
switch ($packetType) {
case self::HANDSHAKE:
//Handshake
$reply = chr(self::HANDSHAKE);
$reply .= Binary::writeInt($sessionID);
$reply .= self::getTokenString($this->token, $address) . "";
$this->server->getNetwork()->sendPacket($address, $port, $reply);
break;
case self::STATISTICS:
//Stat
$token = Binary::readInt(substr($payload, 0, 4));
if ($token !== self::getTokenString($this->token, $address) and $token !== self::getTokenString($this->lastToken, $address)) {
break;
}
$reply = chr(self::STATISTICS);
$reply .= Binary::writeInt($sessionID);
if ($this->timeout < microtime(true)) {
$this->regenerateInfo();
}
if (strlen($payload) === 8) {
$reply .= $this->longData;
} else {
$reply .= $this->shortData;
}
$this->server->getNetwork()->sendPacket($address, $port, $reply);
break;
}
}
/** * @param string $address * @param int $port * @param string $payload * * TODO: move this to Network */ public function handlePacket($address, $port, $payload) { try { if (strlen($payload) > 2 and substr($payload, 0, 2) === "þý" and $this->queryHandler instanceof QueryHandler) { $this->queryHandler->handle($address, $port, $payload); } } catch (\Exception $e) { if (\pocketmine\DEBUG > 1) { if ($this->logger instanceof MainLogger) { $this->logger->logException($e); } } $this->getNetwork()->blockAddress($address, 600); } //TODO: add raw packet events }