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\nbt\NetworkLittleEndianNBTStream;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\StringTag;
use pocketmine\network\mcpe\protocol\BlockEntityDataPacket;
use pocketmine\Player;
@ -106,7 +107,7 @@ abstract class Spawnable extends Tile{
*/
final public function getSpawnCompound() : 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_Y),
$this->namedtag->getTag(self::TAG_Z)

View File

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