From 2ba601b6e9091a44811156b089de0f4594c8a1b8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 7 Aug 2017 19:24:07 +0100 Subject: [PATCH] Fixed signs --- .../event/block/SignChangeEvent.php | 2 +- src/pocketmine/tile/Sign.php | 79 +++++++++++-------- 2 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/pocketmine/event/block/SignChangeEvent.php b/src/pocketmine/event/block/SignChangeEvent.php index 85616fb06..d9c45baa7 100644 --- a/src/pocketmine/event/block/SignChangeEvent.php +++ b/src/pocketmine/event/block/SignChangeEvent.php @@ -46,7 +46,7 @@ class SignChangeEvent extends BlockEvent implements Cancellable{ public function __construct(Block $theBlock, Player $thePlayer, array $theLines){ parent::__construct($theBlock); $this->player = $thePlayer; - $this->lines = $theLines; + $this->setLines($theLines); } /** diff --git a/src/pocketmine/tile/Sign.php b/src/pocketmine/tile/Sign.php index 49688588a..fb9e066da 100644 --- a/src/pocketmine/tile/Sign.php +++ b/src/pocketmine/tile/Sign.php @@ -32,18 +32,21 @@ use pocketmine\utils\TextFormat; class Sign extends Spawnable{ + /** @var string[] */ + protected $text = ["", "", "", ""]; + public function __construct(Level $level, CompoundTag $nbt){ - if(!isset($nbt->Text1)){ - $nbt->Text1 = new StringTag("Text1", ""); - } - if(!isset($nbt->Text2)){ - $nbt->Text2 = new StringTag("Text2", ""); - } - if(!isset($nbt->Text3)){ - $nbt->Text3 = new StringTag("Text3", ""); - } - if(!isset($nbt->Text4)){ - $nbt->Text4 = new StringTag("Text4", ""); + if(isset($nbt->Text)){ //MCPE 1.2 save format + $this->text = explode("\n", $nbt->Text->getValue()); + unset($nbt->Text); + }else{ + for($i = 1; $i < 4; ++$i){ + $textKey = "Text$i"; + if(isset($nbt->$textKey)){ + $this->text[$i - 1] = $nbt->$textKey->getValue(); + unset($nbt->$textKey); + } + } } parent::__construct($level, $nbt); @@ -51,14 +54,18 @@ class Sign extends Spawnable{ public function saveNBT(){ parent::saveNBT(); + $this->namedtag->Text = new StringTag("Text", implode("\n", $this->text)); + + foreach($this->text as $i => $line){ //Backwards-compatibility + $textKey = "Text$i"; + $this->namedtag->$textKey = new StringTag($textKey, $this->getLine($i)); + } + unset($this->namedtag->Creator); } public function setText($line1 = "", $line2 = "", $line3 = "", $line4 = ""){ - $this->namedtag->Text1->setValue($line1); - $this->namedtag->Text2->setValue($line2); - $this->namedtag->Text3->setValue($line3); - $this->namedtag->Text4->setValue($line4); + $this->text = [$line1, $line2, $line3, $line4]; $this->onChanged(); } @@ -71,7 +78,8 @@ class Sign extends Spawnable{ if($index < 0 or $index > 3){ throw new \InvalidArgumentException("Index must be in the range 0-3!"); } - $this->namedtag->{"Text" . ($index + 1)}->setValue($line); + + $this->text[$index] = $line; if($update){ $this->onChanged(); } @@ -86,23 +94,18 @@ class Sign extends Spawnable{ if($index < 0 or $index > 3){ throw new \InvalidArgumentException("Index must be in the range 0-3!"); } - return $this->namedtag->{"Text" . ($index + 1)}->getValue(); + return $this->text[$index]; } - public function getText(){ - return [ - $this->namedtag->Text1->getValue(), - $this->namedtag->Text2->getValue(), - $this->namedtag->Text3->getValue(), - $this->namedtag->Text4->getValue() - ]; + /** + * @return string[] + */ + public function getText() : array{ + return $this->text; } public function addAdditionalSpawnData(CompoundTag $nbt){ - for($i = 1; $i <= 4; $i++){ - $textKey = "Text" . $i; - $nbt->$textKey = $this->namedtag->$textKey; - } + $nbt->Text = new StringTag("Text", implode("\n", $this->text)); return $nbt; } @@ -111,12 +114,20 @@ class Sign extends Spawnable{ return false; } - $ev = new SignChangeEvent($this->getBlock(), $player, [ - TextFormat::clean($nbt->Text1->getValue(), ($removeFormat = $player->getRemoveFormat())), - TextFormat::clean($nbt->Text2->getValue(), $removeFormat), - TextFormat::clean($nbt->Text3->getValue(), $removeFormat), - TextFormat::clean($nbt->Text4->getValue(), $removeFormat) - ]); + if(isset($nbt->Text)){ + $lines = array_pad(explode("\n", $nbt->Text->getValue()), 4, ""); + }else{ + $lines = [ + $nbt->Text1->getValue(), + $nbt->Text2->getValue(), + $nbt->Text3->getValue(), + $nbt->Text4->getValue() + ]; + } + + $removeFormat = $player->getRemoveFormat(); + + $ev = new SignChangeEvent($this->getBlock(), $player, array_map(function(string $line) use ($removeFormat){ return TextFormat::clean($line, $removeFormat); }, $lines)); if(!isset($this->namedtag->Creator) or $this->namedtag->Creator->getValue() !== $player->getRawUniqueId()){ $ev->setCancelled();