mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-06 20:07:09 +00:00
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:
parent
be2fe160b3
commit
f24f2d9ca9
@ -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 */
|
||||
|
@ -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; }
|
||||
|
@ -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 */
|
||||
|
@ -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{
|
||||
|
@ -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);
|
||||
|
@ -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];
|
||||
|
@ -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{
|
||||
|
@ -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{
|
||||
|
@ -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
@ -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;
|
||||
}
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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[]
|
||||
|
@ -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; }
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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{
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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{
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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; }
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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();
|
||||
|
@ -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; }
|
||||
|
@ -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){
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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; }
|
||||
|
@ -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{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
@ -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{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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{
|
||||
|
@ -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{
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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{
|
||||
|
@ -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
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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; }
|
||||
|
@ -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[]
|
||||
*/
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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{
|
||||
|
@ -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));
|
||||
|
@ -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{
|
||||
|
@ -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{
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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; }
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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[] */
|
||||
|
@ -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);
|
||||
|
@ -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{
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user