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.
This commit is contained in:
Dylan K. Taylor 2017-09-01 17:57:40 +01:00 committed by GitHub
parent 138d85307b
commit 6e8631347d
3 changed files with 32 additions and 1 deletions

@ -1 +1 @@
Subproject commit 2ab4d9172eba05cb7c6b8c98639db2ba9e60472c Subproject commit eac602e8bc084fbaf3bc133129d6c8e4dc517c52

View File

@ -23,12 +23,15 @@ declare(strict_types=1);
namespace pocketmine\plugin; namespace pocketmine\plugin;
use pocketmine\network\mcpe\protocol\ProtocolInfo;
use pocketmine\permission\Permission; use pocketmine\permission\Permission;
class PluginDescription{ class PluginDescription{
private $name; private $name;
private $main; private $main;
private $api; private $api;
/** @var int[] */
private $compatibleMcpeProtocols = [];
private $extensions = []; private $extensions = [];
private $depend = []; private $depend = [];
private $softDepend = []; private $softDepend = [];
@ -76,6 +79,8 @@ class PluginDescription{
throw new PluginException("Invalid PluginDescription main, cannot start within the PocketMine namespace"); 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"])){ if(isset($plugin["commands"]) and is_array($plugin["commands"])){
$this->commands = $plugin["commands"]; $this->commands = $plugin["commands"];
} }
@ -147,6 +152,13 @@ class PluginDescription{
return $this->api; return $this->api;
} }
/**
* @return int[]
*/
public function getCompatibleMcpeProtocols() : array{
return $this->compatibleMcpeProtocols;
}
/** /**
* @return string[] * @return string[]
*/ */

View File

@ -32,6 +32,7 @@ use pocketmine\event\HandlerList;
use pocketmine\event\Listener; use pocketmine\event\Listener;
use pocketmine\event\Timings; use pocketmine\event\Timings;
use pocketmine\event\TimingsHandler; use pocketmine\event\TimingsHandler;
use pocketmine\network\mcpe\protocol\ProtocolInfo;
use pocketmine\permission\Permissible; use pocketmine\permission\Permissible;
use pocketmine\permission\Permission; use pocketmine\permission\Permission;
use pocketmine\Server; use pocketmine\Server;
@ -258,6 +259,24 @@ class PluginManager{
continue; 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; $plugins[$name] = $file;
$softDependencies[$name] = $description->getSoftDepend(); $softDependencies[$name] = $description->getSoftDepend();