From 6e8631347d64c0c7d929454ff91c19ffdc047a5a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 1 Sep 2017 17:57:40 +0100 Subject: [PATCH] Added capability to specify compatible protocol versions in plugin.yml (#1247) Protocol-dependent plugins may specify the `mcpe-protocol` attribute in plugin.yml to disallow plugin loading when the protocol changes. --- src/pocketmine/lang/locale | 2 +- src/pocketmine/plugin/PluginDescription.php | 12 ++++++++++++ src/pocketmine/plugin/PluginManager.php | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/pocketmine/lang/locale b/src/pocketmine/lang/locale index 2ab4d9172..eac602e8b 160000 --- a/src/pocketmine/lang/locale +++ b/src/pocketmine/lang/locale @@ -1 +1 @@ -Subproject commit 2ab4d9172eba05cb7c6b8c98639db2ba9e60472c +Subproject commit eac602e8bc084fbaf3bc133129d6c8e4dc517c52 diff --git a/src/pocketmine/plugin/PluginDescription.php b/src/pocketmine/plugin/PluginDescription.php index dc7be00e8..006e01e06 100644 --- a/src/pocketmine/plugin/PluginDescription.php +++ b/src/pocketmine/plugin/PluginDescription.php @@ -23,12 +23,15 @@ declare(strict_types=1); namespace pocketmine\plugin; +use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\permission\Permission; class PluginDescription{ private $name; private $main; private $api; + /** @var int[] */ + private $compatibleMcpeProtocols = []; private $extensions = []; private $depend = []; private $softDepend = []; @@ -76,6 +79,8 @@ class PluginDescription{ throw new PluginException("Invalid PluginDescription main, cannot start within the PocketMine namespace"); } + $this->compatibleMcpeProtocols = array_map("intval", (array) ($plugin["mcpe-protocol"] ?? [])); + if(isset($plugin["commands"]) and is_array($plugin["commands"])){ $this->commands = $plugin["commands"]; } @@ -147,6 +152,13 @@ class PluginDescription{ return $this->api; } + /** + * @return int[] + */ + public function getCompatibleMcpeProtocols() : array{ + return $this->compatibleMcpeProtocols; + } + /** * @return string[] */ diff --git a/src/pocketmine/plugin/PluginManager.php b/src/pocketmine/plugin/PluginManager.php index 17511cec0..0e926898d 100644 --- a/src/pocketmine/plugin/PluginManager.php +++ b/src/pocketmine/plugin/PluginManager.php @@ -32,6 +32,7 @@ use pocketmine\event\HandlerList; use pocketmine\event\Listener; use pocketmine\event\Timings; use pocketmine\event\TimingsHandler; +use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\permission\Permissible; use pocketmine\permission\Permission; use pocketmine\Server; @@ -258,6 +259,24 @@ class PluginManager{ continue; } + if(count($pluginMcpeProtocols = $description->getCompatibleMcpeProtocols()) > 0){ + $serverMcpeProtocols = [ProtocolInfo::CURRENT_PROTOCOL]; + if(count(array_intersect($pluginMcpeProtocols, $serverMcpeProtocols)) === 0){ + $this->server->getLogger()->error($this->server->getLanguage()->translateString( + "pocketmine.plugin.loadError", + [ + $name, + $this->server->getLanguage()->translateString( + "%pocketmine.plugin.incompatibleProtocol", + [ + implode(", ", $pluginMcpeProtocols) + ]) + ] + )); + continue; + } + } + $plugins[$name] = $file; $softDependencies[$name] = $description->getSoftDepend();