$states */ public function __construct( private string $name, private array $states, private int $version ){} public function getName() : string{ return $this->name; } /** * @return Tag[] * @phpstan-return array */ public function getStates() : array{ return $this->states; } public function getState(string $name) : ?Tag{ return $this->states[$name] ?? null; } public function getVersion() : int{ return $this->version; } /** * @throws BlockStateDeserializeException */ public static function fromNbt(CompoundTag $nbt) : self{ try{ $name = $nbt->getString(self::TAG_NAME); $states = $nbt->getCompoundTag(self::TAG_STATES) ?? throw new BlockStateDeserializeException("Missing tag \"" . self::TAG_STATES . "\""); $version = $nbt->getInt(self::TAG_VERSION, 0); }catch(NbtException $e){ throw new BlockStateDeserializeException($e->getMessage(), 0, $e); } $allKeys = $nbt->getValue(); unset($allKeys[self::TAG_NAME], $allKeys[self::TAG_STATES], $allKeys[self::TAG_VERSION]); if(count($allKeys) !== 0){ throw new BlockStateDeserializeException("Unexpected extra keys: " . implode(", ", array_keys($allKeys))); } return new self($name, $states->getValue(), $version); } public function toNbt() : CompoundTag{ $statesTag = CompoundTag::create(); foreach(Utils::stringifyKeys($this->states) as $key => $value){ $statesTag->setTag($key, $value); } return CompoundTag::create() ->setString(self::TAG_NAME, $this->name) ->setInt(self::TAG_VERSION, $this->version) ->setTag(self::TAG_STATES, $statesTag); } public function equals(self $that) : bool{ if($this->name !== $that->name || count($this->states) !== count($that->states)){ return false; } foreach(Utils::stringifyKeys($this->states) as $k => $v){ if(!isset($that->states[$k]) || !$that->states[$k]->equals($v)){ return false; } } return true; } }