*/ protected array $patterns = []; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::BLACK(); parent::__construct($idInfo, $name, $breakInfo); } public function readStateFromWorld() : void{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileBanner){ $this->color = $tile->getBaseColor(); $this->setPatterns($tile->getPatterns()); } } public function writeStateToWorld() : void{ parent::writeStateToWorld(); $tile = $this->position->getWorld()->getTile($this->position); assert($tile instanceof TileBanner); $tile->setBaseColor($this->color); $tile->setPatterns($this->patterns); } public function isSolid() : bool{ return false; } public function getMaxStackSize() : int{ return 16; } /** * @return BannerPatternLayer[] * @phpstan-return list */ public function getPatterns() : array{ return $this->patterns; } /** * @param BannerPatternLayer[] $patterns * * @phpstan-param list $patterns * @return $this */ public function setPatterns(array $patterns) : self{ $checked = array_filter($patterns, fn($v) => $v instanceof BannerPatternLayer); if(count($checked) !== count($patterns)){ throw new \TypeError("Deque must only contain " . BannerPatternLayer::class . " objects"); } $this->patterns = $checked; return $this; } /** * @return AxisAlignedBB[] */ protected function recalculateCollisionBoxes() : array{ return []; } public function getSupportType(int $facing) : SupportType{ return SupportType::NONE(); } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($item instanceof ItemBanner){ $this->color = $item->getColor(); $this->setPatterns($item->getPatterns()); } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } abstract protected function getSupportingFace() : int; public function onNearbyBlockChange() : void{ if($this->getSide($this->getSupportingFace())->getId() === BlockLegacyIds::AIR){ $this->position->getWorld()->useBreakOn($this->position); } } protected function writeStateToItemMeta() : int{ return DyeColorIdMap::getInstance()->toInvertedId($this->color); } public function getDropsForCompatibleTool(Item $item) : array{ $drop = $this->asItem(); if($drop instanceof ItemBanner && count($this->patterns) > 0){ $drop->setPatterns($this->patterns); } return [$drop]; } public function getPickedItem(bool $addUserData = false) : Item{ $result = $this->asItem(); if($addUserData && $result instanceof ItemBanner && count($this->patterns) > 0){ $result->setPatterns($this->patterns); } return $result; } }