From 4e82482a80335594c8b7460c0c2287fce3bbdeae Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 30 Aug 2025 18:10:44 +0100 Subject: [PATCH] Use generic enumSet() for blocks with facing flags --- src/block/Vine.php | 17 +++++------ src/block/utils/MultiAnyFacingTrait.php | 11 ++++---- src/data/runtime/RuntimeDataDescriber.php | 10 ------- src/data/runtime/RuntimeDataReader.php | 28 ------------------- .../runtime/RuntimeDataSizeCalculator.php | 8 ------ src/data/runtime/RuntimeDataWriter.php | 26 ----------------- 6 files changed, 15 insertions(+), 85 deletions(-) diff --git a/src/block/Vine.php b/src/block/Vine.php index 8dfb0520e..0e6f83b12 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -33,6 +33,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; use function array_intersect_key; use function count; +use function spl_object_id; class Vine extends Flowable{ @@ -40,14 +41,14 @@ class Vine extends Flowable{ protected array $faces = []; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->horizontalFacingFlags($this->faces); + $w->enumSet($this->faces, HorizontalFacingOption::cases()); } /** @return HorizontalFacingOption[] */ public function getFaces() : array{ return $this->faces; } public function hasFace(HorizontalFacingOption $face) : bool{ - return isset($this->faces[$face->value]); + return isset($this->faces[spl_object_id($face)]); } /** @@ -60,7 +61,7 @@ class Vine extends Flowable{ if(!$face instanceof HorizontalFacingOption){ throw new \InvalidArgumentException("Expected array of HorizontalFacingOption"); } - $uniqueFaces[$face->value] = $face; + $uniqueFaces[spl_object_id($face)] = $face; } $this->faces = $uniqueFaces; return $this; @@ -69,9 +70,9 @@ class Vine extends Flowable{ /** @return $this */ public function setFace(HorizontalFacingOption $face, bool $value) : self{ if($value){ - $this->faces[$face->value] = $face; + $this->faces[spl_object_id($face)] = $face; }else{ - unset($this->faces[$face->value]); + unset($this->faces[spl_object_id($face)]); } return $this; } @@ -105,7 +106,7 @@ class Vine extends Flowable{ } $this->faces = $blockReplace instanceof Vine ? $blockReplace->faces : []; - $this->faces[$hzFacing->value] = $hzFacing; + $this->faces[spl_object_id($hzFacing)] = $hzFacing; return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -118,8 +119,8 @@ class Vine extends Flowable{ $supportedFaces = $up instanceof Vine ? array_intersect_key($this->faces, $up->faces) : []; foreach($this->faces as $face){ - if(!isset($supportedFaces[$face->value]) && !$this->getSide($face->toFacing())->isSolid()){ - unset($this->faces[$face->value]); + if(!isset($supportedFaces[spl_object_id($face)]) && !$this->getSide($face->toFacing())->isSolid()){ + unset($this->faces[spl_object_id($face)]); $changed = true; } } diff --git a/src/block/utils/MultiAnyFacingTrait.php b/src/block/utils/MultiAnyFacingTrait.php index b7cd77901..b465a7d50 100644 --- a/src/block/utils/MultiAnyFacingTrait.php +++ b/src/block/utils/MultiAnyFacingTrait.php @@ -25,6 +25,7 @@ namespace pocketmine\block\utils; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\math\Facing; +use function spl_object_id; /** * Used by blocks that can have multiple target faces in the area of one solid block, such as covering three sides of a corner. @@ -35,14 +36,14 @@ trait MultiAnyFacingTrait{ protected array $faces = []; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ - $w->facingFlags($this->faces); + $w->enumSet($this->faces, Facing::cases()); } /** @return Facing[] */ public function getFaces() : array{ return $this->faces; } public function hasFace(Facing $face) : bool{ - return isset($this->faces[$face->value]); + return isset($this->faces[spl_object_id($face)]); } /** @@ -52,7 +53,7 @@ trait MultiAnyFacingTrait{ public function setFaces(array $faces) : self{ $uniqueFaces = []; foreach($faces as $face){ - $uniqueFaces[$face->value] = $face; + $uniqueFaces[spl_object_id($face)] = $face; } $this->faces = $uniqueFaces; return $this; @@ -61,9 +62,9 @@ trait MultiAnyFacingTrait{ /** @return $this */ public function setFace(Facing $face, bool $value) : self{ if($value){ - $this->faces[$face->value] = $face; + $this->faces[spl_object_id($face)] = $face; }else{ - unset($this->faces[$face->value]); + unset($this->faces[spl_object_id($face)]); } return $this; } diff --git a/src/data/runtime/RuntimeDataDescriber.php b/src/data/runtime/RuntimeDataDescriber.php index 4fab5fc34..cf6d93135 100644 --- a/src/data/runtime/RuntimeDataDescriber.php +++ b/src/data/runtime/RuntimeDataDescriber.php @@ -47,16 +47,6 @@ interface RuntimeDataDescriber{ public function bool(bool &$value) : void; - /** - * @param Facing[] $faces - */ - public function facingFlags(array &$faces) : void; - - /** - * @param HorizontalFacingOption[] $faces - */ - public function horizontalFacingFlags(array &$faces) : void; - public function facingExcept(Facing &$facing, Facing $except) : void; public function horizontalAxis(Axis &$axis) : void; diff --git a/src/data/runtime/RuntimeDataReader.php b/src/data/runtime/RuntimeDataReader.php index abc4b2a84..58845c49e 100644 --- a/src/data/runtime/RuntimeDataReader.php +++ b/src/data/runtime/RuntimeDataReader.php @@ -77,34 +77,6 @@ final class RuntimeDataReader implements RuntimeDataDescriber{ $value = $this->readBool(); } - /** - * @param Facing[] $faces - */ - public function facingFlags(array &$faces) : void{ - $result = []; - foreach(Facing::ALL as $facing){ - if($this->readBool()){ - $result[$facing->value] = $facing; - } - } - - $faces = $result; - } - - /** - * @param HorizontalFacingOption[] $faces - */ - public function horizontalFacingFlags(array &$faces) : void{ - $result = []; - foreach(HorizontalFacingOption::cases() as $facing){ - if($this->readBool()){ - $result[$facing->value] = $facing; - } - } - - $faces = $result; - } - public function facingExcept(Facing &$facing, Facing $except) : void{ $result = Facing::DOWN; $this->enum($result); diff --git a/src/data/runtime/RuntimeDataSizeCalculator.php b/src/data/runtime/RuntimeDataSizeCalculator.php index 6efd7ed8a..ba6f7afd1 100644 --- a/src/data/runtime/RuntimeDataSizeCalculator.php +++ b/src/data/runtime/RuntimeDataSizeCalculator.php @@ -52,14 +52,6 @@ final class RuntimeDataSizeCalculator implements RuntimeDataDescriber{ $this->addBits(1); } - public function facingFlags(array &$faces) : void{ - $this->addBits(count(Facing::cases())); - } - - public function horizontalFacingFlags(array &$faces) : void{ - $this->addBits(count(HorizontalFacingOption::cases())); - } - public function facingExcept(Facing &$facing, Facing $except) : void{ $this->enum($facing); } diff --git a/src/data/runtime/RuntimeDataWriter.php b/src/data/runtime/RuntimeDataWriter.php index e469ac26e..a2be0c0f2 100644 --- a/src/data/runtime/RuntimeDataWriter.php +++ b/src/data/runtime/RuntimeDataWriter.php @@ -74,32 +74,6 @@ final class RuntimeDataWriter implements RuntimeDataDescriber{ $this->writeBool($value); } - /** - * @param Facing[] $faces - */ - public function facingFlags(array &$faces) : void{ - $uniqueFaces = []; - foreach($faces as $face){ - $uniqueFaces[$face->value] = true; - } - foreach(Facing::ALL as $facing){ - $this->writeBool(isset($uniqueFaces[$facing->value])); - } - } - - /** - * @param HorizontalFacingOption[] $faces - */ - public function horizontalFacingFlags(array &$faces) : void{ - $uniqueFaces = []; - foreach($faces as $face){ - $uniqueFaces[$face->value] = true; - } - foreach(HorizontalFacingOption::cases() as $facing){ - $this->writeBool(isset($uniqueFaces[$facing->value])); - } - } - public function facingExcept(Facing &$facing, Facing $except) : void{ $this->enum($facing); }