Hit block legacy metadata with the biggest nuke you've ever seen

This commit completely revamps the way that blocks are represented in memory at runtime.

Instead of being represented by legacy Mojang block IDs and metadata, which are dated, limited and unchangeable, we now use custom PM block IDs, which are generated from VanillaBlocks.
This means we have full control of how they are assigned, which opens the doors to finally addressing inconsistencies like glazed terracotta, stripped logs handling, etc.

To represent state, BlockDataReader and BlockDataWriter have been introduced, and are used by blocks with state information to pack said information into a binary form that can be stored on a chunk at runtime.
Conceptually it's pretty similar to legacy metadata, but the actual format shares no resemblance whatsoever to legacy metadata, and is fully controlled by PM.
This means that the 'state data' may change in serialization format at any time, so it should **NOT** be stored on disk or in a config.

In the future, this will be improved using more auto-generated code and attributes, instead of hand-baked decodeState() and encodeState(). For now, this opens the gateway to a significant expansion of features.
It's not ideal, but it's a big step forwards.
This commit is contained in:
Dylan K. Taylor 2022-06-24 23:19:37 +01:00
parent be2fe160b3
commit f24f2d9ca9
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
149 changed files with 2234 additions and 2650 deletions

View File

@ -24,7 +24,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\inventory\AnvilInventory;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\Fallable;
use pocketmine\block\utils\FallableTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
@ -46,23 +47,20 @@ class Anvil extends Transparent implements Fallable{
private int $damage = self::UNDAMAGED;
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | ($this->damage << 2);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x3);
$this->damage = BlockDataSerializer::readBoundedInt("damage", $stateMeta >> 2, self::UNDAMAGED, self::VERY_DAMAGED);
}
public function getStateBitmask() : int{
return 0b1111;
}
protected function writeStateToItemMeta() : int{
return $this->damage << 2;
}
protected function decodeState(BlockDataReader $r) : void{
$this->setDamage($r->readBoundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED));
$this->setFacing($r->readHorizontalFacing());
}
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(2, $this->getDamage());
$w->writeHorizontalFacing($this->getFacing());
}
public function getDamage() : int{ return $this->damage; }
/** @return $this */

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\event\block\StructureGrowEvent;
use pocketmine\item\Bamboo as ItemBamboo;
@ -54,18 +55,16 @@ class Bamboo extends Transparent{
protected bool $ready = false;
protected int $leafSize = self::NO_LEAVES;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->thick = ($stateMeta & BlockLegacyMetadata::BAMBOO_FLAG_THICK) !== 0;
$this->leafSize = BlockDataSerializer::readBoundedInt("leafSize", ($stateMeta >> BlockLegacyMetadata::BAMBOO_LEAF_SIZE_SHIFT) & BlockLegacyMetadata::BAMBOO_LEAF_SIZE_MASK, self::NO_LEAVES, self::LARGE_LEAVES);
$this->ready = ($stateMeta & BlockLegacyMetadata::BAMBOO_FLAG_READY) !== 0;
protected function decodeState(BlockDataReader $r) : void{
$this->setLeafSize($r->readBoundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES));
$this->setThick($r->readBool());
$this->setReady($r->readBool());
}
public function writeStateToMeta() : int{
return ($this->thick ? BlockLegacyMetadata::BAMBOO_FLAG_THICK : 0) | ($this->leafSize << BlockLegacyMetadata::BAMBOO_LEAF_SIZE_SHIFT) | ($this->ready ? BlockLegacyMetadata::BAMBOO_FLAG_READY : 0);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(2, $this->getLeafSize());
$w->writeBool($this->isThick());
$w->writeBool($this->isReady());
}
public function isThick() : bool{ return $this->thick; }

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\event\block\StructureGrowEvent;
use pocketmine\item\Bamboo as ItemBamboo;
use pocketmine\item\Fertilizer;
@ -32,19 +34,16 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
final class BambooSapling extends Flowable{
private bool $ready = false;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->ready = ($stateMeta & BlockLegacyMetadata::BAMBOO_SAPLING_FLAG_READY) !== 0;
protected function decodeState(BlockDataReader $r) : void{
$this->setReady($r->readBool());
}
protected function writeStateToMeta() : int{
return $this->ready ? BlockLegacyMetadata::BAMBOO_SAPLING_FLAG_READY : 0;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->isReady());
}
public function getStateBitmask() : int{ return 0b1; }
public function isReady() : bool{ return $this->ready; }
/** @return $this */

View File

