From 1ff381ebf470887c6dc823d7bf4ffcfab0e9ee46 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Mon, 31 Mar 2014 05:04:36 +0200 Subject: [PATCH] =?UTF-8?q?Things=20are=20working=20=E3=83=BD=E0=BC=BC?= =?UTF-8?q?=E0=BA=88=D9=84=CD=9C=E0=BA=88=E0=BC=BD=EF=BE=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PocketMine/Player.php | 17 +- src/PocketMine/Server.php | 55 +++++- ...spawntEvent.php => PlayerRespawnEvent.php} | 0 src/PocketMine/network/ThreadedHandler.php | 39 ++-- src/PocketMine/network/raknet/Packet.php | 169 ++++++++++++------ src/PocketMine/scheduler/ServerScheduler.php | 5 +- src/PocketMine/scheduler/Task.php | 2 +- src/PocketMine/scheduler/TaskQueue.php | 29 +++ 8 files changed, 220 insertions(+), 96 deletions(-) rename src/PocketMine/event/player/{PlayerRespawntEvent.php => PlayerRespawnEvent.php} (100%) create mode 100644 src/PocketMine/scheduler/TaskQueue.php diff --git a/src/PocketMine/Player.php b/src/PocketMine/Player.php index 824ddec8a..e69fc6bb9 100644 --- a/src/PocketMine/Player.php +++ b/src/PocketMine/Player.php @@ -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(); diff --git a/src/PocketMine/Server.php b/src/PocketMine/Server.php index 078814135..37c526c81 100644 --- a/src/PocketMine/Server.php +++ b/src/PocketMine/Server.php @@ -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; + } + } } } diff --git a/src/PocketMine/event/player/PlayerRespawntEvent.php b/src/PocketMine/event/player/PlayerRespawnEvent.php similarity index 100% rename from src/PocketMine/event/player/PlayerRespawntEvent.php rename to src/PocketMine/event/player/PlayerRespawnEvent.php diff --git a/src/PocketMine/network/ThreadedHandler.php b/src/PocketMine/network/ThreadedHandler.php index 06282e829..02afc36f3 100644 --- a/src/PocketMine/network/ThreadedHandler.php +++ b/src/PocketMine/network/ThreadedHandler.php @@ -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; } diff --git a/src/PocketMine/network/raknet/Packet.php b/src/PocketMine/network/raknet/Packet.php index 3de7228a3..f1eb116c8 100644 --- a/src/PocketMine/network/raknet/Packet.php +++ b/src/PocketMine/network/raknet/Packet.php @@ -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 diff --git a/src/PocketMine/scheduler/ServerScheduler.php b/src/PocketMine/scheduler/ServerScheduler.php index e138b2877..ea4ed4502 100644 --- a/src/PocketMine/scheduler/ServerScheduler.php +++ b/src/PocketMine/scheduler/ServerScheduler.php @@ -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()); diff --git a/src/PocketMine/scheduler/Task.php b/src/PocketMine/scheduler/Task.php index aa434f81c..1ffa1d460 100644 --- a/src/PocketMine/scheduler/Task.php +++ b/src/PocketMine/scheduler/Task.php @@ -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; } diff --git a/src/PocketMine/scheduler/TaskQueue.php b/src/PocketMine/scheduler/TaskQueue.php new file mode 100644 index 000000000..8b9827bbf --- /dev/null +++ b/src/PocketMine/scheduler/TaskQueue.php @@ -0,0 +1,29 @@ +