Make Block::decodeState() and encodeState() more codegen-friendly

This commit is contained in:
Dylan K. Taylor
2022-07-18 15:48:03 +01:00
parent b8d1b00985
commit cf34f88a67
4 changed files with 72 additions and 25 deletions

View File

@@ -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<int, BrewingStandSlot>
*/
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; }
}

View File

@@ -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<int, BrewingStandSlot> $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; }