Tile: added handling for PC 1.11 save IDs

This commit is contained in:
Dylan K. Taylor 2018-02-28 19:58:18 +00:00
parent 7e9f1324a7
commit 28e601bbb9
2 changed files with 36 additions and 18 deletions

View File

@ -26,6 +26,7 @@ namespace pocketmine\tile;
use pocketmine\level\Level; use pocketmine\level\Level;
use pocketmine\nbt\NetworkLittleEndianNBTStream; use pocketmine\nbt\NetworkLittleEndianNBTStream;
use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\StringTag;
use pocketmine\network\mcpe\protocol\BlockEntityDataPacket; use pocketmine\network\mcpe\protocol\BlockEntityDataPacket;
use pocketmine\Player; use pocketmine\Player;
@ -106,7 +107,7 @@ abstract class Spawnable extends Tile{
*/ */
final public function getSpawnCompound() : CompoundTag{ final public function getSpawnCompound() : CompoundTag{
$nbt = new CompoundTag("", [ $nbt = new CompoundTag("", [
$this->namedtag->getTag(self::TAG_ID), new StringTag(self::TAG_ID, static::getSaveId()),
$this->namedtag->getTag(self::TAG_X), $this->namedtag->getTag(self::TAG_X),
$this->namedtag->getTag(self::TAG_Y), $this->namedtag->getTag(self::TAG_Y),
$this->namedtag->getTag(self::TAG_Z) $this->namedtag->getTag(self::TAG_Z)

View File

@ -66,8 +66,8 @@ abstract class Tile extends Position{
/** @var string[] classes that extend Tile */ /** @var string[] classes that extend Tile */
private static $knownTiles = []; private static $knownTiles = [];
/** @var string[] */ /** @var string[][] */
private static $shortNames = []; private static $saveNames = [];
/** @var Chunk */ /** @var Chunk */
public $chunk; public $chunk;
@ -85,16 +85,16 @@ abstract class Tile extends Position{
protected $timings; protected $timings;
public static function init(){ public static function init(){
self::registerTile(Banner::class); self::registerTile(Banner::class, [self::BANNER, "minecraft:banner"]);
self::registerTile(Bed::class); self::registerTile(Bed::class, [self::BED, "minecraft:bed"]);
self::registerTile(Chest::class); self::registerTile(Chest::class, [self::CHEST, "minecraft:chest"]);
self::registerTile(EnchantTable::class); self::registerTile(EnchantTable::class, [self::ENCHANT_TABLE, "minecraft:enchanting_table"]);
self::registerTile(EnderChest::class); self::registerTile(EnderChest::class, [self::ENDER_CHEST, "minecraft:ender_chest"]);
self::registerTile(FlowerPot::class); self::registerTile(FlowerPot::class, [self::FLOWER_POT, "minecraft:flower_pot"]);
self::registerTile(Furnace::class); self::registerTile(Furnace::class, [self::FURNACE, "minecraft:furnace"]);
self::registerTile(ItemFrame::class); self::registerTile(ItemFrame::class, [self::ITEM_FRAME]); //this is an entity in PC
self::registerTile(Sign::class); self::registerTile(Sign::class, [self::SIGN, "minecraft:sign"]);
self::registerTile(Skull::class); self::registerTile(Skull::class, [self::SKULL, "minecraft:skull"]);
} }
/** /**
@ -115,15 +115,27 @@ abstract class Tile extends Position{
} }
/** /**
* @param $className * @param $className
* @param array $saveNames
* *
* @return bool * @return bool
* @throws \ReflectionException
*/ */
public static function registerTile($className) : bool{ public static function registerTile($className, array $saveNames = []) : bool{
$class = new \ReflectionClass($className); $class = new \ReflectionClass($className);
if(is_a($className, Tile::class, true) and !$class->isAbstract()){ if(is_a($className, Tile::class, true) and !$class->isAbstract()){
self::$knownTiles[$class->getShortName()] = $className; $shortName = $class->getShortName();
self::$shortNames[$className] = $class->getShortName(); if(!in_array($shortName, $saveNames, true)){
$saveNames[] = $shortName;
}
foreach($saveNames as $name){
self::$knownTiles[$name] = $className;
}
self::$saveNames[$className] = $saveNames;
return true; return true;
} }
@ -135,7 +147,12 @@ abstract class Tile extends Position{
* @return string * @return string
*/ */
public static function getSaveId() : string{ public static function getSaveId() : string{
return self::$shortNames[static::class]; if(!isset(self::$saveNames[static::class])){
throw new \InvalidStateException("Tile is not registered");
}
reset(self::$saveNames[static::class]);
return current(self::$saveNames[static::class]);
} }
public function __construct(Level $level, CompoundTag $nbt){ public function __construct(Level $level, CompoundTag $nbt){