Merge branch 'master' into 0.10

This commit is contained in:
Shoghi Cervantes
2014-11-05 19:04:36 +01:00
106 changed files with 1022 additions and 1138 deletions

View File

@@ -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));

View File

@@ -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(){

View File

@@ -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();

View File

@@ -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());