mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-05 01:16:15 +00:00
Use generic enumSet() for blocks with facing flags
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user