@ -25,7 +25,8 @@ namespace pocketmine\block;
use pocketmine\block\tile\Barrel as TileBarrel;
use pocketmine\block\utils\AnyFacingTrait;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
@ -38,17 +39,14 @@ class Barrel extends Opaque{
protected bool $open = false;
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeFacing($this->facing) | ($this->open ? BlockLegacyMetadata::BARREL_FLAG_OPEN : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->setFacing($r->readFacing());
$this->setOpen($r->readBool());
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readFacing($stateMeta & 0x07);
$this->open = ($stateMeta & BlockLegacyMetadata::BARREL_FLAG_OPEN) === BlockLegacyMetadata::BARREL_FLAG_OPEN;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeFacing($this->getFacing());
$w->writeBool($this->isOpen());
}
public function isOpen() : bool{

View File

@ -25,6 +25,8 @@ namespace pocketmine\block;
use pocketmine\block\tile\Banner as TileBanner;
use pocketmine\block\utils\BannerPatternLayer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
use pocketmine\block\utils\SupportType;
@ -53,6 +55,14 @@ abstract class BaseBanner extends Transparent{
parent::__construct($idInfo, $name, $breakInfo);
}
protected function decodeState(BlockDataReader $r) : void{
//TODO: we currently purposely don't read or write colour (it's stored on the tile)
}
protected function encodeState(BlockDataWriter $w) : void{
//TODO: we currently purposely don't read or write colour (it's stored on the tile)
}
public function readStateFromWorld() : void{
parent::readStateFromWorld();
$tile = $this->position->getWorld()->getTile($this->position);

View File

@ -24,12 +24,12 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Bed as TileBed;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
use pocketmine\data\bedrock\DyeColorIdMap;
use pocketmine\entity\Entity;
use pocketmine\entity\Living;
use pocketmine\item\Item;
@ -54,20 +54,18 @@ class Bed extends Transparent{
parent::__construct($idInfo, $name, $breakInfo);
}
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) |
($this->occupied ? BlockLegacyMetadata::BED_FLAG_OCCUPIED : 0) |
($this->head ? BlockLegacyMetadata::BED_FLAG_HEAD : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->occupied = $r->readBool();
$this->head = $r->readBool();
//TODO: we currently purposely don't read or write colour (it's stored on the tile)
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->occupied = ($stateMeta & BlockLegacyMetadata::BED_FLAG_OCCUPIED) !== 0;
$this->head = ($stateMeta & BlockLegacyMetadata::BED_FLAG_HEAD) !== 0;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->occupied);
$w->writeBool($this->head);
//TODO: we currently purposely don't read or write colour (it's stored on the tile)
}
public function readStateFromWorld() : void{
@ -209,10 +207,6 @@ class Bed extends Transparent{
return [];
}
protected function writeStateToItemMeta() : int{
return DyeColorIdMap::getInstance()->toId($this->color);
}
public function getAffectedBlocks() : array{
if(($other = $this->getOtherHalf()) !== null){
return [$this, $other];

View File

@ -23,20 +23,18 @@ declare(strict_types=1);
namespace pocketmine\block;
class Bedrock extends Opaque{
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
class Bedrock extends Opaque{
private bool $burnsForever = false;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->burnsForever = ($stateMeta & BlockLegacyMetadata::BEDROCK_FLAG_INFINIBURN) !== 0;
protected function decodeState(BlockDataReader $r) : void{
$this->burnsForever = $r->readBool();
}
protected function writeStateToMeta() : int{
return $this->burnsForever ? BlockLegacyMetadata::BEDROCK_FLAG_INFINIBURN : 0;
}
public function getStateBitmask() : int{
return 0b1;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->burnsForever);
}
public function burnsForever() : bool{

View File

@ -25,16 +25,17 @@ namespace pocketmine\block;
use pocketmine\block\tile\Bell as TileBell;
use pocketmine\block\utils\BellAttachmentType;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataReaderHelper;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\BlockDataWriterHelper;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
use pocketmine\utils\AssumptionFailedError;
use pocketmine\world\BlockTransaction;
use pocketmine\world\sound\BellRingSound;
@ -48,36 +49,14 @@ final class Bell extends Transparent{
parent::__construct($idInfo, $name, $breakInfo);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->setFacing(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03));
$attachmentType = [
BlockLegacyMetadata::BELL_ATTACHMENT_FLOOR => BellAttachmentType::FLOOR(),
BlockLegacyMetadata::BELL_ATTACHMENT_CEILING => BellAttachmentType::CEILING(),
BlockLegacyMetadata::BELL_ATTACHMENT_ONE_WALL => BellAttachmentType::ONE_WALL(),
BlockLegacyMetadata::BELL_ATTACHMENT_TWO_WALLS => BellAttachmentType::TWO_WALLS()
][($stateMeta >> 2) & 0b11] ?? null;
if($attachmentType === null){
throw new InvalidBlockStateException("No such attachment type");
}
$this->setAttachmentType($attachmentType);
protected function decodeState(BlockDataReader $r) : void{
$this->attachmentType = BlockDataReaderHelper::readBellAttachmentType($r);
$this->facing = $r->readHorizontalFacing();
}
public function writeStateToMeta() : int{
$attachmentTypeMeta = [
BellAttachmentType::FLOOR()->id() => BlockLegacyMetadata::BELL_ATTACHMENT_FLOOR,
BellAttachmentType::CEILING()->id() => BlockLegacyMetadata::BELL_ATTACHMENT_CEILING,
BellAttachmentType::ONE_WALL()->id() => BlockLegacyMetadata::BELL_ATTACHMENT_ONE_WALL,
BellAttachmentType::TWO_WALLS()->id() => BlockLegacyMetadata::BELL_ATTACHMENT_TWO_WALLS
][$this->getAttachmentType()->id()] ?? null;
if($attachmentTypeMeta === null){
throw new AssumptionFailedError("Mapping should cover all cases");
}
return BlockDataSerializer::writeLegacyHorizontalFacing($this->getFacing()) | ($attachmentTypeMeta << 2);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
BlockDataWriterHelper::writeBellAttachmentType($w, $this->attachmentType);
$w->writeHorizontalFacing($this->facing);
}
protected function recalculateCollisionBoxes() : array{

View File

@ -28,7 +28,8 @@ namespace pocketmine\block;
use pocketmine\block\tile\Spawnable;
use pocketmine\block\tile\Tile;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\entity\Entity;
use pocketmine\item\enchantment\VanillaEnchantments;
@ -44,14 +45,12 @@ use pocketmine\world\BlockTransaction;
use pocketmine\world\format\Chunk;
use pocketmine\world\Position;
use pocketmine\world\World;
use function assert;
use function count;
use function dechex;
use const PHP_INT_MAX;
class Block{
public const INTERNAL_METADATA_BITS = 4;
public const INTERNAL_METADATA_MASK = ~(~0 << self::INTERNAL_METADATA_BITS);
public const INTERNAL_STATE_DATA_BITS = 6;
public const INTERNAL_STATE_DATA_MASK = ~(~0 << self::INTERNAL_STATE_DATA_BITS);
protected BlockIdentifier $idInfo;
protected string $fallbackName;
@ -65,9 +64,6 @@ class Block{
* @param string $name English name of the block type (TODO: implement translations)
*/
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
if(($idInfo->getLegacyVariant() & $this->getStateBitmask()) !== 0){
throw new \InvalidArgumentException("Variant 0x" . dechex($idInfo->getLegacyVariant()) . " collides with state bitmask 0x" . dechex($this->getStateBitmask()));
}
$this->idInfo = $idInfo;
$this->fallbackName = $name;
$this->breakInfo = $breakInfo;
@ -86,18 +82,11 @@ class Block{
return $this->fallbackName;
}
/**
* @deprecated
*/
public function getId() : int{
return $this->idInfo->getLegacyBlockId();
}
/**
* @internal
*/
public function getFullId() : int{
return ($this->getId() << self::INTERNAL_METADATA_BITS) | $this->getMeta();
public function getStateId() : int{
return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->computeStateData();
}
public function asItem() : Item{
@ -107,34 +96,29 @@ class Block{
);
}
/**
* @deprecated
*/
public function getMeta() : int{
$stateMeta = $this->writeStateToMeta();
assert(($stateMeta & ~$this->getStateBitmask()) === 0);
return $this->idInfo->getLegacyVariant() | $stateMeta;
}
protected function writeStateToItemMeta() : int{
return 0;
}
/**
* Returns a bitmask used to extract state bits from block metadata.
*/
public function getStateBitmask() : int{
return 0;
public function decodeStateData(int $data) : void{
$reader = new BlockDataReader(self::INTERNAL_STATE_DATA_BITS, $data);
$this->decodeState($reader);
}
protected function writeStateToMeta() : int{
return 0;
protected function decodeState(BlockDataReader $r) : void{
//NOOP
}
/**
* @throws InvalidBlockStateException
* @internal
*/
public function readStateFromData(int $id, int $stateMeta) : void{
public function computeStateData() : int{
$writer = new BlockDataWriter(self::INTERNAL_STATE_DATA_BITS);
$this->encodeState($writer);
return $writer->getValue();
}
protected function encodeState(BlockDataWriter $w) : void{
//NOOP
}
@ -150,7 +134,7 @@ class Block{
}
public function writeStateToWorld() : void{
$this->position->getWorld()->getOrLoadChunkAtPosition($this->position)->setFullBlock($this->position->x & Chunk::COORD_MASK, $this->position->y, $this->position->z & Chunk::COORD_MASK, $this->getFullId());
$this->position->getWorld()->getOrLoadChunkAtPosition($this->position)->setFullBlock($this->position->x & Chunk::COORD_MASK, $this->position->y, $this->position->z & Chunk::COORD_MASK, $this->getStateId());
$tileType = $this->idInfo->getTileClass();
$oldTile = $this->position->getWorld()->getTile($this->position);
@ -194,7 +178,7 @@ class Block{
* Returns whether the given block has the same type and properties as this block.
*/
public function isSameState(Block $other) : bool{
return $this->getFullId() === $other->getFullId();
return $this->getStateId() === $other->getStateId();
}
/**
@ -551,7 +535,7 @@ class Block{
* @return string
*/
public function __toString(){
return "Block[" . $this->getName() . "] (" . $this->getId() . ":" . $this->getMeta() . ")";
return "Block[" . $this->getName() . "] (" . $this->getTypeId() . ":" . $this->computeStateData() . ")";
}
/**

File diff suppressed because it is too large Load Diff

View File

@ -23,8 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\PillarRotationInMetadataTrait;
use pocketmine\block\utils\PillarRotationTrait;
class BoneBlock extends Opaque{
use PillarRotationInMetadataTrait;
use PillarRotationTrait;
}

View File

@ -24,6 +24,10 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\BrewingStand as TileBrewingStand;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataReaderHelper;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\BlockDataWriterHelper;
use pocketmine\block\utils\BrewingStandSlot;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
@ -42,33 +46,12 @@ class BrewingStand extends Transparent{
*/
protected array $slots = [];
protected function writeStateToMeta() : int{
$flags = 0;
foreach([
BlockLegacyMetadata::BREWING_STAND_FLAG_EAST => BrewingStandSlot::EAST(),
BlockLegacyMetadata::BREWING_STAND_FLAG_NORTHWEST => BrewingStandSlot::NORTHWEST(),
BlockLegacyMetadata::BREWING_STAND_FLAG_SOUTHWEST => BrewingStandSlot::SOUTHWEST(),
] as $flag => $slot){
$flags |= (array_key_exists($slot->id(), $this->slots) ? $flag : 0);
}
return $flags;
protected function decodeState(BlockDataReader $r) : void{
$this->setSlots(BlockDataReaderHelper::readBrewingStandSlotKeySet($r));
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->slots = [];
foreach([
BlockLegacyMetadata::BREWING_STAND_FLAG_EAST => BrewingStandSlot::EAST(),
BlockLegacyMetadata::BREWING_STAND_FLAG_NORTHWEST => BrewingStandSlot::NORTHWEST(),
BlockLegacyMetadata::BREWING_STAND_FLAG_SOUTHWEST => BrewingStandSlot::SOUTHWEST(),
] as $flag => $slot){
if(($stateMeta & $flag) !== 0){
$this->slots[$slot->id()] = $slot;
}
}
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
BlockDataWriterHelper::writeBrewingStandSlotKeySet($w, $this->slots);
}
protected function recalculateCollisionBoxes() : array{

View File

@ -24,7 +24,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\AnyFacingTrait;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
@ -38,18 +39,14 @@ abstract class Button extends Flowable{
protected bool $pressed = false;
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeFacing($this->facing) | ($this->pressed ? BlockLegacyMetadata::BUTTON_FLAG_POWERED : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readFacing();
$this->pressed = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
//TODO: in PC it's (6 - facing) for every meta except 0 (down)
$this->facing = BlockDataSerializer::readFacing($stateMeta & 0x07);
$this->pressed = ($stateMeta & BlockLegacyMetadata::BUTTON_FLAG_POWERED) !== 0;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeFacing($this->facing);
$w->writeBool($this->pressed);
}
public function isPressed() : bool{ return $this->pressed; }

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\entity\Entity;
use pocketmine\event\block\BlockGrowEvent;
@ -41,16 +42,12 @@ class Cactus extends Transparent{
protected int $age = 0;
protected function writeStateToMeta() : int{
return $this->age;
protected function decodeState(BlockDataReader $r) : void{
$this->age = $r->readBoundedInt(4, 0, self::MAX_AGE);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(4, $this->age);
}
public function getAge() : int{ return $this->age; }

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\entity\effect\EffectInstance;
use pocketmine\entity\FoodSource;
@ -40,16 +41,12 @@ class Cake extends Transparent implements FoodSource{
protected int $bites = 0;
protected function writeStateToMeta() : int{
return $this->bites;
protected function decodeState(BlockDataReader $r) : void{
$this->bites = $r->readBoundedInt(3, 0, self::MAX_BITES);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->bites = BlockDataSerializer::readBoundedInt("bites", $stateMeta, 0, self::MAX_BITES);
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(3, $this->bites);
}
/**

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
@ -33,7 +33,7 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
class Carpet extends Flowable{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,23 +23,10 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
class CarvedPumpkin extends Opaque{
use FacesOppositePlacingPlayerTrait;
use HorizontalFacingTrait;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
}
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing);
}
public function getStateBitmask() : int{
return 0b11;
}
}

View File

@ -23,11 +23,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -35,18 +33,6 @@ final class ChemistryTable extends Opaque{
use FacesOppositePlacingPlayerTrait;
use HorizontalFacingTrait;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = Facing::opposite(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x3));
}
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::opposite($this->facing));
}
public function getStateBitmask() : int{
return 0b0011;
}
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
//TODO
return false;

View File

@ -25,7 +25,7 @@ namespace pocketmine\block;
use pocketmine\block\tile\Chest as TileChest;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
use pocketmine\event\block\ChestPairEvent;
use pocketmine\item\Item;
@ -36,7 +36,7 @@ use pocketmine\player\Player;
class Chest extends Transparent{
use FacesOppositePlacingPlayerTrait;
use NormalHorizontalFacingInMetadataTrait;
use HorizontalFacingTrait;
/**
* @return AxisAlignedBB[]

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
use pocketmine\block\utils\TreeType;
@ -46,17 +47,14 @@ class CocoaBlock extends Transparent{
protected int $age = 0;
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::opposite($this->facing)) | ($this->age << 2);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->age = $r->readBoundedInt(2, 0, self::MAX_AGE);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = Facing::opposite(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03));
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta >> 2, 0, self::MAX_AGE);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeInt(2, $this->age);
}
public function getAge() : int{ return $this->age; }

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
class Concrete extends Opaque{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
use pocketmine\block\utils\Fallable;
use pocketmine\block\utils\FallableTrait;
@ -31,7 +31,7 @@ use pocketmine\event\block\BlockFormEvent;
use pocketmine\math\Facing;
class ConcretePowder extends Opaque implements Fallable{
use ColorInMetadataTrait;
use ColoredTrait;
use FallableTrait {
onNearbyBlockChange as protected startFalling;
}

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\data\bedrock\CoralTypeIdMap;
use pocketmine\item\Item;
use pocketmine\math\Facing;
@ -33,24 +32,8 @@ use pocketmine\world\BlockTransaction;
final class Coral extends BaseCoral{
public function readStateFromData(int $id, int $stateMeta) : void{
$coralType = CoralTypeIdMap::getInstance()->fromId($stateMeta);
if($coralType === null){
throw new InvalidBlockStateException("No such coral type");
}
$this->coralType = $coralType;
}
public function writeStateToMeta() : int{
return CoralTypeIdMap::getInstance()->toId($this->coralType);
}
protected function writeStateToItemMeta() : int{
return $this->writeStateToMeta();
}
public function getStateBitmask() : int{
return 0b0111;
return CoralTypeIdMap::getInstance()->toId($this->coralType);
}
public function readStateFromWorld() : void{

View File

@ -25,7 +25,6 @@ namespace pocketmine\block;
use pocketmine\block\utils\CoralType;
use pocketmine\block\utils\CoralTypeTrait;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\data\bedrock\CoralTypeIdMap;
use pocketmine\item\Item;
use function mt_rand;
@ -38,25 +37,8 @@ final class CoralBlock extends Opaque{
parent::__construct($idInfo, $name, $breakInfo);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$coralType = CoralTypeIdMap::getInstance()->fromId($stateMeta & 0x7);
if($coralType === null){
throw new InvalidBlockStateException("No such coral type");
}
$this->coralType = $coralType;
$this->dead = ($stateMeta & BlockLegacyMetadata::CORAL_BLOCK_FLAG_DEAD) !== 0;
}
protected function writeStateToMeta() : int{
return ($this->dead ? BlockLegacyMetadata::CORAL_BLOCK_FLAG_DEAD : 0) | CoralTypeIdMap::getInstance()->toId($this->coralType);
}
protected function writeStateToItemMeta() : int{
return $this->writeStateToMeta();
}
public function getStateBitmask() : int{
return 0b1111;
return ($this->dead ? BlockLegacyMetadata::CORAL_BLOCK_FLAG_DEAD : 0) | CoralTypeIdMap::getInstance()->toId($this->coralType);
}
public function onNearbyBlockChange() : void{

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Fertilizer;
use pocketmine\item\Item;
@ -38,16 +39,12 @@ abstract class Crops extends Flowable{
protected int $age = 0;
protected function writeStateToMeta() : int{
return $this->age;
protected function decodeState(BlockDataReader $r) : void{
$this->age = $r->readBoundedInt(3, 0, self::MAX_AGE);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE);
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(3, $this->age);
}
public function getAge() : int{ return $this->age; }

View File

@ -24,7 +24,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
@ -39,30 +40,16 @@ use const M_PI;
class DaylightSensor extends Transparent{
use AnalogRedstoneSignalEmitterTrait;
protected BlockIdentifierFlattened $idInfoFlattened;
protected bool $inverted = false;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
protected function decodeState(BlockDataReader $r) : void{
$this->signalStrength = $r->readBoundedInt(4, 0, 15);
$this->inverted = $r->readBool();
}
public function getId() : int{
return $this->inverted ? $this->idInfoFlattened->getSecondId() : parent::getId();
}
protected function writeStateToMeta() : int{
return $this->signalStrength;
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->signalStrength = BlockDataSerializer::readBoundedInt("signalStrength", $stateMeta, 0, 15);
$this->inverted = $id === $this->idInfoFlattened->getSecondId();
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(4, $this->signalStrength);
$w->writeBool($this->inverted);
}
public function isInverted() : bool{

View File

@ -23,9 +23,22 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
class DetectorRail extends StraightOnlyRail{
protected bool $activated = false;
protected function decodeState(BlockDataReader $r) : void{
parent::decodeState($r);
$this->activated = $r->readBool();
}
protected function encodeState(BlockDataWriter $w) : void{
parent::encodeState($w);
$w->writeBool($this->activated);
}
public function isActivated() : bool{ return $this->activated; }
/** @return $this */
@ -33,19 +46,5 @@ class DetectorRail extends StraightOnlyRail{
$this->activated = $activated;
return $this;
}
public function readStateFromData(int $id, int $stateMeta) : void{
parent::readStateFromData($id, $stateMeta & ~BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED);
$this->activated = ($stateMeta & BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED) !== 0;
}
protected function writeStateToMeta() : int{
return parent::writeStateToMeta() | ($this->activated ? BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED : 0);
}
public function getStateBitmask() : int{
return 0b1111;
}
//TODO
}

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\item\Hoe;
use pocketmine\item\Item;
use pocketmine\math\Facing;
@ -31,23 +33,18 @@ use pocketmine\player\Player;
use pocketmine\world\sound\ItemUseOnBlockSound;
class Dirt extends Opaque{
protected bool $coarse = false;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->coarse = ($stateMeta & BlockLegacyMetadata::DIRT_FLAG_COARSE) !== 0;
}
protected function writeStateToMeta() : int{
protected function writeStateToItemMeta() : int{
return $this->coarse ? BlockLegacyMetadata::DIRT_FLAG_COARSE : 0;
}
protected function writeStateToItemMeta() : int{
return $this->writeStateToMeta();
protected function decodeState(BlockDataReader $r) : void{
$this->coarse = $r->readBool();
}
public function getStateBitmask() : int{
return 0b1;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->coarse);
}
public function isCoarse() : bool{ return $this->coarse; }

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
@ -41,27 +42,18 @@ class Door extends Transparent{
protected bool $hingeRight = false;
protected bool $open = false;
protected function writeStateToMeta() : int{
if($this->top){
return BlockLegacyMetadata::DOOR_FLAG_TOP |
($this->hingeRight ? BlockLegacyMetadata::DOOR_TOP_FLAG_RIGHT : 0);
}
return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::rotateY($this->facing, true)) | ($this->open ? BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->top = $r->readBool();
$this->hingeRight = $r->readBool();
$this->open = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->top = ($stateMeta & BlockLegacyMetadata::DOOR_FLAG_TOP) !== 0;
if($this->top){
$this->hingeRight = ($stateMeta & BlockLegacyMetadata::DOOR_TOP_FLAG_RIGHT) !== 0;
}else{
$this->facing = Facing::rotateY(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03), false);
$this->open = ($stateMeta & BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN) !== 0;
}
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->top);
$w->writeBool($this->hingeRight);
$w->writeBool($this->open);
}
public function readStateFromWorld() : void{

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
@ -30,19 +32,14 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
class DoublePlant extends Flowable{
protected bool $top = false;
protected function writeStateToMeta() : int{
return ($this->top ? BlockLegacyMetadata::DOUBLE_PLANT_FLAG_TOP : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->top = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->top = ($stateMeta & BlockLegacyMetadata::DOUBLE_PLANT_FLAG_TOP) !== 0;
}
public function getStateBitmask() : int{
return 0b1000;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->top);
}
public function isTop() : bool{ return $this->top; }

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
final class DyedShulkerBox extends ShulkerBox{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\math\AxisAlignedBB;
@ -35,17 +36,14 @@ class EndPortalFrame extends Opaque{
protected bool $eye = false;
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | ($this->eye ? BlockLegacyMetadata::END_PORTAL_FRAME_FLAG_EYE : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->eye = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->eye = ($stateMeta & BlockLegacyMetadata::END_PORTAL_FRAME_FLAG_EYE) !== 0;
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->eye);
}
public function hasEye() : bool{ return $this->eye; }

View File

@ -24,7 +24,6 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\AnyFacingTrait;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\Axis;
use pocketmine\math\AxisAlignedBB;
@ -36,27 +35,6 @@ use pocketmine\world\BlockTransaction;
class EndRod extends Flowable{
use AnyFacingTrait;
protected function writeStateToMeta() : int{
$result = BlockDataSerializer::writeFacing($this->facing);
if(Facing::axis($this->facing) !== Axis::Y){
$result ^= 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{
if($stateMeta !== 0 && $stateMeta !== 1){
$stateMeta ^= 1;
}
$this->facing = BlockDataSerializer::readFacing($stateMeta);
}
public function getStateBitmask() : int{
return 0b111;
}
public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
$this->facing = $face;
if($blockClicked instanceof EndRod && $blockClicked->facing === $this->facing){

View File

@ -26,7 +26,7 @@ namespace pocketmine\block;
use pocketmine\block\inventory\EnderChestInventory;
use pocketmine\block\tile\EnderChest as TileEnderChest;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
@ -36,7 +36,7 @@ use pocketmine\player\Player;
class EnderChest extends Transparent{
use FacesOppositePlacingPlayerTrait;
use NormalHorizontalFacingInMetadataTrait;
use HorizontalFacingTrait;
public function getLightLevel() : int{
return 7;

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\entity\Entity;
use pocketmine\entity\Living;
use pocketmine\event\entity\EntityTrampleFarmlandEvent;
@ -37,16 +38,12 @@ class Farmland extends Transparent{
protected int $wetness = 0; //"moisture" blockstate property in PC
protected function writeStateToMeta() : int{
return $this->wetness;
protected function decodeState(BlockDataReader $r) : void{
$this->wetness = $r->readBoundedInt(3, 0, self::MAX_WETNESS);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->wetness = BlockDataSerializer::readBoundedInt("wetness", $stateMeta, 0, self::MAX_WETNESS);
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(3, $this->wetness);
}
public function getWetness() : int{ return $this->wetness; }

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
@ -40,20 +41,16 @@ class FenceGate extends Transparent{
protected bool $open = false;
protected bool $inWall = false;
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) |
($this->open ? BlockLegacyMetadata::FENCE_GATE_FLAG_OPEN : 0) |
($this->inWall ? BlockLegacyMetadata::FENCE_GATE_FLAG_IN_WALL : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->open = $r->readBool();
$this->inWall = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$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;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->open);
$w->writeBool($this->inWall);
}
public function isOpen() : bool{ return $this->open; }

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\entity\Entity;
use pocketmine\entity\projectile\Arrow;
use pocketmine\event\block\BlockBurnEvent;
@ -45,16 +46,12 @@ class Fire extends Flowable{
protected int $age = 0;
protected function writeStateToMeta() : int{
return $this->age;
protected function decodeState(BlockDataReader $r) : void{
$this->age = $r->readBoundedInt(4, 0, self::MAX_AGE);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(4, $this->age);
}
public function getAge() : int{ return $this->age; }

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SignLikeRotationTrait;
use pocketmine\item\Item;
use pocketmine\math\Facing;
@ -31,18 +33,19 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
final class FloorBanner extends BaseBanner{
use SignLikeRotationTrait;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->rotation = $stateMeta;
use SignLikeRotationTrait {
decodeState as decodeRotation;
encodeState as encodeRotation;
}
protected function writeStateToMeta() : int{
return $this->rotation;
protected function decodeState(BlockDataReader $r) : void{
parent::decodeState($r);
$this->decodeRotation($r);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
parent::encodeState($w);
$this->encodeRotation($w);
}
protected function getSupportingFace() : int{

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\data\bedrock\CoralTypeIdMap;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
@ -37,30 +38,8 @@ use function atan2;
use function rad2deg;
final class FloorCoralFan extends BaseCoral{
protected BlockIdentifierFlattened $idInfoFlattened;
private int $axis = Axis::X;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->dead = $id === $this->idInfoFlattened->getSecondId();
$this->axis = ($stateMeta >> 3) === BlockLegacyMetadata::CORAL_FAN_EAST_WEST ? Axis::X : Axis::Z;
$coralType = CoralTypeIdMap::getInstance()->fromId($stateMeta & BlockLegacyMetadata::CORAL_FAN_TYPE_MASK);
if($coralType === null){
throw new InvalidBlockStateException("No such coral type");
}
$this->coralType = $coralType;
}
public function getId() : int{
return $this->dead ? $this->idInfoFlattened->getSecondId() : parent::getId();
}
public function asItem() : Item{
//TODO: HACK! workaround dead flag being lost when broken / blockpicked (original impl only uses first ID)
return ItemFactory::getInstance()->get(
@ -69,17 +48,18 @@ final class FloorCoralFan extends BaseCoral{
);
}
protected function writeStateToMeta() : int{
return (($this->axis === Axis::X ? BlockLegacyMetadata::CORAL_FAN_EAST_WEST : BlockLegacyMetadata::CORAL_FAN_NORTH_SOUTH) << 3) |
CoralTypeIdMap::getInstance()->toId($this->coralType);
}
protected function writeStateToItemMeta() : int{
return CoralTypeIdMap::getInstance()->toId($this->coralType);
}
public function getStateBitmask() : int{
return 0b1111;
protected function decodeState(BlockDataReader $r) : void{
parent::decodeState($r);
$this->axis = $r->readHorizontalAxis();
}
protected function encodeState(BlockDataWriter $w) : void{
parent::encodeState($w);
$w->writeHorizontalAxis($this->axis);
}
public function getAxis() : int{ return $this->axis; }

View File

@ -33,18 +33,6 @@ use pocketmine\world\BlockTransaction;
final class FloorSign extends BaseSign{
use SignLikeRotationTrait;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->rotation = $stateMeta;
}
protected function writeStateToMeta() : int{
return $this->rotation;
}
public function getStateBitmask() : int{
return 0b1111;
}
protected function getSupportingFace() : int{
return Facing::DOWN;
}

View File

@ -36,15 +36,6 @@ class FlowerPot extends Flowable{
protected ?Block $plant = null;
protected function writeStateToMeta() : int{
//TODO: HACK! this is just to make the client actually render the plant - we purposely don't read the flag back
return $this->plant !== null ? BlockLegacyMetadata::FLOWER_POT_FLAG_OCCUPIED : 0;
}
public function getStateBitmask() : int{
return 0b1;
}
public function readStateFromWorld() : void{
parent::readStateFromWorld();
$tile = $this->position->getWorld()->getTile($this->position);

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\event\block\BlockMeltEvent;
use function mt_rand;
@ -32,16 +33,12 @@ class FrostedIce extends Ice{
protected int $age = 0;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE);
protected function decodeState(BlockDataReader $r) : void{
$this->age = $r->readBoundedInt(2, 0, self::MAX_AGE);
}
protected function writeStateToMeta() : int{
return $this->age;
}
public function getStateBitmask() : int{
return 0b11;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(2, $this->age);
}
public function getAge() : int{ return $this->age; }

View File

@ -24,8 +24,10 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Furnace as TileFurnace;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -33,26 +35,18 @@ use function mt_rand;
class Furnace extends Opaque{
use FacesOppositePlacingPlayerTrait;
use NormalHorizontalFacingInMetadataTrait {
readStateFromData as readFacingStateFromData;
use HorizontalFacingTrait;
protected bool $lit = false;
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->lit = $r->readBool();
}
protected BlockIdentifierFlattened $idInfoFlattened;
protected bool $lit = false; //this is set based on the blockID
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
}
public function getId() : int{
return $this->lit ? $this->idInfoFlattened->getSecondId() : parent::getId();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->readFacingStateFromData($id, $stateMeta);
$this->lit = $id === $this->idInfoFlattened->getSecondId();
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->lit);
}
public function getLightLevel() : int{

View File

@ -24,9 +24,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
class GlazedTerracotta extends Opaque{
use FacesOppositePlacingPlayerTrait;
use NormalHorizontalFacingInMetadataTrait;
use HorizontalFacingTrait;
}

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\PillarRotationInMetadataTrait;
use pocketmine\block\utils\PillarRotationTrait;
use pocketmine\entity\Entity;
class HayBale extends Opaque{
use PillarRotationInMetadataTrait;
use PillarRotationTrait;
public function getFlameEncouragement() : int{
return 60;

View File

@ -24,7 +24,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Hopper as TileHopper;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\PoweredByRedstoneTrait;
use pocketmine\block\utils\SupportType;
@ -40,21 +41,18 @@ class Hopper extends Transparent{
private int $facing = Facing::DOWN;
public function readStateFromData(int $id, int $stateMeta) : void{
$facing = BlockDataSerializer::readFacing($stateMeta & 0x07);
protected function decodeState(BlockDataReader $r) : void{
$facing = $r->readFacing();
if($facing === Facing::UP){
throw new InvalidBlockStateException("Hopper may not face upward");
}
$this->facing = $facing;
$this->powered = ($stateMeta & BlockLegacyMetadata::HOPPER_FLAG_POWERED) !== 0;
$this->powered = $r->readBool();
}
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeFacing($this->facing) | ($this->powered ? BlockLegacyMetadata::HOPPER_FLAG_POWERED : 0);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeFacing($this->facing);
$w->writeBool($this->powered);
}
public function getFacing() : int{ return $this->facing; }

View File

@ -31,7 +31,7 @@ final class InfestedStone extends Opaque{
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, Block $imitated){
parent::__construct($idInfo, $name, $breakInfo);
$this->imitated = $imitated->getFullId();
$this->imitated = $imitated->getStateId();
}
public function getImitatedBlock() : Block{

View File

@ -24,7 +24,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\ItemFrame as TileItemFrame;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
use pocketmine\math\Facing;
@ -46,13 +47,14 @@ class ItemFrame extends Flowable{
protected int $itemRotation = 0;
protected float $itemDropChance = 1.0;
protected function writeStateToMeta() : int{
return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->hasMap ? BlockLegacyMetadata::ITEM_FRAME_FLAG_HAS_MAP : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->hasMap = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta);
$this->hasMap = ($stateMeta & BlockLegacyMetadata::ITEM_FRAME_FLAG_HAS_MAP) !== 0;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->hasMap);
}
public function readStateFromWorld() : void{
@ -78,10 +80,6 @@ class ItemFrame extends Flowable{
}
}
public function getStateBitmask() : int{
return 0b111;
}
public function getFramedItem() : ?Item{
return $this->framedItem !== null ? clone $this->framedItem : null;
}

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
use pocketmine\entity\Entity;
use pocketmine\entity\Living;
@ -36,7 +36,7 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
class Ladder extends Transparent{
use NormalHorizontalFacingInMetadataTrait;
use HorizontalFacingTrait;
public function hasEntityCollision() : bool{
return true;

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
use pocketmine\math\Axis;
@ -33,19 +35,14 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
class Lantern extends Transparent{
protected bool $hanging = false;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->hanging = ($stateMeta & BlockLegacyMetadata::LANTERN_FLAG_HANGING) !== 0;
protected function decodeState(BlockDataReader $r) : void{
$this->hanging = $r->readBool();
}
protected function writeStateToMeta() : int{
return $this->hanging ? BlockLegacyMetadata::LANTERN_FLAG_HANGING : 0;
}
public function getStateBitmask() : int{
return 0b1;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->hanging);
}
public function isHanging() : bool{ return $this->hanging; }

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\block\utils\TreeType;
use pocketmine\event\block\LeavesDecayEvent;
@ -38,7 +40,6 @@ use pocketmine\world\World;
use function mt_rand;
class Leaves extends Transparent{
protected TreeType $treeType;
protected bool $noDecay = false;
protected bool $checkDecay = false;
@ -48,17 +49,14 @@ class Leaves extends Transparent{
$this->treeType = $treeType;
}
protected function writeStateToMeta() : int{
return ($this->noDecay ? BlockLegacyMetadata::LEAVES_FLAG_NO_DECAY : 0) | ($this->checkDecay ? BlockLegacyMetadata::LEAVES_FLAG_CHECK_DECAY : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->noDecay = $r->readBool();
$this->checkDecay = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->noDecay = ($stateMeta & BlockLegacyMetadata::LEAVES_FLAG_NO_DECAY) !== 0;
$this->checkDecay = ($stateMeta & BlockLegacyMetadata::LEAVES_FLAG_CHECK_DECAY) !== 0;
}
public function getStateBitmask() : int{
return 0b1100;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->noDecay);
$w->writeBool($this->checkDecay);
}
public function isNoDecay() : bool{ return $this->noDecay; }

View File

@ -24,7 +24,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Lectern as TileLectern;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
@ -43,15 +44,17 @@ class Lectern extends Transparent{
protected int $viewedPage = 0;
protected ?WritableBookBase $book = null;
protected bool $producingSignal = false;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->producingSignal = ($stateMeta & BlockLegacyMetadata::LECTERN_FLAG_POWERED) !== 0;
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->producingSignal = $r->readBool();
}
public function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | ($this->producingSignal ? BlockLegacyMetadata::LECTERN_FLAG_POWERED : 0);
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->producingSignal);
}
public function readStateFromWorld() : void{
@ -72,10 +75,6 @@ class Lectern extends Transparent{
}
}
public function getStateBitmask() : int{
return 0b111;
}
public function getFlammability() : int{
return 30;
}

View File

@ -23,6 +23,10 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataReaderHelper;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\BlockDataWriterHelper;
use pocketmine\block\utils\LeverFacing;
use pocketmine\item\Item;
use pocketmine\math\Axis;
@ -43,36 +47,14 @@ class Lever extends Flowable{
parent::__construct($idInfo, $name, $breakInfo);
}
protected function writeStateToMeta() : int{
$rotationMeta = match($this->facing->id()){
LeverFacing::DOWN_AXIS_X()->id() => 0,
LeverFacing::EAST()->id() => 1,
LeverFacing::WEST()->id() => 2,
LeverFacing::SOUTH()->id() => 3,
LeverFacing::NORTH()->id() => 4,
LeverFacing::UP_AXIS_Z()->id() => 5,
LeverFacing::UP_AXIS_X()->id() => 6,
LeverFacing::DOWN_AXIS_Z()->id() => 7,
default => throw new AssumptionFailedError(),
};
return $rotationMeta | ($this->activated ? BlockLegacyMetadata::LEVER_FLAG_POWERED : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = BlockDataReaderHelper::readLeverFacing($r);
$this->activated = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$rotationMeta = $stateMeta & 0x07;
$this->facing = match($rotationMeta){
0 => LeverFacing::DOWN_AXIS_X(),
1 => LeverFacing::EAST(),
2 => LeverFacing::WEST(),
3 => LeverFacing::SOUTH(),
4 => LeverFacing::NORTH(),
5 => LeverFacing::UP_AXIS_Z(),
6 => LeverFacing::UP_AXIS_X(),
7 => LeverFacing::DOWN_AXIS_Z(),
default => throw new AssumptionFailedError("0x07 mask should make this impossible"), //phpstan doesn't understand :(
};
$this->activated = ($stateMeta & BlockLegacyMetadata::LEVER_FLAG_POWERED) !== 0;
protected function encodeState(BlockDataWriter $w) : void{
BlockDataWriterHelper::writeLeverFacing($w, $this->facing);
$w->writeBool($this->activated);
}
public function getFacing() : LeverFacing{ return $this->facing; }
@ -91,10 +73,6 @@ class Lever extends Flowable{
return $this;
}
public function getStateBitmask() : int{
return 0b1111;
}
public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
if(!$this->canBeSupportedBy($blockClicked, $face)){
return false;

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\MinimumCostFlowCalculator;
use pocketmine\block\utils\SupportType;
use pocketmine\entity\Entity;
@ -40,8 +41,6 @@ use function lcg_value;
abstract class Liquid extends Transparent{
public const MAX_DECAY = 7;
protected BlockIdentifierFlattened $idInfoFlattened;
public int $adjacentSources = 0;
protected ?Vector3 $flowVector = null;
@ -50,27 +49,16 @@ abstract class Liquid extends Transparent{
protected int $decay = 0; //PC "level" property
protected bool $still = false;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
protected function decodeState(BlockDataReader $r) : void{
$this->decay = $r->readBoundedInt(3, 0, self::MAX_DECAY);
$this->falling = $r->readBool();
$this->still = $r->readBool();
}
public function getId() : int{
return $this->still ? $this->idInfoFlattened->getSecondId() : parent::getId();
}
protected function writeStateToMeta() : int{
return $this->decay | ($this->falling ? BlockLegacyMetadata::LIQUID_FLAG_FALLING : 0);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->decay = BlockDataSerializer::readBoundedInt("decay", $stateMeta & 0x07, 0, self::MAX_DECAY);
$this->falling = ($stateMeta & BlockLegacyMetadata::LIQUID_FLAG_FALLING) !== 0;
$this->still = $id === $this->idInfoFlattened->getSecondId();
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(3, $this->decay);
$w->writeBool($this->falling);
$w->writeBool($this->still);
}
public function isFalling() : bool{ return $this->falling; }

View File

@ -23,10 +23,10 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\PillarRotationInMetadataTrait;
use pocketmine\block\utils\PillarRotationTrait;
class Log extends Wood{
use PillarRotationInMetadataTrait;
use PillarRotationTrait;
protected function getAxisMetaShift() : int{
return $this->isStripped() ? 0 : 2;

View File

@ -24,7 +24,6 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\inventory\LoomInventory;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
@ -35,18 +34,6 @@ final class Loom extends Opaque{
use FacesOppositePlacingPlayerTrait;
use HorizontalFacingTrait;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x3);
}
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing);
}
public function getStateBitmask() : int{
return 0b11;
}
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
if($player !== null){
$player->setCurrentWindow(new LoomInventory($this->position));

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\entity\Entity;
use pocketmine\item\Item;
@ -33,16 +35,12 @@ class NetherPortal extends Transparent{
protected int $axis = Axis::X;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->axis = $stateMeta === BlockLegacyMetadata::NETHER_PORTAL_AXIS_Z ? Axis::Z : Axis::X; //mojang u dumb
protected function decodeState(BlockDataReader $r) : void{
$this->axis = $r->readHorizontalAxis();
}
protected function writeStateToMeta() : int{
return $this->axis === Axis::Z ? BlockLegacyMetadata::NETHER_PORTAL_AXIS_Z : BlockLegacyMetadata::NETHER_PORTAL_AXIS_X;
}
public function getStateBitmask() : int{
return 0b11;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalAxis($this->axis);
}
public function getAxis() : int{

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Item;
use pocketmine\math\Facing;
@ -37,16 +38,12 @@ class NetherWartPlant extends Flowable{
protected int $age = 0;
protected function writeStateToMeta() : int{
return $this->age;
protected function decodeState(BlockDataReader $r) : void{
$this->age = $r->readBoundedInt(2, 0, self::MAX_AGE);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE);
}
public function getStateBitmask() : int{
return 0b11;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(2, $this->age);
}
public function getAge() : int{ return $this->age; }

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\RailConnectionInfo;
use pocketmine\math\Facing;
@ -33,20 +35,16 @@ class Rail extends BaseRail{
private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH;
public function readStateFromData(int $id, int $stateMeta) : void{
if(!isset(RailConnectionInfo::CONNECTIONS[$stateMeta]) && !isset(RailConnectionInfo::CURVE_CONNECTIONS[$stateMeta])){
throw new InvalidBlockStateException("No rail shape matches metadata $stateMeta");
protected function decodeState(BlockDataReader $r) : void{
$railShape = $r->readInt(4);
if(!isset(RailConnectionInfo::CONNECTIONS[$railShape]) && !isset(RailConnectionInfo::CURVE_CONNECTIONS[$railShape])){
throw new InvalidBlockStateException("Invalid rail shape $railShape");
}
$this->railShape = $stateMeta;
$this->railShape = $railShape;
}
protected function writeStateToMeta() : int{
//TODO: railShape won't be plain metadata in future
return $this->railShape;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(4, $this->railShape);
}
protected function setShapeFromConnections(array $connections) : void{

View File

@ -23,14 +23,15 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataReaderHelper;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\BlockDataWriterHelper;
use pocketmine\block\utils\MushroomBlockType;
use pocketmine\data\bedrock\MushroomBlockTypeIdMap;
use pocketmine\item\Item;
use function mt_rand;
class RedMushroomBlock extends Opaque{
protected MushroomBlockType $mushroomBlockType;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
@ -38,20 +39,12 @@ class RedMushroomBlock extends Opaque{
parent::__construct($idInfo, $name, $breakInfo);
}
protected function writeStateToMeta() : int{
return MushroomBlockTypeIdMap::getInstance()->toId($this->mushroomBlockType);
protected function decodeState(BlockDataReader $r) : void{
$this->mushroomBlockType = BlockDataReaderHelper::readMushroomBlockType($r);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$type = MushroomBlockTypeIdMap::getInstance()->fromId($stateMeta);
if($type === null){
throw new InvalidBlockStateException("No such mushroom variant $stateMeta");
}
$this->mushroomBlockType = $type;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
BlockDataWriterHelper::writeMushroomBlockType($w, $this->mushroomBlockType);
}
public function getMushroomBlockType() : MushroomBlockType{ return $this->mushroomBlockType; }

View File

@ -25,7 +25,8 @@ namespace pocketmine\block;
use pocketmine\block\tile\Comparator;
use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\PoweredByRedstoneTrait;
use pocketmine\block\utils\SupportType;
@ -42,33 +43,19 @@ class RedstoneComparator extends Flowable{
use AnalogRedstoneSignalEmitterTrait;
use PoweredByRedstoneTrait;
protected BlockIdentifierFlattened $idInfoFlattened;
protected bool $isSubtractMode = false;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->isSubtractMode = $r->readBool();
$this->powered = $r->readBool();
//TODO: this doesn't call the decoder from AnalogRedstoneSignalEmitter
}
public function getId() : int{
return $this->powered ? $this->idInfoFlattened->getSecondId() : parent::getId();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->isSubtractMode = ($stateMeta & BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_SUBTRACT) !== 0;
$this->powered = ($id === $this->idInfoFlattened->getSecondId() || ($stateMeta & BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_POWERED) !== 0);
}
public function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) |
($this->isSubtractMode ? BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_SUBTRACT : 0) |
($this->powered ? BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_POWERED : 0);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->isSubtractMode);
$w->writeBool($this->powered);
}
public function readStateFromWorld() : void{

View File

@ -23,24 +23,19 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\PoweredByRedstoneTrait;
class RedstoneLamp extends Opaque{
use PoweredByRedstoneTrait;
protected BlockIdentifierFlattened $idInfoFlattened;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
protected function decodeState(BlockDataReader $r) : void{
$this->powered = $r->readBool();
}
public function getId() : int{
return $this->powered ? $this->idInfoFlattened->getSecondId() : parent::getId();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->powered = $id === $this->idInfoFlattened->getSecondId();
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->powered);
}
public function getLightLevel() : int{

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\item\Item;
use pocketmine\item\VanillaItems;
use pocketmine\math\Vector3;
@ -30,22 +32,14 @@ use pocketmine\player\Player;
use function mt_rand;
class RedstoneOre extends Opaque{
protected BlockIdentifierFlattened $idInfoFlattened;
protected bool $lit = false;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
protected function decodeState(BlockDataReader $r) : void{
$this->lit = $r->readBool();
}
public function getId() : int{
return $this->lit ? $this->idInfoFlattened->getSecondId() : parent::getId();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->lit = $id === $this->idInfoFlattened->getSecondId();
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->lit);
}
public function isLit() : bool{

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\PoweredByRedstoneTrait;
use pocketmine\block\utils\SupportType;
@ -41,31 +42,18 @@ class RedstoneRepeater extends Flowable{
public const MIN_DELAY = 1;
public const MAX_DELAY = 4;
protected BlockIdentifierFlattened $idInfoFlattened;
protected int $delay = self::MIN_DELAY;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->delay = $r->readBoundedInt(2, self::MIN_DELAY - 1, self::MAX_DELAY - 1) + 1;
$this->powered = $r->readBool();
}
public function getId() : int{
return $this->powered ? $this->idInfoFlattened->getSecondId() : parent::getId();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->delay = BlockDataSerializer::readBoundedInt("delay", ($stateMeta >> 2) + 1, self::MIN_DELAY, self::MAX_DELAY);
$this->powered = $id === $this->idInfoFlattened->getSecondId();
}
public function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | (($this->delay - 1) << 2);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeInt(2, $this->delay - 1);
$w->writeBool($this->powered);
}
public function getDelay() : int{ return $this->delay; }

View File

@ -23,24 +23,20 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
class RedstoneTorch extends Torch{
protected BlockIdentifierFlattened $idInfoFlattened;
protected bool $lit = true;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
protected function decodeState(BlockDataReader $r) : void{
parent::decodeState($r);
$this->lit = $r->readBool();
}
public function getId() : int{
return $this->lit ? parent::getId() : $this->idInfoFlattened->getSecondId();
}
public function readStateFromData(int $id, int $stateMeta) : void{
parent::readStateFromData($id, $stateMeta);
$this->lit = $id !== $this->idInfoFlattened->getSecondId();
protected function encodeState(BlockDataWriter $w) : void{
parent::encodeState($w);
$w->writeBool($this->lit);
}
public function isLit() : bool{

View File

@ -24,7 +24,6 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
@ -41,18 +40,6 @@ class RedstoneWire extends Flowable{
return false;
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->signalStrength = BlockDataSerializer::readBoundedInt("signalStrength", $stateMeta, 0, 15);
}
protected function writeStateToMeta() : int{
return $this->signalStrength;
}
public function getStateBitmask() : int{
return 0b1111;
}
public function readStateFromWorld() : void{
parent::readStateFromWorld();
//TODO: check connections to nearby redstone components

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\TreeType;
use pocketmine\event\block\StructureGrowEvent;
use pocketmine\item\Fertilizer;
@ -36,7 +38,6 @@ use pocketmine\world\generator\object\TreeFactory;
use function mt_rand;
class Sapling extends Flowable{
protected bool $ready = false;
private TreeType $treeType;
@ -46,16 +47,12 @@ class Sapling extends Flowable{
$this->treeType = $treeType;
}
protected function writeStateToMeta() : int{
return ($this->ready ? BlockLegacyMetadata::SAPLING_FLAG_READY : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->ready = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->ready = ($stateMeta & BlockLegacyMetadata::SAPLING_FLAG_READY) !== 0;
}
public function getStateBitmask() : int{
return 0b1000;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->ready);
}
public function isReady() : bool{ return $this->ready; }

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
@ -37,17 +39,14 @@ class SeaPickle extends Transparent{
protected int $count = self::MIN_COUNT;
protected bool $underwater = false;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->count = ($stateMeta & 0x03) + 1;
$this->underwater = ($stateMeta & BlockLegacyMetadata::SEA_PICKLE_FLAG_NOT_UNDERWATER) === 0;
protected function decodeState(BlockDataReader $r) : void{
$this->count = $r->readBoundedInt(2, self::MIN_COUNT - 1, self::MAX_COUNT - 1) + 1;
$this->underwater = $r->readBool();
}
protected function writeStateToMeta() : int{
return ($this->count - 1) | ($this->underwater ? 0 : BlockLegacyMetadata::SEA_PICKLE_FLAG_NOT_UNDERWATER);
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(2, $this->count - 1);
$w->writeBool($this->underwater);
}
public function getCount() : int{ return $this->count; }

View File

@ -25,6 +25,8 @@ namespace pocketmine\block;
use pocketmine\block\tile\ShulkerBox as TileShulkerBox;
use pocketmine\block\utils\AnyFacingTrait;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\item\Item;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
@ -33,6 +35,14 @@ use pocketmine\world\BlockTransaction;
class ShulkerBox extends Opaque{
use AnyFacingTrait;
protected function decodeState(BlockDataReader $r) : void{
//NOOP - we don't read or write facing here, because the tile persists it
}
protected function encodeState(BlockDataWriter $w) : void{
//NOOP - we don't read or write facing here, because the tile persists it
}
public function writeStateToWorld() : void{
parent::writeStateToWorld();
$shulker = $this->position->getWorld()->getTile($this->position);

View File

@ -23,12 +23,12 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\PillarRotationInMetadataTrait;
use pocketmine\block\utils\PillarRotationTrait;
/**
* @internal This class provides a general base for pillar-like blocks. It **should not** be used for contract binding
* in APIs, because not all pillar-like blocks extend this class.
*/
class SimplePillar extends Opaque{
use PillarRotationInMetadataTrait;
use PillarRotationTrait;
}

View File

@ -23,20 +23,18 @@ declare(strict_types=1);
namespace pocketmine\block;
abstract class SimplePressurePlate extends PressurePlate{
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
abstract class SimplePressurePlate extends PressurePlate{
protected bool $pressed = false;
protected function writeStateToMeta() : int{
return $this->pressed ? BlockLegacyMetadata::PRESSURE_PLATE_FLAG_POWERED : 0;
protected function decodeState(BlockDataReader $r) : void{
$this->pressed = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->pressed = ($stateMeta & BlockLegacyMetadata::PRESSURE_PLATE_FLAG_POWERED) !== 0;
}
public function getStateBitmask() : int{
return 0b1;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->pressed);
}
public function isPressed() : bool{ return $this->pressed; }

View File

@ -24,7 +24,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\tile\Skull as TileSkull;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\SkullType;
use pocketmine\item\Item;
use pocketmine\math\AxisAlignedBB;
@ -42,7 +44,6 @@ class Skull extends Flowable{
protected SkullType $skullType;
protected int $facing = Facing::NORTH;
protected bool $noDrops = false;
protected int $rotation = self::MIN_ROTATION; //TODO: split this into floor skull and wall skull handling
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
@ -50,19 +51,16 @@ class Skull extends Flowable{
parent::__construct($idInfo, $name, $breakInfo);
}
protected function writeStateToMeta() : int{
return ($this->facing === Facing::UP ? 1 : BlockDataSerializer::writeHorizontalFacing($this->facing)) |
($this->noDrops ? BlockLegacyMetadata::SKULL_FLAG_NO_DROPS : 0);
protected function decodeState(BlockDataReader $r) : void{
$facing = $r->readFacing();
if($facing === Facing::DOWN){
throw new InvalidBlockStateException("Skull may not face down");
}
$this->facing = $facing;
}
public function readStateFromData(int $id, int $stateMeta) : void{
$facingMeta = $stateMeta & 0x7;
$this->facing = $facingMeta === 1 ? Facing::UP : BlockDataSerializer::readHorizontalFacing($facingMeta);
$this->noDrops = ($stateMeta & BlockLegacyMetadata::SKULL_FLAG_NO_DROPS) !== 0;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeFacing($this->facing);
}
public function readStateFromWorld() : void{
@ -115,14 +113,6 @@ class Skull extends Flowable{
return $this;
}
public function isNoDrops() : bool{ return $this->noDrops; }
/** @return $this */
public function setNoDrops(bool $noDrops) : self{
$this->noDrops = $noDrops;
return $this;
}
/**
* @return AxisAlignedBB[]
*/

View File

@ -23,6 +23,10 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataReaderHelper;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\BlockDataWriterHelper;
use pocketmine\block\utils\SlabType;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
@ -33,38 +37,19 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
class Slab extends Transparent{
protected BlockIdentifierFlattened $idInfoFlattened;
protected SlabType $slabType;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
parent::__construct($idInfo, $name . " Slab", $breakInfo);
$this->slabType = SlabType::BOTTOM();
}
public function getId() : int{
return $this->slabType->equals(SlabType::DOUBLE()) ? $this->idInfoFlattened->getSecondId() : parent::getId();
protected function decodeState(BlockDataReader $r) : void{
$this->slabType = BlockDataReaderHelper::readSlabType($r);
}
protected function writeStateToMeta() : int{
if(!$this->slabType->equals(SlabType::DOUBLE())){
return ($this->slabType->equals(SlabType::TOP()) ? BlockLegacyMetadata::SLAB_FLAG_UPPER : 0);
}
return 0;
}
public function readStateFromData(int $id, int $stateMeta) : void{
if($id === $this->idInfoFlattened->getSecondId()){
$this->slabType = SlabType::DOUBLE();
}else{
$this->slabType = ($stateMeta & BlockLegacyMetadata::SLAB_FLAG_UPPER) !== 0 ? SlabType::TOP() : SlabType::BOTTOM();
}
}
public function getStateBitmask() : int{
return 0b1000;
protected function encodeState(BlockDataWriter $w) : void{
BlockDataWriterHelper::writeSlabType($w, $this->slabType);
}
public function isTransparent() : bool{

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\Fallable;
use pocketmine\block\utils\FallableTrait;
use pocketmine\block\utils\SupportType;
@ -46,16 +47,12 @@ class SnowLayer extends Flowable implements Fallable{
protected int $layers = self::MIN_LAYERS;
protected function writeStateToMeta() : int{
return $this->layers - 1;
protected function decodeState(BlockDataReader $r) : void{
$this->layers = $r->readBoundedInt(3, self::MIN_LAYERS - 1, self::MAX_LAYERS - 1) + 1;
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->layers = BlockDataSerializer::readBoundedInt("layers", $stateMeta + 1, self::MIN_LAYERS, self::MAX_LAYERS);
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(3, $this->layers - 1);
}
public function getLayers() : int{ return $this->layers; }

View File

@ -23,24 +23,22 @@ declare(strict_types=1);
namespace pocketmine\block;
class Sponge extends Opaque{
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
class Sponge extends Opaque{
protected bool $wet = false;
protected function writeStateToMeta() : int{
protected function writeStateToItemMeta() : int{
return $this->wet ? BlockLegacyMetadata::SPONGE_FLAG_WET : 0;
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->wet = ($stateMeta & BlockLegacyMetadata::SPONGE_FLAG_WET) !== 0;
protected function decodeState(BlockDataReader $r) : void{
$this->wet = $r->readBool();
}
protected function writeStateToItemMeta() : int{
return $this->writeStateToMeta();
}
public function getStateBitmask() : int{
return 0b1;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->wet);
}
public function isWet() : bool{ return $this->wet; }

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
final class StainedGlass extends Glass{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
final class StainedGlassPane extends GlassPane{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
final class StainedHardenedClay extends HardenedClay{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
final class StainedHardenedGlass extends HardenedGlass{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
final class StainedHardenedGlassPane extends HardenedGlassPane{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\StairShape;
use pocketmine\block\utils\SupportType;
@ -46,17 +47,14 @@ class Stair extends Transparent{
parent::__construct($idInfo, $name, $breakInfo);
}
protected function writeStateToMeta() : int{
return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->upsideDown ? BlockLegacyMetadata::STAIR_FLAG_UPSIDE_DOWN : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->upsideDown = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta);
$this->upsideDown = ($stateMeta & BlockLegacyMetadata::STAIR_FLAG_UPSIDE_DOWN) !== 0;
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->upsideDown);
}
public function readStateFromWorld() : void{

View File

@ -24,7 +24,6 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\inventory\StonecutterInventory;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\FacesOppositePlacingPlayerTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
@ -38,18 +37,6 @@ class Stonecutter extends Transparent{
use FacesOppositePlacingPlayerTrait;
use HorizontalFacingTrait;
public function writeStateToMeta() : int{
return BlockDataSerializer::writeHorizontalFacing($this->facing);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta);
}
public function getStateBitmask() : int{
return 0b111;
}
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
if($player !== null){
$player->setCurrentWindow(new StonecutterInventory($this->position));

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\RailConnectionInfo;
use function array_keys;
@ -35,21 +37,16 @@ class StraightOnlyRail extends BaseRail{
private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH;
public function readStateFromData(int $id, int $stateMeta) : void{
$railShape = $stateMeta & ~BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED;
protected function decodeState(BlockDataReader $r) : void{
$railShape = $r->readInt(3);
if(!isset(RailConnectionInfo::CONNECTIONS[$railShape])){
throw new InvalidBlockStateException("No rail shape matches meta $stateMeta");
throw new InvalidBlockStateException("No rail shape matches meta $railShape");
}
$this->railShape = $railShape;
}
protected function writeStateToMeta() : int{
//TODO: railShape won't be plain metadata in the future
return $this->railShape;
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(3, $this->railShape);
}
protected function setShapeFromConnections(array $connections) : void{

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Fertilizer;
use pocketmine\item\Item;
@ -37,16 +38,12 @@ class Sugarcane extends Flowable{
protected int $age = 0;
protected function writeStateToMeta() : int{
return $this->age;
protected function decodeState(BlockDataReader $r) : void{
$this->age = $r->readBoundedInt(4, 0, self::MAX_AGE);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE);
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(4, $this->age);
}
private function grow() : bool{

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\entity\Entity;
use pocketmine\entity\Living;
use pocketmine\event\block\BlockGrowEvent;
@ -45,16 +46,12 @@ class SweetBerryBush extends Flowable{
protected int $age = self::STAGE_SAPLING;
protected function writeStateToMeta() : int{
return $this->age;
protected function decodeState(BlockDataReader $r) : void{
$this->age = $r->readBoundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->age = BlockDataSerializer::readBoundedInt("stage", $stateMeta, self::STAGE_SAPLING, self::STAGE_MATURE);
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(3, $this->age);
}
public function getAge() : int{ return $this->age; }

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\entity\Entity;
use pocketmine\entity\Location;
use pocketmine\entity\object\PrimedTNT;
@ -40,25 +42,21 @@ use function sin;
use const M_PI;
class TNT extends Opaque{
protected bool $unstable = false; //TODO: Usage unclear, seems to be a weird hack in vanilla
protected bool $worksUnderwater = false;
public function readStateFromData(int $id, int $stateMeta) : void{
$this->unstable = ($stateMeta & BlockLegacyMetadata::TNT_FLAG_UNSTABLE) !== 0;
$this->worksUnderwater = ($stateMeta & BlockLegacyMetadata::TNT_FLAG_UNDERWATER) !== 0;
}
protected function writeStateToMeta() : int{
return ($this->unstable ? BlockLegacyMetadata::TNT_FLAG_UNSTABLE : 0) | ($this->worksUnderwater ? BlockLegacyMetadata::TNT_FLAG_UNDERWATER : 0);
}
protected function writeStateToItemMeta() : int{
return $this->worksUnderwater ? BlockLegacyMetadata::TNT_FLAG_UNDERWATER : 0;
}
public function getStateBitmask() : int{
return 0b11;
protected function decodeState(BlockDataReader $r) : void{
$this->unstable = $r->readBool();
$this->worksUnderwater = $r->readBool();
}
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->unstable);
$w->writeBool($this->worksUnderwater);
}
public function isUnstable() : bool{ return $this->unstable; }

View File

@ -23,7 +23,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
use pocketmine\math\Axis;
@ -36,17 +38,16 @@ class Torch extends Flowable{
protected int $facing = Facing::UP;
protected function writeStateToMeta() : int{
return $this->facing === Facing::UP ? 5 : 6 - BlockDataSerializer::writeHorizontalFacing($this->facing);
protected function decodeState(BlockDataReader $r) : void{
$facing = $r->readFacing();
if($facing === Facing::DOWN){
throw new InvalidBlockStateException("Torch cannot have a DOWN facing");
}
$this->facing = $facing;
}
public function readStateFromData(int $id, int $stateMeta) : void{
$facingMeta = $stateMeta & 0x7;
$this->facing = $facingMeta === 5 ? Facing::UP : BlockDataSerializer::readHorizontalFacing(6 - $facingMeta);
}
public function getStateBitmask() : int{
return 0b111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeFacing($this->facing);
}
public function getFacing() : int{ return $this->facing; }

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\SupportType;
use pocketmine\item\Item;
@ -40,20 +41,16 @@ class Trapdoor extends Transparent{
protected bool $open = false;
protected bool $top = false;
protected function writeStateToMeta() : int{
return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->top ? BlockLegacyMetadata::TRAPDOOR_FLAG_UPPER : 0) | ($this->open ? BlockLegacyMetadata::TRAPDOOR_FLAG_OPEN : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->top = $r->readBool();
$this->open = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
//TODO: in PC the values are reversed (facing - 2)
$this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta);
$this->top = ($stateMeta & BlockLegacyMetadata::TRAPDOOR_FLAG_UPPER) !== 0;
$this->open = ($stateMeta & BlockLegacyMetadata::TRAPDOOR_FLAG_OPEN) !== 0;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->top);
$w->writeBool($this->open);
}
public function isOpen() : bool{ return $this->open; }

View File

@ -23,29 +23,27 @@ declare(strict_types=1);
namespace pocketmine\block;
class Tripwire extends Flowable{
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
class Tripwire extends Flowable{
protected bool $triggered = false;
protected bool $suspended = false; //unclear usage, makes hitbox bigger if set
protected bool $connected = false;
protected bool $disarmed = false;
protected function writeStateToMeta() : int{
return ($this->triggered ? BlockLegacyMetadata::TRIPWIRE_FLAG_TRIGGERED : 0) |
($this->suspended ? BlockLegacyMetadata::TRIPWIRE_FLAG_SUSPENDED : 0) |
($this->connected ? BlockLegacyMetadata::TRIPWIRE_FLAG_CONNECTED : 0) |
($this->disarmed ? BlockLegacyMetadata::TRIPWIRE_FLAG_DISARMED : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->triggered = $r->readBool();
$this->suspended = $r->readBool();
$this->connected = $r->readBool();
$this->disarmed = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->triggered = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_FLAG_TRIGGERED) !== 0;
$this->suspended = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_FLAG_SUSPENDED) !== 0;
$this->connected = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_FLAG_CONNECTED) !== 0;
$this->disarmed = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_FLAG_DISARMED) !== 0;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeBool($this->triggered);
$w->writeBool($this->suspended);
$w->writeBool($this->connected);
$w->writeBool($this->disarmed);
}
public function isTriggered() : bool{ return $this->triggered; }

View File

@ -23,7 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
use pocketmine\math\Axis;
@ -38,20 +39,16 @@ class TripwireHook extends Flowable{
protected bool $connected = false;
protected bool $powered = false;
protected function writeStateToMeta() : int{
return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) |
($this->connected ? BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_CONNECTED : 0) |
($this->powered ? BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_POWERED : 0);
protected function decodeState(BlockDataReader $r) : void{
$this->facing = $r->readHorizontalFacing();
$this->connected = $r->readBool();
$this->powered = $r->readBool();
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03);
$this->connected = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_CONNECTED) !== 0;
$this->powered = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_POWERED) !== 0;
}
public function getStateBitmask() : int{
return 0b1111;
protected function encodeState(BlockDataWriter $w) : void{
$w->writeHorizontalFacing($this->facing);
$w->writeBool($this->connected);
$w->writeBool($this->powered);
}
public function isConnected() : bool{ return $this->connected; }

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\BlockLegacyIds as Ids;
use pocketmine\block\BlockTypeIds as Ids;
use pocketmine\utils\CloningRegistryTrait;
/**
@ -596,543 +596,543 @@ final class VanillaBlocks{
protected static function setup() : void{
$factory = BlockFactory::getInstance();
self::register("acacia_button", $factory->get(Ids::ACACIA_BUTTON, 0));
self::register("acacia_door", $factory->get(Ids::ACACIA_DOOR_BLOCK, 0));
self::register("acacia_fence", $factory->get(Ids::FENCE, 4));
self::register("acacia_door", $factory->get(Ids::ACACIA_DOOR, 0));
self::register("acacia_fence", $factory->get(Ids::ACACIA_FENCE, 0));
self::register("acacia_fence_gate", $factory->get(Ids::ACACIA_FENCE_GATE, 0));
self::register("acacia_leaves", $factory->get(Ids::LEAVES2, 0));
self::register("acacia_log", $factory->get(Ids::LOG2, 0));
self::register("acacia_planks", $factory->get(Ids::PLANKS, 4));
self::register("acacia_leaves", $factory->get(Ids::ACACIA_LEAVES, 0));
self::register("acacia_log", $factory->get(Ids::ACACIA_LOG, 0));
self::register("acacia_planks", $factory->get(Ids::ACACIA_PLANKS, 0));
self::register("acacia_pressure_plate", $factory->get(Ids::ACACIA_PRESSURE_PLATE, 0));
self::register("acacia_sapling", $factory->get(Ids::SAPLING, 4));
self::register("acacia_sign", $factory->get(Ids::ACACIA_STANDING_SIGN, 0));
self::register("acacia_slab", $factory->get(Ids::WOODEN_SLAB, 4));
self::register("acacia_stairs", $factory->get(Ids::ACACIA_STAIRS, 0));
self::register("acacia_trapdoor", $factory->get(Ids::ACACIA_TRAPDOOR, 0));
self::register("acacia_sapling", $factory->get(Ids::ACACIA_SAPLING, 0));
self::register("acacia_sign", $factory->get(Ids::ACACIA_SIGN, 0));
self::register("acacia_slab", $factory->get(Ids::ACACIA_SLAB, 0));
self::register("acacia_stairs", $factory->get(Ids::ACACIA_STAIRS, 3));
self::register("acacia_trapdoor", $factory->get(Ids::ACACIA_TRAPDOOR, 3));
self::register("acacia_wall_sign", $factory->get(Ids::ACACIA_WALL_SIGN, 2));
self::register("acacia_wood", $factory->get(Ids::WOOD, 4));
self::register("acacia_wood", $factory->get(Ids::ACACIA_WOOD, 0));
self::register("activator_rail", $factory->get(Ids::ACTIVATOR_RAIL, 0));
self::register("air", $factory->get(Ids::AIR, 0));
self::register("all_sided_mushroom_stem", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 15));
self::register("allium", $factory->get(Ids::POPPY, 2));
self::register("andesite", $factory->get(Ids::STONE, 5));
self::register("andesite_slab", $factory->get(Ids::STONE_SLAB3, 3));
self::register("andesite_stairs", $factory->get(Ids::ANDESITE_STAIRS, 0));
self::register("andesite_wall", $factory->get(Ids::COBBLESTONE_WALL, 4));
self::register("all_sided_mushroom_stem", $factory->get(Ids::ALL_SIDED_MUSHROOM_STEM, 0));
self::register("allium", $factory->get(Ids::ALLIUM, 0));
self::register("andesite", $factory->get(Ids::ANDESITE, 0));
self::register("andesite_slab", $factory->get(Ids::ANDESITE_SLAB, 0));
self::register("andesite_stairs", $factory->get(Ids::ANDESITE_STAIRS, 3));
self::register("andesite_wall", $factory->get(Ids::ANDESITE_WALL, 0));
self::register("anvil", $factory->get(Ids::ANVIL, 0));
self::register("azure_bluet", $factory->get(Ids::POPPY, 3));
self::register("azure_bluet", $factory->get(Ids::AZURE_BLUET, 0));
self::register("bamboo", $factory->get(Ids::BAMBOO, 0));
self::register("bamboo_sapling", $factory->get(Ids::BAMBOO_SAPLING, 0));
self::register("banner", $factory->get(Ids::STANDING_BANNER, 0));
self::register("banner", $factory->get(Ids::BANNER, 0));
self::register("barrel", $factory->get(Ids::BARREL, 0));
self::register("barrier", $factory->get(Ids::BARRIER, 0));
self::register("beacon", $factory->get(Ids::BEACON, 0));
self::register("bed", $factory->get(Ids::BED_BLOCK, 0));
self::register("bed", $factory->get(Ids::BED, 0));
self::register("bedrock", $factory->get(Ids::BEDROCK, 0));
self::register("beetroots", $factory->get(Ids::BEETROOT_BLOCK, 0));
self::register("bell", $factory->get(Ids::BELL, 0));
self::register("beetroots", $factory->get(Ids::BEETROOTS, 0));
self::register("bell", $factory->get(Ids::BELL, 1));
self::register("birch_button", $factory->get(Ids::BIRCH_BUTTON, 0));
self::register("birch_door", $factory->get(Ids::BIRCH_DOOR_BLOCK, 0));
self::register("birch_fence", $factory->get(Ids::FENCE, 2));
self::register("birch_door", $factory->get(Ids::BIRCH_DOOR, 0));
self::register("birch_fence", $factory->get(Ids::BIRCH_FENCE, 0));
self::register("birch_fence_gate", $factory->get(Ids::BIRCH_FENCE_GATE, 0));
self::register("birch_leaves", $factory->get(Ids::LEAVES, 2));
self::register("birch_log", $factory->get(Ids::LOG, 2));
self::register("birch_planks", $factory->get(Ids::PLANKS, 2));
self::register("birch_leaves", $factory->get(Ids::BIRCH_LEAVES, 0));
self::register("birch_log", $factory->get(Ids::BIRCH_LOG, 0));
self::register("birch_planks", $factory->get(Ids::BIRCH_PLANKS, 0));
self::register("birch_pressure_plate", $factory->get(Ids::BIRCH_PRESSURE_PLATE, 0));
self::register("birch_sapling", $factory->get(Ids::SAPLING, 2));
self::register("birch_sign", $factory->get(Ids::BIRCH_STANDING_SIGN, 0));
self::register("birch_slab", $factory->get(Ids::WOODEN_SLAB, 2));
self::register("birch_stairs", $factory->get(Ids::BIRCH_STAIRS, 0));
self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 0));
self::register("birch_sapling", $factory->get(Ids::BIRCH_SAPLING, 0));
self::register("birch_sign", $factory->get(Ids::BIRCH_SIGN, 0));
self::register("birch_slab", $factory->get(Ids::BIRCH_SLAB, 0));
self::register("birch_stairs", $factory->get(Ids::BIRCH_STAIRS, 3));
self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 3));
self::register("birch_wall_sign", $factory->get(Ids::BIRCH_WALL_SIGN, 2));
self::register("birch_wood", $factory->get(Ids::WOOD, 2));
self::register("birch_wood", $factory->get(Ids::BIRCH_WOOD, 0));
self::register("black_glazed_terracotta", $factory->get(Ids::BLACK_GLAZED_TERRACOTTA, 2));
self::register("blast_furnace", $factory->get(Ids::BLAST_FURNACE, 2));
self::register("blast_furnace", $factory->get(Ids::BLAST_FURNACE, 0));
self::register("blue_glazed_terracotta", $factory->get(Ids::BLUE_GLAZED_TERRACOTTA, 2));
self::register("blue_ice", $factory->get(Ids::BLUE_ICE, 0));
self::register("blue_orchid", $factory->get(Ids::POPPY, 1));
self::register("blue_torch", $factory->get(Ids::COLORED_TORCH_BP, 5));
self::register("blue_orchid", $factory->get(Ids::BLUE_ORCHID, 0));
self::register("blue_torch", $factory->get(Ids::BLUE_TORCH, 1));
self::register("bone_block", $factory->get(Ids::BONE_BLOCK, 0));
self::register("bookshelf", $factory->get(Ids::BOOKSHELF, 0));
self::register("brewing_stand", $factory->get(Ids::BREWING_STAND_BLOCK, 0));
self::register("brick_slab", $factory->get(Ids::STONE_SLAB, 4));
self::register("brick_stairs", $factory->get(Ids::BRICK_STAIRS, 0));
self::register("brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 6));
self::register("bricks", $factory->get(Ids::BRICK_BLOCK, 0));
self::register("brewing_stand", $factory->get(Ids::BREWING_STAND, 0));
self::register("brick_slab", $factory->get(Ids::BRICK_SLAB, 0));
self::register("brick_stairs", $factory->get(Ids::BRICK_STAIRS, 3));
self::register("brick_wall", $factory->get(Ids::BRICK_WALL, 0));
self::register("bricks", $factory->get(Ids::BRICKS, 0));
self::register("brown_glazed_terracotta", $factory->get(Ids::BROWN_GLAZED_TERRACOTTA, 2));
self::register("brown_mushroom", $factory->get(Ids::BROWN_MUSHROOM, 0));
self::register("brown_mushroom_block", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 0));
self::register("cactus", $factory->get(Ids::CACTUS, 0));
self::register("cake", $factory->get(Ids::CAKE_BLOCK, 0));
self::register("carpet", $factory->get(Ids::CARPET, 0));
self::register("cake", $factory->get(Ids::CAKE, 0));
self::register("carpet", $factory->get(Ids::CARPET, 14));
self::register("carrots", $factory->get(Ids::CARROTS, 0));
self::register("carved_pumpkin", $factory->get(Ids::CARVED_PUMPKIN, 0));
self::register("chemical_heat", $factory->get(Ids::CHEMICAL_HEAT, 0));
self::register("chest", $factory->get(Ids::CHEST, 2));
self::register("chiseled_quartz", $factory->get(Ids::QUARTZ_BLOCK, 1));
self::register("chiseled_red_sandstone", $factory->get(Ids::RED_SANDSTONE, 1));
self::register("chiseled_sandstone", $factory->get(Ids::SANDSTONE, 1));
self::register("chiseled_stone_bricks", $factory->get(Ids::STONEBRICK, 3));
self::register("clay", $factory->get(Ids::CLAY_BLOCK, 0));
self::register("coal", $factory->get(Ids::COAL_BLOCK, 0));
self::register("chiseled_quartz", $factory->get(Ids::CHISELED_QUARTZ, 0));
self::register("chiseled_red_sandstone", $factory->get(Ids::CHISELED_RED_SANDSTONE, 0));
self::register("chiseled_sandstone", $factory->get(Ids::CHISELED_SANDSTONE, 0));
self::register("chiseled_stone_bricks", $factory->get(Ids::CHISELED_STONE_BRICKS, 0));
self::register("clay", $factory->get(Ids::CLAY, 0));
self::register("coal", $factory->get(Ids::COAL, 0));
self::register("coal_ore", $factory->get(Ids::COAL_ORE, 0));
self::register("cobblestone", $factory->get(Ids::COBBLESTONE, 0));
self::register("cobblestone_slab", $factory->get(Ids::STONE_SLAB, 3));
self::register("cobblestone_stairs", $factory->get(Ids::COBBLESTONE_STAIRS, 0));
self::register("cobblestone_slab", $factory->get(Ids::COBBLESTONE_SLAB, 0));
self::register("cobblestone_stairs", $factory->get(Ids::COBBLESTONE_STAIRS, 3));
self::register("cobblestone_wall", $factory->get(Ids::COBBLESTONE_WALL, 0));
self::register("cobweb", $factory->get(Ids::COBWEB, 0));
self::register("cocoa_pod", $factory->get(Ids::COCOA, 0));
self::register("compound_creator", $factory->get(Ids::CHEMISTRY_TABLE, 0));
self::register("concrete", $factory->get(Ids::CONCRETE, 0));
self::register("concrete_powder", $factory->get(Ids::CONCRETEPOWDER, 0));
self::register("coral", $factory->get(Ids::CORAL, 0));
self::register("coral_block", $factory->get(Ids::CORAL_BLOCK, 0));
self::register("coral_fan", $factory->get(Ids::CORAL_FAN, 0));
self::register("cornflower", $factory->get(Ids::POPPY, 9));
self::register("cracked_stone_bricks", $factory->get(Ids::STONEBRICK, 2));
self::register("cocoa_pod", $factory->get(Ids::COCOA_POD, 0));
self::register("compound_creator", $factory->get(Ids::COMPOUND_CREATOR, 0));
self::register("concrete", $factory->get(Ids::CONCRETE, 14));
self::register("concrete_powder", $factory->get(Ids::CONCRETE_POWDER, 14));
self::register("coral", $factory->get(Ids::CORAL, 4));
self::register("coral_block", $factory->get(Ids::CORAL_BLOCK, 4));
self::register("coral_fan", $factory->get(Ids::CORAL_FAN, 4));
self::register("cornflower", $factory->get(Ids::CORNFLOWER, 0));
self::register("cracked_stone_bricks", $factory->get(Ids::CRACKED_STONE_BRICKS, 0));
self::register("crafting_table", $factory->get(Ids::CRAFTING_TABLE, 0));
self::register("cut_red_sandstone", $factory->get(Ids::RED_SANDSTONE, 2));
self::register("cut_red_sandstone_slab", $factory->get(Ids::STONE_SLAB4, 4));
self::register("cut_sandstone", $factory->get(Ids::SANDSTONE, 2));
self::register("cut_sandstone_slab", $factory->get(Ids::STONE_SLAB4, 3));
self::register("cut_red_sandstone", $factory->get(Ids::CUT_RED_SANDSTONE, 0));
self::register("cut_red_sandstone_slab", $factory->get(Ids::CUT_RED_SANDSTONE_SLAB, 0));
self::register("cut_sandstone", $factory->get(Ids::CUT_SANDSTONE, 0));
self::register("cut_sandstone_slab", $factory->get(Ids::CUT_SANDSTONE_SLAB, 0));
self::register("cyan_glazed_terracotta", $factory->get(Ids::CYAN_GLAZED_TERRACOTTA, 2));
self::register("dandelion", $factory->get(Ids::DANDELION, 0));
self::register("dark_oak_button", $factory->get(Ids::DARK_OAK_BUTTON, 0));
self::register("dark_oak_door", $factory->get(Ids::DARK_OAK_DOOR_BLOCK, 0));
self::register("dark_oak_fence", $factory->get(Ids::FENCE, 5));
self::register("dark_oak_door", $factory->get(Ids::DARK_OAK_DOOR, 0));
self::register("dark_oak_fence", $factory->get(Ids::DARK_OAK_FENCE, 0));
self::register("dark_oak_fence_gate", $factory->get(Ids::DARK_OAK_FENCE_GATE, 0));
self::register("dark_oak_leaves", $factory->get(Ids::LEAVES2, 1));
self::register("dark_oak_log", $factory->get(Ids::LOG2, 1));
self::register("dark_oak_planks", $factory->get(Ids::PLANKS, 5));
self::register("dark_oak_leaves", $factory->get(Ids::DARK_OAK_LEAVES, 0));
self::register("dark_oak_log", $factory->get(Ids::DARK_OAK_LOG, 0));
self::register("dark_oak_planks", $factory->get(Ids::DARK_OAK_PLANKS, 0));
self::register("dark_oak_pressure_plate", $factory->get(Ids::DARK_OAK_PRESSURE_PLATE, 0));
self::register("dark_oak_sapling", $factory->get(Ids::SAPLING, 5));
self::register("dark_oak_sign", $factory->get(Ids::DARKOAK_STANDING_SIGN, 0));
self::register("dark_oak_slab", $factory->get(Ids::WOODEN_SLAB, 5));
self::register("dark_oak_stairs", $factory->get(Ids::DARK_OAK_STAIRS, 0));
self::register("dark_oak_trapdoor", $factory->get(Ids::DARK_OAK_TRAPDOOR, 0));
self::register("dark_oak_wall_sign", $factory->get(Ids::DARKOAK_WALL_SIGN, 2));
self::register("dark_oak_wood", $factory->get(Ids::WOOD, 5));
self::register("dark_prismarine", $factory->get(Ids::PRISMARINE, 1));
self::register("dark_prismarine_slab", $factory->get(Ids::STONE_SLAB2, 3));
self::register("dark_prismarine_stairs", $factory->get(Ids::DARK_PRISMARINE_STAIRS, 0));
self::register("daylight_sensor", $factory->get(Ids::DAYLIGHT_DETECTOR, 0));
self::register("dead_bush", $factory->get(Ids::DEADBUSH, 0));
self::register("dark_oak_sapling", $factory->get(Ids::DARK_OAK_SAPLING, 0));
self::register("dark_oak_sign", $factory->get(Ids::DARK_OAK_SIGN, 0));
self::register("dark_oak_slab", $factory->get(Ids::DARK_OAK_SLAB, 0));
self::register("dark_oak_stairs", $factory->get(Ids::DARK_OAK_STAIRS, 3));
self::register("dark_oak_trapdoor", $factory->get(Ids::DARK_OAK_TRAPDOOR, 3));
self::register("dark_oak_wall_sign", $factory->get(Ids::DARK_OAK_WALL_SIGN, 2));
self::register("dark_oak_wood", $factory->get(Ids::DARK_OAK_WOOD, 0));
self::register("dark_prismarine", $factory->get(Ids::DARK_PRISMARINE, 0));
self::register("dark_prismarine_slab", $factory->get(Ids::DARK_PRISMARINE_SLAB, 0));
self::register("dark_prismarine_stairs", $factory->get(Ids::DARK_PRISMARINE_STAIRS, 3));
self::register("daylight_sensor", $factory->get(Ids::DAYLIGHT_SENSOR, 0));
self::register("dead_bush", $factory->get(Ids::DEAD_BUSH, 0));
self::register("detector_rail", $factory->get(Ids::DETECTOR_RAIL, 0));
self::register("diamond", $factory->get(Ids::DIAMOND_BLOCK, 0));
self::register("diamond", $factory->get(Ids::DIAMOND, 0));
self::register("diamond_ore", $factory->get(Ids::DIAMOND_ORE, 0));
self::register("diorite", $factory->get(Ids::STONE, 3));
self::register("diorite_slab", $factory->get(Ids::STONE_SLAB3, 4));
self::register("diorite_stairs", $factory->get(Ids::DIORITE_STAIRS, 0));
self::register("diorite_wall", $factory->get(Ids::COBBLESTONE_WALL, 3));
self::register("diorite", $factory->get(Ids::DIORITE, 0));
self::register("diorite_slab", $factory->get(Ids::DIORITE_SLAB, 0));
self::register("diorite_stairs", $factory->get(Ids::DIORITE_STAIRS, 3));
self::register("diorite_wall", $factory->get(Ids::DIORITE_WALL, 0));
self::register("dirt", $factory->get(Ids::DIRT, 0));
self::register("double_tallgrass", $factory->get(Ids::DOUBLE_PLANT, 2));
self::register("double_tallgrass", $factory->get(Ids::DOUBLE_TALLGRASS, 0));
self::register("dragon_egg", $factory->get(Ids::DRAGON_EGG, 0));
self::register("dried_kelp", $factory->get(Ids::DRIED_KELP_BLOCK, 0));
self::register("dyed_shulker_box", $factory->get(Ids::SHULKER_BOX, 0));
self::register("element_actinium", $factory->get(Ids::ELEMENT_89, 0));
self::register("element_aluminum", $factory->get(Ids::ELEMENT_13, 0));
self::register("element_americium", $factory->get(Ids::ELEMENT_95, 0));
self::register("element_antimony", $factory->get(Ids::ELEMENT_51, 0));
self::register("element_argon", $factory->get(Ids::ELEMENT_18, 0));
self::register("element_arsenic", $factory->get(Ids::ELEMENT_33, 0));
self::register("element_astatine", $factory->get(Ids::ELEMENT_85, 0));
self::register("element_barium", $factory->get(Ids::ELEMENT_56, 0));
self::register("element_berkelium", $factory->get(Ids::ELEMENT_97, 0));
self::register("element_beryllium", $factory->get(Ids::ELEMENT_4, 0));
self::register("element_bismuth", $factory->get(Ids::ELEMENT_83, 0));
self::register("element_bohrium", $factory->get(Ids::ELEMENT_107, 0));
self::register("element_boron", $factory->get(Ids::ELEMENT_5, 0));
self::register("element_bromine", $factory->get(Ids::ELEMENT_35, 0));
self::register("element_cadmium", $factory->get(Ids::ELEMENT_48, 0));
self::register("element_calcium", $factory->get(Ids::ELEMENT_20, 0));
self::register("element_californium", $factory->get(Ids::ELEMENT_98, 0));
self::register("element_carbon", $factory->get(Ids::ELEMENT_6, 0));
self::register("element_cerium", $factory->get(Ids::ELEMENT_58, 0));
self::register("element_cesium", $factory->get(Ids::ELEMENT_55, 0));
self::register("element_chlorine", $factory->get(Ids::ELEMENT_17, 0));
self::register("element_chromium", $factory->get(Ids::ELEMENT_24, 0));
self::register("element_cobalt", $factory->get(Ids::ELEMENT_27, 0));
self::register("element_constructor", $factory->get(Ids::CHEMISTRY_TABLE, 8));
self::register("element_copernicium", $factory->get(Ids::ELEMENT_112, 0));
self::register("element_copper", $factory->get(Ids::ELEMENT_29, 0));
self::register("element_curium", $factory->get(Ids::ELEMENT_96, 0));
self::register("element_darmstadtium", $factory->get(Ids::ELEMENT_110, 0));
self::register("element_dubnium", $factory->get(Ids::ELEMENT_105, 0));
self::register("element_dysprosium", $factory->get(Ids::ELEMENT_66, 0));
self::register("element_einsteinium", $factory->get(Ids::ELEMENT_99, 0));
self::register("element_erbium", $factory->get(Ids::ELEMENT_68, 0));
self::register("element_europium", $factory->get(Ids::ELEMENT_63, 0));
self::register("element_fermium", $factory->get(Ids::ELEMENT_100, 0));
self::register("element_flerovium", $factory->get(Ids::ELEMENT_114, 0));
self::register("element_fluorine", $factory->get(Ids::ELEMENT_9, 0));
self::register("element_francium", $factory->get(Ids::ELEMENT_87, 0));
self::register("element_gadolinium", $factory->get(Ids::ELEMENT_64, 0));
self::register("element_gallium", $factory->get(Ids::ELEMENT_31, 0));
self::register("element_germanium", $factory->get(Ids::ELEMENT_32, 0));
self::register("element_gold", $factory->get(Ids::ELEMENT_79, 0));
self::register("element_hafnium", $factory->get(Ids::ELEMENT_72, 0));
self::register("element_hassium", $factory->get(Ids::ELEMENT_108, 0));
self::register("element_helium", $factory->get(Ids::ELEMENT_2, 0));
self::register("element_holmium", $factory->get(Ids::ELEMENT_67, 0));
self::register("element_hydrogen", $factory->get(Ids::ELEMENT_1, 0));
self::register("element_indium", $factory->get(Ids::ELEMENT_49, 0));
self::register("element_iodine", $factory->get(Ids::ELEMENT_53, 0));
self::register("element_iridium", $factory->get(Ids::ELEMENT_77, 0));
self::register("element_iron", $factory->get(Ids::ELEMENT_26, 0));
self::register("element_krypton", $factory->get(Ids::ELEMENT_36, 0));
self::register("element_lanthanum", $factory->get(Ids::ELEMENT_57, 0));
self::register("element_lawrencium", $factory->get(Ids::ELEMENT_103, 0));
self::register("element_lead", $factory->get(Ids::ELEMENT_82, 0));
self::register("element_lithium", $factory->get(Ids::ELEMENT_3, 0));
self::register("element_livermorium", $factory->get(Ids::ELEMENT_116, 0));
self::register("element_lutetium", $factory->get(Ids::ELEMENT_71, 0));
self::register("element_magnesium", $factory->get(Ids::ELEMENT_12, 0));
self::register("element_manganese", $factory->get(Ids::ELEMENT_25, 0));
self::register("element_meitnerium", $factory->get(Ids::ELEMENT_109, 0));
self::register("element_mendelevium", $factory->get(Ids::ELEMENT_101, 0));
self::register("element_mercury", $factory->get(Ids::ELEMENT_80, 0));
self::register("element_molybdenum", $factory->get(Ids::ELEMENT_42, 0));
self::register("element_moscovium", $factory->get(Ids::ELEMENT_115, 0));
self::register("element_neodymium", $factory->get(Ids::ELEMENT_60, 0));
self::register("element_neon", $factory->get(Ids::ELEMENT_10, 0));
self::register("element_neptunium", $factory->get(Ids::ELEMENT_93, 0));
self::register("element_nickel", $factory->get(Ids::ELEMENT_28, 0));
self::register("element_nihonium", $factory->get(Ids::ELEMENT_113, 0));
self::register("element_niobium", $factory->get(Ids::ELEMENT_41, 0));
self::register("element_nitrogen", $factory->get(Ids::ELEMENT_7, 0));
self::register("element_nobelium", $factory->get(Ids::ELEMENT_102, 0));
self::register("element_oganesson", $factory->get(Ids::ELEMENT_118, 0));
self::register("element_osmium", $factory->get(Ids::ELEMENT_76, 0));
self::register("element_oxygen", $factory->get(Ids::ELEMENT_8, 0));
self::register("element_palladium", $factory->get(Ids::ELEMENT_46, 0));
self::register("element_phosphorus", $factory->get(Ids::ELEMENT_15, 0));
self::register("element_platinum", $factory->get(Ids::ELEMENT_78, 0));
self::register("element_plutonium", $factory->get(Ids::ELEMENT_94, 0));
self::register("element_polonium", $factory->get(Ids::ELEMENT_84, 0));
self::register("element_potassium", $factory->get(Ids::ELEMENT_19, 0));
self::register("element_praseodymium", $factory->get(Ids::ELEMENT_59, 0));
self::register("element_promethium", $factory->get(Ids::ELEMENT_61, 0));
self::register("element_protactinium", $factory->get(Ids::ELEMENT_91, 0));
self::register("element_radium", $factory->get(Ids::ELEMENT_88, 0));
self::register("element_radon", $factory->get(Ids::ELEMENT_86, 0));
self::register("element_rhenium", $factory->get(Ids::ELEMENT_75, 0));
self::register("element_rhodium", $factory->get(Ids::ELEMENT_45, 0));
self::register("element_roentgenium", $factory->get(Ids::ELEMENT_111, 0));
self::register("element_rubidium", $factory->get(Ids::ELEMENT_37, 0));
self::register("element_ruthenium", $factory->get(Ids::ELEMENT_44, 0));
self::register("element_rutherfordium", $factory->get(Ids::ELEMENT_104, 0));
self::register("element_samarium", $factory->get(Ids::ELEMENT_62, 0));
self::register("element_scandium", $factory->get(Ids::ELEMENT_21, 0));
self::register("element_seaborgium", $factory->get(Ids::ELEMENT_106, 0));
self::register("element_selenium", $factory->get(Ids::ELEMENT_34, 0));
self::register("element_silicon", $factory->get(Ids::ELEMENT_14, 0));
self::register("element_silver", $factory->get(Ids::ELEMENT_47, 0));
self::register("element_sodium", $factory->get(Ids::ELEMENT_11, 0));
self::register("element_strontium", $factory->get(Ids::ELEMENT_38, 0));
self::register("element_sulfur", $factory->get(Ids::ELEMENT_16, 0));
self::register("element_tantalum", $factory->get(Ids::ELEMENT_73, 0));
self::register("element_technetium", $factory->get(Ids::ELEMENT_43, 0));
self::register("element_tellurium", $factory->get(Ids::ELEMENT_52, 0));
self::register("element_tennessine", $factory->get(Ids::ELEMENT_117, 0));
self::register("element_terbium", $factory->get(Ids::ELEMENT_65, 0));
self::register("element_thallium", $factory->get(Ids::ELEMENT_81, 0));
self::register("element_thorium", $factory->get(Ids::ELEMENT_90, 0));
self::register("element_thulium", $factory->get(Ids::ELEMENT_69, 0));
self::register("element_tin", $factory->get(Ids::ELEMENT_50, 0));
self::register("element_titanium", $factory->get(Ids::ELEMENT_22, 0));
self::register("element_tungsten", $factory->get(Ids::ELEMENT_74, 0));
self::register("element_uranium", $factory->get(Ids::ELEMENT_92, 0));
self::register("element_vanadium", $factory->get(Ids::ELEMENT_23, 0));
self::register("element_xenon", $factory->get(Ids::ELEMENT_54, 0));
self::register("element_ytterbium", $factory->get(Ids::ELEMENT_70, 0));
self::register("element_yttrium", $factory->get(Ids::ELEMENT_39, 0));
self::register("element_zero", $factory->get(Ids::ELEMENT_0, 0));
self::register("element_zinc", $factory->get(Ids::ELEMENT_30, 0));
self::register("element_zirconium", $factory->get(Ids::ELEMENT_40, 0));
self::register("emerald", $factory->get(Ids::EMERALD_BLOCK, 0));
self::register("dried_kelp", $factory->get(Ids::DRIED_KELP, 0));
self::register("dyed_shulker_box", $factory->get(Ids::DYED_SHULKER_BOX, 14));
self::register("element_actinium", $factory->get(Ids::ELEMENT_ACTINIUM, 0));
self::register("element_aluminum", $factory->get(Ids::ELEMENT_ALUMINUM, 0));
self::register("element_americium", $factory->get(Ids::ELEMENT_AMERICIUM, 0));
self::register("element_antimony", $factory->get(Ids::ELEMENT_ANTIMONY, 0));
self::register("element_argon", $factory->get(Ids::ELEMENT_ARGON, 0));
self::register("element_arsenic", $factory->get(Ids::ELEMENT_ARSENIC, 0));
self::register("element_astatine", $factory->get(Ids::ELEMENT_ASTATINE, 0));
self::register("element_barium", $factory->get(Ids::ELEMENT_BARIUM, 0));
self::register("element_berkelium", $factory->get(Ids::ELEMENT_BERKELIUM, 0));
self::register("element_beryllium", $factory->get(Ids::ELEMENT_BERYLLIUM, 0));
self::register("element_bismuth", $factory->get(Ids::ELEMENT_BISMUTH, 0));
self::register("element_bohrium", $factory->get(Ids::ELEMENT_BOHRIUM, 0));
self::register("element_boron", $factory->get(Ids::ELEMENT_BORON, 0));
self::register("element_bromine", $factory->get(Ids::ELEMENT_BROMINE, 0));
self::register("element_cadmium", $factory->get(Ids::ELEMENT_CADMIUM, 0));
self::register("element_calcium", $factory->get(Ids::ELEMENT_CALCIUM, 0));
self::register("element_californium", $factory->get(Ids::ELEMENT_CALIFORNIUM, 0));
self::register("element_carbon", $factory->get(Ids::ELEMENT_CARBON, 0));
self::register("element_cerium", $factory->get(Ids::ELEMENT_CERIUM, 0));
self::register("element_cesium", $factory->get(Ids::ELEMENT_CESIUM, 0));
self::register("element_chlorine", $factory->get(Ids::ELEMENT_CHLORINE, 0));
self::register("element_chromium", $factory->get(Ids::ELEMENT_CHROMIUM, 0));
self::register("element_cobalt", $factory->get(Ids::ELEMENT_COBALT, 0));
self::register("element_constructor", $factory->get(Ids::ELEMENT_CONSTRUCTOR, 0));
self::register("element_copernicium", $factory->get(Ids::ELEMENT_COPERNICIUM, 0));
self::register("element_copper", $factory->get(Ids::ELEMENT_COPPER, 0));
self::register("element_curium", $factory->get(Ids::ELEMENT_CURIUM, 0));
self::register("element_darmstadtium", $factory->get(Ids::ELEMENT_DARMSTADTIUM, 0));
self::register("element_dubnium", $factory->get(Ids::ELEMENT_DUBNIUM, 0));
self::register("element_dysprosium", $factory->get(Ids::ELEMENT_DYSPROSIUM, 0));
self::register("element_einsteinium", $factory->get(Ids::ELEMENT_EINSTEINIUM, 0));
self::register("element_erbium", $factory->get(Ids::ELEMENT_ERBIUM, 0));
self::register("element_europium", $factory->get(Ids::ELEMENT_EUROPIUM, 0));
self::register("element_fermium", $factory->get(Ids::ELEMENT_FERMIUM, 0));
self::register("element_flerovium", $factory->get(Ids::ELEMENT_FLEROVIUM, 0));
self::register("element_fluorine", $factory->get(Ids::ELEMENT_FLUORINE, 0));
self::register("element_francium", $factory->get(Ids::ELEMENT_FRANCIUM, 0));
self::register("element_gadolinium", $factory->get(Ids::ELEMENT_GADOLINIUM, 0));
self::register("element_gallium", $factory->get(Ids::ELEMENT_GALLIUM, 0));
self::register("element_germanium", $factory->get(Ids::ELEMENT_GERMANIUM, 0));
self::register("element_gold", $factory->get(Ids::ELEMENT_GOLD, 0));
self::register("element_hafnium", $factory->get(Ids::ELEMENT_HAFNIUM, 0));
self::register("element_hassium", $factory->get(Ids::ELEMENT_HASSIUM, 0));
self::register("element_helium", $factory->get(Ids::ELEMENT_HELIUM, 0));
self::register("element_holmium", $factory->get(Ids::ELEMENT_HOLMIUM, 0));
self::register("element_hydrogen", $factory->get(Ids::ELEMENT_HYDROGEN, 0));
self::register("element_indium", $factory->get(Ids::ELEMENT_INDIUM, 0));
self::register("element_iodine", $factory->get(Ids::ELEMENT_IODINE, 0));
self::register("element_iridium", $factory->get(Ids::ELEMENT_IRIDIUM, 0));
self::register("element_iron", $factory->get(Ids::ELEMENT_IRON, 0));
self::register("element_krypton", $factory->get(Ids::ELEMENT_KRYPTON, 0));
self::register("element_lanthanum", $factory->get(Ids::ELEMENT_LANTHANUM, 0));
self::register("element_lawrencium", $factory->get(Ids::ELEMENT_LAWRENCIUM, 0));
self::register("element_lead", $factory->get(Ids::ELEMENT_LEAD, 0));
self::register("element_lithium", $factory->get(Ids::ELEMENT_LITHIUM, 0));
self::register("element_livermorium", $factory->get(Ids::ELEMENT_LIVERMORIUM, 0));
self::register("element_lutetium", $factory->get(Ids::ELEMENT_LUTETIUM, 0));
self::register("element_magnesium", $factory->get(Ids::ELEMENT_MAGNESIUM, 0));
self::register("element_manganese", $factory->get(Ids::ELEMENT_MANGANESE, 0));
self::register("element_meitnerium", $factory->get(Ids::ELEMENT_MEITNERIUM, 0));
self::register("element_mendelevium", $factory->get(Ids::ELEMENT_MENDELEVIUM, 0));
self::register("element_mercury", $factory->get(Ids::ELEMENT_MERCURY, 0));
self::register("element_molybdenum", $factory->get(Ids::ELEMENT_MOLYBDENUM, 0));
self::register("element_moscovium", $factory->get(Ids::ELEMENT_MOSCOVIUM, 0));
self::register("element_neodymium", $factory->get(Ids::ELEMENT_NEODYMIUM, 0));
self::register("element_neon", $factory->get(Ids::ELEMENT_NEON, 0));
self::register("element_neptunium", $factory->get(Ids::ELEMENT_NEPTUNIUM, 0));
self::register("element_nickel", $factory->get(Ids::ELEMENT_NICKEL, 0));
self::register("element_nihonium", $factory->get(Ids::ELEMENT_NIHONIUM, 0));
self::register("element_niobium", $factory->get(Ids::ELEMENT_NIOBIUM, 0));
self::register("element_nitrogen", $factory->get(Ids::ELEMENT_NITROGEN, 0));
self::register("element_nobelium", $factory->get(Ids::ELEMENT_NOBELIUM, 0));
self::register("element_oganesson", $factory->get(Ids::ELEMENT_OGANESSON, 0));
self::register("element_osmium", $factory->get(Ids::ELEMENT_OSMIUM, 0));
self::register("element_oxygen", $factory->get(Ids::ELEMENT_OXYGEN, 0));
self::register("element_palladium", $factory->get(Ids::ELEMENT_PALLADIUM, 0));
self::register("element_phosphorus", $factory->get(Ids::ELEMENT_PHOSPHORUS, 0));
self::register("element_platinum", $factory->get(Ids::ELEMENT_PLATINUM, 0));
self::register("element_plutonium", $factory->get(Ids::ELEMENT_PLUTONIUM, 0));
self::register("element_polonium", $factory->get(Ids::ELEMENT_POLONIUM, 0));
self::register("element_potassium", $factory->get(Ids::ELEMENT_POTASSIUM, 0));
self::register("element_praseodymium", $factory->get(Ids::ELEMENT_PRASEODYMIUM, 0));
self::register("element_promethium", $factory->get(Ids::ELEMENT_PROMETHIUM, 0));
self::register("element_protactinium", $factory->get(Ids::ELEMENT_PROTACTINIUM, 0));
self::register("element_radium", $factory->get(Ids::ELEMENT_RADIUM, 0));
self::register("element_radon", $factory->get(Ids::ELEMENT_RADON, 0));
self::register("element_rhenium", $factory->get(Ids::ELEMENT_RHENIUM, 0));
self::register("element_rhodium", $factory->get(Ids::ELEMENT_RHODIUM, 0));
self::register("element_roentgenium", $factory->get(Ids::ELEMENT_ROENTGENIUM, 0));
self::register("element_rubidium", $factory->get(Ids::ELEMENT_RUBIDIUM, 0));
self::register("element_ruthenium", $factory->get(Ids::ELEMENT_RUTHENIUM, 0));
self::register("element_rutherfordium", $factory->get(Ids::ELEMENT_RUTHERFORDIUM, 0));
self::register("element_samarium", $factory->get(Ids::ELEMENT_SAMARIUM, 0));
self::register("element_scandium", $factory->get(Ids::ELEMENT_SCANDIUM, 0));
self::register("element_seaborgium", $factory->get(Ids::ELEMENT_SEABORGIUM, 0));
self::register("element_selenium", $factory->get(Ids::ELEMENT_SELENIUM, 0));
self::register("element_silicon", $factory->get(Ids::ELEMENT_SILICON, 0));
self::register("element_silver", $factory->get(Ids::ELEMENT_SILVER, 0));
self::register("element_sodium", $factory->get(Ids::ELEMENT_SODIUM, 0));
self::register("element_strontium", $factory->get(Ids::ELEMENT_STRONTIUM, 0));
self::register("element_sulfur", $factory->get(Ids::ELEMENT_SULFUR, 0));
self::register("element_tantalum", $factory->get(Ids::ELEMENT_TANTALUM, 0));
self::register("element_technetium", $factory->get(Ids::ELEMENT_TECHNETIUM, 0));
self::register("element_tellurium", $factory->get(Ids::ELEMENT_TELLURIUM, 0));
self::register("element_tennessine", $factory->get(Ids::ELEMENT_TENNESSINE, 0));
self::register("element_terbium", $factory->get(Ids::ELEMENT_TERBIUM, 0));
self::register("element_thallium", $factory->get(Ids::ELEMENT_THALLIUM, 0));
self::register("element_thorium", $factory->get(Ids::ELEMENT_THORIUM, 0));
self::register("element_thulium", $factory->get(Ids::ELEMENT_THULIUM, 0));
self::register("element_tin", $factory->get(Ids::ELEMENT_TIN, 0));
self::register("element_titanium", $factory->get(Ids::ELEMENT_TITANIUM, 0));
self::register("element_tungsten", $factory->get(Ids::ELEMENT_TUNGSTEN, 0));
self::register("element_uranium", $factory->get(Ids::ELEMENT_URANIUM, 0));
self::register("element_vanadium", $factory->get(Ids::ELEMENT_VANADIUM, 0));
self::register("element_xenon", $factory->get(Ids::ELEMENT_XENON, 0));
self::register("element_ytterbium", $factory->get(Ids::ELEMENT_YTTERBIUM, 0));
self::register("element_yttrium", $factory->get(Ids::ELEMENT_YTTRIUM, 0));
self::register("element_zero", $factory->get(Ids::ELEMENT_ZERO, 0));
self::register("element_zinc", $factory->get(Ids::ELEMENT_ZINC, 0));
self::register("element_zirconium", $factory->get(Ids::ELEMENT_ZIRCONIUM, 0));
self::register("emerald", $factory->get(Ids::EMERALD, 0));
self::register("emerald_ore", $factory->get(Ids::EMERALD_ORE, 0));
self::register("enchanting_table", $factory->get(Ids::ENCHANTING_TABLE, 0));
self::register("end_portal_frame", $factory->get(Ids::END_PORTAL_FRAME, 0));
self::register("end_rod", $factory->get(Ids::END_ROD, 0));
self::register("end_stone", $factory->get(Ids::END_STONE, 0));
self::register("end_stone_brick_slab", $factory->get(Ids::STONE_SLAB3, 0));
self::register("end_stone_brick_stairs", $factory->get(Ids::END_BRICK_STAIRS, 0));
self::register("end_stone_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 10));
self::register("end_stone_bricks", $factory->get(Ids::END_BRICKS, 0));
self::register("end_stone_brick_slab", $factory->get(Ids::END_STONE_BRICK_SLAB, 0));
self::register("end_stone_brick_stairs", $factory->get(Ids::END_STONE_BRICK_STAIRS, 3));
self::register("end_stone_brick_wall", $factory->get(Ids::END_STONE_BRICK_WALL, 0));
self::register("end_stone_bricks", $factory->get(Ids::END_STONE_BRICKS, 0));
self::register("ender_chest", $factory->get(Ids::ENDER_CHEST, 2));
self::register("fake_wooden_slab", $factory->get(Ids::STONE_SLAB, 2));
self::register("fake_wooden_slab", $factory->get(Ids::FAKE_WOODEN_SLAB, 0));
self::register("farmland", $factory->get(Ids::FARMLAND, 0));
self::register("fern", $factory->get(Ids::TALLGRASS, 2));
self::register("fern", $factory->get(Ids::FERN, 0));
self::register("fire", $factory->get(Ids::FIRE, 0));
self::register("fletching_table", $factory->get(Ids::FLETCHING_TABLE, 0));
self::register("flower_pot", $factory->get(Ids::FLOWER_POT_BLOCK, 0));
self::register("flower_pot", $factory->get(Ids::FLOWER_POT, 0));
self::register("frosted_ice", $factory->get(Ids::FROSTED_ICE, 0));
self::register("furnace", $factory->get(Ids::FURNACE, 2));
self::register("furnace", $factory->get(Ids::FURNACE, 0));
self::register("glass", $factory->get(Ids::GLASS, 0));
self::register("glass_pane", $factory->get(Ids::GLASS_PANE, 0));
self::register("glowing_obsidian", $factory->get(Ids::GLOWINGOBSIDIAN, 0));
self::register("glowing_obsidian", $factory->get(Ids::GLOWING_OBSIDIAN, 0));
self::register("glowstone", $factory->get(Ids::GLOWSTONE, 0));
self::register("gold", $factory->get(Ids::GOLD_BLOCK, 0));
self::register("gold", $factory->get(Ids::GOLD, 0));
self::register("gold_ore", $factory->get(Ids::GOLD_ORE, 0));
self::register("granite", $factory->get(Ids::STONE, 1));
self::register("granite_slab", $factory->get(Ids::STONE_SLAB3, 6));
self::register("granite_stairs", $factory->get(Ids::GRANITE_STAIRS, 0));
self::register("granite_wall", $factory->get(Ids::COBBLESTONE_WALL, 2));
self::register("granite", $factory->get(Ids::GRANITE, 0));
self::register("granite_slab", $factory->get(Ids::GRANITE_SLAB, 0));
self::register("granite_stairs", $factory->get(Ids::GRANITE_STAIRS, 3));
self::register("granite_wall", $factory->get(Ids::GRANITE_WALL, 0));
self::register("grass", $factory->get(Ids::GRASS, 0));
self::register("grass_path", $factory->get(Ids::GRASS_PATH, 0));
self::register("gravel", $factory->get(Ids::GRAVEL, 0));
self::register("gray_glazed_terracotta", $factory->get(Ids::GRAY_GLAZED_TERRACOTTA, 2));
self::register("green_glazed_terracotta", $factory->get(Ids::GREEN_GLAZED_TERRACOTTA, 2));
self::register("green_torch", $factory->get(Ids::COLORED_TORCH_RG, 13));
self::register("green_torch", $factory->get(Ids::GREEN_TORCH, 1));
self::register("hardened_clay", $factory->get(Ids::HARDENED_CLAY, 0));
self::register("hardened_glass", $factory->get(Ids::HARD_GLASS, 0));
self::register("hardened_glass_pane", $factory->get(Ids::HARD_GLASS_PANE, 0));
self::register("hardened_glass", $factory->get(Ids::HARDENED_GLASS, 0));
self::register("hardened_glass_pane", $factory->get(Ids::HARDENED_GLASS_PANE, 0));
self::register("hay_bale", $factory->get(Ids::HAY_BALE, 0));
self::register("hopper", $factory->get(Ids::HOPPER_BLOCK, 0));
self::register("hopper", $factory->get(Ids::HOPPER, 0));
self::register("ice", $factory->get(Ids::ICE, 0));
self::register("infested_chiseled_stone_brick", $factory->get(Ids::MONSTER_EGG, 5));
self::register("infested_cobblestone", $factory->get(Ids::MONSTER_EGG, 1));
self::register("infested_cracked_stone_brick", $factory->get(Ids::MONSTER_EGG, 4));
self::register("infested_mossy_stone_brick", $factory->get(Ids::MONSTER_EGG, 3));
self::register("infested_stone", $factory->get(Ids::MONSTER_EGG, 0));
self::register("infested_stone_brick", $factory->get(Ids::MONSTER_EGG, 2));
self::register("infested_chiseled_stone_brick", $factory->get(Ids::INFESTED_CHISELED_STONE_BRICK, 0));
self::register("infested_cobblestone", $factory->get(Ids::INFESTED_COBBLESTONE, 0));
self::register("infested_cracked_stone_brick", $factory->get(Ids::INFESTED_CRACKED_STONE_BRICK, 0));
self::register("infested_mossy_stone_brick", $factory->get(Ids::INFESTED_MOSSY_STONE_BRICK, 0));
self::register("infested_stone", $factory->get(Ids::INFESTED_STONE, 0));
self::register("infested_stone_brick", $factory->get(Ids::INFESTED_STONE_BRICK, 0));
self::register("info_update", $factory->get(Ids::INFO_UPDATE, 0));
self::register("info_update2", $factory->get(Ids::INFO_UPDATE2, 0));
self::register("invisible_bedrock", $factory->get(Ids::INVISIBLEBEDROCK, 0));
self::register("iron", $factory->get(Ids::IRON_BLOCK, 0));
self::register("invisible_bedrock", $factory->get(Ids::INVISIBLE_BEDROCK, 0));
self::register("iron", $factory->get(Ids::IRON, 0));
self::register("iron_bars", $factory->get(Ids::IRON_BARS, 0));
self::register("iron_door", $factory->get(Ids::IRON_DOOR_BLOCK, 0));
self::register("iron_door", $factory->get(Ids::IRON_DOOR, 0));
self::register("iron_ore", $factory->get(Ids::IRON_ORE, 0));
self::register("iron_trapdoor", $factory->get(Ids::IRON_TRAPDOOR, 0));
self::register("item_frame", $factory->get(Ids::FRAME_BLOCK, 0));
self::register("iron_trapdoor", $factory->get(Ids::IRON_TRAPDOOR, 3));
self::register("item_frame", $factory->get(Ids::ITEM_FRAME, 3));
self::register("jukebox", $factory->get(Ids::JUKEBOX, 0));
self::register("jungle_button", $factory->get(Ids::JUNGLE_BUTTON, 0));
self::register("jungle_door", $factory->get(Ids::JUNGLE_DOOR_BLOCK, 0));
self::register("jungle_fence", $factory->get(Ids::FENCE, 3));
self::register("jungle_door", $factory->get(Ids::JUNGLE_DOOR, 0));
self::register("jungle_fence", $factory->get(Ids::JUNGLE_FENCE, 0));
self::register("jungle_fence_gate", $factory->get(Ids::JUNGLE_FENCE_GATE, 0));
self::register("jungle_leaves", $factory->get(Ids::LEAVES, 3));
self::register("jungle_log", $factory->get(Ids::LOG, 3));
self::register("jungle_planks", $factory->get(Ids::PLANKS, 3));
self::register("jungle_leaves", $factory->get(Ids::JUNGLE_LEAVES, 0));
self::register("jungle_log", $factory->get(Ids::JUNGLE_LOG, 0));
self::register("jungle_planks", $factory->get(Ids::JUNGLE_PLANKS, 0));
self::register("jungle_pressure_plate", $factory->get(Ids::JUNGLE_PRESSURE_PLATE, 0));
self::register("jungle_sapling", $factory->get(Ids::SAPLING, 3));
self::register("jungle_sign", $factory->get(Ids::JUNGLE_STANDING_SIGN, 0));
self::register("jungle_slab", $factory->get(Ids::WOODEN_SLAB, 3));
self::register("jungle_stairs", $factory->get(Ids::JUNGLE_STAIRS, 0));
self::register("jungle_trapdoor", $factory->get(Ids::JUNGLE_TRAPDOOR, 0));
self::register("jungle_sapling", $factory->get(Ids::JUNGLE_SAPLING, 0));
self::register("jungle_sign", $factory->get(Ids::JUNGLE_SIGN, 0));
self::register("jungle_slab", $factory->get(Ids::JUNGLE_SLAB, 0));
self::register("jungle_stairs", $factory->get(Ids::JUNGLE_STAIRS, 3));
self::register("jungle_trapdoor", $factory->get(Ids::JUNGLE_TRAPDOOR, 3));
self::register("jungle_wall_sign", $factory->get(Ids::JUNGLE_WALL_SIGN, 2));
self::register("jungle_wood", $factory->get(Ids::WOOD, 3));
self::register("lab_table", $factory->get(Ids::CHEMISTRY_TABLE, 12));
self::register("jungle_wood", $factory->get(Ids::JUNGLE_WOOD, 0));
self::register("lab_table", $factory->get(Ids::LAB_TABLE, 0));
self::register("ladder", $factory->get(Ids::LADDER, 2));
self::register("lantern", $factory->get(Ids::LANTERN, 0));
self::register("lapis_lazuli", $factory->get(Ids::LAPIS_BLOCK, 0));
self::register("lapis_lazuli_ore", $factory->get(Ids::LAPIS_ORE, 0));
self::register("large_fern", $factory->get(Ids::DOUBLE_PLANT, 3));
self::register("lava", $factory->get(Ids::FLOWING_LAVA, 0));
self::register("lectern", $factory->get(Ids::LECTERN, 0));
self::register("legacy_stonecutter", $factory->get(Ids::STONECUTTER, 0));
self::register("lever", $factory->get(Ids::LEVER, 0));
self::register("lapis_lazuli", $factory->get(Ids::LAPIS_LAZULI, 0));
self::register("lapis_lazuli_ore", $factory->get(Ids::LAPIS_LAZULI_ORE, 0));
self::register("large_fern", $factory->get(Ids::LARGE_FERN, 0));
self::register("lava", $factory->get(Ids::LAVA, 0));
self::register("lectern", $factory->get(Ids::LECTERN, 2));
self::register("legacy_stonecutter", $factory->get(Ids::LEGACY_STONECUTTER, 0));
self::register("lever", $factory->get(Ids::LEVER, 6));
self::register("light_blue_glazed_terracotta", $factory->get(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, 2));
self::register("light_gray_glazed_terracotta", $factory->get(Ids::SILVER_GLAZED_TERRACOTTA, 2));
self::register("lilac", $factory->get(Ids::DOUBLE_PLANT, 1));
self::register("lily_of_the_valley", $factory->get(Ids::POPPY, 10));
self::register("light_gray_glazed_terracotta", $factory->get(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA, 2));
self::register("lilac", $factory->get(Ids::LILAC, 0));
self::register("lily_of_the_valley", $factory->get(Ids::LILY_OF_THE_VALLEY, 0));
self::register("lily_pad", $factory->get(Ids::LILY_PAD, 0));
self::register("lime_glazed_terracotta", $factory->get(Ids::LIME_GLAZED_TERRACOTTA, 2));
self::register("lit_pumpkin", $factory->get(Ids::JACK_O_LANTERN, 0));
self::register("loom", $factory->get(Ids::LOOM, 0));
self::register("lit_pumpkin", $factory->get(Ids::LIT_PUMPKIN, 0));
self::register("loom", $factory->get(Ids::LOOM, 2));
self::register("magenta_glazed_terracotta", $factory->get(Ids::MAGENTA_GLAZED_TERRACOTTA, 2));
self::register("magma", $factory->get(Ids::MAGMA, 0));
self::register("material_reducer", $factory->get(Ids::CHEMISTRY_TABLE, 4));
self::register("melon", $factory->get(Ids::MELON_BLOCK, 0));
self::register("material_reducer", $factory->get(Ids::MATERIAL_REDUCER, 0));
self::register("melon", $factory->get(Ids::MELON, 0));
self::register("melon_stem", $factory->get(Ids::MELON_STEM, 0));
self::register("mob_head", $factory->get(Ids::MOB_HEAD_BLOCK, 2));
self::register("monster_spawner", $factory->get(Ids::MOB_SPAWNER, 0));
self::register("mob_head", $factory->get(Ids::MOB_HEAD, 2));
self::register("monster_spawner", $factory->get(Ids::MONSTER_SPAWNER, 0));
self::register("mossy_cobblestone", $factory->get(Ids::MOSSY_COBBLESTONE, 0));
self::register("mossy_cobblestone_slab", $factory->get(Ids::STONE_SLAB2, 5));
self::register("mossy_cobblestone_stairs", $factory->get(Ids::MOSSY_COBBLESTONE_STAIRS, 0));
self::register("mossy_cobblestone_wall", $factory->get(Ids::COBBLESTONE_WALL, 1));
self::register("mossy_stone_brick_slab", $factory->get(Ids::STONE_SLAB4, 0));
self::register("mossy_stone_brick_stairs", $factory->get(Ids::MOSSY_STONE_BRICK_STAIRS, 0));
self::register("mossy_stone_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 8));
self::register("mossy_stone_bricks", $factory->get(Ids::STONEBRICK, 1));
self::register("mushroom_stem", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 10));
self::register("mossy_cobblestone_slab", $factory->get(Ids::MOSSY_COBBLESTONE_SLAB, 0));
self::register("mossy_cobblestone_stairs", $factory->get(Ids::MOSSY_COBBLESTONE_STAIRS, 3));
self::register("mossy_cobblestone_wall", $factory->get(Ids::MOSSY_COBBLESTONE_WALL, 0));
self::register("mossy_stone_brick_slab", $factory->get(Ids::MOSSY_STONE_BRICK_SLAB, 0));
self::register("mossy_stone_brick_stairs", $factory->get(Ids::MOSSY_STONE_BRICK_STAIRS, 3));
self::register("mossy_stone_brick_wall", $factory->get(Ids::MOSSY_STONE_BRICK_WALL, 0));
self::register("mossy_stone_bricks", $factory->get(Ids::MOSSY_STONE_BRICKS, 0));
self::register("mushroom_stem", $factory->get(Ids::MUSHROOM_STEM, 0));
self::register("mycelium", $factory->get(Ids::MYCELIUM, 0));
self::register("nether_brick_fence", $factory->get(Ids::NETHER_BRICK_FENCE, 0));
self::register("nether_brick_slab", $factory->get(Ids::STONE_SLAB, 7));
self::register("nether_brick_stairs", $factory->get(Ids::NETHER_BRICK_STAIRS, 0));
self::register("nether_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 9));
self::register("nether_bricks", $factory->get(Ids::NETHER_BRICK_BLOCK, 0));
self::register("nether_portal", $factory->get(Ids::PORTAL, 1));
self::register("nether_brick_slab", $factory->get(Ids::NETHER_BRICK_SLAB, 0));
self::register("nether_brick_stairs", $factory->get(Ids::NETHER_BRICK_STAIRS, 3));
self::register("nether_brick_wall", $factory->get(Ids::NETHER_BRICK_WALL, 0));
self::register("nether_bricks", $factory->get(Ids::NETHER_BRICKS, 0));
self::register("nether_portal", $factory->get(Ids::NETHER_PORTAL, 1));
self::register("nether_quartz_ore", $factory->get(Ids::NETHER_QUARTZ_ORE, 0));
self::register("nether_reactor_core", $factory->get(Ids::NETHERREACTOR, 0));
self::register("nether_wart", $factory->get(Ids::NETHER_WART_PLANT, 0));
self::register("nether_reactor_core", $factory->get(Ids::NETHER_REACTOR_CORE, 0));
self::register("nether_wart", $factory->get(Ids::NETHER_WART, 0));
self::register("nether_wart_block", $factory->get(Ids::NETHER_WART_BLOCK, 0));
self::register("netherrack", $factory->get(Ids::NETHERRACK, 0));
self::register("note_block", $factory->get(Ids::NOTEBLOCK, 0));
self::register("oak_button", $factory->get(Ids::WOODEN_BUTTON, 0));
self::register("oak_door", $factory->get(Ids::OAK_DOOR_BLOCK, 0));
self::register("oak_fence", $factory->get(Ids::FENCE, 0));
self::register("oak_fence_gate", $factory->get(Ids::FENCE_GATE, 0));
self::register("oak_leaves", $factory->get(Ids::LEAVES, 0));
self::register("oak_log", $factory->get(Ids::LOG, 0));
self::register("oak_planks", $factory->get(Ids::PLANKS, 0));
self::register("oak_pressure_plate", $factory->get(Ids::WOODEN_PRESSURE_PLATE, 0));
self::register("oak_sapling", $factory->get(Ids::SAPLING, 0));
self::register("oak_sign", $factory->get(Ids::SIGN_POST, 0));
self::register("oak_slab", $factory->get(Ids::WOODEN_SLAB, 0));
self::register("oak_stairs", $factory->get(Ids::OAK_STAIRS, 0));
self::register("oak_trapdoor", $factory->get(Ids::TRAPDOOR, 0));
self::register("oak_wall_sign", $factory->get(Ids::WALL_SIGN, 2));
self::register("oak_wood", $factory->get(Ids::WOOD, 0));
self::register("note_block", $factory->get(Ids::NOTE_BLOCK, 0));
self::register("oak_button", $factory->get(Ids::OAK_BUTTON, 0));
self::register("oak_door", $factory->get(Ids::OAK_DOOR, 0));
self::register("oak_fence", $factory->get(Ids::OAK_FENCE, 0));
self::register("oak_fence_gate", $factory->get(Ids::OAK_FENCE_GATE, 0));
self::register("oak_leaves", $factory->get(Ids::OAK_LEAVES, 0));
self::register("oak_log", $factory->get(Ids::OAK_LOG, 0));
self::register("oak_planks", $factory->get(Ids::OAK_PLANKS, 0));
self::register("oak_pressure_plate", $factory->get(Ids::OAK_PRESSURE_PLATE, 0));
self::register("oak_sapling", $factory->get(Ids::OAK_SAPLING, 0));
self::register("oak_sign", $factory->get(Ids::OAK_SIGN, 0));
self::register("oak_slab", $factory->get(Ids::OAK_SLAB, 0));
self::register("oak_stairs", $factory->get(Ids::OAK_STAIRS, 3));
self::register("oak_trapdoor", $factory->get(Ids::OAK_TRAPDOOR, 3));
self::register("oak_wall_sign", $factory->get(Ids::OAK_WALL_SIGN, 2));
self::register("oak_wood", $factory->get(Ids::OAK_WOOD, 0));
self::register("obsidian", $factory->get(Ids::OBSIDIAN, 0));
self::register("orange_glazed_terracotta", $factory->get(Ids::ORANGE_GLAZED_TERRACOTTA, 2));
self::register("orange_tulip", $factory->get(Ids::POPPY, 5));
self::register("oxeye_daisy", $factory->get(Ids::POPPY, 8));
self::register("orange_tulip", $factory->get(Ids::ORANGE_TULIP, 0));
self::register("oxeye_daisy", $factory->get(Ids::OXEYE_DAISY, 0));
self::register("packed_ice", $factory->get(Ids::PACKED_ICE, 0));
self::register("peony", $factory->get(Ids::DOUBLE_PLANT, 5));
self::register("peony", $factory->get(Ids::PEONY, 0));
self::register("pink_glazed_terracotta", $factory->get(Ids::PINK_GLAZED_TERRACOTTA, 2));
self::register("pink_tulip", $factory->get(Ids::POPPY, 7));
self::register("pink_tulip", $factory->get(Ids::PINK_TULIP, 0));
self::register("podzol", $factory->get(Ids::PODZOL, 0));
self::register("polished_andesite", $factory->get(Ids::STONE, 6));
self::register("polished_andesite_slab", $factory->get(Ids::STONE_SLAB3, 2));
self::register("polished_andesite_stairs", $factory->get(Ids::POLISHED_ANDESITE_STAIRS, 0));
self::register("polished_diorite", $factory->get(Ids::STONE, 4));
self::register("polished_diorite_slab", $factory->get(Ids::STONE_SLAB3, 5));
self::register("polished_diorite_stairs", $factory->get(Ids::POLISHED_DIORITE_STAIRS, 0));
self::register("polished_granite", $factory->get(Ids::STONE, 2));
self::register("polished_granite_slab", $factory->get(Ids::STONE_SLAB3, 7));
self::register("polished_granite_stairs", $factory->get(Ids::POLISHED_GRANITE_STAIRS, 0));
self::register("polished_andesite", $factory->get(Ids::POLISHED_ANDESITE, 0));
self::register("polished_andesite_slab", $factory->get(Ids::POLISHED_ANDESITE_SLAB, 0));
self::register("polished_andesite_stairs", $factory->get(Ids::POLISHED_ANDESITE_STAIRS, 3));
self::register("polished_diorite", $factory->get(Ids::POLISHED_DIORITE, 0));
self::register("polished_diorite_slab", $factory->get(Ids::POLISHED_DIORITE_SLAB, 0));
self::register("polished_diorite_stairs", $factory->get(Ids::POLISHED_DIORITE_STAIRS, 3));
self::register("polished_granite", $factory->get(Ids::POLISHED_GRANITE, 0));
self::register("polished_granite_slab", $factory->get(Ids::POLISHED_GRANITE_SLAB, 0));
self::register("polished_granite_stairs", $factory->get(Ids::POLISHED_GRANITE_STAIRS, 3));
self::register("poppy", $factory->get(Ids::POPPY, 0));
self::register("potatoes", $factory->get(Ids::POTATOES, 0));
self::register("powered_rail", $factory->get(Ids::GOLDEN_RAIL, 0));
self::register("powered_rail", $factory->get(Ids::POWERED_RAIL, 0));
self::register("prismarine", $factory->get(Ids::PRISMARINE, 0));
self::register("prismarine_bricks", $factory->get(Ids::PRISMARINE, 2));
self::register("prismarine_bricks_slab", $factory->get(Ids::STONE_SLAB2, 4));
self::register("prismarine_bricks_stairs", $factory->get(Ids::PRISMARINE_BRICKS_STAIRS, 0));
self::register("prismarine_slab", $factory->get(Ids::STONE_SLAB2, 2));
self::register("prismarine_stairs", $factory->get(Ids::PRISMARINE_STAIRS, 0));
self::register("prismarine_wall", $factory->get(Ids::COBBLESTONE_WALL, 11));
self::register("prismarine_bricks", $factory->get(Ids::PRISMARINE_BRICKS, 0));
self::register("prismarine_bricks_slab", $factory->get(Ids::PRISMARINE_BRICKS_SLAB, 0));
self::register("prismarine_bricks_stairs", $factory->get(Ids::PRISMARINE_BRICKS_STAIRS, 3));
self::register("prismarine_slab", $factory->get(Ids::PRISMARINE_SLAB, 0));
self::register("prismarine_stairs", $factory->get(Ids::PRISMARINE_STAIRS, 3));
self::register("prismarine_wall", $factory->get(Ids::PRISMARINE_WALL, 0));
self::register("pumpkin", $factory->get(Ids::PUMPKIN, 0));
self::register("pumpkin_stem", $factory->get(Ids::PUMPKIN_STEM, 0));
self::register("purple_glazed_terracotta", $factory->get(Ids::PURPLE_GLAZED_TERRACOTTA, 2));
self::register("purple_torch", $factory->get(Ids::COLORED_TORCH_BP, 13));
self::register("purpur", $factory->get(Ids::PURPUR_BLOCK, 0));
self::register("purpur_pillar", $factory->get(Ids::PURPUR_BLOCK, 2));
self::register("purpur_slab", $factory->get(Ids::STONE_SLAB2, 1));
self::register("purpur_stairs", $factory->get(Ids::PURPUR_STAIRS, 0));
self::register("quartz", $factory->get(Ids::QUARTZ_BLOCK, 0));
self::register("quartz_pillar", $factory->get(Ids::QUARTZ_BLOCK, 2));
self::register("quartz_slab", $factory->get(Ids::STONE_SLAB, 6));
self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 0));
self::register("purple_torch", $factory->get(Ids::PURPLE_TORCH, 1));
self::register("purpur", $factory->get(Ids::PURPUR, 0));
self::register("purpur_pillar", $factory->get(Ids::PURPUR_PILLAR, 0));
self::register("purpur_slab", $factory->get(Ids::PURPUR_SLAB, 0));
self::register("purpur_stairs", $factory->get(Ids::PURPUR_STAIRS, 3));
self::register("quartz", $factory->get(Ids::QUARTZ, 0));
self::register("quartz_pillar", $factory->get(Ids::QUARTZ_PILLAR, 0));
self::register("quartz_slab", $factory->get(Ids::QUARTZ_SLAB, 0));
self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 3));
self::register("rail", $factory->get(Ids::RAIL, 0));
self::register("red_glazed_terracotta", $factory->get(Ids::RED_GLAZED_TERRACOTTA, 2));
self::register("red_mushroom", $factory->get(Ids::RED_MUSHROOM, 0));
self::register("red_mushroom_block", $factory->get(Ids::RED_MUSHROOM_BLOCK, 0));
self::register("red_nether_brick_slab", $factory->get(Ids::STONE_SLAB2, 7));
self::register("red_nether_brick_stairs", $factory->get(Ids::RED_NETHER_BRICK_STAIRS, 0));
self::register("red_nether_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 13));
self::register("red_nether_bricks", $factory->get(Ids::RED_NETHER_BRICK, 0));
self::register("red_sand", $factory->get(Ids::SAND, 1));
self::register("red_nether_brick_slab", $factory->get(Ids::RED_NETHER_BRICK_SLAB, 0));
self::register("red_nether_brick_stairs", $factory->get(Ids::RED_NETHER_BRICK_STAIRS, 3));
self::register("red_nether_brick_wall", $factory->get(Ids::RED_NETHER_BRICK_WALL, 0));
self::register("red_nether_bricks", $factory->get(Ids::RED_NETHER_BRICKS, 0));
self::register("red_sand", $factory->get(Ids::RED_SAND, 0));
self::register("red_sandstone", $factory->get(Ids::RED_SANDSTONE, 0));
self::register("red_sandstone_slab", $factory->get(Ids::STONE_SLAB2, 0));
self::register("red_sandstone_stairs", $factory->get(Ids::RED_SANDSTONE_STAIRS, 0));
self::register("red_sandstone_wall", $factory->get(Ids::COBBLESTONE_WALL, 12));
self::register("red_torch", $factory->get(Ids::COLORED_TORCH_RG, 5));
self::register("red_tulip", $factory->get(Ids::POPPY, 4));
self::register("redstone", $factory->get(Ids::REDSTONE_BLOCK, 0));
self::register("redstone_comparator", $factory->get(Ids::COMPARATOR_BLOCK, 0));
self::register("red_sandstone_slab", $factory->get(Ids::RED_SANDSTONE_SLAB, 0));
self::register("red_sandstone_stairs", $factory->get(Ids::RED_SANDSTONE_STAIRS, 3));
self::register("red_sandstone_wall", $factory->get(Ids::RED_SANDSTONE_WALL, 0));
self::register("red_torch", $factory->get(Ids::RED_TORCH, 1));
self::register("red_tulip", $factory->get(Ids::RED_TULIP, 0));
self::register("redstone", $factory->get(Ids::REDSTONE, 0));
self::register("redstone_comparator", $factory->get(Ids::REDSTONE_COMPARATOR, 2));
self::register("redstone_lamp", $factory->get(Ids::REDSTONE_LAMP, 0));
self::register("redstone_ore", $factory->get(Ids::REDSTONE_ORE, 0));
self::register("redstone_repeater", $factory->get(Ids::REPEATER_BLOCK, 0));
self::register("redstone_torch", $factory->get(Ids::LIT_REDSTONE_TORCH, 5));
self::register("redstone_repeater", $factory->get(Ids::REDSTONE_REPEATER, 0));
self::register("redstone_torch", $factory->get(Ids::REDSTONE_TORCH, 9));
self::register("redstone_wire", $factory->get(Ids::REDSTONE_WIRE, 0));
self::register("reserved6", $factory->get(Ids::RESERVED6, 0));
self::register("rose_bush", $factory->get(Ids::DOUBLE_PLANT, 4));
self::register("rose_bush", $factory->get(Ids::ROSE_BUSH, 0));
self::register("sand", $factory->get(Ids::SAND, 0));
self::register("sandstone", $factory->get(Ids::SANDSTONE, 0));
self::register("sandstone_slab", $factory->get(Ids::STONE_SLAB, 1));
self::register("sandstone_stairs", $factory->get(Ids::SANDSTONE_STAIRS, 0));
self::register("sandstone_wall", $factory->get(Ids::COBBLESTONE_WALL, 5));
self::register("sea_lantern", $factory->get(Ids::SEALANTERN, 0));
self::register("sea_pickle", $factory->get(Ids::SEA_PICKLE, 0));
self::register("shulker_box", $factory->get(Ids::UNDYED_SHULKER_BOX, 0));
self::register("sandstone_slab", $factory->get(Ids::SANDSTONE_SLAB, 0));
self::register("sandstone_stairs", $factory->get(Ids::SANDSTONE_STAIRS, 3));
self::register("sandstone_wall", $factory->get(Ids::SANDSTONE_WALL, 0));
self::register("sea_lantern", $factory->get(Ids::SEA_LANTERN, 0));
self::register("sea_pickle", $factory->get(Ids::SEA_PICKLE, 4));
self::register("shulker_box", $factory->get(Ids::SHULKER_BOX, 0));
self::register("slime", $factory->get(Ids::SLIME, 0));
self::register("smoker", $factory->get(Ids::SMOKER, 2));
self::register("smooth_quartz", $factory->get(Ids::QUARTZ_BLOCK, 3));
self::register("smooth_quartz_slab", $factory->get(Ids::STONE_SLAB4, 1));
self::register("smooth_quartz_stairs", $factory->get(Ids::SMOOTH_QUARTZ_STAIRS, 0));
self::register("smooth_red_sandstone", $factory->get(Ids::RED_SANDSTONE, 3));
self::register("smooth_red_sandstone_slab", $factory->get(Ids::STONE_SLAB3, 1));
self::register("smooth_red_sandstone_stairs", $factory->get(Ids::SMOOTH_RED_SANDSTONE_STAIRS, 0));
self::register("smooth_sandstone", $factory->get(Ids::SANDSTONE, 3));
self::register("smooth_sandstone_slab", $factory->get(Ids::STONE_SLAB2, 6));
self::register("smooth_sandstone_stairs", $factory->get(Ids::SMOOTH_SANDSTONE_STAIRS, 0));
self::register("smoker", $factory->get(Ids::SMOKER, 0));
self::register("smooth_quartz", $factory->get(Ids::SMOOTH_QUARTZ, 0));
self::register("smooth_quartz_slab", $factory->get(Ids::SMOOTH_QUARTZ_SLAB, 0));
self::register("smooth_quartz_stairs", $factory->get(Ids::SMOOTH_QUARTZ_STAIRS, 3));
self::register("smooth_red_sandstone", $factory->get(Ids::SMOOTH_RED_SANDSTONE, 0));
self::register("smooth_red_sandstone_slab", $factory->get(Ids::SMOOTH_RED_SANDSTONE_SLAB, 0));
self::register("smooth_red_sandstone_stairs", $factory->get(Ids::SMOOTH_RED_SANDSTONE_STAIRS, 3));
self::register("smooth_sandstone", $factory->get(Ids::SMOOTH_SANDSTONE, 0));
self::register("smooth_sandstone_slab", $factory->get(Ids::SMOOTH_SANDSTONE_SLAB, 0));
self::register("smooth_sandstone_stairs", $factory->get(Ids::SMOOTH_SANDSTONE_STAIRS, 3));
self::register("smooth_stone", $factory->get(Ids::SMOOTH_STONE, 0));
self::register("smooth_stone_slab", $factory->get(Ids::STONE_SLAB, 0));
self::register("smooth_stone_slab", $factory->get(Ids::SMOOTH_STONE_SLAB, 0));
self::register("snow", $factory->get(Ids::SNOW, 0));
self::register("snow_layer", $factory->get(Ids::SNOW_LAYER, 0));
self::register("soul_sand", $factory->get(Ids::SOUL_SAND, 0));
self::register("sponge", $factory->get(Ids::SPONGE, 0));
self::register("spruce_button", $factory->get(Ids::SPRUCE_BUTTON, 0));
self::register("spruce_door", $factory->get(Ids::SPRUCE_DOOR_BLOCK, 0));
self::register("spruce_fence", $factory->get(Ids::FENCE, 1));
self::register("spruce_door", $factory->get(Ids::SPRUCE_DOOR, 0));
self::register("spruce_fence", $factory->get(Ids::SPRUCE_FENCE, 0));
self::register("spruce_fence_gate", $factory->get(Ids::SPRUCE_FENCE_GATE, 0));
self::register("spruce_leaves", $factory->get(Ids::LEAVES, 1));
self::register("spruce_log", $factory->get(Ids::LOG, 1));
self::register("spruce_planks", $factory->get(Ids::PLANKS, 1));
self::register("spruce_leaves", $factory->get(Ids::SPRUCE_LEAVES, 0));
self::register("spruce_log", $factory->get(Ids::SPRUCE_LOG, 0));
self::register("spruce_planks", $factory->get(Ids::SPRUCE_PLANKS, 0));
self::register("spruce_pressure_plate", $factory->get(Ids::SPRUCE_PRESSURE_PLATE, 0));
self::register("spruce_sapling", $factory->get(Ids::SAPLING, 1));
self::register("spruce_sign", $factory->get(Ids::SPRUCE_STANDING_SIGN, 0));
self::register("spruce_slab", $factory->get(Ids::WOODEN_SLAB, 1));
self::register("spruce_stairs", $factory->get(Ids::SPRUCE_STAIRS, 0));
self::register("spruce_trapdoor", $factory->get(Ids::SPRUCE_TRAPDOOR, 0));
self::register("spruce_sapling", $factory->get(Ids::SPRUCE_SAPLING, 0));
self::register("spruce_sign", $factory->get(Ids::SPRUCE_SIGN, 0));
self::register("spruce_slab", $factory->get(Ids::SPRUCE_SLAB, 0));
self::register("spruce_stairs", $factory->get(Ids::SPRUCE_STAIRS, 3));
self::register("spruce_trapdoor", $factory->get(Ids::SPRUCE_TRAPDOOR, 3));
self::register("spruce_wall_sign", $factory->get(Ids::SPRUCE_WALL_SIGN, 2));
self::register("spruce_wood", $factory->get(Ids::WOOD, 1));
self::register("stained_clay", $factory->get(Ids::STAINED_CLAY, 0));
self::register("stained_glass", $factory->get(Ids::STAINED_GLASS, 0));
self::register("stained_glass_pane", $factory->get(Ids::STAINED_GLASS_PANE, 0));
self::register("stained_hardened_glass", $factory->get(Ids::HARD_STAINED_GLASS, 0));
self::register("stained_hardened_glass_pane", $factory->get(Ids::HARD_STAINED_GLASS_PANE, 0));
self::register("spruce_wood", $factory->get(Ids::SPRUCE_WOOD, 0));
self::register("stained_clay", $factory->get(Ids::STAINED_CLAY, 14));
self::register("stained_glass", $factory->get(Ids::STAINED_GLASS, 14));
self::register("stained_glass_pane", $factory->get(Ids::STAINED_GLASS_PANE, 14));
self::register("stained_hardened_glass", $factory->get(Ids::STAINED_HARDENED_GLASS, 14));
self::register("stained_hardened_glass_pane", $factory->get(Ids::STAINED_HARDENED_GLASS_PANE, 14));
self::register("stone", $factory->get(Ids::STONE, 0));
self::register("stone_brick_slab", $factory->get(Ids::STONE_SLAB, 5));
self::register("stone_brick_stairs", $factory->get(Ids::STONE_BRICK_STAIRS, 0));
self::register("stone_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 7));
self::register("stone_bricks", $factory->get(Ids::STONEBRICK, 0));
self::register("stone_brick_slab", $factory->get(Ids::STONE_BRICK_SLAB, 0));
self::register("stone_brick_stairs", $factory->get(Ids::STONE_BRICK_STAIRS, 3));
self::register("stone_brick_wall", $factory->get(Ids::STONE_BRICK_WALL, 0));
self::register("stone_bricks", $factory->get(Ids::STONE_BRICKS, 0));
self::register("stone_button", $factory->get(Ids::STONE_BUTTON, 0));
self::register("stone_pressure_plate", $factory->get(Ids::STONE_PRESSURE_PLATE, 0));
self::register("stone_slab", $factory->get(Ids::STONE_SLAB4, 2));
self::register("stone_stairs", $factory->get(Ids::NORMAL_STONE_STAIRS, 0));
self::register("stonecutter", $factory->get(Ids::STONECUTTER_BLOCK, 2));
self::register("stone_slab", $factory->get(Ids::STONE_SLAB, 0));
self::register("stone_stairs", $factory->get(Ids::STONE_STAIRS, 3));
self::register("stonecutter", $factory->get(Ids::STONECUTTER, 2));
self::register("stripped_acacia_log", $factory->get(Ids::STRIPPED_ACACIA_LOG, 0));
self::register("stripped_acacia_wood", $factory->get(Ids::WOOD, 12));
self::register("stripped_acacia_wood", $factory->get(Ids::STRIPPED_ACACIA_WOOD, 0));
self::register("stripped_birch_log", $factory->get(Ids::STRIPPED_BIRCH_LOG, 0));
self::register("stripped_birch_wood", $factory->get(Ids::WOOD, 10));
self::register("stripped_birch_wood", $factory->get(Ids::STRIPPED_BIRCH_WOOD, 0));
self::register("stripped_dark_oak_log", $factory->get(Ids::STRIPPED_DARK_OAK_LOG, 0));
self::register("stripped_dark_oak_wood", $factory->get(Ids::WOOD, 13));
self::register("stripped_dark_oak_wood", $factory->get(Ids::STRIPPED_DARK_OAK_WOOD, 0));
self::register("stripped_jungle_log", $factory->get(Ids::STRIPPED_JUNGLE_LOG, 0));
self::register("stripped_jungle_wood", $factory->get(Ids::WOOD, 11));
self::register("stripped_jungle_wood", $factory->get(Ids::STRIPPED_JUNGLE_WOOD, 0));
self::register("stripped_oak_log", $factory->get(Ids::STRIPPED_OAK_LOG, 0));
self::register("stripped_oak_wood", $factory->get(Ids::WOOD, 8));
self::register("stripped_oak_wood", $factory->get(Ids::STRIPPED_OAK_WOOD, 0));
self::register("stripped_spruce_log", $factory->get(Ids::STRIPPED_SPRUCE_LOG, 0));
self::register("stripped_spruce_wood", $factory->get(Ids::WOOD, 9));
self::register("sugarcane", $factory->get(Ids::REEDS_BLOCK, 0));
self::register("sunflower", $factory->get(Ids::DOUBLE_PLANT, 0));
self::register("stripped_spruce_wood", $factory->get(Ids::STRIPPED_SPRUCE_WOOD, 0));
self::register("sugarcane", $factory->get(Ids::SUGARCANE, 0));
self::register("sunflower", $factory->get(Ids::SUNFLOWER, 0));
self::register("sweet_berry_bush", $factory->get(Ids::SWEET_BERRY_BUSH, 0));
self::register("tall_grass", $factory->get(Ids::TALLGRASS, 1));
self::register("tall_grass", $factory->get(Ids::TALL_GRASS, 0));
self::register("tnt", $factory->get(Ids::TNT, 0));
self::register("torch", $factory->get(Ids::TORCH, 5));
self::register("torch", $factory->get(Ids::TORCH, 1));
self::register("trapped_chest", $factory->get(Ids::TRAPPED_CHEST, 2));
self::register("tripwire", $factory->get(Ids::TRIPWIRE, 0));
self::register("tripwire_hook", $factory->get(Ids::TRIPWIRE_HOOK, 0));
self::register("underwater_torch", $factory->get(Ids::UNDERWATER_TORCH, 5));
self::register("vines", $factory->get(Ids::VINE, 0));
self::register("tripwire_hook", $factory->get(Ids::TRIPWIRE_HOOK, 2));
self::register("underwater_torch", $factory->get(Ids::UNDERWATER_TORCH, 1));
self::register("vines", $factory->get(Ids::VINES, 0));
self::register("wall_banner", $factory->get(Ids::WALL_BANNER, 2));
self::register("wall_coral_fan", $factory->get(Ids::CORAL_FAN_HANG, 0));
self::register("water", $factory->get(Ids::FLOWING_WATER, 0));
self::register("weighted_pressure_plate_heavy", $factory->get(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, 0));
self::register("weighted_pressure_plate_light", $factory->get(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, 0));
self::register("wheat", $factory->get(Ids::WHEAT_BLOCK, 0));
self::register("wall_coral_fan", $factory->get(Ids::WALL_CORAL_FAN, 4));
self::register("water", $factory->get(Ids::WATER, 0));
self::register("weighted_pressure_plate_heavy", $factory->get(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY, 0));
self::register("weighted_pressure_plate_light", $factory->get(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT, 0));
self::register("wheat", $factory->get(Ids::WHEAT, 0));
self::register("white_glazed_terracotta", $factory->get(Ids::WHITE_GLAZED_TERRACOTTA, 2));
self::register("white_tulip", $factory->get(Ids::POPPY, 6));
self::register("wool", $factory->get(Ids::WOOL, 0));
self::register("white_tulip", $factory->get(Ids::WHITE_TULIP, 0));
self::register("wool", $factory->get(Ids::WOOL, 14));
self::register("yellow_glazed_terracotta", $factory->get(Ids::YELLOW_GLAZED_TERRACOTTA, 2));
}
}

View File

@ -23,6 +23,8 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\entity\Entity;
use pocketmine\item\Item;
use pocketmine\math\Axis;
@ -38,27 +40,16 @@ class Vine extends Flowable{
/** @var int[] */
protected array $faces = [];
protected function writeStateToMeta() : int{
return
(isset($this->faces[Facing::SOUTH]) ? BlockLegacyMetadata::VINE_FLAG_SOUTH : 0) |
(isset($this->faces[Facing::WEST]) ? BlockLegacyMetadata::VINE_FLAG_WEST : 0) |
(isset($this->faces[Facing::NORTH]) ? BlockLegacyMetadata::VINE_FLAG_NORTH : 0) |
(isset($this->faces[Facing::EAST]) ? BlockLegacyMetadata::VINE_FLAG_EAST : 0);
protected function decodeState(BlockDataReader $r) : void{
foreach(Facing::HORIZONTAL as $facing){
$this->setFace($facing, $r->readBool());
}
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->setFaceFromMeta($stateMeta, BlockLegacyMetadata::VINE_FLAG_SOUTH, Facing::SOUTH);
$this->setFaceFromMeta($stateMeta, BlockLegacyMetadata::VINE_FLAG_WEST, Facing::WEST);
$this->setFaceFromMeta($stateMeta, BlockLegacyMetadata::VINE_FLAG_NORTH, Facing::NORTH);
$this->setFaceFromMeta($stateMeta, BlockLegacyMetadata::VINE_FLAG_EAST, Facing::EAST);
}
public function getStateBitmask() : int{
return 0b1111;
}
private function setFaceFromMeta(int $meta, int $flag, int $face) : void{
$this->setFace($face, ($meta & $flag) !== 0);
protected function encodeState(BlockDataWriter $w) : void{
foreach(Facing::HORIZONTAL as $facing){
$w->writeBool($this->hasFace($facing));
}
}
/** @return int[] */

View File

@ -23,7 +23,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
use pocketmine\math\Axis;
use pocketmine\math\Facing;
@ -32,7 +34,20 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
final class WallBanner extends BaseBanner{
use NormalHorizontalFacingInMetadataTrait;
use HorizontalFacingTrait {
decodeState as decodeFacing;
encodeState as encodeFacing;
}
protected function decodeState(BlockDataReader $r) : void{
parent::decodeState($r);
$this->decodeFacing($r);
}
protected function encodeState(BlockDataWriter $w) : void{
parent::encodeState($w);
$this->encodeFacing($w);
}
protected function getSupportingFace() : int{
return Facing::opposite($this->facing);

View File

@ -23,10 +23,9 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\block\utils\CoralType;
use pocketmine\block\utils\BlockDataReader;
use pocketmine\block\utils\BlockDataWriter;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\block\utils\InvalidBlockStateException;
use pocketmine\data\bedrock\CoralTypeIdMap;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
@ -35,73 +34,23 @@ use pocketmine\math\Axis;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
use pocketmine\utils\AssumptionFailedError;
use pocketmine\world\BlockTransaction;
final class WallCoralFan extends BaseCoral{
use HorizontalFacingTrait;
protected BlockIdentifierFlattened $idInfoFlattened;
public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->idInfoFlattened = $idInfo;
parent::__construct($idInfo, $name, $breakInfo);
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->facing = BlockDataSerializer::readCoralFacing($stateMeta >> 2);
$this->dead = ($stateMeta & BlockLegacyMetadata::CORAL_FAN_HANG_FLAG_DEAD) !== 0;
$coralTypeFlag = $stateMeta & BlockLegacyMetadata::CORAL_FAN_HANG_TYPE_MASK;
switch($id){
case $this->idInfoFlattened->getLegacyBlockId():
$this->coralType = $coralTypeFlag === BlockLegacyMetadata::CORAL_FAN_HANG_TUBE ? CoralType::TUBE() : CoralType::BRAIN();
break;
case $this->idInfoFlattened->getAdditionalId(0):
$this->coralType = $coralTypeFlag === BlockLegacyMetadata::CORAL_FAN_HANG2_BUBBLE ? CoralType::BUBBLE() : CoralType::FIRE();
break;
case $this->idInfoFlattened->getAdditionalId(1):
if($coralTypeFlag !== BlockLegacyMetadata::CORAL_FAN_HANG3_HORN){
throw new InvalidBlockStateException("Invalid CORAL_FAN_HANG3 type");
}
$this->coralType = CoralType::HORN();
break;
default:
throw new \LogicException("ID/meta doesn't match any CORAL_FAN_HANG type");
}
}
public function getId() : int{
if($this->coralType->equals(CoralType::TUBE()) || $this->coralType->equals(CoralType::BRAIN())){
return $this->idInfoFlattened->getLegacyBlockId();
}elseif($this->coralType->equals(CoralType::BUBBLE()) || $this->coralType->equals(CoralType::FIRE())){
return $this->idInfoFlattened->getAdditionalId(0);
}elseif($this->coralType->equals(CoralType::HORN())){
return $this->idInfoFlattened->getAdditionalId(1);
}
throw new AssumptionFailedError("All types of coral should be covered");
}
public function writeStateToMeta() : int{
$coralTypeFlag = (function() : int{
switch($this->coralType->id()){
case CoralType::TUBE()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG_TUBE;
case CoralType::BRAIN()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG_BRAIN;
case CoralType::BUBBLE()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG2_BUBBLE;
case CoralType::FIRE()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG2_FIRE;
case CoralType::HORN()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG3_HORN;
default: throw new AssumptionFailedError("All types of coral should be covered");
}
})();
return (BlockDataSerializer::writeCoralFacing($this->facing) << 2) | ($this->dead ? BlockLegacyMetadata::CORAL_FAN_HANG_FLAG_DEAD : 0) | $coralTypeFlag;
}
protected function writeStateToItemMeta() : int{
return CoralTypeIdMap::getInstance()->toId($this->coralType);
}
public function getStateBitmask() : int{
return 0b1111;
protected function decodeState(BlockDataReader $r) : void{
parent::decodeState($r);
$this->facing = $r->readHorizontalFacing();
}
protected function encodeState(BlockDataWriter $w) : void{
parent::encodeState($w);
$w->writeHorizontalFacing($this->facing);
}
public function asItem() : Item{

View File

@ -23,7 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
use pocketmine\math\Axis;
use pocketmine\math\Facing;
@ -32,7 +32,7 @@ use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
final class WallSign extends BaseSign{
use NormalHorizontalFacingInMetadataTrait;
use HorizontalFacingTrait;
protected function getSupportingFace() : int{
return Facing::opposite($this->facing);

View File

@ -24,20 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait;
use pocketmine\block\utils\BlockDataSerializer;
abstract class WeightedPressurePlate extends PressurePlate{
use AnalogRedstoneSignalEmitterTrait;
protected function writeStateToMeta() : int{
return $this->signalStrength;
}
public function readStateFromData(int $id, int $stateMeta) : void{
$this->signalStrength = BlockDataSerializer::readBoundedInt("signalStrength", $stateMeta, 0, 15);
}
public function getStateBitmask() : int{
return 0b1111;
}
}

View File

@ -23,11 +23,11 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\ColorInMetadataTrait;
use pocketmine\block\utils\ColoredTrait;
use pocketmine\block\utils\DyeColor;
class Wool extends Opaque{
use ColorInMetadataTrait;
use ColoredTrait;
public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){
$this->color = DyeColor::WHITE();

View File

@ -23,12 +23,12 @@ declare(strict_types=1);
namespace pocketmine\block\tile;
use pocketmine\block\utils\BlockDataSerializer;
use pocketmine\math\Facing;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\network\mcpe\protocol\BlockActorDataPacket;
use pocketmine\network\mcpe\protocol\types\BlockPosition;
use pocketmine\network\mcpe\protocol\types\CacheableNbt;
use pocketmine\utils\AssumptionFailedError;
final class Bell extends Spawnable{
public const TAG_DIRECTION = "Direction"; //TAG_Int
@ -80,7 +80,13 @@ final class Bell extends Spawnable{
public function createFakeUpdatePacket(int $bellHitFace) : BlockActorDataPacket{
$nbt = $this->getSpawnCompound();
$nbt->setByte(self::TAG_RINGING, 1);
$nbt->setInt(self::TAG_DIRECTION, BlockDataSerializer::writeLegacyHorizontalFacing($bellHitFace));
$nbt->setInt(self::TAG_DIRECTION, match($bellHitFace){
Facing::SOUTH => 0,
Facing::WEST => 1,
Facing::NORTH => 2,
Facing::EAST => 3,
default => throw new AssumptionFailedError("Unreachable")
});
$nbt->setInt(self::TAG_TICKS, 0);
return BlockActorDataPacket::create(BlockPosition::fromVector3($this->position), new CacheableNbt($nbt));
}

View File

@ -70,7 +70,7 @@ class FlowerPot extends Spawnable{
protected function writeSaveData(CompoundTag $nbt) : void{
if($this->plant !== null){
$nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getFullId())->toNbt());
$nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getStateId())->toNbt());
}
}
@ -88,7 +88,7 @@ class FlowerPot extends Spawnable{
protected function addAdditionalSpawnData(CompoundTag $nbt) : void{
if($this->plant !== null){
$nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getFullId())->toNbt());
$nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getStateId())->toNbt());
}
}
}

View File

@ -26,6 +26,14 @@ namespace pocketmine\block\utils;
trait AnalogRedstoneSignalEmitterTrait{
protected int $signalStrength = 0;
protected function decodeState(BlockDataReader $r) : void{
$this->signalStrength = $r->readBoundedInt(4, 0, 15);
}
protected function encodeState(BlockDataWriter $w) : void{
$w->writeInt(4, $this->signalStrength);
}
public function getOutputSignalStrength() : int{ return $this->signalStrength; }
/** @return $this */

Some files were not shown because too many files have changed in this diff Show More