diff --git a/src/pocketmine/tile/Banner.php b/src/pocketmine/tile/Banner.php index 647d8fc08..0bf7fdb50 100644 --- a/src/pocketmine/tile/Banner.php +++ b/src/pocketmine/tile/Banner.php @@ -111,6 +111,7 @@ class Banner extends Spawnable implements Nameable{ $this->baseColor = $nbt->getInt(self::TAG_BASE, self::COLOR_BLACK, true); $this->patterns = $nbt->getListTag(self::TAG_PATTERNS) ?? new ListTag(self::TAG_PATTERNS); $nbt->removeTag(self::TAG_BASE, self::TAG_PATTERNS); + $this->loadName($nbt); parent::__construct($level, $nbt); } @@ -118,6 +119,7 @@ class Banner extends Spawnable implements Nameable{ parent::saveNBT(); $this->namedtag->setInt(self::TAG_BASE, $this->baseColor); $this->namedtag->setTag($this->patterns); + $this->saveName($this->namedtag); } public function addAdditionalSpawnData(CompoundTag $nbt) : void{ diff --git a/src/pocketmine/tile/Chest.php b/src/pocketmine/tile/Chest.php index 7fd3f3add..2e4f454fe 100644 --- a/src/pocketmine/tile/Chest.php +++ b/src/pocketmine/tile/Chest.php @@ -59,7 +59,8 @@ class Chest extends Spawnable implements InventoryHolder, Container, Nameable{ parent::__construct($level, $nbt); $this->inventory = new ChestInventory($this); - $this->loadItems(); + $this->loadItems($this->namedtag); + $this->loadName($this->namedtag); } public function close() : void{ @@ -86,7 +87,8 @@ class Chest extends Spawnable implements InventoryHolder, Container, Nameable{ }else{ $this->namedtag->removeTag(self::TAG_PAIRX, self::TAG_PAIRZ); } - $this->saveItems(); + $this->saveItems($this->namedtag); + $this->saveName($this->namedtag); } /** diff --git a/src/pocketmine/tile/ContainerTrait.php b/src/pocketmine/tile/ContainerTrait.php index 10501c9cc..330092460 100644 --- a/src/pocketmine/tile/ContainerTrait.php +++ b/src/pocketmine/tile/ContainerTrait.php @@ -37,16 +37,14 @@ trait ContainerTrait{ /** @var string|null */ private $lock; - abstract public function getNBT() : CompoundTag; - /** * @return Inventory */ abstract public function getRealInventory(); - protected function loadItems() : void{ - if($this->getNBT()->hasTag(Container::TAG_ITEMS, ListTag::class)){ - $inventoryTag = $this->getNBT()->getListTag(Container::TAG_ITEMS); + protected function loadItems(CompoundTag $tag) : void{ + if($tag->hasTag(Container::TAG_ITEMS, ListTag::class)){ + $inventoryTag = $tag->getListTag(Container::TAG_ITEMS); $inventory = $this->getRealInventory(); /** @var CompoundTag $itemNBT */ @@ -55,21 +53,21 @@ trait ContainerTrait{ } } - if($this->getNBT()->hasTag(Container::TAG_LOCK, StringTag::class)){ - $this->lock = $this->getNBT()->getString(Container::TAG_LOCK); + if($tag->hasTag(Container::TAG_LOCK, StringTag::class)){ + $this->lock = $tag->getString(Container::TAG_LOCK); } } - protected function saveItems() : void{ + protected function saveItems(CompoundTag $tag) : void{ $items = []; foreach($this->getRealInventory()->getContents() as $slot => $item){ $items[] = $item->nbtSerialize($slot); } - $this->getNBT()->setTag(new ListTag(Container::TAG_ITEMS, $items, NBT::TAG_Compound)); + $tag->setTag(new ListTag(Container::TAG_ITEMS, $items, NBT::TAG_Compound)); if($this->lock !== null){ - $this->getNBT()->setString(Container::TAG_LOCK, $this->lock); + $tag->setString(Container::TAG_LOCK, $this->lock); } } diff --git a/src/pocketmine/tile/EnchantTable.php b/src/pocketmine/tile/EnchantTable.php index 723018e69..d31491ce2 100644 --- a/src/pocketmine/tile/EnchantTable.php +++ b/src/pocketmine/tile/EnchantTable.php @@ -23,9 +23,22 @@ declare(strict_types=1); namespace pocketmine\tile; +use pocketmine\level\Level; +use pocketmine\nbt\tag\CompoundTag; + class EnchantTable extends Spawnable implements Nameable{ use NameableTrait; + public function __construct(Level $level, CompoundTag $nbt){ + $this->loadName($nbt); + parent::__construct($level, $nbt); + } + + public function saveNBT() : void{ + parent::saveNBT(); + $this->saveName($this->namedtag); + } + /** * @return string */ diff --git a/src/pocketmine/tile/Furnace.php b/src/pocketmine/tile/Furnace.php index 4c1b95373..c46ba2e76 100644 --- a/src/pocketmine/tile/Furnace.php +++ b/src/pocketmine/tile/Furnace.php @@ -70,7 +70,8 @@ class Furnace extends Spawnable implements InventoryHolder, Container, Nameable{ parent::__construct($level, $nbt); $this->inventory = new FurnaceInventory($this); - $this->loadItems(); + $this->loadItems($this->namedtag); + $this->loadName($this->namedtag); if($this->burnTime > 0){ $this->scheduleUpdate(); @@ -99,7 +100,8 @@ class Furnace extends Spawnable implements InventoryHolder, Container, Nameable{ $this->namedtag->setShort(self::TAG_COOK_TIME, $this->cookTime); $this->namedtag->setShort(self::TAG_MAX_TIME, $this->maxTime); - $this->saveItems(); + $this->saveItems($this->namedtag); + $this->saveName($this->namedtag); } /** diff --git a/src/pocketmine/tile/NameableTrait.php b/src/pocketmine/tile/NameableTrait.php index 28ff2b260..d1a62593c 100644 --- a/src/pocketmine/tile/NameableTrait.php +++ b/src/pocketmine/tile/NameableTrait.php @@ -26,50 +26,44 @@ namespace pocketmine\tile; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\nbt\tag\StringTag; use pocketmine\Player; /** * This trait implements most methods in the {@link Nameable} interface. It should only be used by Tiles. */ trait NameableTrait{ + /** @var string|null */ + private $customName; /** * @return string */ abstract public function getDefaultName() : string; - /** - * @return CompoundTag - */ - abstract public function getNBT() : CompoundTag; - /** * @return string */ public function getName() : string{ - $nbt = $this->getNBT(); - return $nbt->getString(Nameable::TAG_CUSTOM_NAME) ?? $this->getDefaultName(); + return $this->customName ?? $this->getDefaultName(); } /** * @param string $name */ public function setName(string $name) : void{ - $nbt = $this->getNBT(); if($name === ""){ - $nbt->removeTag(Nameable::TAG_CUSTOM_NAME); - - return; + $this->customName = null; + }else{ + $this->customName = $name; } - - $nbt->setString(Nameable::TAG_CUSTOM_NAME, $name); } /** * @return bool */ public function hasName() : bool{ - return $this->getNBT()->hasTag(Nameable::TAG_CUSTOM_NAME); + return $this->customName !== null; } protected static function createAdditionalNBT(CompoundTag $nbt, Vector3 $pos, ?int $face = null, ?Item $item = null, ?Player $player = null) : void{ @@ -79,8 +73,20 @@ trait NameableTrait{ } public function addAdditionalSpawnData(CompoundTag $nbt) : void{ - if($this->hasName()){ - $nbt->setString(Nameable::TAG_CUSTOM_NAME, $this->getName()); + if($this->customName !== null){ + $nbt->setString(Nameable::TAG_CUSTOM_NAME, $this->customName); + } + } + + protected function loadName(CompoundTag $tag) : void{ + if($tag->hasTag(Nameable::TAG_CUSTOM_NAME, StringTag::class)){ + $this->customName = $tag->getString(Nameable::TAG_CUSTOM_NAME); + } + } + + protected function saveName(CompoundTag $tag) : void{ + if($this->customName !== null){ + $tag->setString(Nameable::TAG_CUSTOM_NAME, $this->customName); } } }