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
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
4 changed files with 72 additions and 25 deletions

View File

@ -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{

View File

@ -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[] */

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; }