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.
This commit is contained in:
Dylan K. Taylor 2020-06-21 00:47:02 +01:00
parent 1f90aa07aa
commit 1ef6e5e17b
2 changed files with 6 additions and 53 deletions

View File

@ -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);
}
}

View File

@ -46,11 +46,6 @@ final class TileFactory{
* @phpstan-var array<class-string<Tile>, list<string>>
*/
private $saveNames = [];
/**
* @var string[] base class => overridden class
* @phpstan-var array<class-string<Tile>, class-string<Tile>>
*/
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<Tile> $baseClass
* @phpstan-param class-string<Tile> $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<TTile> $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
*/