mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-10-19 04:15:04 +00:00
Merge branch 'master' into 0.10
This commit is contained in:
@@ -74,6 +74,7 @@ use pocketmine\network\protocol\UpdateBlockPacket;
|
||||
use pocketmine\network\protocol\UseItemPacket;
|
||||
use pocketmine\Player;
|
||||
use pocketmine\Server;
|
||||
use pocketmine\utils\MainLogger;
|
||||
use pocketmine\utils\TextFormat;
|
||||
use raklib\protocol\EncapsulatedPacket;
|
||||
use raklib\RakLib;
|
||||
@@ -83,7 +84,8 @@ use raklib\server\ServerInstance;
|
||||
|
||||
class RakLibInterface implements ServerInstance, SourceInterface{
|
||||
|
||||
private $packetPool = [];
|
||||
/** @var \SplFixedArray */
|
||||
private $packetPool;
|
||||
|
||||
private $server;
|
||||
/** @var Player[] */
|
||||
@@ -120,8 +122,6 @@ class RakLibInterface implements ServerInstance, SourceInterface{
|
||||
}
|
||||
|
||||
public function doTick(){
|
||||
$this->cleanPacketPool();
|
||||
EncapsulatedPacket::cleanPacketPool();
|
||||
$this->interface->sendTick();
|
||||
}
|
||||
|
||||
@@ -175,9 +175,19 @@ class RakLibInterface implements ServerInstance, SourceInterface{
|
||||
|
||||
public function handleEncapsulated($identifier, EncapsulatedPacket $packet, $flags){
|
||||
if(isset($this->players[$identifier])){
|
||||
$pk = $this->getPacket($packet->buffer);
|
||||
$pk->decode();
|
||||
$this->players[$identifier]->handleDataPacket($pk);
|
||||
try{
|
||||
$pk = $this->getPacket($packet->buffer);
|
||||
$pk->decode();
|
||||
$this->players[$identifier]->handleDataPacket($pk);
|
||||
}catch (\Exception $e){
|
||||
if(\pocketmine\DEBUG > 1){
|
||||
$logger = $this->server->getLogger();
|
||||
if($logger instanceof MainLogger){
|
||||
$logger->logException($e);
|
||||
$logger->debug("Packet ".get_class($pk)." 0x".bin2hex($packet->buffer));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,7 +235,6 @@ class RakLibInterface implements ServerInstance, SourceInterface{
|
||||
$pk = null;
|
||||
if(!$packet->isEncoded){
|
||||
$packet->encode();
|
||||
unset($packet->__encapsulatedPacket);
|
||||
}elseif(!$needACK){
|
||||
if(!isset($packet->__encapsulatedPacket)){
|
||||
$packet->__encapsulatedPacket = new CachedEncapsulatedPacket;
|
||||
@@ -237,13 +246,11 @@ class RakLibInterface implements ServerInstance, SourceInterface{
|
||||
}
|
||||
|
||||
if($pk === null){
|
||||
$pk = EncapsulatedPacket::getPacketFromPool();
|
||||
$pk = new EncapsulatedPacket();
|
||||
$pk->buffer = $packet->buffer;
|
||||
$pk->reliability = 2;
|
||||
if($needACK === true){
|
||||
$pk->identifierACK = $this->identifiersACK[$identifier]++;
|
||||
}else{
|
||||
$pk->identifierACK = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,23 +272,17 @@ class RakLibInterface implements ServerInstance, SourceInterface{
|
||||
* @return DataPacket
|
||||
*/
|
||||
public function getPacketFromPool($id){
|
||||
if(isset($this->packetPool[$id])){
|
||||
/** @var DataPacket $class */
|
||||
$class = $this->packetPool[$id];
|
||||
return $class::getFromPool();
|
||||
/** @var DataPacket $class */
|
||||
$class = $this->packetPool[$id];
|
||||
if($class !== null){
|
||||
return new $class;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function cleanPacketPool(){
|
||||
foreach($this->packetPool as $class){
|
||||
/** @var DataPacket $class */
|
||||
$class::cleanPool();
|
||||
}
|
||||
}
|
||||
|
||||
private function registerPackets(){
|
||||
$this->packetPool = new \SplFixedArray(256);
|
||||
|
||||
$this->registerPacket(ProtocolInfo::LOGIN_PACKET, LoginPacket::class);
|
||||
$this->registerPacket(ProtocolInfo::LOGIN_STATUS_PACKET, LoginStatusPacket::class);
|
||||
$this->registerPacket(ProtocolInfo::MESSAGE_PACKET, MessagePacket::class);
|
||||
@@ -333,7 +334,7 @@ class RakLibInterface implements ServerInstance, SourceInterface{
|
||||
$pid = ord($buffer{0});
|
||||
|
||||
if(($data = $this->getPacketFromPool($pid)) === null){
|
||||
$data = UnknownPacket::getFromPool();
|
||||
$data = new UnknownPacket();
|
||||
$data->packetID = $pid;
|
||||
}
|
||||
$data->setBuffer(substr($buffer, 1));
|
||||
|
@@ -27,69 +27,11 @@ namespace pocketmine\network\protocol;
|
||||
use pocketmine\utils\Binary;
|
||||
#endif
|
||||
|
||||
use pocketmine\event\server\DataPacketSendEvent;
|
||||
use pocketmine\event\server\DataPacketReceiveEvent;
|
||||
use pocketmine\item\Item;
|
||||
use pocketmine\Player;
|
||||
|
||||
|
||||
abstract class DataPacket extends \stdClass{
|
||||
|
||||
/** @var DataPacket[] */
|
||||
public static $pool = [];
|
||||
public static $next = 0;
|
||||
|
||||
/** @var DataPacketSendEvent */
|
||||
private $sendEvent = null;
|
||||
/** @var DataPacketReceiveEvent */
|
||||
private $receiveEvent = null;
|
||||
|
||||
public static function getFromPool(){
|
||||
if(static::$next >= count(static::$pool)){
|
||||
static::$pool[] = new static;
|
||||
}
|
||||
return static::$pool[static::$next++]->clean();
|
||||
}
|
||||
|
||||
public static function cleanPool(){
|
||||
if(static::$next > 16384){
|
||||
static::$pool = [];
|
||||
}
|
||||
static::$next = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
*
|
||||
* @return DataPacketReceiveEvent
|
||||
*/
|
||||
public function getReceiveEvent(Player $player){
|
||||
if($this->receiveEvent === null){
|
||||
$this->receiveEvent = new DataPacketReceiveEvent($player, $this);
|
||||
}else{
|
||||
$this->receiveEvent->setCancelled(false);
|
||||
$this->receiveEvent->__construct($player, $this);
|
||||
}
|
||||
|
||||
return $this->receiveEvent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
*
|
||||
* @return DataPacketSendEvent
|
||||
*/
|
||||
public function getSendEvent(Player $player){
|
||||
if($this->sendEvent === null){
|
||||
$this->sendEvent = new DataPacketSendEvent($player, $this);
|
||||
}else{
|
||||
$this->sendEvent->setCancelled(false);
|
||||
$this->sendEvent->__construct($player, $this);
|
||||
}
|
||||
|
||||
return $this->sendEvent;
|
||||
}
|
||||
|
||||
private $offset = 0;
|
||||
public $buffer = "";
|
||||
public $isEncoded = false;
|
||||
@@ -115,20 +57,14 @@ abstract class DataPacket extends \stdClass{
|
||||
}
|
||||
|
||||
protected function get($len){
|
||||
if($len <= 0){
|
||||
if($len < 0){
|
||||
$this->offset = strlen($this->buffer) - 1;
|
||||
|
||||
return "";
|
||||
}elseif($len === true){
|
||||
return substr($this->buffer, $this->offset);
|
||||
}
|
||||
|
||||
$buffer = "";
|
||||
for(; $len > 0; --$len, ++$this->offset){
|
||||
$buffer .= $this->buffer{$this->offset};
|
||||
}
|
||||
|
||||
return $buffer;
|
||||
return $len === 1 ? $this->buffer{$this->offset++} : substr($this->buffer, ($this->offset += $len) - $len, $len);
|
||||
}
|
||||
|
||||
protected function put($str){
|
||||
@@ -177,11 +113,11 @@ abstract class DataPacket extends \stdClass{
|
||||
|
||||
|
||||
protected function getLTriad(){
|
||||
return Binary::readTriad(strrev($this->get(3)));
|
||||
return Binary::readLTriad($this->get(3));
|
||||
}
|
||||
|
||||
protected function putLTriad($v){
|
||||
$this->buffer .= strrev(Binary::writeTriad($v));
|
||||
$this->buffer .= Binary::writeLTriad($v);
|
||||
}
|
||||
|
||||
protected function getByte(){
|
||||
|
@@ -58,7 +58,7 @@ class QueryHandler{
|
||||
}
|
||||
|
||||
public function regenerateInfo(){
|
||||
$this->server->getPluginManager()->callEvent($ev = QueryRegenerateEvent::createEvent($this->server, 5));
|
||||
$this->server->getPluginManager()->callEvent($ev = new QueryRegenerateEvent($this->server, 5));
|
||||
$this->longData = $ev->getLongQuery();
|
||||
$this->shortData = $ev->getShortQuery();
|
||||
$this->timeout = microtime(true) + $ev->getTimeout();
|
||||
|
@@ -94,7 +94,7 @@ class RCON{
|
||||
$response = new RemoteConsoleCommandSender();
|
||||
$command = $this->workers[$n]->cmd;
|
||||
|
||||
$this->server->getPluginManager()->callEvent($ev = RemoteServerCommandEvent::createEvent($response, $command));
|
||||
$this->server->getPluginManager()->callEvent($ev = new RemoteServerCommandEvent($response, $command));
|
||||
|
||||
if(!$ev->isCancelled()){
|
||||
$this->server->dispatchCommand($ev->getSender(), $ev->getCommand());
|
||||
|
Reference in New Issue
Block a user