mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-15 10:19:39 +00:00
Deduplicate code for general classpath registries
This commit is contained in:
parent
e016693779
commit
be37236c76
@ -73,6 +73,7 @@ use pocketmine\plugin\Plugin;
|
||||
use pocketmine\Server;
|
||||
use pocketmine\timings\Timings;
|
||||
use pocketmine\timings\TimingsHandler;
|
||||
use pocketmine\utils\Utils;
|
||||
|
||||
abstract class Entity extends Location implements Metadatable, EntityIds{
|
||||
|
||||
@ -304,27 +305,16 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function registerEntity(string $className, bool $force = false, array $saveNames = []) : void{
|
||||
Utils::testValidInstance($className, Entity::class);
|
||||
|
||||
/** @var Entity $className */
|
||||
|
||||
try{
|
||||
$class = new \ReflectionClass($className);
|
||||
}catch(\ReflectionException $e){
|
||||
throw new \InvalidArgumentException("Class $className does not exist");
|
||||
}
|
||||
if(!$class->isSubclassOf(Entity::class)){
|
||||
throw new \InvalidArgumentException("Class $className does not extend " . Entity::class);
|
||||
}
|
||||
if(!$class->isInstantiable()){
|
||||
throw new \InvalidArgumentException("Class $className cannot be constructed");
|
||||
}
|
||||
|
||||
if($className::NETWORK_ID !== -1){
|
||||
self::$knownEntities[$className::NETWORK_ID] = $className;
|
||||
}elseif(!$force){
|
||||
throw new \InvalidArgumentException("Class $className does not declare a valid NETWORK_ID and not force-registering");
|
||||
}
|
||||
|
||||
$shortName = $class->getShortName();
|
||||
$shortName = (new \ReflectionClass($className))->getShortName();
|
||||
if(!in_array($shortName, $saveNames, true)){
|
||||
$saveNames[] = $shortName;
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ use pocketmine\level\format\io\leveldb\LevelDB;
|
||||
use pocketmine\level\format\io\region\Anvil;
|
||||
use pocketmine\level\format\io\region\McRegion;
|
||||
use pocketmine\level\format\io\region\PMAnvil;
|
||||
use pocketmine\utils\Utils;
|
||||
|
||||
abstract class LevelProviderManager{
|
||||
protected static $providers = [];
|
||||
@ -44,17 +45,7 @@ abstract class LevelProviderManager{
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function addProvider(string $class){
|
||||
try{
|
||||
$reflection = new \ReflectionClass($class);
|
||||
}catch(\ReflectionException $e){
|
||||
throw new \InvalidArgumentException("Class $class does not exist");
|
||||
}
|
||||
if(!$reflection->implementsInterface(LevelProvider::class)){
|
||||
throw new \InvalidArgumentException("Class $class does not implement " . LevelProvider::class);
|
||||
}
|
||||
if(!$reflection->isInstantiable()){
|
||||
throw new \InvalidArgumentException("Class $class cannot be constructed");
|
||||
}
|
||||
Utils::testValidInstance($class, LevelProvider::class);
|
||||
|
||||
/** @var LevelProvider $class */
|
||||
self::$providers[strtolower($class::getProviderName())] = $class;
|
||||
|
@ -39,6 +39,7 @@ use pocketmine\Player;
|
||||
use pocketmine\Server;
|
||||
use pocketmine\timings\Timings;
|
||||
use pocketmine\timings\TimingsHandler;
|
||||
use pocketmine\utils\Utils;
|
||||
|
||||
abstract class Tile extends Position{
|
||||
|
||||
@ -114,19 +115,9 @@ abstract class Tile extends Position{
|
||||
* @param string[] $saveNames
|
||||
*/
|
||||
public static function registerTile(string $className, array $saveNames = []) : void{
|
||||
try{
|
||||
$class = new \ReflectionClass($className);
|
||||
}catch(\ReflectionException $e){
|
||||
throw new \InvalidArgumentException("Class $className does not exist");
|
||||
}
|
||||
if(!$class->isSubclassOf(Tile::class)){
|
||||
throw new \InvalidArgumentException("Class $className does not extend " . Tile::class);
|
||||
}
|
||||
if(!$class->isInstantiable()){
|
||||
throw new \InvalidArgumentException("Class $className cannot be constructed");
|
||||
}
|
||||
Utils::testValidInstance($className, Tile::class);
|
||||
|
||||
$shortName = $class->getShortName();
|
||||
$shortName = (new \ReflectionClass($className))->getShortName();
|
||||
if(!in_array($shortName, $saveNames, true)){
|
||||
$saveNames[] = $shortName;
|
||||
}
|
||||
|
@ -547,4 +547,25 @@ class Utils{
|
||||
|
||||
return true; //stfu operator
|
||||
}
|
||||
|
||||
public static function testValidInstance(string $className, string $baseName) : void{
|
||||
try{
|
||||
$base = new \ReflectionClass($baseName);
|
||||
}catch(\ReflectionException $e){
|
||||
throw new \InvalidArgumentException("Base class $baseName does not exist");
|
||||
}
|
||||
|
||||
try{
|
||||
$class = new \ReflectionClass($className);
|
||||
}catch(\ReflectionException $e){
|
||||
throw new \InvalidArgumentException("Class $className does not exist");
|
||||
}
|
||||
|
||||
if(!$class->isSubclassOf($baseName)){
|
||||
throw new \InvalidArgumentException("Class $className does not " . ($base->isInterface() ? "implement" : "extend") . " " . $baseName);
|
||||
}
|
||||
if(!$class->isInstantiable()){
|
||||
throw new \InvalidArgumentException("Class $className cannot be constructed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user