Things are working ヽ༼ຈل͜ຈ༽ノ

This commit is contained in:
Shoghi Cervantes 2014-03-31 05:04:36 +02:00
parent 2b8df410d1
commit 1ff381ebf4
8 changed files with 220 additions and 96 deletions

View File

@ -253,17 +253,19 @@ class Player extends RealHuman implements CommandSender{
*/
public function __construct($clientID, $ip, $port, $MTU){
$this->perm = new PermissibleBase($this);
$this->namedtag = new Compound();
$this->bigCnt = 0;
$this->MTU = $MTU;
$this->server = Server::getInstance();
$this->lastBreak = microtime(true);
$this->clientID = $clientID;
$this->CID = $ip . ":" . $port;
Player::$list[$this->CID] = $this;
$this->ip = $ip;
$this->port = $port;
$this->spawnPosition = Level::getDefault()->getSafeSpawn();
$this->timeout = microtime(true) + 20;
$this->gamemode = $this->server->gamemode;
$this->gamemode = $this->server->getGamemode();
$this->level = Level::getDefault();
$this->viewDistance = $this->server->getViewDistance();
$this->slot = 0;
@ -381,7 +383,7 @@ class Player extends RealHuman implements CommandSender{
$distance = @$this->chunksOrder[$index];
if($index === null or $distance === null){
if($this->chunkScheduled === 0){
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk")), 60);
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk"), array(false, true)), 60);
}
return false;
@ -392,7 +394,7 @@ class Player extends RealHuman implements CommandSender{
if(!$this->level->isChunkPopulated($X, $Z)){
$this->orderChunks();
if($this->chunkScheduled === 0 or $force === true){
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk")), MAX_CHUNK_RATE);
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk"), array(false, true)), MAX_CHUNK_RATE);
++$this->chunkScheduled;
}
@ -421,7 +423,7 @@ class Player extends RealHuman implements CommandSender{
$this->lastChunk = array($X, $Z);
if($this->chunkScheduled === 0 or $force === true){
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk")), MAX_CHUNK_RATE);
$this->server->getScheduler()->scheduleDelayedTask(new CallbackTask(array($this, "getNextChunk"), array(false, true)), MAX_CHUNK_RATE);
++$this->chunkScheduled;
}
}
@ -1063,7 +1065,7 @@ class Player extends RealHuman implements CommandSender{
return;
}
if($this->server->isWhitelisted(strtolower($this->getName()))){
if(!$this->server->isWhitelisted(strtolower($this->getName()))){
$this->close($this->username . " has left the game", "Server is white-listed");
return;
@ -1180,7 +1182,6 @@ class Player extends RealHuman implements CommandSender{
//$this->heal($this->data->get("health"), "spawn", true);
$this->spawned = true;
$this->spawnToAll();
$this->sendMessage($this->server->getMotd() . "\n");
$this->sendInventory();
$this->sendSettings();
@ -2045,7 +2046,9 @@ class Player extends RealHuman implements CommandSender{
if($this->connected === true){
if($this->username != ""){
$this->server->getPluginManager()->callEvent($ev = new Event\Player\PlayerQuitEvent($this, $message));
$this->save();
if($this->loggedIn === true){
$this->save();
}
}
$this->sendBuffer();

View File

@ -40,6 +40,8 @@ use PocketMine\Item\Item;
use PocketMine\Level\Generator\Generator;
use PocketMine\Level\Level;
use PocketMine\Network\Packet;
use PocketMine\Network\RakNet\Info as RakNetInfo;
use PocketMine\Network\RakNet\Packet as RakNetPacket;
use PocketMine\Network\Query\QueryHandler;
use PocketMine\Network\Query\QueryPacket;
use PocketMine\Network\ThreadedHandler;
@ -342,7 +344,7 @@ class Server{
* @return string
*/
public function getMotd(){
return $this->getConfigString("motd", "");
return $this->getConfigString("motd", "Minecraft: PE Server");
}
/**
@ -455,6 +457,7 @@ class Server{
}else{
$value = $this->properties->exists($variable) ? $this->properties->get($variable) : $defaultValue;
}
if(is_bool($value)){
return $value;
}
@ -601,7 +604,7 @@ class Server{
@mkdir($this->pluginPath, 0777);
$this->operators = new Config($this->dataPath . "ops.txt", Config::ENUM);
$this->whitelist = new Config($this->dataPath . "whitelist.txt", Config::ENUM);
$this->whitelist = new Config($this->dataPath . "white-list.txt", Config::ENUM);
if(file_exists($this->dataPath . "banned.txt") and !file_exists($this->dataPath . "banned-players.txt")){
@rename($this->dataPath . "banned.txt", $this->dataPath . "banned-players.txt");
}
@ -617,8 +620,7 @@ class Server{
console("[INFO] Loading properties...");
$this->properties = new Config($this->dataPath . "server.properties", Config::PROPERTIES, array(
"server-name" => "Minecraft: PE Server",
"motd" => "Welcome @player to this server!",
"motd" => "Minecraft: PE Server",
"server-port" => 19132,
"memory-limit" => "128M",
"white-list" => false,
@ -887,6 +889,51 @@ class Server{
public function handlePacket(Packet $packet){
if($packet instanceof QueryPacket and isset($this->queryHandler)){
$this->queryHandler->handle($packet);
}elseif($packet instanceof RakNetPacket){
$CID = $packet->ip . ":" . $packet->port;
if(isset(Player::$list[$CID])){
Player::$list[$CID]->handlePacket($packet);
}else{
switch($packet->pid()){
case RakNetInfo::UNCONNECTED_PING:
case RakNetInfo::UNCONNECTED_PING_OPEN_CONNECTIONS:
$pk = new RakNetPacket(RakNetInfo::UNCONNECTED_PONG);
$pk->pingID = $packet->pingID;
$pk->serverID = $this->serverID;
$pk->serverType = "MCCPP;Demo;" . $this->getMotd() . " [" . count(Player::$list) . "/" . $this->getMaxPlayers() . "]";
$pk->ip = $packet->ip;
$pk->port = $packet->port;
$this->sendPacket($pk);
break;
case RakNetInfo::OPEN_CONNECTION_REQUEST_1:
if($packet->structure !== RakNetInfo::STRUCTURE){
console("[DEBUG] Incorrect structure #" . $packet->structure . " from " . $packet->ip . ":" . $packet->port, true, true, 2);
$pk = new RakNetPacket(RakNetInfo::INCOMPATIBLE_PROTOCOL_VERSION);
$pk->serverID = $this->serverID;
$pk->ip = $packet->ip;
$pk->port = $packet->port;
$this->sendPacket($pk);
}else{
$pk = new RakNetPacket(RakNetInfo::OPEN_CONNECTION_REPLY_1);
$pk->serverID = $this->serverID;
$pk->mtuSize = strlen($packet->buffer);
$pk->ip = $packet->ip;
$pk->port = $packet->port;
$this->sendPacket($pk);
}
break;
case RakNetInfo::OPEN_CONNECTION_REQUEST_2:
new Player($packet->clientID, $packet->ip, $packet->port, $packet->mtuSize); //New Session!
$pk = new RakNetPacket(RakNetInfo::OPEN_CONNECTION_REPLY_2);
$pk->serverID = $this->serverID;
$pk->serverPort = $this->getPort();
$pk->mtuSize = $packet->mtuSize;
$pk->ip = $packet->ip;
$pk->port = $packet->port;
$this->sendPacket($pk);
break;
}
}
}
}

View File

@ -27,6 +27,7 @@ namespace PocketMine\Network;
use PocketMine\Network\Query\QueryPacket;
use PocketMine\Network\RakNet\Info;
use PocketMine\Network\RakNet\Packet as RakNetPacket;
use PocketMine\Server;
class ThreadedHandler extends \Thread{
protected $bandwidthUp;
@ -61,7 +62,7 @@ class ThreadedHandler extends \Thread{
}
public function close(){
$this->synchronized(function (){
$this->synchronized(function(){
$this->stop = true;
socket_close($this->socket);
});
@ -73,9 +74,7 @@ class ThreadedHandler extends \Thread{
* @return float
*/
public function getUploadSpeed(){
return $this->synchronized(function (){
return $this->bandwidthUp / max(1, microtime(true) - $this->bandwidthTime);
});
return $this->bandwidthUp / max(1, microtime(true) - $this->bandwidthTime);
}
/**
@ -84,9 +83,7 @@ class ThreadedHandler extends \Thread{
* @return float
*/
public function getDownloadSpeed(){
return $this->synchronized(function (){
return $this->bandwidthDown / max(1, microtime(true) - $this->bandwidthTime);
});
return $this->bandwidthDown / max(1, microtime(true) - $this->bandwidthTime);
}
@ -94,10 +91,7 @@ class ThreadedHandler extends \Thread{
* @return Packet
*/
public function readPacket(){
return $this->packets->synchronized(function (){
//$this->notify();
return $this->packets->shift();
});
return $this->packets->shift();
}
/**
@ -106,15 +100,17 @@ class ThreadedHandler extends \Thread{
* @return int
*/
public function writePacket(Packet $packet){
return $this->queue->synchronized(function ($packet){
$this->queue[] = $packet;
//$this->notify();
return strlen($packet->buffer);
}, $packet);
$this->queue[] = $packet;
return strlen($packet->buffer);
}
public function run(){
$autoloader = new \SplClassLoader();
$autoloader->add("PocketMine", array(
\PocketMine\PATH . "src"
));
$autoloader->register(true);
$this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($this->socket, SOL_SOCKET, SO_BROADCAST, 1); //Allow sending broadcast messages
if(@socket_bind($this->socket, $this->serverip, $this->port) === true){
@ -142,10 +138,7 @@ class ThreadedHandler extends \Thread{
}
private function putPacket(){
if(($packet = $this->queue->synchronized(function (){
return $this->queue->shift();
})) instanceof Packet
){
if(($packet = $this->queue->shift()) instanceof Packet){
if($packet instanceof RakNetPacket){
$packet->encode();
}
@ -184,9 +177,7 @@ class ThreadedHandler extends \Thread{
$packet->port = $port;
$packet->buffer =& $buffer;
}
$this->packets->synchronized(function (Packet $packet){
$this->packets[] = $packet;
}, $packet);
$this->packets[] = $packet;
return true;
}

View File

@ -21,11 +21,66 @@
namespace PocketMine\Network\RakNet;
use PocketMine\Network;
use PocketMine\Network\Packet as NetworkPacket;
use PocketMine\Network\Protocol\AddEntityPacket;
use PocketMine\Network\Protocol\AddItemEntityPacket;
use PocketMine\Network\Protocol\AddMobPacket;
use PocketMine\Network\Protocol\AddPaintingPacket;
use PocketMine\Network\Protocol\AddPlayerPacket;
use PocketMine\Network\Protocol\AdventureSettingsPacket;
use PocketMine\Network\Protocol\AnimatePacket;
use PocketMine\Network\Protocol\ChatPacket;
use PocketMine\Network\Protocol\ChunkDataPacket;
use PocketMine\Network\Protocol\ClientConnectPacket;
use PocketMine\Network\Protocol\ContainerClosePacket;
use PocketMine\Network\Protocol\ContainerOpenPacket;
use PocketMine\Network\Protocol\ContainerSetContentPacket;
use PocketMine\Network\Protocol\ContainerSetDataPacket;
use PocketMine\Network\Protocol\ContainerSetSlotPacket;
use PocketMine\Network\Protocol\DataPacket;
use PocketMine\Network\Protocol\DisconnectPacket;
use PocketMine\Network\Protocol\DropItemPacket;
use PocketMine\Network\Protocol\EntityDataPacket;
use PocketMine\Network\Protocol\EntityEventPacket;
use PocketMine\Network\Protocol\ExplodePacket;
use PocketMine\Network\Protocol\HurtArmorPacket;
use PocketMine\Network\Protocol\Info as ProtocolInfo;
use PocketMine\Network\Protocol\InteractPacket;
use PocketMine\Network\Protocol\LevelEventPacket;
use PocketMine\Network\Protocol\LoginPacket;
use PocketMine\Network\Protocol\LoginStatusPacket;
use PocketMine\Network\Protocol\MessagePacket;
use PocketMine\Network\Protocol\MoveEntityPacket;
use PocketMine\Network\Protocol\MoveEntityPacket_PosRot;
use PocketMine\Network\Protocol\MovePlayerPacket;
use PocketMine\Network\Protocol\PingPacket;
use PocketMine\Network\Protocol\PlayerActionPacket;
use PocketMine\Network\Protocol\PlayerArmorEquipmentPacket;
use PocketMine\Network\Protocol\PlayerEquipmentPacket;
use PocketMine\Network\Protocol\PongPacket;
use PocketMine\Network\Protocol\ReadyPacket;
use PocketMine\Network\Protocol\RemoveBlockPacket;
use PocketMine\Network\Protocol\RemoveEntityPacket;
use PocketMine\Network\Protocol\RemovePlayerPacket;
use PocketMine\Network\Protocol\RequestChunkPacket;
use PocketMine\Network\Protocol\RespawnPacket;
use PocketMine\Network\Protocol\RotateHeadPacket;
use PocketMine\Network\Protocol\SendInventoryPacket;
use PocketMine\Network\Protocol\ServerHandshakePacket;
use PocketMine\Network\Protocol\SetEntityDataPacket;
use PocketMine\Network\Protocol\SetEntityMotionPacket;
use PocketMine\Network\Protocol\SetHealthPacket;
use PocketMine\Network\Protocol\SetSpawnPositionPacket;
use PocketMine\Network\Protocol\SetTimePacket;
use PocketMine\Network\Protocol\StartGamePacket;
use PocketMine\Network\Protocol\TakeItemEntityPacket;
use PocketMine\Network\Protocol\TileEventPacket;
use PocketMine\Network\Protocol\UnknownPacket;
use PocketMine\Network\Protocol\UpdateBlockPacket;
use PocketMine\Network\Protocol\UseItemPacket;
use PocketMine\Utils\Utils;
class Packet extends Network\Packet{
class Packet extends NetworkPacket{
private $packetID;
private $offset = 1;
public $data = array();
@ -196,166 +251,166 @@ class Packet extends Network\Packet{
}
switch($pid){
case ProtocolInfo::PING_PACKET:
$data = new Network\Protocol\PingPacket;
$data = new PingPacket();
break;
case ProtocolInfo::PONG_PACKET:
$data = new Network\Protocol\PongPacket;
$data = new PongPacket();
break;
case ProtocolInfo::CLIENT_CONNECT_PACKET:
$data = new Network\Protocol\ClientConnectPacket;
$data = new ClientConnectPacket();
break;
case ProtocolInfo::SERVER_HANDSHAKE_PACKET:
$data = new Network\Protocol\ServerHandshakePacket;
$data = new ServerHandshakePacket();
break;
case ProtocolInfo::DISCONNECT_PACKET:
$data = new Network\Protocol\DisconnectPacket;
$data = new DisconnectPacket();
break;
case ProtocolInfo::LOGIN_PACKET:
$data = new Network\Protocol\LoginPacket;
$data = new LoginPacket();
break;
case ProtocolInfo::LOGIN_STATUS_PACKET:
$data = new Network\Protocol\LoginStatusPacket;
$data = new LoginStatusPacket();
break;
case ProtocolInfo::READY_PACKET:
$data = new Network\Protocol\ReadyPacket;
$data = new ReadyPacket();
break;
case ProtocolInfo::MESSAGE_PACKET:
$data = new Network\Protocol\MessagePacket;
$data = new MessagePacket();
break;
case ProtocolInfo::SET_TIME_PACKET:
$data = new Network\Protocol\SetTimePacket;
$data = new SetTimePacket();
break;
case ProtocolInfo::START_GAME_PACKET:
$data = new Network\Protocol\StartGamePacket;
$data = new StartGamePacket();
break;
case ProtocolInfo::ADD_MOB_PACKET:
$data = new Network\Protocol\AddMobPacket;
$data = new AddMobPacket();
break;
case ProtocolInfo::ADD_PLAYER_PACKET:
$data = new Network\Protocol\AddPlayerPacket;
$data = new AddPlayerPacket();
break;
case ProtocolInfo::REMOVE_PLAYER_PACKET:
$data = new Network\Protocol\RemovePlayerPacket;
$data = new RemovePlayerPacket();
break;
case ProtocolInfo::ADD_ENTITY_PACKET:
$data = new Network\Protocol\AddEntityPacket;
$data = new AddEntityPacket();
break;
case ProtocolInfo::REMOVE_ENTITY_PACKET:
$data = new Network\Protocol\RemoveEntityPacket;
$data = new RemoveEntityPacket();
break;
case ProtocolInfo::ADD_ITEM_ENTITY_PACKET:
$data = new Network\Protocol\AddItemEntityPacket;
$data = new AddItemEntityPacket();
break;
case ProtocolInfo::TAKE_ITEM_ENTITY_PACKET:
$data = new Network\Protocol\TakeItemEntityPacket;
$data = new TakeItemEntityPacket();
break;
case ProtocolInfo::MOVE_ENTITY_PACKET:
$data = new Network\Protocol\MoveEntityPacket;
$data = new MoveEntityPacket();
break;
case ProtocolInfo::MOVE_ENTITY_PACKET_POSROT:
$data = new Network\Protocol\MoveEntityPacket_PosRot;
$data = new MoveEntityPacket_PosRot();
break;
case ProtocolInfo::ROTATE_HEAD_PACKET:
$data = new Network\Protocol\RotateHeadPacket;
$data = new RotateHeadPacket();
break;
case ProtocolInfo::MOVE_PLAYER_PACKET:
$data = new Network\Protocol\MovePlayerPacket;
$data = new MovePlayerPacket();
break;
case ProtocolInfo::REMOVE_BLOCK_PACKET:
$data = new Network\Protocol\RemoveBlockPacket;
$data = new RemoveBlockPacket();
break;
case ProtocolInfo::UPDATE_BLOCK_PACKET:
$data = new Network\Protocol\UpdateBlockPacket;
$data = new UpdateBlockPacket();
break;
case ProtocolInfo::ADD_PAINTING_PACKET:
$data = new Network\Protocol\AddPaintingPacket;
$data = new AddPaintingPacket();
break;
case ProtocolInfo::EXPLODE_PACKET:
$data = new Network\Protocol\ExplodePacket;
$data = new ExplodePacket();
break;
case ProtocolInfo::LEVEL_EVENT_PACKET:
$data = new Network\Protocol\LevelEventPacket;
$data = new LevelEventPacket();
break;
case ProtocolInfo::TILE_EVENT_PACKET:
$data = new Network\Protocol\TileEventPacket;
$data = new TileEventPacket();
break;
case ProtocolInfo::ENTITY_EVENT_PACKET:
$data = new Network\Protocol\EntityEventPacket;
$data = new EntityEventPacket();
break;
case ProtocolInfo::REQUEST_CHUNK_PACKET:
$data = new Network\Protocol\RequestChunkPacket;
$data = new RequestChunkPacket();
break;
case ProtocolInfo::CHUNK_DATA_PACKET:
$data = new Network\Protocol\ChunkDataPacket;
$data = new ChunkDataPacket();
break;
case ProtocolInfo::PLAYER_EQUIPMENT_PACKET:
$data = new Network\Protocol\PlayerEquipmentPacket;
$data = new PlayerEquipmentPacket();
break;
case ProtocolInfo::PLAYER_ARMOR_EQUIPMENT_PACKET:
$data = new Network\Protocol\PlayerArmorEquipmentPacket;
$data = new PlayerArmorEquipmentPacket();
break;
case ProtocolInfo::INTERACT_PACKET:
$data = new Network\Protocol\InteractPacket;
$data = new InteractPacket();
break;
case ProtocolInfo::USE_ITEM_PACKET:
$data = new Network\Protocol\UseItemPacket;
$data = new UseItemPacket();
break;
case ProtocolInfo::PLAYER_ACTION_PACKET:
$data = new Network\Protocol\PlayerActionPacket;
$data = new PlayerActionPacket();
break;
case ProtocolInfo::HURT_ARMOR_PACKET:
$data = new Network\Protocol\HurtArmorPacket;
$data = new HurtArmorPacket();
break;
case ProtocolInfo::SET_ENTITY_DATA_PACKET:
$data = new Network\Protocol\SetEntityDataPacket;
$data = new SetEntityDataPacket();
break;
case ProtocolInfo::SET_ENTITY_MOTION_PACKET:
$data = new Network\Protocol\SetEntityMotionPacket;
$data = new SetEntityMotionPacket();
break;
case ProtocolInfo::SET_HEALTH_PACKET:
$data = new Network\Protocol\SetHealthPacket;
$data = new SetHealthPacket();
break;
case ProtocolInfo::SET_SPAWN_POSITION_PACKET:
$data = new Network\Protocol\SetSpawnPositionPacket;
$data = new SetSpawnPositionPacket();
break;
case ProtocolInfo::ANIMATE_PACKET:
$data = new Network\Protocol\AnimatePacket;
$data = new AnimatePacket();
break;
case ProtocolInfo::RESPAWN_PACKET:
$data = new Network\Protocol\RespawnPacket;
$data = new RespawnPacket();
break;
case ProtocolInfo::SEND_INVENTORY_PACKET:
$data = new Network\Protocol\SendInventoryPacket;
$data = new SendInventoryPacket();
break;
case ProtocolInfo::DROP_ITEM_PACKET:
$data = new Network\Protocol\DropItemPacket;
$data = new DropItemPacket();
break;
case ProtocolInfo::CONTAINER_OPEN_PACKET:
$data = new Network\Protocol\ContainerOpenPacket;
$data = new ContainerOpenPacket();
break;
case ProtocolInfo::CONTAINER_CLOSE_PACKET:
$data = new Network\Protocol\ContainerClosePacket;
$data = new ContainerClosePacket();
break;
case ProtocolInfo::CONTAINER_SET_SLOT_PACKET:
$data = new Network\Protocol\ContainerSetSlotPacket;
$data = new ContainerSetSlotPacket();
break;
case ProtocolInfo::CONTAINER_SET_DATA_PACKET:
$data = new Network\Protocol\ContainerSetDataPacket;
$data = new ContainerSetDataPacket();
break;
case ProtocolInfo::CONTAINER_SET_CONTENT_PACKET:
$data = new Network\Protocol\ContainerSetContentPacket;
$data = new ContainerSetContentPacket();
break;
case ProtocolInfo::CHAT_PACKET:
$data = new Network\Protocol\ChatPacket;
$data = new ChatPacket();
break;
case ProtocolInfo::ADVENTURE_SETTINGS_PACKET:
$data = new Network\Protocol\AdventureSettingsPacket;
$data = new AdventureSettingsPacket();
break;
case ProtocolInfo::ENTITY_DATA_PACKET:
$data = new Network\Protocol\EntityDataPacket;
$data = new EntityDataPacket();
break;
default:
$data = new Network\Protocol\UnknownPacket();
$data = new UnknownPacket();
$data->packetID = $pid;
break;
}
@ -468,7 +523,7 @@ class Packet extends Network\Packet{
}
private function encodeDataPacket(Network\Protocol\DataPacket $pk){
private function encodeDataPacket(DataPacket $pk){
$this->putByte(($pk->reliability << 5) | ($pk->hasSplit > 0 ? 0b00010000 : 0));
$this->putShort(strlen($pk->buffer) << 3);
if($pk->reliability === 2

View File

@ -45,7 +45,7 @@ class ServerScheduler{
protected $currentTick = 0;
public function __construct(){
$this->queue = new \SplPriorityQueue();
$this->queue = new TaskQueue();
}
/**
@ -165,14 +165,13 @@ class ServerScheduler{
*/
public function mainThreadHeartbeat($currentTick){
$this->currentTick = $currentTick;
while($this->isReady($this->currentTick)){
$task = $this->queue->extract();
if($task->isCancelled()){
unset($this->tasks[$task->getTaskId()]);
continue;
}else{
$task->run();
$task->run($this->currentTick);
}
if($task->isRepeating()){
$task->setNextRun($this->currentTick + $task->getPeriod());

View File

@ -47,7 +47,7 @@ abstract class Task{
/**
* @param TaskHandler $taskHandler
*/
public final function setHandler(TaskHandler $taskHandler){
public final function setHandler($taskHandler){
if($this->taskHandler === null or $taskHandler === null){
$this->taskHandler = $taskHandler;
}

View File

@ -0,0 +1,29 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
*
*
*/
namespace PocketMine\Scheduler;
class TaskQueue extends \SplPriorityQueue{
public function compare($priority1, $priority2){
return (int) -($priority1 - $priority2);
}
}