Remove implied dependence on Facing/Bearing constant values

this introduces mapping tables for redundancy for when those things change or disappear.
This commit is contained in:
Dylan K. Taylor 2019-07-29 17:43:36 +01:00
parent 18d05f57b5
commit a621bf66ff
41 changed files with 176 additions and 136 deletions

View File

@ -23,14 +23,13 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\Fallable;
use pocketmine\block\utils\FallableTrait;
use pocketmine\inventory\AnvilInventory;
use pocketmine\item\Item;
use pocketmine\item\ToolTier;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -47,11 +46,11 @@ class Anvil extends Transparent implements Fallable{
}
protected function writeStateToMeta() : int{
return Bearing::fromFacing($this->facing);
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readLegacyHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta);
}
public function getStateBitmask() : int{

View File

@ -26,7 +26,7 @@ namespace pocketmine\block;
use Ds\Deque;
use pocketmine\block\tile\Banner as TileBanner;
use pocketmine\block\utils\BannerPattern;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\DyeColor;
use pocketmine\item\Banner as ItemBanner;
use pocketmine\item\Item;
@ -77,12 +77,12 @@ class Banner extends Transparent{
if($this->facing === Facing::UP){
return $this->rotation;
}
return $this->facing;
return BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
if($id === $this->idInfo->getSecondId()){
$this->facing = BlockDataValidator::readHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta);
}else{
$this->facing = Facing::UP;
$this->rotation = $stateMeta;

View File

@ -24,14 +24,13 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Bed as TileBed;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\DyeColor;
use pocketmine\item\Bed as ItemBed;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\lang\TranslationContainer;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -56,13 +55,13 @@ class Bed extends Transparent{
}
protected function writeStateToMeta() : int{
return Bearing::fromFacing($this->facing) |
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) |
($this->occupied ? BlockLegacyMetadata::BED_FLAG_OCCUPIED : 0) |
($this->head ? BlockLegacyMetadata::BED_FLAG_HEAD : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->occupied = ($stateMeta & BlockLegacyMetadata::BED_FLAG_OCCUPIED) !== 0;
$this->head = ($stateMeta & BlockLegacyMetadata::BED_FLAG_HEAD) !== 0;
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
@ -40,12 +40,12 @@ abstract class Button extends Flowable{
protected $powered = false;
protected function writeStateToMeta() : int{
return $this->facing | ($this->powered ? BlockLegacyMetadata::BUTTON_FLAG_POWERED : 0);
return BlockDataSerializer::writeFacing($this->facing) | ($this->powered ? BlockLegacyMetadata::BUTTON_FLAG_POWERED : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
//TODO: in PC it's (6 - facing) for every meta except 0 (down)
$this->facing = BlockDataValidator::readFacing($stateMeta & 0x07);
$this->facing = BlockDataSerializer::readFacing($stateMeta & 0x07);
$this->powered = ($stateMeta & BlockLegacyMetadata::BUTTON_FLAG_POWERED) !== 0;
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\entity\Entity;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\event\entity\EntityDamageByBlockEvent;
@ -49,7 +49,7 @@ class Cactus extends Transparent{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataValidator::readBoundedInt("age", $stateMeta, 0, 15);
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, 15);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\entity\effect\EffectInstance;
use pocketmine\entity\Living;
use pocketmine\item\FoodSource;
@ -48,7 +48,7 @@ class Cake extends Transparent implements FoodSource{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->bites = BlockDataValidator::readBoundedInt("bites", $stateMeta, 0, 6);
$this->bites = BlockDataSerializer::readBoundedInt("bites", $stateMeta, 0, 6);
}
public function getStateBitmask() : int{

View File

@ -23,9 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -37,11 +36,11 @@ class CarvedPumpkin extends Opaque{
protected $facing = Facing::NORTH;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
}
protected function writeStateToMeta() : int{
return Bearing::fromFacing($this->facing);
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing);
}
public function getStateBitmask() : int{

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Chest as TileChest;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Facing;
@ -42,11 +42,11 @@ class Chest extends Transparent{
}
protected function writeStateToMeta() : int{
return $this->facing;
return BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta);
}
public function getStateBitmask() : int{

View File

@ -23,13 +23,12 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\TreeType;
use pocketmine\item\Fertilizer;
use pocketmine\item\Item;
use pocketmine\item\VanillaItems;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -48,12 +47,12 @@ class CocoaBlock extends Transparent{
}
protected function writeStateToMeta() : int{
return Bearing::fromFacing(Facing::opposite($this->facing)) | ($this->age << 2);
return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::opposite($this->facing)) | ($this->age << 2);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = Facing::opposite(BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03));
$this->age = BlockDataValidator::readBoundedInt("age", $stateMeta >> 2, 0, 2);
$this->facing = Facing::opposite(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03));
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta >> 2, 0, 2);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Fertilizer;
use pocketmine\item\Item;
@ -46,7 +46,7 @@ abstract class Crops extends Flowable{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataValidator::readBoundedInt("age", $stateMeta, 0, 7);
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, 7);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Facing;
@ -57,7 +57,7 @@ class DaylightSensor extends Transparent{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->power = BlockDataValidator::readBoundedInt("power", $stateMeta, 0, 15);
$this->power = BlockDataSerializer::readBoundedInt("power", $stateMeta, 0, 15);
$this->inverted = $id === $this->idInfo->getSecondId();
}

View File

@ -23,10 +23,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -55,7 +54,7 @@ class Door extends Transparent{
($this->powered ? BlockLegacyMetadata::DOOR_TOP_FLAG_POWERED : 0);
}
return Bearing::fromFacing(Facing::rotateY($this->facing, true)) | ($this->open ? BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN : 0);
return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::rotateY($this->facing, true)) | ($this->open ? BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
@ -64,7 +63,7 @@ class Door extends Transparent{
$this->hingeRight = ($stateMeta & BlockLegacyMetadata::DOOR_TOP_FLAG_RIGHT) !== 0;
$this->powered = ($stateMeta & BlockLegacyMetadata::DOOR_TOP_FLAG_POWERED) !== 0;
}else{
$this->facing = Facing::rotateY(BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03), false);
$this->facing = Facing::rotateY(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03), false);
$this->open = ($stateMeta & BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN) !== 0;
}
}

View File

@ -23,10 +23,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -44,11 +43,11 @@ class EndPortalFrame extends Opaque{
}
protected function writeStateToMeta() : int{
return Bearing::fromFacing($this->facing) | ($this->eye ? BlockLegacyMetadata::END_PORTAL_FRAME_FLAG_EYE : 0);
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | ($this->eye ? BlockLegacyMetadata::END_PORTAL_FRAME_FLAG_EYE : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->eye = ($stateMeta & BlockLegacyMetadata::END_PORTAL_FRAME_FLAG_EYE) !== 0;
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Facing;
@ -41,10 +41,12 @@ class EndRod extends Flowable{
}
protected function writeStateToMeta() : int{
if(Facing::axis($this->facing) === Facing::AXIS_Y){
return $this->facing;
$result = BlockDataSerializer::writeFacing($this->facing);
if(Facing::axis($this->facing) !== Facing::AXIS_Y){
$result ^= 1; //TODO: in PC this is always the same as facing, just PE is stupid
}
return $this->facing ^ 1; //TODO: in PC this is always the same as facing, just PE is stupid
return $result;
}
public function readStateFromData(int $id, int $stateMeta) : void{
@ -52,7 +54,7 @@ class EndRod extends Flowable{
$stateMeta ^= 1;
}
$this->facing = BlockDataValidator::readFacing($stateMeta);
$this->facing = BlockDataSerializer::readFacing($stateMeta);
}
public function getStateBitmask() : int{

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\EnderChest as TileEnderChest;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\item\ToolTier;
use pocketmine\math\AxisAlignedBB;
@ -43,11 +43,11 @@ class EnderChest extends Transparent{
}
protected function writeStateToMeta() : int{
return $this->facing;
return BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Facing;
@ -42,7 +42,7 @@ class Farmland extends Transparent{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->wetness = BlockDataValidator::readBoundedInt("wetness", $stateMeta, 0, 7);
$this->wetness = BlockDataSerializer::readBoundedInt("wetness", $stateMeta, 0, 7);
}
public function getStateBitmask() : int{

View File

@ -23,10 +23,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -46,13 +45,13 @@ class FenceGate extends Transparent{
}
protected function writeStateToMeta() : int{
return Bearing::fromFacing($this->facing) |
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) |
($this->open ? BlockLegacyMetadata::FENCE_GATE_FLAG_OPEN : 0) |
($this->inWall ? BlockLegacyMetadata::FENCE_GATE_FLAG_IN_WALL : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->open = ($stateMeta & BlockLegacyMetadata::FENCE_GATE_FLAG_OPEN) !== 0;
$this->inWall = ($stateMeta & BlockLegacyMetadata::FENCE_GATE_FLAG_IN_WALL) !== 0;
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\entity\Entity;
use pocketmine\entity\projectile\Arrow;
use pocketmine\event\block\BlockBurnEvent;
@ -49,7 +49,7 @@ class Fire extends Flowable{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataValidator::readBoundedInt("age", $stateMeta, 0, 15);
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, 15);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use function max;
use function mt_rand;
@ -37,7 +37,7 @@ class FrostedIce extends Ice{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataValidator::readBoundedInt("age", $stateMeta, 0, 3);
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, 3);
}
protected function writeStateToMeta() : int{

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Furnace as TileFurnace;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\item\ToolTier;
use pocketmine\math\Facing;
@ -50,11 +50,11 @@ class Furnace extends Opaque{
}
protected function writeStateToMeta() : int{
return $this->facing;
return BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta);
$this->lit = $id === $this->idInfo->getSecondId();
}

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\item\ToolTier;
use pocketmine\math\Facing;
@ -42,11 +42,11 @@ class GlazedTerracotta extends Opaque{
}
protected function writeStateToMeta() : int{
return $this->facing;
return BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta);
}
public function getStateBitmask() : int{

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Hopper as TileHopper;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
@ -41,7 +41,7 @@ class Hopper extends Transparent{
private $powered = false;
public function readStateFromData(int $id, int $stateMeta) : void{
$facing = BlockDataValidator::readFacing($stateMeta & 0x07);
$facing = BlockDataSerializer::readFacing($stateMeta & 0x07);
if($facing === Facing::UP){
throw new InvalidBlockStateException("Hopper may not face upward");
}
@ -50,7 +50,7 @@ class Hopper extends Transparent{
}
protected function writeStateToMeta() : int{
return $this->facing | ($this->powered ? BlockLegacyMetadata::HOPPER_FLAG_POWERED : 0);
return BlockDataSerializer::writeFacing($this->facing) | ($this->powered ? BlockLegacyMetadata::HOPPER_FLAG_POWERED : 0);
}
public function getStateBitmask() : int{

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\ItemFrame as TileItemFrame;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
@ -51,11 +51,11 @@ class ItemFrame extends Flowable{
}
protected function writeStateToMeta() : int{
return (5 - $this->facing) | ($this->hasMap ? BlockLegacyMetadata::ITEM_FRAME_FLAG_HAS_MAP : 0);
return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->hasMap ? BlockLegacyMetadata::ITEM_FRAME_FLAG_HAS_MAP : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::read5MinusHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta);
$this->hasMap = ($stateMeta & BlockLegacyMetadata::ITEM_FRAME_FLAG_HAS_MAP) !== 0;
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\entity\Entity;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
@ -42,11 +42,11 @@ class Ladder extends Transparent{
}
protected function writeStateToMeta() : int{
return $this->facing;
return BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
@ -54,7 +54,7 @@ class Lever extends Flowable{
}elseif($this->position === self::TOP){
$rotationMeta = Facing::axis($this->facing) === Facing::AXIS_Z ? 5 : 6;
}else{
$rotationMeta = 6 - $this->facing;
$rotationMeta = 6 - BlockDataSerializer::writeHorizontalFacing($this->facing);
}
return $rotationMeta | ($this->powered ? BlockLegacyMetadata::LEVER_FLAG_POWERED : 0);
}
@ -69,7 +69,7 @@ class Lever extends Flowable{
$this->facing = $rotationMeta === 7 ? Facing::SOUTH : Facing::EAST;
}else{
$this->position = self::SIDE;
$this->facing = BlockDataValidator::readHorizontalFacing(6 - $rotationMeta);
$this->facing = BlockDataSerializer::readHorizontalFacing(6 - $rotationMeta);
}
$this->powered = ($stateMeta & BlockLegacyMetadata::LEVER_FLAG_POWERED) !== 0;

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\entity\Entity;
use pocketmine\event\block\BlockFormEvent;
use pocketmine\event\block\BlockSpreadEvent;
@ -74,7 +74,7 @@ abstract class Liquid extends Transparent{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->decay = BlockDataValidator::readBoundedInt("decay", $stateMeta & 0x07, 0, 7);
$this->decay = BlockDataSerializer::readBoundedInt("decay", $stateMeta & 0x07, 0, 7);
$this->falling = ($stateMeta & BlockLegacyMetadata::LIQUID_FLAG_FALLING) !== 0;
$this->still = $id === $this->idInfo->getSecondId();
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\item\ToolTier;
use pocketmine\item\VanillaItems;
@ -42,7 +42,7 @@ class NetherReactor extends Opaque{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->state = BlockDataValidator::readBoundedInt("state", $stateMeta, 0, 2);
$this->state = BlockDataSerializer::readBoundedInt("state", $stateMeta, 0, 2);
}
public function getStateBitmask() : int{

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Item;
use pocketmine\math\Facing;
@ -47,7 +47,7 @@ class NetherWartPlant extends Flowable{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataValidator::readBoundedInt("age", $stateMeta, 0, 3);
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, 3);
}
public function getStateBitmask() : int{

View File

@ -24,10 +24,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Comparator;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -56,13 +55,13 @@ class RedstoneComparator extends Flowable{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->isSubtractMode = ($stateMeta & BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_SUBTRACT) !== 0;
$this->powered = ($id === $this->idInfo->getSecondId() or ($stateMeta & BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_POWERED) !== 0);
}
public function writeStateToMeta() : int{
return Bearing::fromFacing($this->facing) |
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) |
($this->isSubtractMode ? BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_SUBTRACT : 0) |
($this->powered ? BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_POWERED : 0);
}

View File

@ -23,10 +23,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -52,13 +51,13 @@ class RedstoneRepeater extends Flowable{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->delay = BlockDataValidator::readBoundedInt("delay", ($stateMeta >> 2) + 1, 1, 4);
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->delay = BlockDataSerializer::readBoundedInt("delay", ($stateMeta >> 2) + 1, 1, 4);
$this->powered = $id === $this->idInfo->getSecondId();
}
public function writeStateToMeta() : int{
return Bearing::fromFacing($this->facing) | (($this->delay - 1) << 2);
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | (($this->delay - 1) << 2);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
class RedstoneWire extends Flowable{
@ -35,7 +35,7 @@ class RedstoneWire extends Flowable{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->power = BlockDataValidator::readBoundedInt("power", $stateMeta, 0, 15);
$this->power = BlockDataSerializer::readBoundedInt("power", $stateMeta, 0, 15);
}
protected function writeStateToMeta() : int{

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Sign as TileSign;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\SignText;
use pocketmine\event\block\SignChangeEvent;
use pocketmine\item\Item;
@ -71,12 +71,12 @@ class Sign extends Transparent{
if($this->facing === Facing::UP){
return $this->rotation;
}
return $this->facing;
return BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
if($id === $this->idInfo->getSecondId()){
$this->facing = BlockDataValidator::readHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta);
}else{
$this->facing = Facing::UP;
$this->rotation = $stateMeta;

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Skull as TileSkull;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\SkullType;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
@ -54,11 +54,11 @@ class Skull extends Flowable{
}
protected function writeStateToMeta() : int{
return $this->facing;
return $this->facing === Facing::UP ? 1 : BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = $stateMeta === 1 ? Facing::UP : BlockDataValidator::readHorizontalFacing($stateMeta);
$this->facing = $stateMeta === 1 ? Facing::UP : BlockDataSerializer::readHorizontalFacing($stateMeta);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\Fallable;
use pocketmine\block\utils\FallableTrait;
use pocketmine\item\Item;
@ -52,7 +52,7 @@ class SnowLayer extends Flowable implements Fallable{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->layers = BlockDataValidator::readBoundedInt("layers", $stateMeta + 1, 1, 8);
$this->layers = BlockDataSerializer::readBoundedInt("layers", $stateMeta + 1, 1, 8);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\StairShape;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
@ -48,11 +48,11 @@ class Stair extends Transparent{
}
protected function writeStateToMeta() : int{
return (5 - $this->facing) | ($this->upsideDown ? BlockLegacyMetadata::STAIR_FLAG_UPSIDE_DOWN : 0);
return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->upsideDown ? BlockLegacyMetadata::STAIR_FLAG_UPSIDE_DOWN : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::read5MinusHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta);
$this->upsideDown = ($stateMeta & BlockLegacyMetadata::STAIR_FLAG_UPSIDE_DOWN) !== 0;
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Fertilizer;
use pocketmine\item\Item;
@ -46,7 +46,7 @@ class Sugarcane extends Flowable{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataValidator::readBoundedInt("age", $stateMeta, 0, 15);
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, 15);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
@ -40,11 +40,11 @@ class Torch extends Flowable{
}
protected function writeStateToMeta() : int{
return 6 - $this->facing;
return $this->facing === Facing::UP ? 5 : 6 - BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = $stateMeta === 5 ? Facing::UP : BlockDataValidator::readHorizontalFacing(6 - $stateMeta);
$this->facing = $stateMeta === 5 ? Facing::UP : BlockDataSerializer::readHorizontalFacing(6 - $stateMeta);
}
public function getStateBitmask() : int{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Facing;
@ -42,13 +42,13 @@ class Trapdoor extends Transparent{
protected $top = false;
protected function writeStateToMeta() : int{
return (5 - $this->facing) | ($this->top ? BlockLegacyMetadata::TRAPDOOR_FLAG_UPPER : 0) | ($this->open ? BlockLegacyMetadata::TRAPDOOR_FLAG_OPEN : 0);
return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->top ? BlockLegacyMetadata::TRAPDOOR_FLAG_UPPER : 0) | ($this->open ? BlockLegacyMetadata::TRAPDOOR_FLAG_OPEN : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
//TODO: in PC the values are reversed (facing - 2)
$this->facing = BlockDataValidator::read5MinusHorizontalFacing($stateMeta);
$this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta);
$this->top = ($stateMeta & BlockLegacyMetadata::TRAPDOOR_FLAG_UPPER) !== 0;
$this->open = ($stateMeta & BlockLegacyMetadata::TRAPDOOR_FLAG_OPEN) !== 0;
}

View File

@ -23,9 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -45,13 +44,13 @@ class TripwireHook extends Flowable{
}
protected function writeStateToMeta() : int{
return Bearing::fromFacing($this->facing) |
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) |
($this->connected ? BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_CONNECTED : 0) |
($this->powered ? BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_POWERED : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataValidator::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->connected = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_CONNECTED) !== 0;
$this->powered = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_POWERED) !== 0;
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataValidator;
use pocketmine\block\utils\BlockDataSerializer;
abstract class WeightedPressurePlate extends PressurePlate{
@ -35,7 +35,7 @@ abstract class WeightedPressurePlate extends PressurePlate{
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->power = BlockDataValidator::readBoundedInt("power", $stateMeta, 0, 15);
$this->power = BlockDataSerializer::readBoundedInt("power", $stateMeta, 0, 15);
}
public function getStateBitmask() : int{

View File

@ -23,28 +23,48 @@ declare(strict_types=1);
namespace pocketmine\block\utils;
use pocketmine\math\Bearing;
use pocketmine\math\Facing;
final class BlockDataValidator{
final class BlockDataSerializer{
private function __construct(){
}
/**
* @param int $facing
* @param int $raw
*
* @return int
* @throws InvalidBlockStateException
*/
public static function readFacing(int $facing) : int{
try{
Facing::validate($facing);
}catch(\InvalidArgumentException $e){
throw new InvalidBlockStateException("Invalid facing $facing", 0, $e);
public static function readFacing(int $raw) : int{
static $map = [ //this is for redundancy, for when/if the FACING constant values change
0 => Facing::DOWN,
1 => Facing::UP,
2 => Facing::NORTH,
3 => Facing::SOUTH,
4 => Facing::WEST,
5 => Facing::EAST
];
if(!isset($map[$raw])){
throw new InvalidBlockStateException("Invalid facing $raw");
}
return $facing;
return $map[$raw];
}
public static function writeFacing(int $facing) : int{
static $map = [ //again, for redundancy
Facing::DOWN => 0,
Facing::UP => 1,
Facing::NORTH => 2,
Facing::SOUTH => 3,
Facing::WEST => 4,
Facing::EAST => 5
];
if(!isset($map[$facing])){
throw new \InvalidArgumentException("Invalid facing $facing");
}
return $map[$facing];
}
/**
@ -61,19 +81,43 @@ final class BlockDataValidator{
return $facing;
}
public static function writeHorizontalFacing(int $facing) : int{
if(Facing::axis($facing) === Facing::AXIS_Y){
throw new \InvalidArgumentException("Invalid Y-axis facing");
}
return self::writeFacing($facing);
}
/**
* @param int $facing
* @param int $raw
*
* @return int
* @throws InvalidBlockStateException
*/
public static function readLegacyHorizontalFacing(int $facing) : int{
try{
$facing = Bearing::toFacing($facing);
}catch(\InvalidArgumentException $e){
throw new InvalidBlockStateException("Invalid legacy facing $facing");
public static function readLegacyHorizontalFacing(int $raw) : int{
static $map = [ //again, for redundancy
0 => Facing::SOUTH,
1 => Facing::WEST,
2 => Facing::NORTH,
3 => Facing::EAST
];
if(!isset($map[$raw])){
throw new InvalidBlockStateException("Invalid legacy facing $raw");
}
return self::readHorizontalFacing($facing);
return $map[$raw];
}
public static function writeLegacyHorizontalFacing(int $facing) : int{
static $map = [
Facing::SOUTH => 0,
Facing::WEST => 1,
Facing::NORTH => 2,
Facing::EAST => 3
];
if(!isset($map[$facing])){
throw new \InvalidArgumentException("Invalid Y-axis facing");
}
return $map[$facing];
}
/**
@ -86,6 +130,10 @@ final class BlockDataValidator{
return self::readHorizontalFacing(5 - ($value & 0x03));
}
public static function write5MinusHorizontalFacing(int $value) : int{
return 5 - self::writeHorizontalFacing($value);
}
public static function readBoundedInt(string $name, int $v, int $min, int $max) : int{
if($v < $min or $v > $max){
throw new InvalidBlockStateException("$name should be in range $min - $max, got $v");