77 private array $deserializeFuncs = [];
83 private array $simpleCache = [];
85 public function __construct(){
86 $this->registerCandleDeserializers();
87 $this->registerFlatColorBlockDeserializers();
88 $this->registerFlatCoralDeserializers();
89 $this->registerCauldronDeserializers();
90 $this->registerFlatWoodBlockDeserializers();
91 $this->registerLeavesDeserializers();
92 $this->registerSaplingDeserializers();
93 $this->registerLightDeserializers();
94 $this->registerMobHeadDeserializers();
95 $this->registerCopperDeserializers();
96 $this->registerSimpleDeserializers();
97 $this->registerDeserializers();
101 if(count($stateData->getStates()) === 0){
103 return $this->simpleCache[$stateData->getName()] ??= $this->deserializeToStateId($stateData);
107 return $this->deserializeToStateId($stateData);
110 private function deserializeToStateId(
BlockStateData $stateData) : int{
111 $stateId = $this->deserializeBlock($stateData)->getStateId();
114 if(!RuntimeBlockStateRegistry::getInstance()->hasStateId($stateId)){
115 throw new \LogicException(
"State ID $stateId returned by deserializer for " . $stateData->getName() .
" is not registered in RuntimeBlockStateRegistry");
121 public function map(
string $id, \Closure $c) : void{
122 $this->deserializeFuncs[$id] = $c;
123 $this->simpleCache = [];
133 return $this->deserializeFuncs[$id] ?? null;
137 public function mapSimple(
string $id, \Closure $getBlock) : void{
138 $this->map($id, $getBlock);
144 public function mapSlab(
string $singleId,
string $doubleId, \Closure $getBlock) : void{
145 $this->map($singleId, fn(Reader $in) => Helper::decodeSingleSlab($getBlock($in), $in));
146 $this->map($doubleId, fn(Reader $in) => Helper::decodeDoubleSlab($getBlock($in), $in));
152 public function mapStairs(
string $id, \Closure $getBlock) : void{
153 $this->map($id, fn(Reader $in) :
Stair => Helper::decodeStairs($getBlock(), $in));
157 public function mapLog(
string $unstrippedId,
string $strippedId, \Closure $getBlock) : void{
158 $this->map($unstrippedId, fn(Reader $in) => Helper::decodeLog($getBlock(), false, $in));
159 $this->map($strippedId, fn(Reader $in) => Helper::decodeLog($getBlock(),
true, $in));
175 ?\Closure $extra =
null
177 foreach(
Utils::stringifyKeys($mapProperty->getValueToEnum()) as $infix => $enumCase){
178 $id = $prefix . $infix . $suffix;
180 $this->map($id, fn() => $getBlock($enumCase));
182 $this->map($id,
function(Reader $in) use ($enumCase, $getBlock, $extra) :
Block{
183 $block = $getBlock($enumCase);
196 public function mapColored(
string $prefix,
string $suffix, \Closure $getBlock, ?\Closure $extra =
null) : void{
197 $this->mapFlattenedEnum(
201 fn(DyeColor $color) => $getBlock()->setColor($color),
206 private function registerCandleDeserializers() : void{
207 $this->map(Ids::CANDLE, fn(Reader $in) => Helper::decodeCandle(Blocks::CANDLE(), $in));
211 fn() => Blocks::DYED_CANDLE(),
212 Helper::decodeCandle(...)
215 $this->map(Ids::CANDLE_CAKE, fn(Reader $in) => Blocks::CAKE_WITH_CANDLE()->setLit($in->readBool(StateNames::LIT)));
220 fn() => Blocks::CAKE_WITH_DYED_CANDLE(),
225 private function registerFlatColorBlockDeserializers() : void{
226 $this->mapColored(
"minecraft:hard_",
"_stained_glass", fn() => Blocks::STAINED_HARDENED_GLASS());
227 $this->mapColored(
"minecraft:hard_",
"_stained_glass_pane", fn() => Blocks::STAINED_HARDENED_GLASS_PANE());
229 $this->mapColored(
"minecraft:",
"_carpet", fn() => Blocks::CARPET());
230 $this->mapColored(
"minecraft:",
"_concrete", fn() => Blocks::CONCRETE());
231 $this->mapColored(
"minecraft:",
"_concrete_powder", fn() => Blocks::CONCRETE_POWDER());
232 $this->mapColored(
"minecraft:",
"_shulker_box", fn() => Blocks::DYED_SHULKER_BOX());
233 $this->mapColored(
"minecraft:",
"_stained_glass", fn() => Blocks::STAINED_GLASS());
234 $this->mapColored(
"minecraft:",
"_stained_glass_pane", fn() => Blocks::STAINED_GLASS_PANE());
235 $this->mapColored(
"minecraft:",
"_terracotta", fn() => Blocks::STAINED_CLAY());
236 $this->mapColored(
"minecraft:",
"_wool", fn() => Blocks::WOOL());
239 Ids::BLACK_GLAZED_TERRACOTTA => DyeColor::BLACK,
240 Ids::BLUE_GLAZED_TERRACOTTA => DyeColor::BLUE,
241 Ids::BROWN_GLAZED_TERRACOTTA => DyeColor::BROWN,
242 Ids::CYAN_GLAZED_TERRACOTTA => DyeColor::CYAN,
243 Ids::GRAY_GLAZED_TERRACOTTA => DyeColor::GRAY,
244 Ids::GREEN_GLAZED_TERRACOTTA => DyeColor::GREEN,
245 Ids::LIGHT_BLUE_GLAZED_TERRACOTTA => DyeColor::LIGHT_BLUE,
246 Ids::SILVER_GLAZED_TERRACOTTA => DyeColor::LIGHT_GRAY,
247 Ids::LIME_GLAZED_TERRACOTTA => DyeColor::LIME,
248 Ids::MAGENTA_GLAZED_TERRACOTTA => DyeColor::MAGENTA,
249 Ids::ORANGE_GLAZED_TERRACOTTA => DyeColor::ORANGE,
250 Ids::PINK_GLAZED_TERRACOTTA => DyeColor::PINK,
251 Ids::PURPLE_GLAZED_TERRACOTTA => DyeColor::PURPLE,
252 Ids::RED_GLAZED_TERRACOTTA => DyeColor::RED,
253 Ids::WHITE_GLAZED_TERRACOTTA => DyeColor::WHITE,
254 Ids::YELLOW_GLAZED_TERRACOTTA => DyeColor::YELLOW,
256 $this->map($id, fn(Reader $in) => Blocks::GLAZED_TERRACOTTA()
258 ->setFacing($in->readHorizontalFacing())
263 private function registerFlatCoralDeserializers() : void{
265 Ids::BRAIN_CORAL => CoralType::BRAIN,
266 Ids::BUBBLE_CORAL => CoralType::BUBBLE,
267 Ids::FIRE_CORAL => CoralType::FIRE,
268 Ids::HORN_CORAL => CoralType::HORN,
269 Ids::TUBE_CORAL => CoralType::TUBE,
270 ] as $id => $coralType){
271 $this->mapSimple($id, fn() => Blocks::CORAL()->setCoralType($coralType)->setDead(
false));
274 Ids::DEAD_BRAIN_CORAL => CoralType::BRAIN,
275 Ids::DEAD_BUBBLE_CORAL => CoralType::BUBBLE,
276 Ids::DEAD_FIRE_CORAL => CoralType::FIRE,
277 Ids::DEAD_HORN_CORAL => CoralType::HORN,
278 Ids::DEAD_TUBE_CORAL => CoralType::TUBE,
279 ] as $id => $coralType){
280 $this->mapSimple($id, fn() => Blocks::CORAL()->setCoralType($coralType)->setDead(
true));
284 [CoralType::BRAIN, Ids::BRAIN_CORAL_FAN, Ids::DEAD_BRAIN_CORAL_FAN],
285 [CoralType::BUBBLE, Ids::BUBBLE_CORAL_FAN, Ids::DEAD_BUBBLE_CORAL_FAN],
286 [CoralType::FIRE, Ids::FIRE_CORAL_FAN, Ids::DEAD_FIRE_CORAL_FAN],
287 [CoralType::HORN, Ids::HORN_CORAL_FAN, Ids::DEAD_HORN_CORAL_FAN],
288 [CoralType::TUBE, Ids::TUBE_CORAL_FAN, Ids::DEAD_TUBE_CORAL_FAN],
289 ] as [$coralType, $aliveId, $deadId]){
290 $this->map($aliveId, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN()->setCoralType($coralType)->setDead(
false), $in));
291 $this->map($deadId, fn(Reader $in) => Helper::decodeFloorCoralFan(Blocks::CORAL_FAN()->setCoralType($coralType)->setDead(
true), $in));
295 [CoralType::BRAIN, Ids::BRAIN_CORAL_BLOCK, Ids::DEAD_BRAIN_CORAL_BLOCK],
296 [CoralType::BUBBLE, Ids::BUBBLE_CORAL_BLOCK, Ids::DEAD_BUBBLE_CORAL_BLOCK],
297 [CoralType::FIRE, Ids::FIRE_CORAL_BLOCK, Ids::DEAD_FIRE_CORAL_BLOCK],
298 [CoralType::HORN, Ids::HORN_CORAL_BLOCK, Ids::DEAD_HORN_CORAL_BLOCK],
299 [CoralType::TUBE, Ids::TUBE_CORAL_BLOCK, Ids::DEAD_TUBE_CORAL_BLOCK],
300 ] as [$coralType, $aliveId, $deadId]){
301 $this->map($aliveId, fn(Reader $in) => Blocks::CORAL_BLOCK()->setCoralType($coralType)->setDead(
false));
302 $this->map($deadId, fn(Reader $in) => Blocks::CORAL_BLOCK()->setCoralType($coralType)->setDead(
true));
306 [CoralType::BRAIN, Ids::BRAIN_CORAL_WALL_FAN, Ids::DEAD_BRAIN_CORAL_WALL_FAN],
307 [CoralType::BUBBLE, Ids::BUBBLE_CORAL_WALL_FAN, Ids::DEAD_BUBBLE_CORAL_WALL_FAN],
308 [CoralType::FIRE, Ids::FIRE_CORAL_WALL_FAN, Ids::DEAD_FIRE_CORAL_WALL_FAN],
309 [CoralType::HORN, Ids::HORN_CORAL_WALL_FAN, Ids::DEAD_HORN_CORAL_WALL_FAN],
310 [CoralType::TUBE, Ids::TUBE_CORAL_WALL_FAN, Ids::DEAD_TUBE_CORAL_WALL_FAN],
311 ] as [$coralType, $aliveId, $deadId]){
312 $this->map($aliveId, fn(Reader $in) => Blocks::WALL_CORAL_FAN()->setFacing($in->readCoralFacing())->setCoralType($coralType)->setDead(
false));
313 $this->map($deadId, fn(Reader $in) => Blocks::WALL_CORAL_FAN()->setFacing($in->readCoralFacing())->setCoralType($coralType)->setDead(
true));
317 private function registerCauldronDeserializers() : void{
318 $deserializer = function(Reader $in) : Block{
319 $level = $in->readBoundedInt(StateNames::FILL_LEVEL, 0, 6);
321 $in->ignored(StateNames::CAULDRON_LIQUID);
322 return Blocks::CAULDRON();
325 return (match($liquid = $in->readString(StateNames::CAULDRON_LIQUID)){
326 StringValues::CAULDRON_LIQUID_WATER => Blocks::WATER_CAULDRON(),
327 StringValues::CAULDRON_LIQUID_LAVA => Blocks::LAVA_CAULDRON(),
328 StringValues::CAULDRON_LIQUID_POWDER_SNOW => throw new UnsupportedBlockStateException(
"Powder snow is not supported yet"),
329 default => throw $in->badValueException(StateNames::CAULDRON_LIQUID, $liquid)
330 })->setFillLevel($level);
332 $this->map(Ids::CAULDRON, $deserializer);
335 private function registerFlatWoodBlockDeserializers() : void{
336 $this->map(Ids::ACACIA_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::ACACIA_BUTTON(), $in));
337 $this->map(Ids::ACACIA_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::ACACIA_DOOR(), $in));
338 $this->map(Ids::ACACIA_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::ACACIA_FENCE_GATE(), $in));
339 $this->map(Ids::ACACIA_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::ACACIA_PRESSURE_PLATE(), $in));
340 $this->map(Ids::ACACIA_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::ACACIA_SIGN(), $in));
341 $this->map(Ids::ACACIA_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::ACACIA_TRAPDOOR(), $in));
342 $this->map(Ids::ACACIA_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::ACACIA_WALL_SIGN(), $in));
343 $this->mapLog(Ids::ACACIA_LOG, Ids::STRIPPED_ACACIA_LOG, fn() => Blocks::ACACIA_LOG());
344 $this->mapLog(Ids::ACACIA_WOOD, Ids::STRIPPED_ACACIA_WOOD, fn() => Blocks::ACACIA_WOOD());
345 $this->mapSimple(Ids::ACACIA_FENCE, fn() => Blocks::ACACIA_FENCE());
346 $this->mapSimple(Ids::ACACIA_PLANKS, fn() => Blocks::ACACIA_PLANKS());
347 $this->mapSlab(Ids::ACACIA_SLAB, Ids::ACACIA_DOUBLE_SLAB, fn() => Blocks::ACACIA_SLAB());
348 $this->mapStairs(Ids::ACACIA_STAIRS, fn() => Blocks::ACACIA_STAIRS());
350 $this->map(Ids::BIRCH_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::BIRCH_BUTTON(), $in));
351 $this->map(Ids::BIRCH_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::BIRCH_DOOR(), $in));
352 $this->map(Ids::BIRCH_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::BIRCH_FENCE_GATE(), $in));
353 $this->map(Ids::BIRCH_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::BIRCH_PRESSURE_PLATE(), $in));
354 $this->map(Ids::BIRCH_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::BIRCH_SIGN(), $in));
355 $this->map(Ids::BIRCH_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::BIRCH_TRAPDOOR(), $in));
356 $this->map(Ids::BIRCH_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::BIRCH_WALL_SIGN(), $in));
357 $this->mapLog(Ids::BIRCH_LOG, Ids::STRIPPED_BIRCH_LOG, fn() => Blocks::BIRCH_LOG());
358 $this->mapLog(Ids::BIRCH_WOOD, Ids::STRIPPED_BIRCH_WOOD, fn() => Blocks::BIRCH_WOOD());
359 $this->mapSimple(Ids::BIRCH_FENCE, fn() => Blocks::BIRCH_FENCE());
360 $this->mapSimple(Ids::BIRCH_PLANKS, fn() => Blocks::BIRCH_PLANKS());
361 $this->mapSlab(Ids::BIRCH_SLAB, Ids::BIRCH_DOUBLE_SLAB, fn() => Blocks::BIRCH_SLAB());
362 $this->mapStairs(Ids::BIRCH_STAIRS, fn() => Blocks::BIRCH_STAIRS());
364 $this->map(Ids::CHERRY_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::CHERRY_BUTTON(), $in));
365 $this->map(Ids::CHERRY_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::CHERRY_DOOR(), $in));
366 $this->map(Ids::CHERRY_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::CHERRY_FENCE_GATE(), $in));
367 $this->map(Ids::CHERRY_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::CHERRY_PRESSURE_PLATE(), $in));
368 $this->map(Ids::CHERRY_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::CHERRY_SIGN(), $in));
369 $this->map(Ids::CHERRY_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::CHERRY_TRAPDOOR(), $in));
370 $this->map(Ids::CHERRY_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::CHERRY_WALL_SIGN(), $in));
371 $this->mapLog(Ids::CHERRY_LOG, Ids::STRIPPED_CHERRY_LOG, fn() => Blocks::CHERRY_LOG());
372 $this->mapSimple(Ids::CHERRY_FENCE, fn() => Blocks::CHERRY_FENCE());
373 $this->mapSimple(Ids::CHERRY_PLANKS, fn() => Blocks::CHERRY_PLANKS());
374 $this->mapSlab(Ids::CHERRY_SLAB, Ids::CHERRY_DOUBLE_SLAB, fn() => Blocks::CHERRY_SLAB());
375 $this->mapStairs(Ids::CHERRY_STAIRS, fn() => Blocks::CHERRY_STAIRS());
376 $this->map(Ids::CHERRY_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::CHERRY_WOOD(),
false, $in));
377 $this->map(Ids::STRIPPED_CHERRY_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::CHERRY_WOOD(),
true, $in));
379 $this->map(Ids::CRIMSON_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::CRIMSON_BUTTON(), $in));
380 $this->map(Ids::CRIMSON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::CRIMSON_DOOR(), $in));
381 $this->map(Ids::CRIMSON_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::CRIMSON_FENCE_GATE(), $in));
382 $this->map(Ids::CRIMSON_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::CRIMSON_PRESSURE_PLATE(), $in));
383 $this->map(Ids::CRIMSON_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::CRIMSON_SIGN(), $in));
384 $this->map(Ids::CRIMSON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::CRIMSON_TRAPDOOR(), $in));
385 $this->map(Ids::CRIMSON_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::CRIMSON_WALL_SIGN(), $in));
386 $this->mapLog(Ids::CRIMSON_HYPHAE, Ids::STRIPPED_CRIMSON_HYPHAE, fn() => Blocks::CRIMSON_HYPHAE());
387 $this->mapLog(Ids::CRIMSON_STEM, Ids::STRIPPED_CRIMSON_STEM, fn() => Blocks::CRIMSON_STEM());
388 $this->mapSimple(Ids::CRIMSON_FENCE, fn() => Blocks::CRIMSON_FENCE());
389 $this->mapSimple(Ids::CRIMSON_PLANKS, fn() => Blocks::CRIMSON_PLANKS());
390 $this->mapSlab(Ids::CRIMSON_SLAB, Ids::CRIMSON_DOUBLE_SLAB, fn() => Blocks::CRIMSON_SLAB());
391 $this->mapStairs(Ids::CRIMSON_STAIRS, fn() => Blocks::CRIMSON_STAIRS());
393 $this->map(Ids::DARKOAK_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::DARK_OAK_SIGN(), $in));
394 $this->map(Ids::DARKOAK_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::DARK_OAK_WALL_SIGN(), $in));
395 $this->map(Ids::DARK_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::DARK_OAK_BUTTON(), $in));
396 $this->map(Ids::DARK_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::DARK_OAK_DOOR(), $in));
397 $this->map(Ids::DARK_OAK_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::DARK_OAK_FENCE_GATE(), $in));
398 $this->map(Ids::DARK_OAK_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::DARK_OAK_PRESSURE_PLATE(), $in));
399 $this->map(Ids::DARK_OAK_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::DARK_OAK_TRAPDOOR(), $in));
400 $this->mapLog(Ids::DARK_OAK_LOG, Ids::STRIPPED_DARK_OAK_LOG, fn() => Blocks::DARK_OAK_LOG());
401 $this->mapLog(Ids::DARK_OAK_WOOD, Ids::STRIPPED_DARK_OAK_WOOD, fn() => Blocks::DARK_OAK_WOOD());
402 $this->mapSimple(Ids::DARK_OAK_FENCE, fn() => Blocks::DARK_OAK_FENCE());
403 $this->mapSimple(Ids::DARK_OAK_PLANKS, fn() => Blocks::DARK_OAK_PLANKS());
404 $this->mapSlab(Ids::DARK_OAK_SLAB, Ids::DARK_OAK_DOUBLE_SLAB, fn() => Blocks::DARK_OAK_SLAB());
405 $this->mapStairs(Ids::DARK_OAK_STAIRS, fn() => Blocks::DARK_OAK_STAIRS());
407 $this->map(Ids::JUNGLE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::JUNGLE_BUTTON(), $in));
408 $this->map(Ids::JUNGLE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::JUNGLE_DOOR(), $in));
409 $this->map(Ids::JUNGLE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::JUNGLE_FENCE_GATE(), $in));
410 $this->map(Ids::JUNGLE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::JUNGLE_PRESSURE_PLATE(), $in));
411 $this->map(Ids::JUNGLE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::JUNGLE_SIGN(), $in));
412 $this->map(Ids::JUNGLE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::JUNGLE_TRAPDOOR(), $in));
413 $this->map(Ids::JUNGLE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::JUNGLE_WALL_SIGN(), $in));
414 $this->mapLog(Ids::JUNGLE_LOG, Ids::STRIPPED_JUNGLE_LOG, fn() => Blocks::JUNGLE_LOG());
415 $this->mapLog(Ids::JUNGLE_WOOD, Ids::STRIPPED_JUNGLE_WOOD, fn() => Blocks::JUNGLE_WOOD());
416 $this->mapSimple(Ids::JUNGLE_FENCE, fn() => Blocks::JUNGLE_FENCE());
417 $this->mapSimple(Ids::JUNGLE_PLANKS, fn() => Blocks::JUNGLE_PLANKS());
418 $this->mapSlab(Ids::JUNGLE_SLAB, Ids::JUNGLE_DOUBLE_SLAB, fn() => Blocks::JUNGLE_SLAB());
419 $this->mapStairs(Ids::JUNGLE_STAIRS, fn() => Blocks::JUNGLE_STAIRS());
421 $this->map(Ids::MANGROVE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::MANGROVE_BUTTON(), $in));
422 $this->map(Ids::MANGROVE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::MANGROVE_DOOR(), $in));
423 $this->map(Ids::MANGROVE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::MANGROVE_FENCE_GATE(), $in));
424 $this->map(Ids::MANGROVE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::MANGROVE_PRESSURE_PLATE(), $in));
425 $this->map(Ids::MANGROVE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::MANGROVE_SIGN(), $in));
426 $this->map(Ids::MANGROVE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::MANGROVE_TRAPDOOR(), $in));
427 $this->map(Ids::MANGROVE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::MANGROVE_WALL_SIGN(), $in));
428 $this->mapLog(Ids::MANGROVE_LOG, Ids::STRIPPED_MANGROVE_LOG, fn() => Blocks::MANGROVE_LOG());
429 $this->mapSimple(Ids::MANGROVE_FENCE, fn() => Blocks::MANGROVE_FENCE());
430 $this->mapSimple(Ids::MANGROVE_PLANKS, fn() => Blocks::MANGROVE_PLANKS());
431 $this->mapSlab(Ids::MANGROVE_SLAB, Ids::MANGROVE_DOUBLE_SLAB, fn() => Blocks::MANGROVE_SLAB());
432 $this->mapStairs(Ids::MANGROVE_STAIRS, fn() => Blocks::MANGROVE_STAIRS());
433 $this->map(Ids::MANGROVE_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_WOOD(),
false, $in));
434 $this->map(Ids::STRIPPED_MANGROVE_WOOD, fn(Reader $in) => Helper::decodeLog(Blocks::MANGROVE_WOOD(),
true, $in));
437 $this->map(Ids::WOODEN_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::OAK_BUTTON(), $in));
438 $this->map(Ids::WOODEN_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::OAK_DOOR(), $in));
439 $this->map(Ids::FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::OAK_FENCE_GATE(), $in));
440 $this->map(Ids::WOODEN_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::OAK_PRESSURE_PLATE(), $in));
441 $this->map(Ids::STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::OAK_SIGN(), $in));
442 $this->map(Ids::TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::OAK_TRAPDOOR(), $in));
443 $this->map(Ids::WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::OAK_WALL_SIGN(), $in));
444 $this->mapLog(Ids::OAK_LOG, Ids::STRIPPED_OAK_LOG, fn() => Blocks::OAK_LOG());
445 $this->mapLog(Ids::OAK_WOOD, Ids::STRIPPED_OAK_WOOD, fn() => Blocks::OAK_WOOD());
446 $this->mapSimple(Ids::OAK_FENCE, fn() => Blocks::OAK_FENCE());
447 $this->mapSimple(Ids::OAK_PLANKS, fn() => Blocks::OAK_PLANKS());
448 $this->mapSlab(Ids::OAK_SLAB, Ids::OAK_DOUBLE_SLAB, fn() => Blocks::OAK_SLAB());
449 $this->mapStairs(Ids::OAK_STAIRS, fn() => Blocks::OAK_STAIRS());
451 $this->map(Ids::PALE_OAK_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::PALE_OAK_BUTTON(), $in));
452 $this->map(Ids::PALE_OAK_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::PALE_OAK_DOOR(), $in));
453 $this->map(Ids::PALE_OAK_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::PALE_OAK_FENCE_GATE(), $in));
454 $this->map(Ids::PALE_OAK_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::PALE_OAK_PRESSURE_PLATE(), $in));
455 $this->map(Ids::PALE_OAK_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::PALE_OAK_SIGN(), $in));
456 $this->map(Ids::PALE_OAK_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::PALE_OAK_TRAPDOOR(), $in));
457 $this->map(Ids::PALE_OAK_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::PALE_OAK_WALL_SIGN(), $in));
458 $this->mapLog(Ids::PALE_OAK_LOG, Ids::STRIPPED_PALE_OAK_LOG, fn() => Blocks::PALE_OAK_LOG());
459 $this->mapLog(Ids::PALE_OAK_WOOD, Ids::STRIPPED_PALE_OAK_WOOD, fn() => Blocks::PALE_OAK_WOOD());
460 $this->mapSimple(Ids::PALE_OAK_FENCE, fn() => Blocks::PALE_OAK_FENCE());
461 $this->mapSimple(Ids::PALE_OAK_PLANKS, fn() => Blocks::PALE_OAK_PLANKS());
462 $this->mapSlab(Ids::PALE_OAK_SLAB, Ids::PALE_OAK_DOUBLE_SLAB, fn() => Blocks::PALE_OAK_SLAB());
463 $this->mapStairs(Ids::PALE_OAK_STAIRS, fn() => Blocks::PALE_OAK_STAIRS());
465 $this->map(Ids::SPRUCE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::SPRUCE_BUTTON(), $in));
466 $this->map(Ids::SPRUCE_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::SPRUCE_DOOR(), $in));
467 $this->map(Ids::SPRUCE_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::SPRUCE_FENCE_GATE(), $in));
468 $this->map(Ids::SPRUCE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::SPRUCE_PRESSURE_PLATE(), $in));
469 $this->map(Ids::SPRUCE_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::SPRUCE_SIGN(), $in));
470 $this->map(Ids::SPRUCE_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::SPRUCE_TRAPDOOR(), $in));
471 $this->map(Ids::SPRUCE_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::SPRUCE_WALL_SIGN(), $in));
472 $this->mapLog(Ids::SPRUCE_LOG, Ids::STRIPPED_SPRUCE_LOG, fn() => Blocks::SPRUCE_LOG());
473 $this->mapLog(Ids::SPRUCE_WOOD, Ids::STRIPPED_SPRUCE_WOOD, fn() => Blocks::SPRUCE_WOOD());
474 $this->mapSimple(Ids::SPRUCE_FENCE, fn() => Blocks::SPRUCE_FENCE());
475 $this->mapSimple(Ids::SPRUCE_PLANKS, fn() => Blocks::SPRUCE_PLANKS());
476 $this->mapSlab(Ids::SPRUCE_SLAB, Ids::SPRUCE_DOUBLE_SLAB, fn() => Blocks::SPRUCE_SLAB());
477 $this->mapStairs(Ids::SPRUCE_STAIRS, fn() => Blocks::SPRUCE_STAIRS());
479 $this->map(Ids::WARPED_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::WARPED_BUTTON(), $in));
480 $this->map(Ids::WARPED_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::WARPED_DOOR(), $in));
481 $this->map(Ids::WARPED_FENCE_GATE, fn(Reader $in) => Helper::decodeFenceGate(Blocks::WARPED_FENCE_GATE(), $in));
482 $this->map(Ids::WARPED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::WARPED_PRESSURE_PLATE(), $in));
483 $this->map(Ids::WARPED_STANDING_SIGN, fn(Reader $in) => Helper::decodeFloorSign(Blocks::WARPED_SIGN(), $in));
484 $this->map(Ids::WARPED_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::WARPED_TRAPDOOR(), $in));
485 $this->map(Ids::WARPED_WALL_SIGN, fn(Reader $in) => Helper::decodeWallSign(Blocks::WARPED_WALL_SIGN(), $in));
486 $this->mapLog(Ids::WARPED_HYPHAE, Ids::STRIPPED_WARPED_HYPHAE, fn() => Blocks::WARPED_HYPHAE());
487 $this->mapLog(Ids::WARPED_STEM, Ids::STRIPPED_WARPED_STEM, fn() => Blocks::WARPED_STEM());
488 $this->mapSimple(Ids::WARPED_FENCE, fn() => Blocks::WARPED_FENCE());
489 $this->mapSimple(Ids::WARPED_PLANKS, fn() => Blocks::WARPED_PLANKS());
490 $this->mapSlab(Ids::WARPED_SLAB, Ids::WARPED_DOUBLE_SLAB, fn() => Blocks::WARPED_SLAB());
491 $this->mapStairs(Ids::WARPED_STAIRS, fn() => Blocks::WARPED_STAIRS());
494 private function registerLeavesDeserializers() : void{
495 $this->map(Ids::ACACIA_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::ACACIA_LEAVES(), $in));
496 $this->map(Ids::AZALEA_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::AZALEA_LEAVES(), $in));
497 $this->map(Ids::AZALEA_LEAVES_FLOWERED, fn(Reader $in) => Helper::decodeLeaves(Blocks::FLOWERING_AZALEA_LEAVES(), $in));
498 $this->map(Ids::BIRCH_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::BIRCH_LEAVES(), $in));
499 $this->map(Ids::CHERRY_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::CHERRY_LEAVES(), $in));
500 $this->map(Ids::DARK_OAK_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::DARK_OAK_LEAVES(), $in));
501 $this->map(Ids::JUNGLE_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::JUNGLE_LEAVES(), $in));
502 $this->map(Ids::MANGROVE_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::MANGROVE_LEAVES(), $in));
503 $this->map(Ids::OAK_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::OAK_LEAVES(), $in));
504 $this->map(Ids::PALE_OAK_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::PALE_OAK_LEAVES(), $in));
505 $this->map(Ids::SPRUCE_LEAVES, fn(Reader $in) => Helper::decodeLeaves(Blocks::SPRUCE_LEAVES(), $in));
508 private function registerSaplingDeserializers() : void{
510 Ids::ACACIA_SAPLING => fn() => Blocks::ACACIA_SAPLING(),
511 Ids::BIRCH_SAPLING => fn() => Blocks::BIRCH_SAPLING(),
512 Ids::DARK_OAK_SAPLING => fn() => Blocks::DARK_OAK_SAPLING(),
513 Ids::JUNGLE_SAPLING => fn() => Blocks::JUNGLE_SAPLING(),
514 Ids::OAK_SAPLING => fn() => Blocks::OAK_SAPLING(),
515 Ids::SPRUCE_SAPLING => fn() => Blocks::SPRUCE_SAPLING(),
516 ] as $id => $getBlock){
517 $this->map($id, fn(Reader $in) => Helper::decodeSapling($getBlock(), $in));
521 private function registerLightDeserializers() : void{
523 Ids::LIGHT_BLOCK_0 => 0,
524 Ids::LIGHT_BLOCK_1 => 1,
525 Ids::LIGHT_BLOCK_2 => 2,
526 Ids::LIGHT_BLOCK_3 => 3,
527 Ids::LIGHT_BLOCK_4 => 4,
528 Ids::LIGHT_BLOCK_5 => 5,
529 Ids::LIGHT_BLOCK_6 => 6,
530 Ids::LIGHT_BLOCK_7 => 7,
531 Ids::LIGHT_BLOCK_8 => 8,
532 Ids::LIGHT_BLOCK_9 => 9,
533 Ids::LIGHT_BLOCK_10 => 10,
534 Ids::LIGHT_BLOCK_11 => 11,
535 Ids::LIGHT_BLOCK_12 => 12,
536 Ids::LIGHT_BLOCK_13 => 13,
537 Ids::LIGHT_BLOCK_14 => 14,
538 Ids::LIGHT_BLOCK_15 => 15,
540 $this->mapSimple($id, fn() => Blocks::LIGHT()->setLightLevel($level));
544 private function registerMobHeadDeserializers() : void{
546 Ids::CREEPER_HEAD => MobHeadType::CREEPER,
547 Ids::DRAGON_HEAD => MobHeadType::DRAGON,
548 Ids::PIGLIN_HEAD => MobHeadType::PIGLIN,
549 Ids::PLAYER_HEAD => MobHeadType::PLAYER,
550 Ids::SKELETON_SKULL => MobHeadType::SKELETON,
551 Ids::WITHER_SKELETON_SKULL => MobHeadType::WITHER_SKELETON,
552 Ids::ZOMBIE_HEAD => MobHeadType::ZOMBIE
553 ] as $id => $mobHeadType){
554 $this->map($id, fn(Reader $in) => Blocks::MOB_HEAD()->setMobHeadType($mobHeadType)->setFacing($in->readFacingWithoutDown()));
561 private function mapCopper(
563 string $waxedNormalId,
565 string $waxedExposedId,
567 string $waxedWeatheredId,
569 string $waxedOxidizedId,
570 \Closure $deserializer
572 foreach(Utils::stringifyKeys([
573 $normalId => [CopperOxidation::NONE, false],
574 $waxedNormalId => [CopperOxidation::NONE, true],
575 $exposedId => [CopperOxidation::EXPOSED, false],
576 $waxedExposedId => [CopperOxidation::EXPOSED, true],
577 $weatheredId => [CopperOxidation::WEATHERED, false],
578 $waxedWeatheredId => [CopperOxidation::WEATHERED, true],
579 $oxidizedId => [CopperOxidation::OXIDIZED, false],
580 $waxedOxidizedId => [CopperOxidation::OXIDIZED, true],
581 ]) as $id => [$oxidation, $waxed]){
582 $this->map($id, fn(Reader $in) => $deserializer($in)->setOxidation($oxidation)->setWaxed($waxed));
586 private function registerCopperDeserializers() : void{
588 Ids::CUT_COPPER_SLAB,
589 Ids::WAXED_CUT_COPPER_SLAB,
590 Ids::EXPOSED_CUT_COPPER_SLAB,
591 Ids::WAXED_EXPOSED_CUT_COPPER_SLAB,
592 Ids::WEATHERED_CUT_COPPER_SLAB,
593 Ids::WAXED_WEATHERED_CUT_COPPER_SLAB,
594 Ids::OXIDIZED_CUT_COPPER_SLAB,
595 Ids::WAXED_OXIDIZED_CUT_COPPER_SLAB,
596 fn(Reader $in) => Helper::decodeSingleSlab(Blocks::CUT_COPPER_SLAB(), $in)
599 Ids::DOUBLE_CUT_COPPER_SLAB,
600 Ids::WAXED_DOUBLE_CUT_COPPER_SLAB,
601 Ids::EXPOSED_DOUBLE_CUT_COPPER_SLAB,
602 Ids::WAXED_EXPOSED_DOUBLE_CUT_COPPER_SLAB,
603 Ids::WEATHERED_DOUBLE_CUT_COPPER_SLAB,
604 Ids::WAXED_WEATHERED_DOUBLE_CUT_COPPER_SLAB,
605 Ids::OXIDIZED_DOUBLE_CUT_COPPER_SLAB,
606 Ids::WAXED_OXIDIZED_DOUBLE_CUT_COPPER_SLAB,
607 fn(Reader $in) => Helper::decodeDoubleSlab(Blocks::CUT_COPPER_SLAB(), $in)
612 Ids::WAXED_COPPER_BULB,
613 Ids::EXPOSED_COPPER_BULB,
614 Ids::WAXED_EXPOSED_COPPER_BULB,
615 Ids::WEATHERED_COPPER_BULB,
616 Ids::WAXED_WEATHERED_COPPER_BULB,
617 Ids::OXIDIZED_COPPER_BULB,
618 Ids::WAXED_OXIDIZED_COPPER_BULB,
619 fn(Reader $in) => Blocks::COPPER_BULB()
620 ->setLit($in->readBool(StateNames::LIT))
621 ->setPowered($in->readBool(StateNames::POWERED_BIT))
625 Ids::WAXED_COPPER_DOOR,
626 Ids::EXPOSED_COPPER_DOOR,
627 Ids::WAXED_EXPOSED_COPPER_DOOR,
628 Ids::WEATHERED_COPPER_DOOR,
629 Ids::WAXED_WEATHERED_COPPER_DOOR,
630 Ids::OXIDIZED_COPPER_DOOR,
631 Ids::WAXED_OXIDIZED_COPPER_DOOR,
632 fn(Reader $in) => Helper::decodeDoor(Blocks::COPPER_DOOR(), $in)
635 Ids::COPPER_TRAPDOOR,
636 Ids::WAXED_COPPER_TRAPDOOR,
637 Ids::EXPOSED_COPPER_TRAPDOOR,
638 Ids::WAXED_EXPOSED_COPPER_TRAPDOOR,
639 Ids::WEATHERED_COPPER_TRAPDOOR,
640 Ids::WAXED_WEATHERED_COPPER_TRAPDOOR,
641 Ids::OXIDIZED_COPPER_TRAPDOOR,
642 Ids::WAXED_OXIDIZED_COPPER_TRAPDOOR,
643 fn(Reader $in) => Helper::decodeTrapdoor(Blocks::COPPER_TRAPDOOR(), $in)
649 Ids::WAXED_EXPOSED_COPPER,
650 Ids::WEATHERED_COPPER,
651 Ids::WAXED_WEATHERED_COPPER,
652 Ids::OXIDIZED_COPPER,
653 Ids::WAXED_OXIDIZED_COPPER,
654 fn(Reader $in) => Blocks::COPPER()
657 Ids::CHISELED_COPPER,
658 Ids::WAXED_CHISELED_COPPER,
659 Ids::EXPOSED_CHISELED_COPPER,
660 Ids::WAXED_EXPOSED_CHISELED_COPPER,
661 Ids::WEATHERED_CHISELED_COPPER,
662 Ids::WAXED_WEATHERED_CHISELED_COPPER,
663 Ids::OXIDIZED_CHISELED_COPPER,
664 Ids::WAXED_OXIDIZED_CHISELED_COPPER,
665 fn(Reader $in) => Blocks::CHISELED_COPPER()
669 Ids::WAXED_COPPER_GRATE,
670 Ids::EXPOSED_COPPER_GRATE,
671 Ids::WAXED_EXPOSED_COPPER_GRATE,
672 Ids::WEATHERED_COPPER_GRATE,
673 Ids::WAXED_WEATHERED_COPPER_GRATE,
674 Ids::OXIDIZED_COPPER_GRATE,
675 Ids::WAXED_OXIDIZED_COPPER_GRATE,
676 fn(Reader $in) => Blocks::COPPER_GRATE()
680 Ids::WAXED_CUT_COPPER,
681 Ids::EXPOSED_CUT_COPPER,
682 Ids::WAXED_EXPOSED_CUT_COPPER,
683 Ids::WEATHERED_CUT_COPPER,
684 Ids::WAXED_WEATHERED_CUT_COPPER,
685 Ids::OXIDIZED_CUT_COPPER,
686 Ids::WAXED_OXIDIZED_CUT_COPPER,
687 fn(Reader $in) => Blocks::CUT_COPPER()
690 Ids::CUT_COPPER_STAIRS,
691 Ids::WAXED_CUT_COPPER_STAIRS,
692 Ids::EXPOSED_CUT_COPPER_STAIRS,
693 Ids::WAXED_EXPOSED_CUT_COPPER_STAIRS,
694 Ids::WEATHERED_CUT_COPPER_STAIRS,
695 Ids::WAXED_WEATHERED_CUT_COPPER_STAIRS,
696 Ids::OXIDIZED_CUT_COPPER_STAIRS,
697 Ids::WAXED_OXIDIZED_CUT_COPPER_STAIRS,
698 fn(Reader $in) => Helper::decodeStairs(Blocks::CUT_COPPER_STAIRS(), $in)
702 private function registerSimpleDeserializers() : void{
703 $this->mapSimple(Ids::AIR, fn() => Blocks::AIR());
704 $this->mapSimple(Ids::AMETHYST_BLOCK, fn() => Blocks::AMETHYST());
705 $this->mapSimple(Ids::ANCIENT_DEBRIS, fn() => Blocks::ANCIENT_DEBRIS());
706 $this->mapSimple(Ids::ANDESITE, fn() => Blocks::ANDESITE());
707 $this->mapSimple(Ids::BARRIER, fn() => Blocks::BARRIER());
708 $this->mapSimple(Ids::BEACON, fn() => Blocks::BEACON());
709 $this->mapSimple(Ids::BLACKSTONE, fn() => Blocks::BLACKSTONE());
710 $this->mapSimple(Ids::BLUE_ICE, fn() => Blocks::BLUE_ICE());
711 $this->mapSimple(Ids::BOOKSHELF, fn() => Blocks::BOOKSHELF());
712 $this->mapSimple(Ids::BRICK_BLOCK, fn() => Blocks::BRICKS());
713 $this->mapSimple(Ids::BROWN_MUSHROOM, fn() => Blocks::BROWN_MUSHROOM());
714 $this->mapSimple(Ids::BUDDING_AMETHYST, fn() => Blocks::BUDDING_AMETHYST());
715 $this->mapSimple(Ids::CALCITE, fn() => Blocks::CALCITE());
716 $this->mapSimple(Ids::CARTOGRAPHY_TABLE, fn() => Blocks::CARTOGRAPHY_TABLE());
717 $this->mapSimple(Ids::CHEMICAL_HEAT, fn() => Blocks::CHEMICAL_HEAT());
718 $this->mapSimple(Ids::CHISELED_DEEPSLATE, fn() => Blocks::CHISELED_DEEPSLATE());
719 $this->mapSimple(Ids::CHISELED_NETHER_BRICKS, fn() => Blocks::CHISELED_NETHER_BRICKS());
720 $this->mapSimple(Ids::CHISELED_POLISHED_BLACKSTONE, fn() => Blocks::CHISELED_POLISHED_BLACKSTONE());
721 $this->mapSimple(Ids::CHISELED_RED_SANDSTONE, fn() => Blocks::CHISELED_RED_SANDSTONE());
722 $this->mapSimple(Ids::CHISELED_RESIN_BRICKS, fn() => Blocks::CHISELED_RESIN_BRICKS());
723 $this->mapSimple(Ids::CHISELED_SANDSTONE, fn() => Blocks::CHISELED_SANDSTONE());
724 $this->mapSimple(Ids::CHISELED_STONE_BRICKS, fn() => Blocks::CHISELED_STONE_BRICKS());
725 $this->mapSimple(Ids::CHISELED_TUFF, fn() => Blocks::CHISELED_TUFF());
726 $this->mapSimple(Ids::CHISELED_TUFF_BRICKS, fn() => Blocks::CHISELED_TUFF_BRICKS());
727 $this->mapSimple(Ids::CHORUS_PLANT, fn() => Blocks::CHORUS_PLANT());
728 $this->mapSimple(Ids::CLAY, fn() => Blocks::CLAY());
729 $this->mapSimple(Ids::COAL_BLOCK, fn() => Blocks::COAL());
730 $this->mapSimple(Ids::COAL_ORE, fn() => Blocks::COAL_ORE());
731 $this->mapSimple(Ids::COBBLED_DEEPSLATE, fn() => Blocks::COBBLED_DEEPSLATE());
732 $this->mapSimple(Ids::COBBLESTONE, fn() => Blocks::COBBLESTONE());
733 $this->mapSimple(Ids::COPPER_ORE, fn() => Blocks::COPPER_ORE());
734 $this->mapSimple(Ids::CRACKED_DEEPSLATE_BRICKS, fn() => Blocks::CRACKED_DEEPSLATE_BRICKS());
735 $this->mapSimple(Ids::CRACKED_DEEPSLATE_TILES, fn() => Blocks::CRACKED_DEEPSLATE_TILES());
736 $this->mapSimple(Ids::CRACKED_NETHER_BRICKS, fn() => Blocks::CRACKED_NETHER_BRICKS());
737 $this->mapSimple(Ids::CRACKED_POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS());
738 $this->mapSimple(Ids::CRACKED_STONE_BRICKS, fn() => Blocks::CRACKED_STONE_BRICKS());
739 $this->mapSimple(Ids::CRAFTING_TABLE, fn() => Blocks::CRAFTING_TABLE());
740 $this->mapSimple(Ids::CRIMSON_ROOTS, fn() => Blocks::CRIMSON_ROOTS());
741 $this->mapSimple(Ids::CRYING_OBSIDIAN, fn() => Blocks::CRYING_OBSIDIAN());
742 $this->mapSimple(Ids::CUT_RED_SANDSTONE, fn() => Blocks::CUT_RED_SANDSTONE());
743 $this->mapSimple(Ids::CUT_SANDSTONE, fn() => Blocks::CUT_SANDSTONE());
744 $this->mapSimple(Ids::DARK_PRISMARINE, fn() => Blocks::DARK_PRISMARINE());
745 $this->mapSimple(Ids::DEADBUSH, fn() => Blocks::DEAD_BUSH());
746 $this->mapSimple(Ids::DEEPSLATE_BRICKS, fn() => Blocks::DEEPSLATE_BRICKS());
747 $this->mapSimple(Ids::DEEPSLATE_COAL_ORE, fn() => Blocks::DEEPSLATE_COAL_ORE());
748 $this->mapSimple(Ids::DEEPSLATE_COPPER_ORE, fn() => Blocks::DEEPSLATE_COPPER_ORE());
749 $this->mapSimple(Ids::DEEPSLATE_DIAMOND_ORE, fn() => Blocks::DEEPSLATE_DIAMOND_ORE());
750 $this->mapSimple(Ids::DEEPSLATE_EMERALD_ORE, fn() => Blocks::DEEPSLATE_EMERALD_ORE());
751 $this->mapSimple(Ids::DEEPSLATE_GOLD_ORE, fn() => Blocks::DEEPSLATE_GOLD_ORE());
752 $this->mapSimple(Ids::DEEPSLATE_IRON_ORE, fn() => Blocks::DEEPSLATE_IRON_ORE());
753 $this->mapSimple(Ids::DEEPSLATE_LAPIS_ORE, fn() => Blocks::DEEPSLATE_LAPIS_LAZULI_ORE());
754 $this->mapSimple(Ids::DEEPSLATE_TILES, fn() => Blocks::DEEPSLATE_TILES());
755 $this->mapSimple(Ids::DIAMOND_BLOCK, fn() => Blocks::DIAMOND());
756 $this->mapSimple(Ids::DIAMOND_ORE, fn() => Blocks::DIAMOND_ORE());
757 $this->mapSimple(Ids::DIORITE, fn() => Blocks::DIORITE());
758 $this->mapSimple(Ids::DRAGON_EGG, fn() => Blocks::DRAGON_EGG());
759 $this->mapSimple(Ids::DRIED_KELP_BLOCK, fn() => Blocks::DRIED_KELP());
760 $this->mapSimple(Ids::ELEMENT_0, fn() => Blocks::ELEMENT_ZERO());
761 $this->mapSimple(Ids::ELEMENT_1, fn() => Blocks::ELEMENT_HYDROGEN());
762 $this->mapSimple(Ids::ELEMENT_10, fn() => Blocks::ELEMENT_NEON());
763 $this->mapSimple(Ids::ELEMENT_100, fn() => Blocks::ELEMENT_FERMIUM());
764 $this->mapSimple(Ids::ELEMENT_101, fn() => Blocks::ELEMENT_MENDELEVIUM());
765 $this->mapSimple(Ids::ELEMENT_102, fn() => Blocks::ELEMENT_NOBELIUM());
766 $this->mapSimple(Ids::ELEMENT_103, fn() => Blocks::ELEMENT_LAWRENCIUM());
767 $this->mapSimple(Ids::ELEMENT_104, fn() => Blocks::ELEMENT_RUTHERFORDIUM());
768 $this->mapSimple(Ids::ELEMENT_105, fn() => Blocks::ELEMENT_DUBNIUM());
769 $this->mapSimple(Ids::ELEMENT_106, fn() => Blocks::ELEMENT_SEABORGIUM());
770 $this->mapSimple(Ids::ELEMENT_107, fn() => Blocks::ELEMENT_BOHRIUM());
771 $this->mapSimple(Ids::ELEMENT_108, fn() => Blocks::ELEMENT_HASSIUM());
772 $this->mapSimple(Ids::ELEMENT_109, fn() => Blocks::ELEMENT_MEITNERIUM());
773 $this->mapSimple(Ids::ELEMENT_11, fn() => Blocks::ELEMENT_SODIUM());
774 $this->mapSimple(Ids::ELEMENT_110, fn() => Blocks::ELEMENT_DARMSTADTIUM());
775 $this->mapSimple(Ids::ELEMENT_111, fn() => Blocks::ELEMENT_ROENTGENIUM());
776 $this->mapSimple(Ids::ELEMENT_112, fn() => Blocks::ELEMENT_COPERNICIUM());
777 $this->mapSimple(Ids::ELEMENT_113, fn() => Blocks::ELEMENT_NIHONIUM());
778 $this->mapSimple(Ids::ELEMENT_114, fn() => Blocks::ELEMENT_FLEROVIUM());
779 $this->mapSimple(Ids::ELEMENT_115, fn() => Blocks::ELEMENT_MOSCOVIUM());
780 $this->mapSimple(Ids::ELEMENT_116, fn() => Blocks::ELEMENT_LIVERMORIUM());
781 $this->mapSimple(Ids::ELEMENT_117, fn() => Blocks::ELEMENT_TENNESSINE());
782 $this->mapSimple(Ids::ELEMENT_118, fn() => Blocks::ELEMENT_OGANESSON());
783 $this->mapSimple(Ids::ELEMENT_12, fn() => Blocks::ELEMENT_MAGNESIUM());
784 $this->mapSimple(Ids::ELEMENT_13, fn() => Blocks::ELEMENT_ALUMINUM());
785 $this->mapSimple(Ids::ELEMENT_14, fn() => Blocks::ELEMENT_SILICON());
786 $this->mapSimple(Ids::ELEMENT_15, fn() => Blocks::ELEMENT_PHOSPHORUS());
787 $this->mapSimple(Ids::ELEMENT_16, fn() => Blocks::ELEMENT_SULFUR());
788 $this->mapSimple(Ids::ELEMENT_17, fn() => Blocks::ELEMENT_CHLORINE());
789 $this->mapSimple(Ids::ELEMENT_18, fn() => Blocks::ELEMENT_ARGON());
790 $this->mapSimple(Ids::ELEMENT_19, fn() => Blocks::ELEMENT_POTASSIUM());
791 $this->mapSimple(Ids::ELEMENT_2, fn() => Blocks::ELEMENT_HELIUM());
792 $this->mapSimple(Ids::ELEMENT_20, fn() => Blocks::ELEMENT_CALCIUM());
793 $this->mapSimple(Ids::ELEMENT_21, fn() => Blocks::ELEMENT_SCANDIUM());
794 $this->mapSimple(Ids::ELEMENT_22, fn() => Blocks::ELEMENT_TITANIUM());
795 $this->mapSimple(Ids::ELEMENT_23, fn() => Blocks::ELEMENT_VANADIUM());
796 $this->mapSimple(Ids::ELEMENT_24, fn() => Blocks::ELEMENT_CHROMIUM());
797 $this->mapSimple(Ids::ELEMENT_25, fn() => Blocks::ELEMENT_MANGANESE());
798 $this->mapSimple(Ids::ELEMENT_26, fn() => Blocks::ELEMENT_IRON());
799 $this->mapSimple(Ids::ELEMENT_27, fn() => Blocks::ELEMENT_COBALT());
800 $this->mapSimple(Ids::ELEMENT_28, fn() => Blocks::ELEMENT_NICKEL());
801 $this->mapSimple(Ids::ELEMENT_29, fn() => Blocks::ELEMENT_COPPER());
802 $this->mapSimple(Ids::ELEMENT_3, fn() => Blocks::ELEMENT_LITHIUM());
803 $this->mapSimple(Ids::ELEMENT_30, fn() => Blocks::ELEMENT_ZINC());
804 $this->mapSimple(Ids::ELEMENT_31, fn() => Blocks::ELEMENT_GALLIUM());
805 $this->mapSimple(Ids::ELEMENT_32, fn() => Blocks::ELEMENT_GERMANIUM());
806 $this->mapSimple(Ids::ELEMENT_33, fn() => Blocks::ELEMENT_ARSENIC());
807 $this->mapSimple(Ids::ELEMENT_34, fn() => Blocks::ELEMENT_SELENIUM());
808 $this->mapSimple(Ids::ELEMENT_35, fn() => Blocks::ELEMENT_BROMINE());
809 $this->mapSimple(Ids::ELEMENT_36, fn() => Blocks::ELEMENT_KRYPTON());
810 $this->mapSimple(Ids::ELEMENT_37, fn() => Blocks::ELEMENT_RUBIDIUM());
811 $this->mapSimple(Ids::ELEMENT_38, fn() => Blocks::ELEMENT_STRONTIUM());
812 $this->mapSimple(Ids::ELEMENT_39, fn() => Blocks::ELEMENT_YTTRIUM());
813 $this->mapSimple(Ids::ELEMENT_4, fn() => Blocks::ELEMENT_BERYLLIUM());
814 $this->mapSimple(Ids::ELEMENT_40, fn() => Blocks::ELEMENT_ZIRCONIUM());
815 $this->mapSimple(Ids::ELEMENT_41, fn() => Blocks::ELEMENT_NIOBIUM());
816 $this->mapSimple(Ids::ELEMENT_42, fn() => Blocks::ELEMENT_MOLYBDENUM());
817 $this->mapSimple(Ids::ELEMENT_43, fn() => Blocks::ELEMENT_TECHNETIUM());
818 $this->mapSimple(Ids::ELEMENT_44, fn() => Blocks::ELEMENT_RUTHENIUM());
819 $this->mapSimple(Ids::ELEMENT_45, fn() => Blocks::ELEMENT_RHODIUM());
820 $this->mapSimple(Ids::ELEMENT_46, fn() => Blocks::ELEMENT_PALLADIUM());
821 $this->mapSimple(Ids::ELEMENT_47, fn() => Blocks::ELEMENT_SILVER());
822 $this->mapSimple(Ids::ELEMENT_48, fn() => Blocks::ELEMENT_CADMIUM());
823 $this->mapSimple(Ids::ELEMENT_49, fn() => Blocks::ELEMENT_INDIUM());
824 $this->mapSimple(Ids::ELEMENT_5, fn() => Blocks::ELEMENT_BORON());
825 $this->mapSimple(Ids::ELEMENT_50, fn() => Blocks::ELEMENT_TIN());
826 $this->mapSimple(Ids::ELEMENT_51, fn() => Blocks::ELEMENT_ANTIMONY());
827 $this->mapSimple(Ids::ELEMENT_52, fn() => Blocks::ELEMENT_TELLURIUM());
828 $this->mapSimple(Ids::ELEMENT_53, fn() => Blocks::ELEMENT_IODINE());
829 $this->mapSimple(Ids::ELEMENT_54, fn() => Blocks::ELEMENT_XENON());
830 $this->mapSimple(Ids::ELEMENT_55, fn() => Blocks::ELEMENT_CESIUM());
831 $this->mapSimple(Ids::ELEMENT_56, fn() => Blocks::ELEMENT_BARIUM());
832 $this->mapSimple(Ids::ELEMENT_57, fn() => Blocks::ELEMENT_LANTHANUM());
833 $this->mapSimple(Ids::ELEMENT_58, fn() => Blocks::ELEMENT_CERIUM());
834 $this->mapSimple(Ids::ELEMENT_59, fn() => Blocks::ELEMENT_PRASEODYMIUM());
835 $this->mapSimple(Ids::ELEMENT_6, fn() => Blocks::ELEMENT_CARBON());
836 $this->mapSimple(Ids::ELEMENT_60, fn() => Blocks::ELEMENT_NEODYMIUM());
837 $this->mapSimple(Ids::ELEMENT_61, fn() => Blocks::ELEMENT_PROMETHIUM());
838 $this->mapSimple(Ids::ELEMENT_62, fn() => Blocks::ELEMENT_SAMARIUM());
839 $this->mapSimple(Ids::ELEMENT_63, fn() => Blocks::ELEMENT_EUROPIUM());
840 $this->mapSimple(Ids::ELEMENT_64, fn() => Blocks::ELEMENT_GADOLINIUM());
841 $this->mapSimple(Ids::ELEMENT_65, fn() => Blocks::ELEMENT_TERBIUM());
842 $this->mapSimple(Ids::ELEMENT_66, fn() => Blocks::ELEMENT_DYSPROSIUM());
843 $this->mapSimple(Ids::ELEMENT_67, fn() => Blocks::ELEMENT_HOLMIUM());
844 $this->mapSimple(Ids::ELEMENT_68, fn() => Blocks::ELEMENT_ERBIUM());
845 $this->mapSimple(Ids::ELEMENT_69, fn() => Blocks::ELEMENT_THULIUM());
846 $this->mapSimple(Ids::ELEMENT_7, fn() => Blocks::ELEMENT_NITROGEN());
847 $this->mapSimple(Ids::ELEMENT_70, fn() => Blocks::ELEMENT_YTTERBIUM());
848 $this->mapSimple(Ids::ELEMENT_71, fn() => Blocks::ELEMENT_LUTETIUM());
849 $this->mapSimple(Ids::ELEMENT_72, fn() => Blocks::ELEMENT_HAFNIUM());
850 $this->mapSimple(Ids::ELEMENT_73, fn() => Blocks::ELEMENT_TANTALUM());
851 $this->mapSimple(Ids::ELEMENT_74, fn() => Blocks::ELEMENT_TUNGSTEN());
852 $this->mapSimple(Ids::ELEMENT_75, fn() => Blocks::ELEMENT_RHENIUM());
853 $this->mapSimple(Ids::ELEMENT_76, fn() => Blocks::ELEMENT_OSMIUM());
854 $this->mapSimple(Ids::ELEMENT_77, fn() => Blocks::ELEMENT_IRIDIUM());
855 $this->mapSimple(Ids::ELEMENT_78, fn() => Blocks::ELEMENT_PLATINUM());
856 $this->mapSimple(Ids::ELEMENT_79, fn() => Blocks::ELEMENT_GOLD());
857 $this->mapSimple(Ids::ELEMENT_8, fn() => Blocks::ELEMENT_OXYGEN());
858 $this->mapSimple(Ids::ELEMENT_80, fn() => Blocks::ELEMENT_MERCURY());
859 $this->mapSimple(Ids::ELEMENT_81, fn() => Blocks::ELEMENT_THALLIUM());
860 $this->mapSimple(Ids::ELEMENT_82, fn() => Blocks::ELEMENT_LEAD());
861 $this->mapSimple(Ids::ELEMENT_83, fn() => Blocks::ELEMENT_BISMUTH());
862 $this->mapSimple(Ids::ELEMENT_84, fn() => Blocks::ELEMENT_POLONIUM());
863 $this->mapSimple(Ids::ELEMENT_85, fn() => Blocks::ELEMENT_ASTATINE());
864 $this->mapSimple(Ids::ELEMENT_86, fn() => Blocks::ELEMENT_RADON());
865 $this->mapSimple(Ids::ELEMENT_87, fn() => Blocks::ELEMENT_FRANCIUM());
866 $this->mapSimple(Ids::ELEMENT_88, fn() => Blocks::ELEMENT_RADIUM());
867 $this->mapSimple(Ids::ELEMENT_89, fn() => Blocks::ELEMENT_ACTINIUM());
868 $this->mapSimple(Ids::ELEMENT_9, fn() => Blocks::ELEMENT_FLUORINE());
869 $this->mapSimple(Ids::ELEMENT_90, fn() => Blocks::ELEMENT_THORIUM());
870 $this->mapSimple(Ids::ELEMENT_91, fn() => Blocks::ELEMENT_PROTACTINIUM());
871 $this->mapSimple(Ids::ELEMENT_92, fn() => Blocks::ELEMENT_URANIUM());
872 $this->mapSimple(Ids::ELEMENT_93, fn() => Blocks::ELEMENT_NEPTUNIUM());
873 $this->mapSimple(Ids::ELEMENT_94, fn() => Blocks::ELEMENT_PLUTONIUM());
874 $this->mapSimple(Ids::ELEMENT_95, fn() => Blocks::ELEMENT_AMERICIUM());
875 $this->mapSimple(Ids::ELEMENT_96, fn() => Blocks::ELEMENT_CURIUM());
876 $this->mapSimple(Ids::ELEMENT_97, fn() => Blocks::ELEMENT_BERKELIUM());
877 $this->mapSimple(Ids::ELEMENT_98, fn() => Blocks::ELEMENT_CALIFORNIUM());
878 $this->mapSimple(Ids::ELEMENT_99, fn() => Blocks::ELEMENT_EINSTEINIUM());
879 $this->mapSimple(Ids::EMERALD_BLOCK, fn() => Blocks::EMERALD());
880 $this->mapSimple(Ids::EMERALD_ORE, fn() => Blocks::EMERALD_ORE());
881 $this->mapSimple(Ids::ENCHANTING_TABLE, fn() => Blocks::ENCHANTING_TABLE());
882 $this->mapSimple(Ids::END_BRICKS, fn() => Blocks::END_STONE_BRICKS());
883 $this->mapSimple(Ids::END_STONE, fn() => Blocks::END_STONE());
884 $this->mapSimple(Ids::FERN, fn() => Blocks::FERN());
885 $this->mapSimple(Ids::FLETCHING_TABLE, fn() => Blocks::FLETCHING_TABLE());
886 $this->mapSimple(Ids::GILDED_BLACKSTONE, fn() => Blocks::GILDED_BLACKSTONE());
887 $this->mapSimple(Ids::GLASS, fn() => Blocks::GLASS());
888 $this->mapSimple(Ids::GLASS_PANE, fn() => Blocks::GLASS_PANE());
889 $this->mapSimple(Ids::GLOWINGOBSIDIAN, fn() => Blocks::GLOWING_OBSIDIAN());
890 $this->mapSimple(Ids::GLOWSTONE, fn() => Blocks::GLOWSTONE());
891 $this->mapSimple(Ids::GOLD_BLOCK, fn() => Blocks::GOLD());
892 $this->mapSimple(Ids::GOLD_ORE, fn() => Blocks::GOLD_ORE());
893 $this->mapSimple(Ids::GRANITE, fn() => Blocks::GRANITE());
894 $this->mapSimple(Ids::GRASS_BLOCK, fn() => Blocks::GRASS());
895 $this->mapSimple(Ids::GRASS_PATH, fn() => Blocks::GRASS_PATH());
896 $this->mapSimple(Ids::GRAVEL, fn() => Blocks::GRAVEL());
897 $this->mapSimple(Ids::HANGING_ROOTS, fn() => Blocks::HANGING_ROOTS());
898 $this->mapSimple(Ids::HARD_GLASS, fn() => Blocks::HARDENED_GLASS());
899 $this->mapSimple(Ids::HARD_GLASS_PANE, fn() => Blocks::HARDENED_GLASS_PANE());
900 $this->mapSimple(Ids::HARDENED_CLAY, fn() => Blocks::HARDENED_CLAY());
901 $this->mapSimple(Ids::HONEYCOMB_BLOCK, fn() => Blocks::HONEYCOMB());
902 $this->mapSimple(Ids::ICE, fn() => Blocks::ICE());
903 $this->mapSimple(Ids::INFESTED_CHISELED_STONE_BRICKS, fn() => Blocks::INFESTED_CHISELED_STONE_BRICK());
904 $this->mapSimple(Ids::INFESTED_COBBLESTONE, fn() => Blocks::INFESTED_COBBLESTONE());
905 $this->mapSimple(Ids::INFESTED_CRACKED_STONE_BRICKS, fn() => Blocks::INFESTED_CRACKED_STONE_BRICK());
906 $this->mapSimple(Ids::INFESTED_MOSSY_STONE_BRICKS, fn() => Blocks::INFESTED_MOSSY_STONE_BRICK());
907 $this->mapSimple(Ids::INFESTED_STONE, fn() => Blocks::INFESTED_STONE());
908 $this->mapSimple(Ids::INFESTED_STONE_BRICKS, fn() => Blocks::INFESTED_STONE_BRICK());
909 $this->mapSimple(Ids::INFO_UPDATE, fn() => Blocks::INFO_UPDATE());
910 $this->mapSimple(Ids::INFO_UPDATE2, fn() => Blocks::INFO_UPDATE2());
911 $this->mapSimple(Ids::INVISIBLE_BEDROCK, fn() => Blocks::INVISIBLE_BEDROCK());
912 $this->mapSimple(Ids::IRON_BARS, fn() => Blocks::IRON_BARS());
913 $this->mapSimple(Ids::IRON_BLOCK, fn() => Blocks::IRON());
914 $this->mapSimple(Ids::IRON_ORE, fn() => Blocks::IRON_ORE());
915 $this->mapSimple(Ids::JUKEBOX, fn() => Blocks::JUKEBOX());
916 $this->mapSimple(Ids::LAPIS_BLOCK, fn() => Blocks::LAPIS_LAZULI());
917 $this->mapSimple(Ids::LAPIS_ORE, fn() => Blocks::LAPIS_LAZULI_ORE());
918 $this->mapSimple(Ids::MAGMA, fn() => Blocks::MAGMA());
919 $this->mapSimple(Ids::MANGROVE_ROOTS, fn() => Blocks::MANGROVE_ROOTS());
920 $this->mapSimple(Ids::MELON_BLOCK, fn() => Blocks::MELON());
921 $this->mapSimple(Ids::MOB_SPAWNER, fn() => Blocks::MONSTER_SPAWNER());
922 $this->mapSimple(Ids::MOSSY_COBBLESTONE, fn() => Blocks::MOSSY_COBBLESTONE());
923 $this->mapSimple(Ids::MOSSY_STONE_BRICKS, fn() => Blocks::MOSSY_STONE_BRICKS());
924 $this->mapSimple(Ids::MUD, fn() => Blocks::MUD());
925 $this->mapSimple(Ids::MUD_BRICKS, fn() => Blocks::MUD_BRICKS());
926 $this->mapSimple(Ids::MYCELIUM, fn() => Blocks::MYCELIUM());
927 $this->mapSimple(Ids::NETHER_BRICK, fn() => Blocks::NETHER_BRICKS());
928 $this->mapSimple(Ids::NETHER_BRICK_FENCE, fn() => Blocks::NETHER_BRICK_FENCE());
929 $this->mapSimple(Ids::NETHER_GOLD_ORE, fn() => Blocks::NETHER_GOLD_ORE());
930 $this->mapSimple(Ids::NETHER_WART_BLOCK, fn() => Blocks::NETHER_WART_BLOCK());
931 $this->mapSimple(Ids::NETHERITE_BLOCK, fn() => Blocks::NETHERITE());
932 $this->mapSimple(Ids::NETHERRACK, fn() => Blocks::NETHERRACK());
933 $this->mapSimple(Ids::NETHERREACTOR, fn() => Blocks::NETHER_REACTOR_CORE());
934 $this->mapSimple(Ids::NOTEBLOCK, fn() => Blocks::NOTE_BLOCK());
935 $this->mapSimple(Ids::OBSIDIAN, fn() => Blocks::OBSIDIAN());
936 $this->mapSimple(Ids::PACKED_ICE, fn() => Blocks::PACKED_ICE());
937 $this->mapSimple(Ids::PACKED_MUD, fn() => Blocks::PACKED_MUD());
938 $this->mapSimple(Ids::PODZOL, fn() => Blocks::PODZOL());
939 $this->mapSimple(Ids::POLISHED_ANDESITE, fn() => Blocks::POLISHED_ANDESITE());
940 $this->mapSimple(Ids::POLISHED_BLACKSTONE, fn() => Blocks::POLISHED_BLACKSTONE());
941 $this->mapSimple(Ids::POLISHED_BLACKSTONE_BRICKS, fn() => Blocks::POLISHED_BLACKSTONE_BRICKS());
942 $this->mapSimple(Ids::POLISHED_DEEPSLATE, fn() => Blocks::POLISHED_DEEPSLATE());
943 $this->mapSimple(Ids::POLISHED_DIORITE, fn() => Blocks::POLISHED_DIORITE());
944 $this->mapSimple(Ids::POLISHED_GRANITE, fn() => Blocks::POLISHED_GRANITE());
945 $this->mapSimple(Ids::POLISHED_TUFF, fn() => Blocks::POLISHED_TUFF());
946 $this->mapSimple(Ids::PRISMARINE, fn() => Blocks::PRISMARINE());
947 $this->mapSimple(Ids::PRISMARINE_BRICKS, fn() => Blocks::PRISMARINE_BRICKS());
948 $this->mapSimple(Ids::QUARTZ_BRICKS, fn() => Blocks::QUARTZ_BRICKS());
949 $this->mapSimple(Ids::QUARTZ_ORE, fn() => Blocks::NETHER_QUARTZ_ORE());
950 $this->mapSimple(Ids::RAW_COPPER_BLOCK, fn() => Blocks::RAW_COPPER());
951 $this->mapSimple(Ids::RAW_GOLD_BLOCK, fn() => Blocks::RAW_GOLD());
952 $this->mapSimple(Ids::RAW_IRON_BLOCK, fn() => Blocks::RAW_IRON());
953 $this->mapSimple(Ids::RED_MUSHROOM, fn() => Blocks::RED_MUSHROOM());
954 $this->mapSimple(Ids::RED_NETHER_BRICK, fn() => Blocks::RED_NETHER_BRICKS());
955 $this->mapSimple(Ids::RED_SAND, fn() => Blocks::RED_SAND());
956 $this->mapSimple(Ids::RED_SANDSTONE, fn() => Blocks::RED_SANDSTONE());
957 $this->mapSimple(Ids::REDSTONE_BLOCK, fn() => Blocks::REDSTONE());
958 $this->mapSimple(Ids::REINFORCED_DEEPSLATE, fn() => Blocks::REINFORCED_DEEPSLATE());
959 $this->mapSimple(Ids::RESERVED6, fn() => Blocks::RESERVED6());
960 $this->mapSimple(Ids::RESIN_BLOCK, fn() => Blocks::RESIN());
961 $this->mapSimple(Ids::RESIN_BRICKS, fn() => Blocks::RESIN_BRICKS());
962 $this->mapSimple(Ids::SAND, fn() => Blocks::SAND());
963 $this->mapSimple(Ids::SANDSTONE, fn() => Blocks::SANDSTONE());
964 $this->mapSimple(Ids::SCULK, fn() => Blocks::SCULK());
965 $this->mapSimple(Ids::SEA_LANTERN, fn() => Blocks::SEA_LANTERN());
966 $this->mapSimple(Ids::SHORT_GRASS, fn() => Blocks::TALL_GRASS());
967 $this->mapSimple(Ids::SHROOMLIGHT, fn() => Blocks::SHROOMLIGHT());
968 $this->mapSimple(Ids::SLIME, fn() => Blocks::SLIME());
969 $this->mapSimple(Ids::SMITHING_TABLE, fn() => Blocks::SMITHING_TABLE());
970 $this->mapSimple(Ids::SMOOTH_BASALT, fn() => Blocks::SMOOTH_BASALT());
971 $this->mapSimple(Ids::SMOOTH_RED_SANDSTONE, fn() => Blocks::SMOOTH_RED_SANDSTONE());
972 $this->mapSimple(Ids::SMOOTH_SANDSTONE, fn() => Blocks::SMOOTH_SANDSTONE());
973 $this->mapSimple(Ids::SMOOTH_STONE, fn() => Blocks::SMOOTH_STONE());
974 $this->mapSimple(Ids::SNOW, fn() => Blocks::SNOW());
975 $this->mapSimple(Ids::SOUL_SAND, fn() => Blocks::SOUL_SAND());
976 $this->mapSimple(Ids::SOUL_SOIL, fn() => Blocks::SOUL_SOIL());
977 $this->mapSimple(Ids::SPORE_BLOSSOM, fn() => Blocks::SPORE_BLOSSOM());
978 $this->mapSimple(Ids::SPONGE, fn() => Blocks::SPONGE());
979 $this->mapSimple(Ids::STONE, fn() => Blocks::STONE());
980 $this->mapSimple(Ids::STONECUTTER, fn() => Blocks::LEGACY_STONECUTTER());
981 $this->mapSimple(Ids::STONE_BRICKS, fn() => Blocks::STONE_BRICKS());
982 $this->mapSimple(Ids::TINTED_GLASS, fn() => Blocks::TINTED_GLASS());
983 $this->mapSimple(Ids::TORCHFLOWER, fn() => Blocks::TORCHFLOWER());
984 $this->mapSimple(Ids::TUFF, fn() => Blocks::TUFF());
985 $this->mapSimple(Ids::TUFF_BRICKS, fn() => Blocks::TUFF_BRICKS());
986 $this->mapSimple(Ids::UNDYED_SHULKER_BOX, fn() => Blocks::SHULKER_BOX());
987 $this->mapSimple(Ids::WARPED_WART_BLOCK, fn() => Blocks::WARPED_WART_BLOCK());
988 $this->mapSimple(Ids::WARPED_ROOTS, fn() => Blocks::WARPED_ROOTS());
989 $this->mapSimple(Ids::WATERLILY, fn() => Blocks::LILY_PAD());
990 $this->mapSimple(Ids::WEB, fn() => Blocks::COBWEB());
991 $this->mapSimple(Ids::WET_SPONGE, fn() => Blocks::SPONGE()->setWet(
true));
992 $this->mapSimple(Ids::WITHER_ROSE, fn() => Blocks::WITHER_ROSE());
993 $this->mapSimple(Ids::DANDELION, fn() => Blocks::DANDELION());
995 $this->mapSimple(Ids::ALLIUM, fn() => Blocks::ALLIUM());
996 $this->mapSimple(Ids::CORNFLOWER, fn() => Blocks::CORNFLOWER());
997 $this->mapSimple(Ids::AZURE_BLUET, fn() => Blocks::AZURE_BLUET());
998 $this->mapSimple(Ids::LILY_OF_THE_VALLEY, fn() => Blocks::LILY_OF_THE_VALLEY());
999 $this->mapSimple(Ids::BLUE_ORCHID, fn() => Blocks::BLUE_ORCHID());
1000 $this->mapSimple(Ids::OXEYE_DAISY, fn() => Blocks::OXEYE_DAISY());
1001 $this->mapSimple(Ids::POPPY, fn() => Blocks::POPPY());
1002 $this->mapSimple(Ids::ORANGE_TULIP, fn() => Blocks::ORANGE_TULIP());
1003 $this->mapSimple(Ids::PINK_TULIP, fn() => Blocks::PINK_TULIP());
1004 $this->mapSimple(Ids::RED_TULIP, fn() => Blocks::RED_TULIP());
1005 $this->mapSimple(Ids::WHITE_TULIP, fn() => Blocks::WHITE_TULIP());
1008 private function registerDeserializers() : void{
1009 $this->map(Ids::ACTIVATOR_RAIL, function(Reader $in) : Block{
1010 return Blocks::ACTIVATOR_RAIL()
1011 ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT))
1012 ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5));
1014 $this->map(Ids::AMETHYST_CLUSTER,
function(Reader $in) : Block{
1015 return Blocks::AMETHYST_CLUSTER()
1016 ->setStage(AmethystCluster::STAGE_CLUSTER)
1017 ->setFacing($in->readBlockFace());
1019 $this->mapSlab(Ids::ANDESITE_SLAB, Ids::ANDESITE_DOUBLE_SLAB, fn() => Blocks::ANDESITE_SLAB());
1020 $this->mapStairs(Ids::ANDESITE_STAIRS, fn() => Blocks::ANDESITE_STAIRS());
1021 $this->map(Ids::ANDESITE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::ANDESITE_WALL(), $in));
1022 $this->map(Ids::ANVIL,
function(Reader $in) : Block{
1023 return Blocks::ANVIL()
1024 ->setDamage(Anvil::UNDAMAGED)
1025 ->setFacing($in->readCardinalHorizontalFacing());
1027 $this->map(Ids::CHIPPED_ANVIL,
function(Reader $in) : Block{
1028 return Blocks::ANVIL()
1029 ->setDamage(Anvil::SLIGHTLY_DAMAGED)
1030 ->setFacing($in->readCardinalHorizontalFacing());
1032 $this->map(Ids::DAMAGED_ANVIL,
function(Reader $in) : Block{
1033 return Blocks::ANVIL()
1034 ->setDamage(Anvil::VERY_DAMAGED)
1035 ->setFacing($in->readCardinalHorizontalFacing());
1037 $this->map(Ids::BAMBOO,
function(Reader $in) : Block{
1038 return Blocks::BAMBOO()
1039 ->setLeafSize(match($value = $in->readString(StateNames::BAMBOO_LEAF_SIZE)){
1040 StringValues::BAMBOO_LEAF_SIZE_NO_LEAVES => Bamboo::NO_LEAVES,
1041 StringValues::BAMBOO_LEAF_SIZE_SMALL_LEAVES => Bamboo::SMALL_LEAVES,
1042 StringValues::BAMBOO_LEAF_SIZE_LARGE_LEAVES => Bamboo::LARGE_LEAVES,
1043 default => throw $in->badValueException(StateNames::BAMBOO_LEAF_SIZE, $value),
1045 ->setReady($in->readBool(StateNames::AGE_BIT))
1046 ->setThick(match($value = $in->readString(StateNames::BAMBOO_STALK_THICKNESS)){
1047 StringValues::BAMBOO_STALK_THICKNESS_THIN => false,
1048 StringValues::BAMBOO_STALK_THICKNESS_THICK => true,
1049 default => throw $in->badValueException(StateNames::BAMBOO_STALK_THICKNESS, $value),
1052 $this->map(Ids::BAMBOO_SAPLING,
function(Reader $in) : Block{
1053 return Blocks::BAMBOO_SAPLING()->setReady($in->readBool(StateNames::AGE_BIT));
1055 $this->map(Ids::BARREL,
function(Reader $in) : Block{
1056 return Blocks::BARREL()
1057 ->setFacing($in->readFacingDirection())
1058 ->setOpen($in->readBool(StateNames::OPEN_BIT));
1060 $this->map(Ids::BASALT,
function(Reader $in){
1061 return Blocks::BASALT()
1062 ->setAxis($in->readPillarAxis());
1064 $this->map(Ids::BED,
function(Reader $in) : Block{
1065 return Blocks::BED()
1066 ->setFacing($in->readLegacyHorizontalFacing())
1067 ->setHead($in->readBool(StateNames::HEAD_PIECE_BIT))
1068 ->setOccupied($in->readBool(StateNames::OCCUPIED_BIT));
1070 $this->map(Ids::BEDROCK,
function(Reader $in) : Block{
1071 return Blocks::BEDROCK()
1072 ->setBurnsForever($in->readBool(StateNames::INFINIBURN_BIT));
1074 $this->map(Ids::BEETROOT, fn(Reader $in) => Helper::decodeCrops(Blocks::BEETROOTS(), $in));
1075 $this->map(Ids::BELL,
function(Reader $in) : Block{
1076 $in->ignored(StateNames::TOGGLE_BIT);
1077 return Blocks::BELL()
1078 ->setFacing($in->readLegacyHorizontalFacing())
1079 ->setAttachmentType($in->readBellAttachmentType());
1081 $this->map(Ids::BIG_DRIPLEAF,
function(Reader $in) : Block{
1082 if($in->readBool(StateNames::BIG_DRIPLEAF_HEAD)){
1083 return Blocks::BIG_DRIPLEAF_HEAD()
1084 ->setFacing($in->readCardinalHorizontalFacing())
1085 ->setLeafState(match($type = $in->readString(StateNames::BIG_DRIPLEAF_TILT)){
1086 StringValues::BIG_DRIPLEAF_TILT_NONE => DripleafState::STABLE,
1087 StringValues::BIG_DRIPLEAF_TILT_UNSTABLE => DripleafState::UNSTABLE,
1088 StringValues::BIG_DRIPLEAF_TILT_PARTIAL_TILT => DripleafState::PARTIAL_TILT,
1089 StringValues::BIG_DRIPLEAF_TILT_FULL_TILT => DripleafState::FULL_TILT,
1090 default => throw $in->badValueException(StateNames::BIG_DRIPLEAF_TILT, $type),
1093 $in->ignored(StateNames::BIG_DRIPLEAF_TILT);
1094 return Blocks::BIG_DRIPLEAF_STEM()->setFacing($in->readCardinalHorizontalFacing());
1097 $this->mapSlab(Ids::BLACKSTONE_SLAB, Ids::BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::BLACKSTONE_SLAB());
1098 $this->mapStairs(Ids::BLACKSTONE_STAIRS, fn() => Blocks::BLACKSTONE_STAIRS());
1099 $this->map(Ids::BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BLACKSTONE_WALL(), $in));
1100 $this->map(Ids::BLAST_FURNACE,
function(Reader $in) : Block{
1101 return Blocks::BLAST_FURNACE()
1102 ->setFacing($in->readCardinalHorizontalFacing())
1105 $this->map(Ids::BONE_BLOCK,
function(Reader $in) : Block{
1106 $in->ignored(StateNames::DEPRECATED);
1107 return Blocks::BONE_BLOCK()->setAxis($in->readPillarAxis());
1109 $this->map(Ids::BREWING_STAND,
function(Reader $in) : Block{
1110 return Blocks::BREWING_STAND()
1111 ->setSlot(BrewingStandSlot::EAST, $in->readBool(StateNames::BREWING_STAND_SLOT_A_BIT))
1112 ->setSlot(BrewingStandSlot::SOUTHWEST, $in->readBool(StateNames::BREWING_STAND_SLOT_B_BIT))
1113 ->setSlot(BrewingStandSlot::NORTHWEST, $in->readBool(StateNames::BREWING_STAND_SLOT_C_BIT));
1115 $this->mapSlab(Ids::BRICK_SLAB, Ids::BRICK_DOUBLE_SLAB, fn() => Blocks::BRICK_SLAB());
1116 $this->mapStairs(Ids::BRICK_STAIRS, fn() => Blocks::BRICK_STAIRS());
1117 $this->map(Ids::BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::BRICK_WALL(), $in));
1118 $this->map(Ids::MUSHROOM_STEM, fn(Reader $in) => match($in->readBoundedInt(StateNames::HUGE_MUSHROOM_BITS, 0, 15)){
1119 BlockLegacyMetadata::MUSHROOM_BLOCK_ALL_STEM => Blocks::ALL_SIDED_MUSHROOM_STEM(),
1120 BlockLegacyMetadata::MUSHROOM_BLOCK_STEM => Blocks::MUSHROOM_STEM(),
1121 default => throw new BlockStateDeserializeException(
"This state does not exist"),
1123 $this->map(Ids::BROWN_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::BROWN_MUSHROOM_BLOCK(), $in));
1124 $this->map(Ids::CACTUS,
function(Reader $in) : Block{
1125 return Blocks::CACTUS()
1126 ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15));
1128 $this->map(Ids::CAKE,
function(Reader $in) : Block{
1129 return Blocks::CAKE()
1130 ->setBites($in->readBoundedInt(StateNames::BITE_COUNTER, 0, 6));
1132 $this->map(Ids::CAMPFIRE,
function(Reader $in) : Block{
1133 return Blocks::CAMPFIRE()
1134 ->setFacing($in->readCardinalHorizontalFacing())
1135 ->setLit(!$in->readBool(StateNames::EXTINGUISHED));
1137 $this->map(Ids::CARROTS, fn(Reader $in) => Helper::decodeCrops(Blocks::CARROTS(), $in));
1138 $this->map(Ids::CARVED_PUMPKIN,
function(Reader $in) : Block{
1139 return Blocks::CARVED_PUMPKIN()
1140 ->setFacing($in->readCardinalHorizontalFacing());
1142 $this->map(Ids::CAVE_VINES,
function(Reader $in) : CaveVines{
1143 return Blocks::CAVE_VINES()
1146 ->setAge($in->readBoundedInt(StateNames::GROWING_PLANT_AGE, 0, 25));
1148 $this->map(Ids::CAVE_VINES_BODY_WITH_BERRIES,
function(Reader $in) : CaveVines{
1149 return Blocks::CAVE_VINES()
1152 ->setAge($in->readBoundedInt(StateNames::GROWING_PLANT_AGE, 0, 25));
1154 $this->map(Ids::CAVE_VINES_HEAD_WITH_BERRIES,
function(Reader $in) : CaveVines{
1155 return Blocks::CAVE_VINES()
1158 ->setAge($in->readBoundedInt(StateNames::GROWING_PLANT_AGE, 0, 25));
1160 $this->map(Ids::CHAIN,
function(Reader $in) : Block{
1161 return Blocks::CHAIN()
1162 ->setAxis($in->readPillarAxis());
1164 $this->map(Ids::CHISELED_BOOKSHELF,
function(Reader $in) : Block{
1165 $block = Blocks::CHISELED_BOOKSHELF()
1166 ->setFacing($in->readLegacyHorizontalFacing());
1169 $flags = $in->readBoundedInt(StateNames::BOOKS_STORED, 0, (1 << 6) - 1);
1170 foreach(ChiseledBookshelfSlot::cases() as $slot){
1171 $block->setSlot($slot, ($flags & (1 << $slot->value)) !== 0);
1176 $this->map(Ids::CHISELED_QUARTZ_BLOCK,
function(Reader $in) : Block{
1177 return Blocks::CHISELED_QUARTZ()
1178 ->setAxis($in->readPillarAxis());
1180 $this->map(Ids::CHEST,
function(Reader $in) : Block{
1181 return Blocks::CHEST()
1182 ->setFacing($in->readCardinalHorizontalFacing());
1184 $this->map(Ids::CHORUS_FLOWER,
function(Reader $in) : Block{
1185 return Blocks::CHORUS_FLOWER()
1186 ->setAge($in->readBoundedInt(StateNames::AGE, ChorusFlower::MIN_AGE, ChorusFlower::MAX_AGE));
1188 $this->map(Ids::COARSE_DIRT, fn() => Blocks::DIRT()->setDirtType(DirtType::COARSE));
1189 $this->mapSlab(Ids::COBBLED_DEEPSLATE_SLAB, Ids::COBBLED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::COBBLED_DEEPSLATE_SLAB());
1190 $this->mapStairs(Ids::COBBLED_DEEPSLATE_STAIRS, fn() => Blocks::COBBLED_DEEPSLATE_STAIRS());
1191 $this->map(Ids::COBBLED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLED_DEEPSLATE_WALL(), $in));
1192 $this->mapSlab(Ids::COBBLESTONE_SLAB, Ids::COBBLESTONE_DOUBLE_SLAB, fn() => Blocks::COBBLESTONE_SLAB());
1193 $this->map(Ids::COBBLESTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::COBBLESTONE_WALL(), $in));
1194 $this->map(Ids::COCOA,
function(Reader $in) : Block{
1195 return Blocks::COCOA_POD()
1196 ->setAge($in->readBoundedInt(StateNames::AGE, 0, 2))
1197 ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing()));
1199 $this->map(Ids::COLORED_TORCH_BLUE, fn(Reader $in) => Blocks::BLUE_TORCH()->setFacing($in->readTorchFacing()));
1200 $this->map(Ids::COLORED_TORCH_GREEN, fn(Reader $in) => Blocks::GREEN_TORCH()->setFacing($in->readTorchFacing()));
1201 $this->map(Ids::COLORED_TORCH_PURPLE, fn(Reader $in) => Blocks::PURPLE_TORCH()->setFacing($in->readTorchFacing()));
1202 $this->map(Ids::COLORED_TORCH_RED, fn(Reader $in) => Blocks::RED_TORCH()->setFacing($in->readTorchFacing()));
1203 $this->map(Ids::COMPOUND_CREATOR, fn(Reader $in) => Blocks::COMPOUND_CREATOR()
1204 ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing()))
1206 $this->mapSlab(Ids::CUT_RED_SANDSTONE_SLAB, Ids::CUT_RED_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::CUT_RED_SANDSTONE_SLAB());
1207 $this->mapSlab(Ids::CUT_SANDSTONE_SLAB, Ids::CUT_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::CUT_SANDSTONE_SLAB());
1208 $this->mapSlab(Ids::DARK_PRISMARINE_SLAB, Ids::DARK_PRISMARINE_DOUBLE_SLAB, fn() => Blocks::DARK_PRISMARINE_SLAB());
1209 $this->mapStairs(Ids::DARK_PRISMARINE_STAIRS, fn() => Blocks::DARK_PRISMARINE_STAIRS());
1210 $this->map(Ids::DAYLIGHT_DETECTOR, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in)
1211 ->setInverted(
false));
1212 $this->map(Ids::DAYLIGHT_DETECTOR_INVERTED, fn(Reader $in) => Helper::decodeDaylightSensor(Blocks::DAYLIGHT_SENSOR(), $in)
1213 ->setInverted(
true));
1214 $this->map(Ids::DEEPSLATE,
function(Reader $in) : Block{
1215 return Blocks::DEEPSLATE()
1216 ->setAxis($in->readPillarAxis());
1218 $this->mapSlab(Ids::DEEPSLATE_BRICK_SLAB, Ids::DEEPSLATE_BRICK_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_BRICK_SLAB());
1219 $this->mapStairs(Ids::DEEPSLATE_BRICK_STAIRS, fn() => Blocks::DEEPSLATE_BRICK_STAIRS());
1220 $this->map(Ids::DEEPSLATE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_BRICK_WALL(), $in));
1221 $this->map(Ids::DEEPSLATE_REDSTONE_ORE, fn() => Blocks::DEEPSLATE_REDSTONE_ORE()->setLit(
false));
1222 $this->mapSlab(Ids::DEEPSLATE_TILE_SLAB, Ids::DEEPSLATE_TILE_DOUBLE_SLAB, fn() => Blocks::DEEPSLATE_TILE_SLAB());
1223 $this->mapStairs(Ids::DEEPSLATE_TILE_STAIRS, fn() => Blocks::DEEPSLATE_TILE_STAIRS());
1224 $this->map(Ids::DEEPSLATE_TILE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DEEPSLATE_TILE_WALL(), $in));
1225 $this->map(Ids::DETECTOR_RAIL,
function(Reader $in) : Block{
1226 return Blocks::DETECTOR_RAIL()
1227 ->setActivated($in->readBool(StateNames::RAIL_DATA_BIT))
1228 ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5));
1230 $this->mapSlab(Ids::DIORITE_SLAB, Ids::DIORITE_DOUBLE_SLAB, fn() => Blocks::DIORITE_SLAB());
1231 $this->mapStairs(Ids::DIORITE_STAIRS, fn() => Blocks::DIORITE_STAIRS());
1232 $this->map(Ids::DIORITE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::DIORITE_WALL(), $in));
1233 $this->map(Ids::DIRT, fn() => Blocks::DIRT()->setDirtType(DirtType::NORMAL));
1234 $this->map(Ids::DIRT_WITH_ROOTS, fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED));
1235 $this->map(Ids::LARGE_FERN, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::LARGE_FERN(), $in));
1236 $this->map(Ids::TALL_GRASS, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::DOUBLE_TALLGRASS(), $in));
1237 $this->map(Ids::PEONY, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::PEONY(), $in));
1238 $this->map(Ids::ROSE_BUSH, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::ROSE_BUSH(), $in));
1239 $this->map(Ids::SUNFLOWER, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::SUNFLOWER(), $in));
1240 $this->map(Ids::LILAC, fn(Reader $in) => Helper::decodeDoublePlant(Blocks::LILAC(), $in));
1241 $this->map(Ids::ELEMENT_CONSTRUCTOR, fn(Reader $in) => Blocks::ELEMENT_CONSTRUCTOR()
1242 ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing()))
1244 $this->mapStairs(Ids::END_BRICK_STAIRS, fn() => Blocks::END_STONE_BRICK_STAIRS());
1245 $this->map(Ids::END_STONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::END_STONE_BRICK_WALL(), $in));
1246 $this->map(Ids::END_PORTAL_FRAME,
function(Reader $in) : Block{
1247 return Blocks::END_PORTAL_FRAME()
1248 ->setEye($in->readBool(StateNames::END_PORTAL_EYE_BIT))
1249 ->setFacing($in->readCardinalHorizontalFacing());
1251 $this->map(Ids::END_ROD,
function(Reader $in) : Block{
1252 return Blocks::END_ROD()
1253 ->setFacing($in->readEndRodFacingDirection());
1255 $this->mapSlab(Ids::END_STONE_BRICK_SLAB, Ids::END_STONE_BRICK_DOUBLE_SLAB, fn() => Blocks::END_STONE_BRICK_SLAB());
1256 $this->map(Ids::ENDER_CHEST,
function(Reader $in) : Block{
1257 return Blocks::ENDER_CHEST()
1258 ->setFacing($in->readCardinalHorizontalFacing());
1260 $this->map(Ids::FARMLAND,
function(Reader $in) : Block{
1261 return Blocks::FARMLAND()
1262 ->setWetness($in->readBoundedInt(StateNames::MOISTURIZED_AMOUNT, 0, 7));
1264 $this->map(Ids::FIRE,
function(Reader $in) : Block{
1265 return Blocks::FIRE()
1266 ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15));
1268 $this->map(Ids::FLOWER_POT,
function(Reader $in) : Block{
1269 $in->ignored(StateNames::UPDATE_BIT);
1270 return Blocks::FLOWER_POT();
1272 $this->map(Ids::FLOWING_LAVA, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::LAVA(), $in));
1273 $this->map(Ids::FLOWING_WATER, fn(Reader $in) => Helper::decodeFlowingLiquid(Blocks::WATER(), $in));
1274 $this->map(Ids::FRAME, fn(Reader $in) => Helper::decodeItemFrame(Blocks::ITEM_FRAME(), $in));
1275 $this->map(Ids::FROSTED_ICE,
function(Reader $in) : Block{
1276 return Blocks::FROSTED_ICE()
1277 ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3));
1279 $this->map(Ids::FURNACE,
function(Reader $in) : Block{
1280 return Blocks::FURNACE()
1281 ->setFacing($in->readCardinalHorizontalFacing())
1284 $this->map(Ids::GLOW_LICHEN, fn(Reader $in) => Blocks::GLOW_LICHEN()->setFaces($in->readFacingFlags()));
1285 $this->map(Ids::GLOW_FRAME, fn(Reader $in) => Helper::decodeItemFrame(Blocks::GLOWING_ITEM_FRAME(), $in));
1286 $this->map(Ids::GOLDEN_RAIL,
function(Reader $in) : Block{
1287 return Blocks::POWERED_RAIL()
1288 ->setPowered($in->readBool(StateNames::RAIL_DATA_BIT))
1289 ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 5));
1291 $this->mapSlab(Ids::GRANITE_SLAB, Ids::GRANITE_DOUBLE_SLAB, fn() => Blocks::GRANITE_SLAB());
1292 $this->mapStairs(Ids::GRANITE_STAIRS, fn() => Blocks::GRANITE_STAIRS());
1293 $this->map(Ids::GRANITE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::GRANITE_WALL(), $in));
1294 $this->map(Ids::HAY_BLOCK,
function(Reader $in) : Block{
1295 $in->ignored(StateNames::DEPRECATED);
1296 return Blocks::HAY_BALE()->setAxis($in->readPillarAxis());
1298 $this->map(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY(), $in));
1299 $this->map(Ids::HOPPER,
function(Reader $in) : Block{
1300 return Blocks::HOPPER()
1301 ->setFacing($in->readFacingWithoutUp())
1302 ->setPowered($in->readBool(StateNames::TOGGLE_BIT));
1304 $this->map(Ids::IRON_DOOR, fn(Reader $in) => Helper::decodeDoor(Blocks::IRON_DOOR(), $in));
1305 $this->map(Ids::IRON_TRAPDOOR, fn(Reader $in) => Helper::decodeTrapdoor(Blocks::IRON_TRAPDOOR(), $in));
1306 $this->map(Ids::LAB_TABLE, fn(Reader $in) => Blocks::LAB_TABLE()
1307 ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing()))
1309 $this->map(Ids::LADDER,
function(Reader $in) : Block{
1310 return Blocks::LADDER()
1311 ->setFacing($in->readHorizontalFacing());
1313 $this->map(Ids::LANTERN,
function(Reader $in) : Block{
1314 return Blocks::LANTERN()
1315 ->setHanging($in->readBool(StateNames::HANGING));
1317 $this->map(Ids::LARGE_AMETHYST_BUD,
function(Reader $in) : Block{
1318 return Blocks::AMETHYST_CLUSTER()
1319 ->setStage(AmethystCluster::STAGE_LARGE_BUD)
1320 ->setFacing($in->readBlockFace());
1322 $this->map(Ids::LAVA, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::LAVA(), $in));
1323 $this->map(Ids::LECTERN,
function(Reader $in) : Block{
1324 return Blocks::LECTERN()
1325 ->setFacing($in->readCardinalHorizontalFacing())
1326 ->setProducingSignal($in->readBool(StateNames::POWERED_BIT));
1328 $this->map(Ids::LEVER,
function(Reader $in) : Block{
1329 return Blocks::LEVER()
1330 ->setActivated($in->readBool(StateNames::OPEN_BIT))
1331 ->setFacing(match($value = $in->readString(StateNames::LEVER_DIRECTION)){
1332 StringValues::LEVER_DIRECTION_DOWN_NORTH_SOUTH => LeverFacing::DOWN_AXIS_Z,
1333 StringValues::LEVER_DIRECTION_DOWN_EAST_WEST => LeverFacing::DOWN_AXIS_X,
1334 StringValues::LEVER_DIRECTION_UP_NORTH_SOUTH => LeverFacing::UP_AXIS_Z,
1335 StringValues::LEVER_DIRECTION_UP_EAST_WEST => LeverFacing::UP_AXIS_X,
1336 StringValues::LEVER_DIRECTION_NORTH => LeverFacing::NORTH,
1337 StringValues::LEVER_DIRECTION_SOUTH => LeverFacing::SOUTH,
1338 StringValues::LEVER_DIRECTION_WEST => LeverFacing::WEST,
1339 StringValues::LEVER_DIRECTION_EAST => LeverFacing::EAST,
1340 default => throw $in->badValueException(StateNames::LEVER_DIRECTION, $value),
1343 $this->map(Ids::LIGHTNING_ROD,
function(Reader $in) : Block{
1344 return Blocks::LIGHTNING_ROD()
1345 ->setFacing($in->readFacingDirection());
1347 $this->map(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeWeightedPressurePlate(Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT(), $in));
1348 $this->map(Ids::LIT_BLAST_FURNACE,
function(Reader $in) : Block{
1349 return Blocks::BLAST_FURNACE()
1350 ->setFacing($in->readCardinalHorizontalFacing())
1353 $this->map(Ids::LIT_DEEPSLATE_REDSTONE_ORE, fn() => Blocks::DEEPSLATE_REDSTONE_ORE()->setLit(
true));
1354 $this->map(Ids::LIT_FURNACE,
function(Reader $in) : Block{
1355 return Blocks::FURNACE()
1356 ->setFacing($in->readCardinalHorizontalFacing())
1359 $this->map(Ids::LIT_PUMPKIN,
function(Reader $in) : Block{
1360 return Blocks::LIT_PUMPKIN()
1361 ->setFacing($in->readCardinalHorizontalFacing());
1363 $this->map(Ids::LIT_REDSTONE_LAMP,
function() : Block{
1364 return Blocks::REDSTONE_LAMP()
1367 $this->map(Ids::LIT_REDSTONE_ORE,
function() : Block{
1368 return Blocks::REDSTONE_ORE()
1371 $this->map(Ids::LIT_SMOKER,
function(Reader $in) : Block{
1372 return Blocks::SMOKER()
1373 ->setFacing($in->readCardinalHorizontalFacing())
1376 $this->map(Ids::LOOM,
function(Reader $in) : Block{
1377 return Blocks::LOOM()
1378 ->setFacing($in->readLegacyHorizontalFacing());
1380 $this->map(Ids::MATERIAL_REDUCER, fn(Reader $in) => Blocks::MATERIAL_REDUCER()
1381 ->setFacing(Facing::opposite($in->readLegacyHorizontalFacing()))
1383 $this->map(Ids::MEDIUM_AMETHYST_BUD,
function(Reader $in) : Block{
1384 return Blocks::AMETHYST_CLUSTER()
1385 ->setStage(AmethystCluster::STAGE_MEDIUM_BUD)
1386 ->setFacing($in->readBlockFace());
1388 $this->map(Ids::MELON_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::MELON_STEM(), $in));
1389 $this->mapSlab(Ids::MOSSY_COBBLESTONE_SLAB, Ids::MOSSY_COBBLESTONE_DOUBLE_SLAB, fn() => Blocks::MOSSY_COBBLESTONE_SLAB());
1390 $this->mapStairs(Ids::MOSSY_COBBLESTONE_STAIRS, fn() => Blocks::MOSSY_COBBLESTONE_STAIRS());
1391 $this->map(Ids::MOSSY_COBBLESTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MOSSY_COBBLESTONE_WALL(), $in));
1392 $this->mapSlab(Ids::MOSSY_STONE_BRICK_SLAB, Ids::MOSSY_STONE_BRICK_DOUBLE_SLAB, fn() => Blocks::MOSSY_STONE_BRICK_SLAB());
1393 $this->mapStairs(Ids::MOSSY_STONE_BRICK_STAIRS, fn() => Blocks::MOSSY_STONE_BRICK_STAIRS());
1394 $this->map(Ids::MOSSY_STONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MOSSY_STONE_BRICK_WALL(), $in));
1395 $this->mapSlab(Ids::MUD_BRICK_SLAB, Ids::MUD_BRICK_DOUBLE_SLAB, fn() => Blocks::MUD_BRICK_SLAB());
1396 $this->mapStairs(Ids::MUD_BRICK_STAIRS, fn() => Blocks::MUD_BRICK_STAIRS());
1397 $this->map(Ids::MUD_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::MUD_BRICK_WALL(), $in));
1398 $this->map(Ids::MUDDY_MANGROVE_ROOTS,
function(Reader $in) : Block{
1399 return Blocks::MUDDY_MANGROVE_ROOTS()
1400 ->setAxis($in->readPillarAxis());
1402 $this->mapSlab(Ids::NETHER_BRICK_SLAB, Ids::NETHER_BRICK_DOUBLE_SLAB, fn() => Blocks::NETHER_BRICK_SLAB());
1403 $this->mapStairs(Ids::NETHER_BRICK_STAIRS, fn() => Blocks::NETHER_BRICK_STAIRS());
1404 $this->map(Ids::NETHER_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::NETHER_BRICK_WALL(), $in));
1405 $this->map(Ids::NETHER_WART,
function(Reader $in) : Block{
1406 return Blocks::NETHER_WART()
1407 ->setAge($in->readBoundedInt(StateNames::AGE, 0, 3));
1409 $this->mapSlab(Ids::NORMAL_STONE_SLAB, Ids::NORMAL_STONE_DOUBLE_SLAB, fn() => Blocks::STONE_SLAB());
1410 $this->mapStairs(Ids::NORMAL_STONE_STAIRS, fn() => Blocks::STONE_STAIRS());
1411 $this->map(Ids::OCHRE_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::OCHRE)->setAxis($in->readPillarAxis()));
1412 $this->map(Ids::PEARLESCENT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::PEARLESCENT)->setAxis($in->readPillarAxis()));
1413 $this->mapSlab(Ids::PETRIFIED_OAK_SLAB, Ids::PETRIFIED_OAK_DOUBLE_SLAB, fn() => Blocks::FAKE_WOODEN_SLAB());
1414 $this->map(Ids::PINK_PETALS,
function(Reader $in) : Block{
1416 $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7);
1417 return Blocks::PINK_PETALS()
1418 ->setFacing($in->readCardinalHorizontalFacing())
1419 ->setCount(min($growth + 1, PinkPetals::MAX_COUNT));
1421 $this->map(Ids::PITCHER_CROP,
function(Reader $in) : Block{
1422 $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7);
1423 $top = $in->readBool(StateNames::UPPER_BLOCK_BIT);
1424 if($growth <= PitcherCrop::MAX_AGE){
1427 return $top ? Blocks::AIR() : Blocks::PITCHER_CROP()->setAge($growth);
1429 return Blocks::DOUBLE_PITCHER_CROP()
1430 ->setAge(min($growth - PitcherCrop::MAX_AGE - 1, DoublePitcherCrop::MAX_AGE))
1433 $this->map(Ids::PITCHER_PLANT,
function(Reader $in) : Block{
1434 return Blocks::PITCHER_PLANT()
1435 ->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT));
1437 $this->mapSlab(Ids::POLISHED_ANDESITE_SLAB, Ids::POLISHED_ANDESITE_DOUBLE_SLAB, fn() => Blocks::POLISHED_ANDESITE_SLAB());
1438 $this->mapStairs(Ids::POLISHED_ANDESITE_STAIRS, fn() => Blocks::POLISHED_ANDESITE_STAIRS());
1439 $this->map(Ids::POLISHED_BASALT,
function(Reader $in) : Block{
1440 return Blocks::POLISHED_BASALT()
1441 ->setAxis($in->readPillarAxis());
1443 $this->map(Ids::POLISHED_BLACKSTONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::POLISHED_BLACKSTONE_BUTTON(), $in));
1444 $this->mapSlab(Ids::POLISHED_BLACKSTONE_SLAB, Ids::POLISHED_BLACKSTONE_DOUBLE_SLAB, fn() => Blocks::POLISHED_BLACKSTONE_SLAB());
1445 $this->map(Ids::POLISHED_BLACKSTONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::POLISHED_BLACKSTONE_PRESSURE_PLATE(), $in));
1446 $this->mapStairs(Ids::POLISHED_BLACKSTONE_STAIRS, fn() => Blocks::POLISHED_BLACKSTONE_STAIRS());
1447 $this->map(Ids::POLISHED_BLACKSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_BLACKSTONE_WALL(), $in));
1448 $this->mapSlab(Ids::POLISHED_BLACKSTONE_BRICK_SLAB, Ids::POLISHED_BLACKSTONE_BRICK_DOUBLE_SLAB, fn() => Blocks::POLISHED_BLACKSTONE_BRICK_SLAB());
1449 $this->mapStairs(Ids::POLISHED_BLACKSTONE_BRICK_STAIRS, fn() => Blocks::POLISHED_BLACKSTONE_BRICK_STAIRS());
1450 $this->map(Ids::POLISHED_BLACKSTONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_BLACKSTONE_BRICK_WALL(), $in));
1451 $this->mapSlab(Ids::POLISHED_DEEPSLATE_SLAB, Ids::POLISHED_DEEPSLATE_DOUBLE_SLAB, fn() => Blocks::POLISHED_DEEPSLATE_SLAB());
1452 $this->mapStairs(Ids::POLISHED_DEEPSLATE_STAIRS, fn() => Blocks::POLISHED_DEEPSLATE_STAIRS());
1453 $this->map(Ids::POLISHED_DEEPSLATE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_DEEPSLATE_WALL(), $in));
1454 $this->mapSlab(Ids::POLISHED_DIORITE_SLAB, Ids::POLISHED_DIORITE_DOUBLE_SLAB, fn() => Blocks::POLISHED_DIORITE_SLAB());
1455 $this->mapStairs(Ids::POLISHED_DIORITE_STAIRS, fn() => Blocks::POLISHED_DIORITE_STAIRS());
1456 $this->mapSlab(Ids::POLISHED_GRANITE_SLAB, Ids::POLISHED_GRANITE_DOUBLE_SLAB, fn() => Blocks::POLISHED_GRANITE_SLAB());
1457 $this->mapStairs(Ids::POLISHED_GRANITE_STAIRS, fn() => Blocks::POLISHED_GRANITE_STAIRS());
1458 $this->mapSlab(Ids::POLISHED_TUFF_SLAB, Ids::POLISHED_TUFF_DOUBLE_SLAB, fn() => Blocks::POLISHED_TUFF_SLAB());
1459 $this->mapStairs(Ids::POLISHED_TUFF_STAIRS, fn() => Blocks::POLISHED_TUFF_STAIRS());
1460 $this->map(Ids::POLISHED_TUFF_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::POLISHED_TUFF_WALL(), $in));
1461 $this->map(Ids::PORTAL,
function(Reader $in) : Block{
1462 return Blocks::NETHER_PORTAL()
1463 ->setAxis(match($value = $in->readString(StateNames::PORTAL_AXIS)){
1464 StringValues::PORTAL_AXIS_UNKNOWN => Axis::X,
1465 StringValues::PORTAL_AXIS_X => Axis::X,
1466 StringValues::PORTAL_AXIS_Z => Axis::Z,
1467 default => throw $in->badValueException(StateNames::PORTAL_AXIS, $value),
1470 $this->map(Ids::POTATOES, fn(Reader $in) => Helper::decodeCrops(Blocks::POTATOES(), $in));
1471 $this->map(Ids::POWERED_COMPARATOR, fn(Reader $in) => Helper::decodeComparator(Blocks::REDSTONE_COMPARATOR(), $in));
1472 $this->map(Ids::POWERED_REPEATER, fn(Reader $in) => Helper::decodeRepeater(Blocks::REDSTONE_REPEATER(), $in)
1473 ->setPowered(
true));
1474 $this->mapSlab(Ids::PRISMARINE_BRICK_SLAB, Ids::PRISMARINE_BRICK_DOUBLE_SLAB, fn() => Blocks::PRISMARINE_BRICKS_SLAB());
1475 $this->mapStairs(Ids::PRISMARINE_BRICKS_STAIRS, fn() => Blocks::PRISMARINE_BRICKS_STAIRS());
1476 $this->map(Ids::PRISMARINE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::PRISMARINE_WALL(), $in));
1477 $this->mapSlab(Ids::PRISMARINE_SLAB, Ids::PRISMARINE_DOUBLE_SLAB, fn() => Blocks::PRISMARINE_SLAB());
1478 $this->mapStairs(Ids::PRISMARINE_STAIRS, fn() => Blocks::PRISMARINE_STAIRS());
1479 $this->map(Ids::PUMPKIN,
function(Reader $in) : Block{
1480 $in->ignored(StateNames::MC_CARDINAL_DIRECTION);
1481 return Blocks::PUMPKIN();
1483 $this->map(Ids::PUMPKIN_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::PUMPKIN_STEM(), $in));
1484 $this->map(Ids::PURPUR_BLOCK,
function(Reader $in) : Block{
1485 $in->ignored(StateNames::PILLAR_AXIS);
1486 return Blocks::PURPUR();
1488 $this->map(Ids::PURPUR_PILLAR, fn(Reader $in) => Blocks::PURPUR_PILLAR()->setAxis($in->readPillarAxis()));
1489 $this->mapSlab(Ids::PURPUR_SLAB, Ids::PURPUR_DOUBLE_SLAB, fn() => Blocks::PURPUR_SLAB());
1490 $this->mapStairs(Ids::PURPUR_STAIRS, fn() => Blocks::PURPUR_STAIRS());
1491 $this->map(Ids::QUARTZ_BLOCK,
function(Reader $in) : Opaque{
1492 $in->ignored(StateNames::PILLAR_AXIS);
1493 return Blocks::QUARTZ();
1495 $this->map(Ids::QUARTZ_PILLAR,
function(Reader $in) : Block{
1496 return Blocks::QUARTZ_PILLAR()
1497 ->setAxis($in->readPillarAxis());
1499 $this->mapSlab(Ids::QUARTZ_SLAB, Ids::QUARTZ_DOUBLE_SLAB, fn() => Blocks::QUARTZ_SLAB());
1500 $this->mapStairs(Ids::QUARTZ_STAIRS, fn() => Blocks::QUARTZ_STAIRS());
1501 $this->map(Ids::RAIL,
function(Reader $in) : Block{
1502 return Blocks::RAIL()
1503 ->setShape($in->readBoundedInt(StateNames::RAIL_DIRECTION, 0, 9));
1505 $this->map(Ids::RED_MUSHROOM_BLOCK, fn(Reader $in) => Helper::decodeMushroomBlock(Blocks::RED_MUSHROOM_BLOCK(), $in));
1506 $this->mapSlab(Ids::RED_NETHER_BRICK_SLAB, Ids::RED_NETHER_BRICK_DOUBLE_SLAB, fn() => Blocks::RED_NETHER_BRICK_SLAB());
1507 $this->mapStairs(Ids::RED_NETHER_BRICK_STAIRS, fn() => Blocks::RED_NETHER_BRICK_STAIRS());
1508 $this->map(Ids::RED_NETHER_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::RED_NETHER_BRICK_WALL(), $in));
1509 $this->mapSlab(Ids::RED_SANDSTONE_SLAB, Ids::RED_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::RED_SANDSTONE_SLAB());
1510 $this->mapStairs(Ids::RED_SANDSTONE_STAIRS, fn() => Blocks::RED_SANDSTONE_STAIRS());
1511 $this->map(Ids::RED_SANDSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::RED_SANDSTONE_WALL(), $in));
1512 $this->map(Ids::REDSTONE_LAMP,
function() : Block{
1513 return Blocks::REDSTONE_LAMP()
1514 ->setPowered(
false);
1516 $this->map(Ids::REDSTONE_ORE,
function() : Block{
1517 return Blocks::REDSTONE_ORE()
1520 $this->map(Ids::REDSTONE_TORCH,
function(Reader $in) : Block{
1521 return Blocks::REDSTONE_TORCH()
1522 ->setFacing($in->readTorchFacing())
1525 $this->map(Ids::REDSTONE_WIRE,
function(Reader $in) : Block{
1526 return Blocks::REDSTONE_WIRE()
1527 ->setOutputSignalStrength($in->readBoundedInt(StateNames::REDSTONE_SIGNAL, 0, 15));
1529 $this->map(Ids::REEDS,
function(Reader $in) : Block{
1530 return Blocks::SUGARCANE()
1531 ->setAge($in->readBoundedInt(StateNames::AGE, 0, 15));
1533 $this->mapSlab(Ids::RESIN_BRICK_SLAB, Ids::RESIN_BRICK_DOUBLE_SLAB, fn() => Blocks::RESIN_BRICK_SLAB());
1534 $this->mapStairs(Ids::RESIN_BRICK_STAIRS, fn() => Blocks::RESIN_BRICK_STAIRS());
1535 $this->map(Ids::RESIN_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::RESIN_BRICK_WALL(), $in));
1536 $this->map(Ids::RESIN_CLUMP, fn(Reader $in) => Blocks::RESIN_CLUMP()->setFaces($in->readFacingFlags()));
1537 $this->map(Ids::RESPAWN_ANCHOR,
function(Reader $in) : Block{
1538 return Blocks::RESPAWN_ANCHOR()
1539 ->setCharges($in->readBoundedInt(StateNames::RESPAWN_ANCHOR_CHARGE, 0, 4));
1541 $this->mapSlab(Ids::SANDSTONE_SLAB, Ids::SANDSTONE_DOUBLE_SLAB, fn() => Blocks::SANDSTONE_SLAB());
1542 $this->mapStairs(Ids::SANDSTONE_STAIRS, fn() => Blocks::SANDSTONE_STAIRS());
1543 $this->map(Ids::SANDSTONE_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::SANDSTONE_WALL(), $in));
1544 $this->map(Ids::SEA_PICKLE,
function(Reader $in) : Block{
1545 return Blocks::SEA_PICKLE()
1546 ->setCount($in->readBoundedInt(StateNames::CLUSTER_COUNT, 0, 3) + 1)
1547 ->setUnderwater(!$in->readBool(StateNames::DEAD_BIT));
1549 $this->map(Ids::SMOKER,
function(Reader $in) : Block{
1550 return Blocks::SMOKER()
1551 ->setFacing($in->readCardinalHorizontalFacing())
1554 $this->map(Ids::SMALL_AMETHYST_BUD,
function(Reader $in) : Block{
1555 return Blocks::AMETHYST_CLUSTER()
1556 ->setStage(AmethystCluster::STAGE_SMALL_BUD)
1557 ->setFacing($in->readBlockFace());
1559 $this->map(Ids::SMALL_DRIPLEAF_BLOCK,
function(Reader $in) : Block{
1560 return Blocks::SMALL_DRIPLEAF()
1561 ->setFacing($in->readCardinalHorizontalFacing())
1562 ->setTop($in->readBool(StateNames::UPPER_BLOCK_BIT));
1564 $this->map(Ids::SMOOTH_QUARTZ,
function(Reader $in) : Block{
1565 $in->ignored(StateNames::PILLAR_AXIS);
1566 return Blocks::SMOOTH_QUARTZ();
1568 $this->mapSlab(Ids::SMOOTH_QUARTZ_SLAB, Ids::SMOOTH_QUARTZ_DOUBLE_SLAB, fn() => Blocks::SMOOTH_QUARTZ_SLAB());
1569 $this->mapStairs(Ids::SMOOTH_QUARTZ_STAIRS, fn() => Blocks::SMOOTH_QUARTZ_STAIRS());
1570 $this->mapSlab(Ids::SMOOTH_RED_SANDSTONE_SLAB, Ids::SMOOTH_RED_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::SMOOTH_RED_SANDSTONE_SLAB());
1571 $this->mapStairs(Ids::SMOOTH_RED_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_RED_SANDSTONE_STAIRS());
1572 $this->mapSlab(Ids::SMOOTH_SANDSTONE_SLAB, Ids::SMOOTH_SANDSTONE_DOUBLE_SLAB, fn() => Blocks::SMOOTH_SANDSTONE_SLAB());
1573 $this->mapStairs(Ids::SMOOTH_SANDSTONE_STAIRS, fn() => Blocks::SMOOTH_SANDSTONE_STAIRS());
1574 $this->mapSlab(Ids::SMOOTH_STONE_SLAB, Ids::SMOOTH_STONE_DOUBLE_SLAB, fn() => Blocks::SMOOTH_STONE_SLAB());
1575 $this->map(Ids::SNOW_LAYER,
function(Reader $in) : Block{
1576 $in->ignored(StateNames::COVERED_BIT);
1577 return Blocks::SNOW_LAYER()->setLayers($in->readBoundedInt(StateNames::HEIGHT, 0, 7) + 1);
1579 $this->map(Ids::SOUL_CAMPFIRE,
function(Reader $in) : Block{
1580 return Blocks::SOUL_CAMPFIRE()
1581 ->setFacing($in->readCardinalHorizontalFacing())
1582 ->setLit(!$in->readBool(StateNames::EXTINGUISHED));
1584 $this->map(Ids::SOUL_FIRE,
function(Reader $in) : Block{
1585 $in->ignored(StateNames::AGE);
1586 return Blocks::SOUL_FIRE();
1588 $this->map(Ids::SOUL_LANTERN,
function(Reader $in) : Block{
1589 return Blocks::SOUL_LANTERN()
1590 ->setHanging($in->readBool(StateNames::HANGING));
1592 $this->map(Ids::SOUL_TORCH,
function(Reader $in) : Block{
1593 return Blocks::SOUL_TORCH()
1594 ->setFacing($in->readTorchFacing());
1596 $this->map(Ids::STANDING_BANNER,
function(Reader $in) : Block{
1597 return Blocks::BANNER()
1598 ->setRotation($in->readBoundedInt(StateNames::GROUND_SIGN_DIRECTION, 0, 15));
1600 $this->mapSlab(Ids::STONE_BRICK_SLAB, Ids::STONE_BRICK_DOUBLE_SLAB, fn() => Blocks::STONE_BRICK_SLAB());
1601 $this->mapStairs(Ids::STONE_BRICK_STAIRS, fn() => Blocks::STONE_BRICK_STAIRS());
1602 $this->map(Ids::STONE_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::STONE_BRICK_WALL(), $in));
1603 $this->map(Ids::STONE_BUTTON, fn(Reader $in) => Helper::decodeButton(Blocks::STONE_BUTTON(), $in));
1604 $this->map(Ids::STONE_PRESSURE_PLATE, fn(Reader $in) => Helper::decodeSimplePressurePlate(Blocks::STONE_PRESSURE_PLATE(), $in));
1605 $this->mapStairs(Ids::STONE_STAIRS, fn() => Blocks::COBBLESTONE_STAIRS());
1606 $this->map(Ids::STONECUTTER_BLOCK,
function(Reader $in) : Block{
1607 return Blocks::STONECUTTER()
1608 ->setFacing($in->readCardinalHorizontalFacing());
1610 $this->map(Ids::SWEET_BERRY_BUSH,
function(Reader $in) : Block{
1612 $growth = $in->readBoundedInt(StateNames::GROWTH, 0, 7);
1613 return Blocks::SWEET_BERRY_BUSH()
1614 ->setAge(min($growth, SweetBerryBush::STAGE_MATURE));
1616 $this->map(Ids::TNT,
function(Reader $in) : Block{
1617 return Blocks::TNT()
1618 ->setUnstable($in->readBool(StateNames::EXPLODE_BIT))
1619 ->setWorksUnderwater(
false);
1621 $this->map(Ids::TORCH,
function(Reader $in) : Block{
1622 return Blocks::TORCH()
1623 ->setFacing($in->readTorchFacing());
1625 $this->map(Ids::TORCHFLOWER_CROP,
function(Reader $in) : Block{
1626 return Blocks::TORCHFLOWER_CROP()
1628 ->setReady($in->readBoundedInt(StateNames::GROWTH, 0, 7) !== 0);
1630 $this->map(Ids::TRAPPED_CHEST,
function(Reader $in) : Block{
1631 return Blocks::TRAPPED_CHEST()
1632 ->setFacing($in->readCardinalHorizontalFacing());
1634 $this->map(Ids::TRIP_WIRE,
function(Reader $in) : Block{
1635 return Blocks::TRIPWIRE()
1636 ->setConnected($in->readBool(StateNames::ATTACHED_BIT))
1637 ->setDisarmed($in->readBool(StateNames::DISARMED_BIT))
1638 ->setSuspended($in->readBool(StateNames::SUSPENDED_BIT))
1639 ->setTriggered($in->readBool(StateNames::POWERED_BIT));
1641 $this->map(Ids::TRIPWIRE_HOOK,
function(Reader $in) : Block{
1642 return Blocks::TRIPWIRE_HOOK()
1643 ->setConnected($in->readBool(StateNames::ATTACHED_BIT))
1644 ->setFacing($in->readLegacyHorizontalFacing())
1645 ->setPowered($in->readBool(StateNames::POWERED_BIT));
1647 $this->mapSlab(Ids::TUFF_BRICK_SLAB, Ids::TUFF_BRICK_DOUBLE_SLAB, fn() => Blocks::TUFF_BRICK_SLAB());
1648 $this->mapStairs(Ids::TUFF_BRICK_STAIRS, fn() => Blocks::TUFF_BRICK_STAIRS());
1649 $this->map(Ids::TUFF_BRICK_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::TUFF_BRICK_WALL(), $in));
1650 $this->mapSlab(Ids::TUFF_SLAB, Ids::TUFF_DOUBLE_SLAB, fn() => Blocks::TUFF_SLAB());
1651 $this->mapStairs(Ids::TUFF_STAIRS, fn() => Blocks::TUFF_STAIRS());
1652 $this->map(Ids::TUFF_WALL, fn(Reader $in) => Helper::decodeWall(Blocks::TUFF_WALL(), $in));
1653 $this->map(Ids::TWISTING_VINES,
function(Reader $in) : Block{
1654 return Blocks::TWISTING_VINES()
1655 ->setAge($in->readBoundedInt(StateNames::TWISTING_VINES_AGE, 0, 25));
1657 $this->map(Ids::UNDERWATER_TNT,
function(Reader $in) : Block{
1658 return Blocks::TNT()
1659 ->setUnstable($in->readBool(StateNames::EXPLODE_BIT))
1660 ->setWorksUnderwater(
true);
1662 $this->map(Ids::UNDERWATER_TORCH,
function(Reader $in) : Block{
1663 return Blocks::UNDERWATER_TORCH()
1664 ->setFacing($in->readTorchFacing());
1666 $this->map(Ids::UNLIT_REDSTONE_TORCH,
function(Reader $in) : Block{
1667 return Blocks::REDSTONE_TORCH()
1668 ->setFacing($in->readTorchFacing())
1671 $this->map(Ids::UNPOWERED_COMPARATOR, fn(Reader $in) => Helper::decodeComparator(Blocks::REDSTONE_COMPARATOR(), $in));
1672 $this->map(Ids::UNPOWERED_REPEATER, fn(Reader $in) => Helper::decodeRepeater(Blocks::REDSTONE_REPEATER(), $in)
1673 ->setPowered(
false));
1674 $this->map(Ids::VERDANT_FROGLIGHT, fn(Reader $in) => Blocks::FROGLIGHT()->setFroglightType(FroglightType::VERDANT)->setAxis($in->readPillarAxis()));
1675 $this->map(Ids::VINE,
function(Reader $in) : Block{
1676 $vineDirectionFlags = $in->readBoundedInt(StateNames::VINE_DIRECTION_BITS, 0, 15);
1677 return Blocks::VINES()
1678 ->setFace(Facing::NORTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_NORTH) !== 0)
1679 ->setFace(Facing::SOUTH, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_SOUTH) !== 0)
1680 ->setFace(Facing::WEST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_WEST) !== 0)
1681 ->setFace(Facing::EAST, ($vineDirectionFlags & BlockLegacyMetadata::VINE_FLAG_EAST) !== 0);
1683 $this->map(Ids::WALL_BANNER,
function(Reader $in) : Block{
1684 return Blocks::WALL_BANNER()
1685 ->setFacing($in->readHorizontalFacing());
1687 $this->map(Ids::WATER, fn(Reader $in) => Helper::decodeStillLiquid(Blocks::WATER(), $in));
1689 $this->map(Ids::WEEPING_VINES,
function(Reader $in) : Block{
1690 return Blocks::WEEPING_VINES()
1691 ->setAge($in->readBoundedInt(StateNames::WEEPING_VINES_AGE, 0, 25));
1693 $this->map(Ids::WHEAT, fn(Reader $in) => Helper::decodeCrops(Blocks::WHEAT(), $in));
1698 $id = $blockStateData->getName();
1699 if(!array_key_exists($id, $this->deserializeFuncs)){
1702 $reader =
new Reader($blockStateData);
1703 $block = $this->deserializeFuncs[$id]($reader);
1704 $reader->checkUnreadProperties();