diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index c35576d58..c0e3d9e37 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -47,28 +47,11 @@ class BrewingStand extends Transparent{ public function getRequiredStateDataBits() : int{ return 3; } protected function decodeState(RuntimeDataReader $r) : void{ - $result = []; - foreach([ - BrewingStandSlot::EAST(), - BrewingStandSlot::NORTHWEST(), - BrewingStandSlot::SOUTHWEST(), - ] as $member){ - if($r->readBool()){ - $result[$member->id()] = $member; - } - } - - $this->setSlots($result); + $this->setSlots($r->readBrewingStandSlots()); } protected function encodeState(RuntimeDataWriter $w) : void{ - foreach([ - BrewingStandSlot::EAST(), - BrewingStandSlot::NORTHWEST(), - BrewingStandSlot::SOUTHWEST(), - ] as $member){ - $w->writeBool(isset($this->slots[$member->id()])); - } + $w->writeBrewingStandSlots($this->getSlots()); } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/Vine.php b/src/block/Vine.php index d716b5eb8..a90de6c8d 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -43,15 +43,11 @@ class Vine extends Flowable{ public function getRequiredStateDataBits() : int{ return 4; } protected function decodeState(RuntimeDataReader $r) : void{ - foreach(Facing::HORIZONTAL as $facing){ - $this->setFace($facing, $r->readBool()); - } + $this->faces = $r->readHorizontalFacingFlags(); } protected function encodeState(RuntimeDataWriter $w) : void{ - foreach(Facing::HORIZONTAL as $facing){ - $w->writeBool($this->hasFace($facing)); - } + $w->writeHorizontalFacingFlags($this->faces); } /** @return int[] */ diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index 7fbede9b1..5ed08cdf8 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\data\runtime; +use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -71,6 +72,20 @@ final class RuntimeDataReader{ }; } + /** + * @return int[] + */ + public function readHorizontalFacingFlags() : array{ + $result = []; + foreach(Facing::HORIZONTAL as $facing){ + if($this->readBool()){ + $result[$facing] = $facing; + } + } + + return $result; + } + public function readFacing() : int{ return match($this->readInt(3)){ 0 => Facing::DOWN, @@ -121,5 +136,24 @@ final class RuntimeDataReader{ return $connections; } + /** + * @return BrewingStandSlot[] + * @phpstan-return array + */ + public function readBrewingStandSlots() : array{ + $result = []; + foreach([ + BrewingStandSlot::EAST(), + BrewingStandSlot::NORTHWEST(), + BrewingStandSlot::SOUTHWEST(), + ] as $member){ + if($this->readBool()){ + $result[$member->id()] = $member; + } + } + + return $result; + } + public function getOffset() : int{ return $this->offset; } } diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index ac7f1f464..a0d7ba7ba 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -23,10 +23,12 @@ declare(strict_types=1); namespace pocketmine\data\runtime; +use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\WallConnectionType; use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\utils\AssumptionFailedError; +use function array_flip; final class RuntimeDataWriter{ use RuntimeEnumSerializerTrait; @@ -78,6 +80,20 @@ final class RuntimeDataWriter{ }); } + /** + * @param int[] $faces + * + * @return $this + */ + public function writeHorizontalFacingFlags(array $faces) : self{ + $uniqueFaces = array_flip($faces); + foreach(Facing::HORIZONTAL as $facing){ + $this->writeBool(isset($uniqueFaces[$facing])); + } + + return $this; + } + public function writeFacing(int $facing) : self{ return $this->writeInt(3, match($facing){ 0 => Facing::DOWN, @@ -125,6 +141,24 @@ final class RuntimeDataWriter{ return $this; } + /** + * @param BrewingStandSlot[] $slots + * @phpstan-param array $slots + * + * @return $this + */ + public function writeBrewingStandSlots(array $slots) : self{ + foreach([ + BrewingStandSlot::EAST(), + BrewingStandSlot::NORTHWEST(), + BrewingStandSlot::SOUTHWEST(), + ] as $member){ + $this->writeBool(isset($slots[$member->id()])); + } + + return $this; + } + public function getValue() : int{ return $this->value; } public function getOffset() : int{ return $this->offset; }