mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-10 05:34:54 +00:00
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:
parent
1f90aa07aa
commit
1ef6e5e17b
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user