From 1ef6e5e17b072ccfd3e731a2bb25e57d2865fd71 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 21 Jun 2020 00:47:02 +0100 Subject: [PATCH] TileFactory now only manages loading tiles from NBT, not direct creation my objective is to make this use proper constructors like entities, but there's a couple of obstacles to get around first. --- src/block/Block.php | 7 ++++- src/block/tile/TileFactory.php | 52 ---------------------------------- 2 files changed, 6 insertions(+), 53 deletions(-) diff --git a/src/block/Block.php b/src/block/Block.php index b2fda913d3..c6cb3ed995 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -163,7 +163,12 @@ class Block{ } } if($oldTile === null and $tileType !== null){ - $this->pos->getWorldNonNull()->addTile(TileFactory::getInstance()->create($tileType, $this->pos->getWorldNonNull(), $this->pos->asVector3())); + /** + * @var Tile $tile + * @see Tile::__construct() + */ + $tile = new $tileType($this->pos->getWorldNonNull(), $this->pos->asVector3()); + $this->pos->getWorldNonNull()->addTile($tile); } } diff --git a/src/block/tile/TileFactory.php b/src/block/tile/TileFactory.php index 19f4fcb2ae..3036d30798 100644 --- a/src/block/tile/TileFactory.php +++ b/src/block/tile/TileFactory.php @@ -46,11 +46,6 @@ final class TileFactory{ * @phpstan-var array, list> */ private $saveNames = []; - /** - * @var string[] base class => overridden class - * @phpstan-var array, class-string> - */ - private $classMapping = []; public function __construct(){ $this->register(Banner::class, ["Banner", "minecraft:banner"]); @@ -102,8 +97,6 @@ final class TileFactory{ public function register(string $className, array $saveNames = []) : void{ Utils::testValidInstance($className, Tile::class); - $this->classMapping[$className] = $className; - $shortName = (new \ReflectionClass($className))->getShortName(); if(!in_array($shortName, $saveNames, true)){ $saveNames[] = $shortName; @@ -116,51 +109,6 @@ final class TileFactory{ $this->saveNames[$className] = $saveNames; } - /** - * @param string $baseClass Already-registered tile class to override - * @param string $newClass Class which extends the base class - * - * TODO: use an explicit template for param1 - * @phpstan-param class-string $baseClass - * @phpstan-param class-string $newClass - * - * @throws \InvalidArgumentException if the base class is not a registered tile - */ - public function override(string $baseClass, string $newClass) : void{ - if(!isset($this->classMapping[$baseClass])){ - throw new \InvalidArgumentException("Class $baseClass is not a registered tile"); - } - - Utils::testValidInstance($newClass, $baseClass); - $this->classMapping[$baseClass] = $newClass; - } - - /** - * @phpstan-template TTile of Tile - * @phpstan-param class-string $baseClass - * - * @return Tile (will be an instanceof $baseClass) - * @phpstan-return TTile - * - * @throws \InvalidArgumentException if the specified class is not a registered tile - */ - public function create(string $baseClass, World $world, Vector3 $pos) : Tile{ - if(isset($this->classMapping[$baseClass])){ - $class = $this->classMapping[$baseClass]; - assert(is_a($class, $baseClass, true)); - /** - * @var Tile $tile - * @phpstan-var TTile $tile - * @see Tile::__construct() - */ - $tile = new $class($world, $pos); - - return $tile; - } - - throw new \InvalidArgumentException("Class $baseClass is not a registered tile"); - } - /** * @internal */