55    public function __construct(
 
   59        $this->register1to1BlockMappings();
 
   60        $this->register1to1ItemMappings();
 
   61        $this->register1to1BlockWithMetaMappings();
 
   62        $this->register1to1ItemWithMetaMappings();
 
   63        $this->register1ToNItemMappings();
 
   64        $this->registerMiscBlockMappings();
 
   65        $this->registerMiscItemMappings();
 
   68    public function map1to1Item(
string $id, 
Item $item) : 
void{
 
   69        $this->deserializer?->map($id, fn() => clone $item);
 
   70        $this->serializer?->map($item, fn() => 
new Data($id));
 
   80        $this->deserializer?->map($id, function(Data $data) use ($item, $deserializeMeta) : 
Item{
 
   81            $result = clone $item;
 
   82            $deserializeMeta($result, $data->getMeta());
 
   85        $this->serializer?->map($item, 
function(
Item $item) use ($id, $serializeMeta) : Data{
 
   87            $meta = $serializeMeta($item);
 
   88            return new Data($id, $meta);
 
 
   92    public function map1to1Block(
string $id, Block $block) : void{
 
   93        $this->deserializer?->mapBlock($id, fn() => $block);
 
   94        $this->serializer?->mapBlock($block, fn() => 
new Data($id));
 
  104        $this->deserializer?->mapBlock($id, function(Data $data) use ($block, $deserializeMeta) : 
Block{
 
  105            $result = clone $block;
 
  106            $deserializeMeta($result, $data->getMeta());
 
  109        $this->serializer?->mapBlock($block, 
function(
Block $block) use ($id, $serializeMeta) : Data{
 
  110            $meta = $serializeMeta($block);
 
  111            return new Data($id, $meta);
 
 
  120        $this->deserializer?->map($id, function(Data $data) use ($items) : 
Item{
 
  121            $result = $items[$data->getMeta()] ?? null;
 
  122            if($result === 
null){
 
  125            return clone $result;
 
  127        foreach($items as $meta => $item){
 
  128            $this->serializer?->map($item, fn() => 
new Data($id, $meta));
 
 
  137    private function register1to1BlockMappings() : void{
 
  138        $this->map1to1Block(Ids::ACACIA_DOOR, Blocks::ACACIA_DOOR());
 
  139        $this->map1to1Block(Ids::BIRCH_DOOR, Blocks::BIRCH_DOOR());
 
  140        $this->map1to1Block(Ids::BREWING_STAND, Blocks::BREWING_STAND());
 
  141        $this->map1to1Block(Ids::CAKE, Blocks::CAKE());
 
  142        $this->map1to1Block(Ids::CAMPFIRE, Blocks::CAMPFIRE());
 
  143        $this->map1to1Block(Ids::CAULDRON, Blocks::CAULDRON());
 
  144        $this->map1to1Block(Ids::CHERRY_DOOR, Blocks::CHERRY_DOOR());
 
  145        $this->map1to1Block(Ids::COMPARATOR, Blocks::REDSTONE_COMPARATOR());
 
  146        $this->map1to1Block(Ids::CRIMSON_DOOR, Blocks::CRIMSON_DOOR());
 
  147        $this->map1to1Block(Ids::DARK_OAK_DOOR, Blocks::DARK_OAK_DOOR());
 
  148        $this->map1to1Block(Ids::FLOWER_POT, Blocks::FLOWER_POT());
 
  149        $this->map1to1Block(Ids::FRAME, Blocks::ITEM_FRAME());
 
  150        $this->map1to1Block(Ids::GLOW_FRAME, Blocks::GLOWING_ITEM_FRAME());
 
  151        $this->map1to1Block(Ids::HOPPER, Blocks::HOPPER());
 
  152        $this->map1to1Block(Ids::IRON_DOOR, Blocks::IRON_DOOR());
 
  153        $this->map1to1Block(Ids::JUNGLE_DOOR, Blocks::JUNGLE_DOOR());
 
  154        $this->map1to1Block(Ids::MANGROVE_DOOR, Blocks::MANGROVE_DOOR());
 
  155        $this->map1to1Block(Ids::NETHER_WART, Blocks::NETHER_WART());
 
  156        $this->map1to1Block(Ids::PALE_OAK_DOOR, Blocks::PALE_OAK_DOOR());
 
  157        $this->map1to1Block(Ids::REPEATER, Blocks::REDSTONE_REPEATER());
 
  158        $this->map1to1Block(Ids::SOUL_CAMPFIRE, Blocks::SOUL_CAMPFIRE());
 
  159        $this->map1to1Block(Ids::SPRUCE_DOOR, Blocks::SPRUCE_DOOR());
 
  160        $this->map1to1Block(Ids::SUGAR_CANE, Blocks::SUGARCANE());
 
  161        $this->map1to1Block(Ids::WARPED_DOOR, Blocks::WARPED_DOOR());
 
  162        $this->map1to1Block(Ids::WOODEN_DOOR, Blocks::OAK_DOOR());
 
  168    private function register1to1ItemMappings() : void{
 
  169        $this->map1to1Item(Ids::ACACIA_BOAT, Items::ACACIA_BOAT());
 
  170        $this->map1to1Item(Ids::ACACIA_HANGING_SIGN, Items::ACACIA_HANGING_SIGN());
 
  171        $this->map1to1Item(Ids::ACACIA_SIGN, Items::ACACIA_SIGN());
 
  172        $this->map1to1Item(Ids::AMETHYST_SHARD, Items::AMETHYST_SHARD());
 
  173        $this->map1to1Item(Ids::APPLE, Items::APPLE());
 
  174        $this->map1to1Item(Ids::BAKED_POTATO, Items::BAKED_POTATO());
 
  175        $this->map1to1Item(Ids::BEEF, Items::RAW_BEEF());
 
  176        $this->map1to1Item(Ids::BEETROOT, Items::BEETROOT());
 
  177        $this->map1to1Item(Ids::BEETROOT_SEEDS, Items::BEETROOT_SEEDS());
 
  178        $this->map1to1Item(Ids::BEETROOT_SOUP, Items::BEETROOT_SOUP());
 
  179        $this->map1to1Item(Ids::BIRCH_BOAT, Items::BIRCH_BOAT());
 
  180        $this->map1to1Item(Ids::BIRCH_HANGING_SIGN, Items::BIRCH_HANGING_SIGN());
 
  181        $this->map1to1Item(Ids::BIRCH_SIGN, Items::BIRCH_SIGN());
 
  182        $this->map1to1Item(Ids::BLAZE_POWDER, Items::BLAZE_POWDER());
 
  183        $this->map1to1Item(Ids::BLAZE_ROD, Items::BLAZE_ROD());
 
  184        $this->map1to1Item(Ids::BLEACH, Items::BLEACH());
 
  185        $this->map1to1Item(Ids::BONE, Items::BONE());
 
  186        $this->map1to1Item(Ids::BONE_MEAL, Items::BONE_MEAL());
 
  187        $this->map1to1Item(Ids::BOOK, Items::BOOK());
 
  188        $this->map1to1Item(Ids::BOW, Items::BOW());
 
  189        $this->map1to1Item(Ids::BOWL, Items::BOWL());
 
  190        $this->map1to1Item(Ids::BREAD, Items::BREAD());
 
  191        $this->map1to1Item(Ids::BRICK, Items::BRICK());
 
  192        $this->map1to1Item(Ids::BUCKET, Items::BUCKET());
 
  193        $this->map1to1Item(Ids::CARROT, Items::CARROT());
 
  194        $this->map1to1Item(Ids::CHAINMAIL_BOOTS, Items::CHAINMAIL_BOOTS());
 
  195        $this->map1to1Item(Ids::CHAINMAIL_CHESTPLATE, Items::CHAINMAIL_CHESTPLATE());
 
  196        $this->map1to1Item(Ids::CHAINMAIL_HELMET, Items::CHAINMAIL_HELMET());
 
  197        $this->map1to1Item(Ids::CHAINMAIL_LEGGINGS, Items::CHAINMAIL_LEGGINGS());
 
  198        $this->map1to1Item(Ids::CHARCOAL, Items::CHARCOAL());
 
  199        $this->map1to1Item(Ids::CHERRY_HANGING_SIGN, Items::CHERRY_HANGING_SIGN());
 
  200        $this->map1to1Item(Ids::CHERRY_SIGN, Items::CHERRY_SIGN());
 
  201        $this->map1to1Item(Ids::CHICKEN, Items::RAW_CHICKEN());
 
  202        $this->map1to1Item(Ids::CHORUS_FRUIT, Items::CHORUS_FRUIT());
 
  203        $this->map1to1Item(Ids::CLAY_BALL, Items::CLAY());
 
  204        $this->map1to1Item(Ids::CLOCK, Items::CLOCK());
 
  205        $this->map1to1Item(Ids::COAL, Items::COAL());
 
  206        $this->map1to1Item(Ids::COAST_ARMOR_TRIM_SMITHING_TEMPLATE, Items::COAST_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  207        $this->map1to1Item(Ids::COCOA_BEANS, Items::COCOA_BEANS());
 
  208        $this->map1to1Item(Ids::COD, Items::RAW_FISH());
 
  209        $this->map1to1Item(Ids::COMPASS, Items::COMPASS());
 
  210        $this->map1to1Item(Ids::COOKED_BEEF, Items::STEAK());
 
  211        $this->map1to1Item(Ids::COOKED_CHICKEN, Items::COOKED_CHICKEN());
 
  212        $this->map1to1Item(Ids::COOKED_COD, Items::COOKED_FISH());
 
  213        $this->map1to1Item(Ids::COOKED_MUTTON, Items::COOKED_MUTTON());
 
  214        $this->map1to1Item(Ids::COOKED_PORKCHOP, Items::COOKED_PORKCHOP());
 
  215        $this->map1to1Item(Ids::COOKED_RABBIT, Items::COOKED_RABBIT());
 
  216        $this->map1to1Item(Ids::COOKED_SALMON, Items::COOKED_SALMON());
 
  217        $this->map1to1Item(Ids::COOKIE, Items::COOKIE());
 
  218        $this->map1to1Item(Ids::COPPER_INGOT, Items::COPPER_INGOT());
 
  219        $this->map1to1Item(Ids::CRIMSON_HANGING_SIGN, Items::CRIMSON_HANGING_SIGN());
 
  220        $this->map1to1Item(Ids::CRIMSON_SIGN, Items::CRIMSON_SIGN());
 
  221        $this->map1to1Item(Ids::DARK_OAK_BOAT, Items::DARK_OAK_BOAT());
 
  222        $this->map1to1Item(Ids::DARK_OAK_HANGING_SIGN, Items::DARK_OAK_HANGING_SIGN());
 
  223        $this->map1to1Item(Ids::DARK_OAK_SIGN, Items::DARK_OAK_SIGN());
 
  224        $this->map1to1Item(Ids::DIAMOND, Items::DIAMOND());
 
  225        $this->map1to1Item(Ids::DIAMOND_AXE, Items::DIAMOND_AXE());
 
  226        $this->map1to1Item(Ids::DIAMOND_BOOTS, Items::DIAMOND_BOOTS());
 
  227        $this->map1to1Item(Ids::DIAMOND_CHESTPLATE, Items::DIAMOND_CHESTPLATE());
 
  228        $this->map1to1Item(Ids::DIAMOND_HELMET, Items::DIAMOND_HELMET());
 
  229        $this->map1to1Item(Ids::DIAMOND_HOE, Items::DIAMOND_HOE());
 
  230        $this->map1to1Item(Ids::DIAMOND_LEGGINGS, Items::DIAMOND_LEGGINGS());
 
  231        $this->map1to1Item(Ids::DIAMOND_PICKAXE, Items::DIAMOND_PICKAXE());
 
  232        $this->map1to1Item(Ids::DIAMOND_SHOVEL, Items::DIAMOND_SHOVEL());
 
  233        $this->map1to1Item(Ids::DIAMOND_SWORD, Items::DIAMOND_SWORD());
 
  234        $this->map1to1Item(Ids::DISC_FRAGMENT_5, Items::DISC_FRAGMENT_5());
 
  235        $this->map1to1Item(Ids::DRAGON_BREATH, Items::DRAGON_BREATH());
 
  236        $this->map1to1Item(Ids::DRIED_KELP, Items::DRIED_KELP());
 
  237        $this->map1to1Item(Ids::DUNE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::DUNE_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  238        $this->map1to1Item(Ids::ECHO_SHARD, Items::ECHO_SHARD());
 
  239        $this->map1to1Item(Ids::EGG, Items::EGG());
 
  240        $this->map1to1Item(Ids::EMERALD, Items::EMERALD());
 
  241        $this->map1to1Item(Ids::ENCHANTED_BOOK, Items::ENCHANTED_BOOK());
 
  242        $this->map1to1Item(Ids::ENCHANTED_GOLDEN_APPLE, Items::ENCHANTED_GOLDEN_APPLE());
 
  243        $this->map1to1Item(Ids::END_CRYSTAL, Items::END_CRYSTAL());
 
  244        $this->map1to1Item(Ids::ENDER_PEARL, Items::ENDER_PEARL());
 
  245        $this->map1to1Item(Ids::EXPERIENCE_BOTTLE, Items::EXPERIENCE_BOTTLE());
 
  246        $this->map1to1Item(Ids::EYE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::EYE_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  247        $this->map1to1Item(Ids::FEATHER, Items::FEATHER());
 
  248        $this->map1to1Item(Ids::FERMENTED_SPIDER_EYE, Items::FERMENTED_SPIDER_EYE());
 
  249        $this->map1to1Item(Ids::FIREWORK_ROCKET, Items::FIREWORK_ROCKET());
 
  250        $this->map1to1Item(Ids::FIRE_CHARGE, Items::FIRE_CHARGE());
 
  251        $this->map1to1Item(Ids::FISHING_ROD, Items::FISHING_ROD());
 
  252        $this->map1to1Item(Ids::FLINT, Items::FLINT());
 
  253        $this->map1to1Item(Ids::FLINT_AND_STEEL, Items::FLINT_AND_STEEL());
 
  254        $this->map1to1Item(Ids::GHAST_TEAR, Items::GHAST_TEAR());
 
  255        $this->map1to1Item(Ids::GLASS_BOTTLE, Items::GLASS_BOTTLE());
 
  256        $this->map1to1Item(Ids::GLISTERING_MELON_SLICE, Items::GLISTERING_MELON());
 
  257        $this->map1to1Item(Ids::GLOW_BERRIES, Items::GLOW_BERRIES());
 
  258        $this->map1to1Item(Ids::GLOW_INK_SAC, Items::GLOW_INK_SAC());
 
  259        $this->map1to1Item(Ids::GLOWSTONE_DUST, Items::GLOWSTONE_DUST());
 
  260        $this->map1to1Item(Ids::GOLD_INGOT, Items::GOLD_INGOT());
 
  261        $this->map1to1Item(Ids::GOLD_NUGGET, Items::GOLD_NUGGET());
 
  262        $this->map1to1Item(Ids::GOLDEN_APPLE, Items::GOLDEN_APPLE());
 
  263        $this->map1to1Item(Ids::GOLDEN_AXE, Items::GOLDEN_AXE());
 
  264        $this->map1to1Item(Ids::GOLDEN_BOOTS, Items::GOLDEN_BOOTS());
 
  265        $this->map1to1Item(Ids::GOLDEN_CARROT, Items::GOLDEN_CARROT());
 
  266        $this->map1to1Item(Ids::GOLDEN_CHESTPLATE, Items::GOLDEN_CHESTPLATE());
 
  267        $this->map1to1Item(Ids::GOLDEN_HELMET, Items::GOLDEN_HELMET());
 
  268        $this->map1to1Item(Ids::GOLDEN_HOE, Items::GOLDEN_HOE());
 
  269        $this->map1to1Item(Ids::GOLDEN_LEGGINGS, Items::GOLDEN_LEGGINGS());
 
  270        $this->map1to1Item(Ids::GOLDEN_PICKAXE, Items::GOLDEN_PICKAXE());
 
  271        $this->map1to1Item(Ids::GOLDEN_SHOVEL, Items::GOLDEN_SHOVEL());
 
  272        $this->map1to1Item(Ids::GOLDEN_SWORD, Items::GOLDEN_SWORD());
 
  273        $this->map1to1Item(Ids::GUNPOWDER, Items::GUNPOWDER());
 
  274        $this->map1to1Item(Ids::HEART_OF_THE_SEA, Items::HEART_OF_THE_SEA());
 
  275        $this->map1to1Item(Ids::HONEY_BOTTLE, Items::HONEY_BOTTLE());
 
  276        $this->map1to1Item(Ids::HONEYCOMB, Items::HONEYCOMB());
 
  277        $this->map1to1Item(Ids::HOST_ARMOR_TRIM_SMITHING_TEMPLATE, Items::HOST_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  278        $this->map1to1Item(Ids::ICE_BOMB, Items::ICE_BOMB());
 
  279        $this->map1to1Item(Ids::INK_SAC, Items::INK_SAC());
 
  280        $this->map1to1Item(Ids::IRON_AXE, Items::IRON_AXE());
 
  281        $this->map1to1Item(Ids::IRON_BOOTS, Items::IRON_BOOTS());
 
  282        $this->map1to1Item(Ids::IRON_CHESTPLATE, Items::IRON_CHESTPLATE());
 
  283        $this->map1to1Item(Ids::IRON_HELMET, Items::IRON_HELMET());
 
  284        $this->map1to1Item(Ids::IRON_HOE, Items::IRON_HOE());
 
  285        $this->map1to1Item(Ids::IRON_INGOT, Items::IRON_INGOT());
 
  286        $this->map1to1Item(Ids::IRON_LEGGINGS, Items::IRON_LEGGINGS());
 
  287        $this->map1to1Item(Ids::IRON_NUGGET, Items::IRON_NUGGET());
 
  288        $this->map1to1Item(Ids::IRON_PICKAXE, Items::IRON_PICKAXE());
 
  289        $this->map1to1Item(Ids::IRON_SHOVEL, Items::IRON_SHOVEL());
 
  290        $this->map1to1Item(Ids::IRON_SWORD, Items::IRON_SWORD());
 
  291        $this->map1to1Item(Ids::JUNGLE_BOAT, Items::JUNGLE_BOAT());
 
  292        $this->map1to1Item(Ids::JUNGLE_HANGING_SIGN, Items::JUNGLE_HANGING_SIGN());
 
  293        $this->map1to1Item(Ids::JUNGLE_SIGN, Items::JUNGLE_SIGN());
 
  294        $this->map1to1Item(Ids::LAPIS_LAZULI, Items::LAPIS_LAZULI());
 
  295        $this->map1to1Item(Ids::LAVA_BUCKET, Items::LAVA_BUCKET());
 
  296        $this->map1to1Item(Ids::LEATHER, Items::LEATHER());
 
  297        $this->map1to1Item(Ids::LEATHER_BOOTS, Items::LEATHER_BOOTS());
 
  298        $this->map1to1Item(Ids::LEATHER_CHESTPLATE, Items::LEATHER_TUNIC());
 
  299        $this->map1to1Item(Ids::LEATHER_HELMET, Items::LEATHER_CAP());
 
  300        $this->map1to1Item(Ids::LEATHER_LEGGINGS, Items::LEATHER_PANTS());
 
  301        $this->map1to1Item(Ids::MAGMA_CREAM, Items::MAGMA_CREAM());
 
  302        $this->map1to1Item(Ids::MANGROVE_BOAT, Items::MANGROVE_BOAT());
 
  303        $this->map1to1Item(Ids::MANGROVE_HANGING_SIGN, Items::MANGROVE_HANGING_SIGN());
 
  304        $this->map1to1Item(Ids::MANGROVE_SIGN, Items::MANGROVE_SIGN());
 
  305        $this->map1to1Item(Ids::MELON_SEEDS, Items::MELON_SEEDS());
 
  306        $this->map1to1Item(Ids::MELON_SLICE, Items::MELON());
 
  307        $this->map1to1Item(Ids::MILK_BUCKET, Items::MILK_BUCKET());
 
  308        $this->map1to1Item(Ids::MINECART, Items::MINECART());
 
  309        $this->map1to1Item(Ids::MUSHROOM_STEW, Items::MUSHROOM_STEW());
 
  310        $this->map1to1Item(Ids::MUSIC_DISC_11, Items::RECORD_11());
 
  311        $this->map1to1Item(Ids::MUSIC_DISC_13, Items::RECORD_13());
 
  312        $this->map1to1Item(Ids::MUSIC_DISC_5, Items::RECORD_5());
 
  313        $this->map1to1Item(Ids::MUSIC_DISC_BLOCKS, Items::RECORD_BLOCKS());
 
  314        $this->map1to1Item(Ids::MUSIC_DISC_CAT, Items::RECORD_CAT());
 
  315        $this->map1to1Item(Ids::MUSIC_DISC_CHIRP, Items::RECORD_CHIRP());
 
  316        $this->map1to1Item(Ids::MUSIC_DISC_CREATOR, Items::RECORD_CREATOR());
 
  317        $this->map1to1Item(Ids::MUSIC_DISC_CREATOR_MUSIC_BOX, Items::RECORD_CREATOR_MUSIC_BOX());
 
  318        $this->map1to1Item(Ids::MUSIC_DISC_FAR, Items::RECORD_FAR());
 
  319        $this->map1to1Item(Ids::MUSIC_DISC_MALL, Items::RECORD_MALL());
 
  320        $this->map1to1Item(Ids::MUSIC_DISC_MELLOHI, Items::RECORD_MELLOHI());
 
  321        $this->map1to1Item(Ids::MUSIC_DISC_OTHERSIDE, Items::RECORD_OTHERSIDE());
 
  322        $this->map1to1Item(Ids::MUSIC_DISC_PIGSTEP, Items::RECORD_PIGSTEP());
 
  323        $this->map1to1Item(Ids::MUSIC_DISC_PRECIPICE, Items::RECORD_PRECIPICE());
 
  324        $this->map1to1Item(Ids::MUSIC_DISC_RELIC, Items::RECORD_RELIC());
 
  325        $this->map1to1Item(Ids::MUSIC_DISC_STAL, Items::RECORD_STAL());
 
  326        $this->map1to1Item(Ids::MUSIC_DISC_STRAD, Items::RECORD_STRAD());
 
  327        $this->map1to1Item(Ids::MUSIC_DISC_WAIT, Items::RECORD_WAIT());
 
  328        $this->map1to1Item(Ids::MUSIC_DISC_WARD, Items::RECORD_WARD());
 
  329        $this->map1to1Item(Ids::MUTTON, Items::RAW_MUTTON());
 
  330        $this->map1to1Item(Ids::NAME_TAG, Items::NAME_TAG());
 
  331        $this->map1to1Item(Ids::NAUTILUS_SHELL, Items::NAUTILUS_SHELL());
 
  332        $this->map1to1Item(Ids::NETHER_STAR, Items::NETHER_STAR());
 
  333        $this->map1to1Item(Ids::NETHERBRICK, Items::NETHER_BRICK());
 
  334        $this->map1to1Item(Ids::NETHERITE_AXE, Items::NETHERITE_AXE());
 
  335        $this->map1to1Item(Ids::NETHERITE_BOOTS, Items::NETHERITE_BOOTS());
 
  336        $this->map1to1Item(Ids::NETHERITE_CHESTPLATE, Items::NETHERITE_CHESTPLATE());
 
  337        $this->map1to1Item(Ids::NETHERITE_HELMET, Items::NETHERITE_HELMET());
 
  338        $this->map1to1Item(Ids::NETHERITE_HOE, Items::NETHERITE_HOE());
 
  339        $this->map1to1Item(Ids::NETHERITE_INGOT, Items::NETHERITE_INGOT());
 
  340        $this->map1to1Item(Ids::NETHERITE_LEGGINGS, Items::NETHERITE_LEGGINGS());
 
  341        $this->map1to1Item(Ids::NETHERITE_PICKAXE, Items::NETHERITE_PICKAXE());
 
  342        $this->map1to1Item(Ids::NETHERITE_SCRAP, Items::NETHERITE_SCRAP());
 
  343        $this->map1to1Item(Ids::NETHERITE_SHOVEL, Items::NETHERITE_SHOVEL());
 
  344        $this->map1to1Item(Ids::NETHERITE_SWORD, Items::NETHERITE_SWORD());
 
  345        $this->map1to1Item(Ids::NETHERITE_UPGRADE_SMITHING_TEMPLATE, Items::NETHERITE_UPGRADE_SMITHING_TEMPLATE());
 
  346        $this->map1to1Item(Ids::OAK_BOAT, Items::OAK_BOAT());
 
  347        $this->map1to1Item(Ids::OAK_HANGING_SIGN, Items::OAK_HANGING_SIGN());
 
  348        $this->map1to1Item(Ids::OAK_SIGN, Items::OAK_SIGN());
 
  349        $this->map1to1Item(Ids::PAINTING, Items::PAINTING());
 
  350        $this->map1to1Item(Ids::PALE_OAK_HANGING_SIGN, Items::PALE_OAK_HANGING_SIGN());
 
  351        $this->map1to1Item(Ids::PALE_OAK_SIGN, Items::PALE_OAK_SIGN());
 
  352        $this->map1to1Item(Ids::PAPER, Items::PAPER());
 
  353        $this->map1to1Item(Ids::PHANTOM_MEMBRANE, Items::PHANTOM_MEMBRANE());
 
  354        $this->map1to1Item(Ids::PITCHER_POD, Items::PITCHER_POD());
 
  355        $this->map1to1Item(Ids::POISONOUS_POTATO, Items::POISONOUS_POTATO());
 
  356        $this->map1to1Item(Ids::POPPED_CHORUS_FRUIT, Items::POPPED_CHORUS_FRUIT());
 
  357        $this->map1to1Item(Ids::PORKCHOP, Items::RAW_PORKCHOP());
 
  358        $this->map1to1Item(Ids::POTATO, Items::POTATO());
 
  359        $this->map1to1Item(Ids::PRISMARINE_CRYSTALS, Items::PRISMARINE_CRYSTALS());
 
  360        $this->map1to1Item(Ids::PRISMARINE_SHARD, Items::PRISMARINE_SHARD());
 
  361        $this->map1to1Item(Ids::PUFFERFISH, Items::PUFFERFISH());
 
  362        $this->map1to1Item(Ids::PUMPKIN_PIE, Items::PUMPKIN_PIE());
 
  363        $this->map1to1Item(Ids::PUMPKIN_SEEDS, Items::PUMPKIN_SEEDS());
 
  364        $this->map1to1Item(Ids::QUARTZ, Items::NETHER_QUARTZ());
 
  365        $this->map1to1Item(Ids::RABBIT, Items::RAW_RABBIT());
 
  366        $this->map1to1Item(Ids::RABBIT_FOOT, Items::RABBIT_FOOT());
 
  367        $this->map1to1Item(Ids::RABBIT_HIDE, Items::RABBIT_HIDE());
 
  368        $this->map1to1Item(Ids::RABBIT_STEW, Items::RABBIT_STEW());
 
  369        $this->map1to1Item(Ids::RAISER_ARMOR_TRIM_SMITHING_TEMPLATE, Items::RAISER_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  370        $this->map1to1Item(Ids::RAW_COPPER, Items::RAW_COPPER());
 
  371        $this->map1to1Item(Ids::RAW_GOLD, Items::RAW_GOLD());
 
  372        $this->map1to1Item(Ids::RAW_IRON, Items::RAW_IRON());
 
  373        $this->map1to1Item(Ids::RECOVERY_COMPASS, Items::RECOVERY_COMPASS());
 
  374        $this->map1to1Item(Ids::REDSTONE, Items::REDSTONE_DUST());
 
  375        $this->map1to1Item(Ids::RESIN_BRICK, Items::RESIN_BRICK());
 
  376        $this->map1to1Item(Ids::RIB_ARMOR_TRIM_SMITHING_TEMPLATE, Items::RIB_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  377        $this->map1to1Item(Ids::ROTTEN_FLESH, Items::ROTTEN_FLESH());
 
  378        $this->map1to1Item(Ids::SALMON, Items::RAW_SALMON());
 
  379        $this->map1to1Item(Ids::TURTLE_SCUTE, Items::SCUTE());
 
  380        $this->map1to1Item(Ids::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  381        $this->map1to1Item(Ids::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  382        $this->map1to1Item(Ids::SHEARS, Items::SHEARS());
 
  383        $this->map1to1Item(Ids::SHULKER_SHELL, Items::SHULKER_SHELL());
 
  384        $this->map1to1Item(Ids::SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  385        $this->map1to1Item(Ids::SLIME_BALL, Items::SLIMEBALL());
 
  386        $this->map1to1Item(Ids::SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  387        $this->map1to1Item(Ids::SNOWBALL, Items::SNOWBALL());
 
  388        $this->map1to1Item(Ids::SPIDER_EYE, Items::SPIDER_EYE());
 
  389        $this->map1to1Item(Ids::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  390        $this->map1to1Item(Ids::SPRUCE_BOAT, Items::SPRUCE_BOAT());
 
  391        $this->map1to1Item(Ids::SPRUCE_HANGING_SIGN, Items::SPRUCE_HANGING_SIGN());
 
  392        $this->map1to1Item(Ids::SPRUCE_SIGN, Items::SPRUCE_SIGN());
 
  393        $this->map1to1Item(Ids::SPYGLASS, Items::SPYGLASS());
 
  394        $this->map1to1Item(Ids::SQUID_SPAWN_EGG, Items::SQUID_SPAWN_EGG());
 
  395        $this->map1to1Item(Ids::STICK, Items::STICK());
 
  396        $this->map1to1Item(Ids::STONE_AXE, Items::STONE_AXE());
 
  397        $this->map1to1Item(Ids::STONE_HOE, Items::STONE_HOE());
 
  398        $this->map1to1Item(Ids::STONE_PICKAXE, Items::STONE_PICKAXE());
 
  399        $this->map1to1Item(Ids::STONE_SHOVEL, Items::STONE_SHOVEL());
 
  400        $this->map1to1Item(Ids::STONE_SWORD, Items::STONE_SWORD());
 
  401        $this->map1to1Item(Ids::STRING, Items::STRING());
 
  402        $this->map1to1Item(Ids::SUGAR, Items::SUGAR());
 
  403        $this->map1to1Item(Ids::SWEET_BERRIES, Items::SWEET_BERRIES());
 
  404        $this->map1to1Item(Ids::TORCHFLOWER_SEEDS, Items::TORCHFLOWER_SEEDS());
 
  405        $this->map1to1Item(Ids::TIDE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::TIDE_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  406        $this->map1to1Item(Ids::TOTEM_OF_UNDYING, Items::TOTEM());
 
  407        $this->map1to1Item(Ids::TRIDENT, Items::TRIDENT());
 
  408        $this->map1to1Item(Ids::TROPICAL_FISH, Items::CLOWNFISH());
 
  409        $this->map1to1Item(Ids::TURTLE_HELMET, Items::TURTLE_HELMET());
 
  410        $this->map1to1Item(Ids::VEX_ARMOR_TRIM_SMITHING_TEMPLATE, Items::VEX_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  411        $this->map1to1Item(Ids::VILLAGER_SPAWN_EGG, Items::VILLAGER_SPAWN_EGG());
 
  412        $this->map1to1Item(Ids::WARD_ARMOR_TRIM_SMITHING_TEMPLATE, Items::WARD_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  413        $this->map1to1Item(Ids::WARPED_HANGING_SIGN, Items::WARPED_HANGING_SIGN());
 
  414        $this->map1to1Item(Ids::WARPED_SIGN, Items::WARPED_SIGN());
 
  415        $this->map1to1Item(Ids::WATER_BUCKET, Items::WATER_BUCKET());
 
  416        $this->map1to1Item(Ids::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE, Items::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  417        $this->map1to1Item(Ids::WHEAT, Items::WHEAT());
 
  418        $this->map1to1Item(Ids::WHEAT_SEEDS, Items::WHEAT_SEEDS());
 
  419        $this->map1to1Item(Ids::WILD_ARMOR_TRIM_SMITHING_TEMPLATE, Items::WILD_ARMOR_TRIM_SMITHING_TEMPLATE());
 
  420        $this->map1to1Item(Ids::WOODEN_AXE, Items::WOODEN_AXE());
 
  421        $this->map1to1Item(Ids::WOODEN_HOE, Items::WOODEN_HOE());
 
  422        $this->map1to1Item(Ids::WOODEN_PICKAXE, Items::WOODEN_PICKAXE());
 
  423        $this->map1to1Item(Ids::WOODEN_SHOVEL, Items::WOODEN_SHOVEL());
 
  424        $this->map1to1Item(Ids::WOODEN_SWORD, Items::WOODEN_SWORD());
 
  425        $this->map1to1Item(Ids::WRITABLE_BOOK, Items::WRITABLE_BOOK());
 
  426        $this->map1to1Item(Ids::WRITTEN_BOOK, Items::WRITTEN_BOOK());
 
  427        $this->map1to1Item(Ids::ZOMBIE_SPAWN_EGG, Items::ZOMBIE_SPAWN_EGG());
 
  436    private function register1ToNItemMappings() : void{
 
  437        $this->map1ToNItem(Ids::ARROW, [
 
  441        $this->map1ToNItem(Ids::COMPOUND, [
 
  442            CompoundTypeIds::SALT => Items::CHEMICAL_SALT(),
 
  443            CompoundTypeIds::SODIUM_OXIDE => Items::CHEMICAL_SODIUM_OXIDE(),
 
  444            CompoundTypeIds::SODIUM_HYDROXIDE => Items::CHEMICAL_SODIUM_HYDROXIDE(),
 
  445            CompoundTypeIds::MAGNESIUM_NITRATE => Items::CHEMICAL_MAGNESIUM_NITRATE(),
 
  446            CompoundTypeIds::IRON_SULPHIDE => Items::CHEMICAL_IRON_SULPHIDE(),
 
  447            CompoundTypeIds::LITHIUM_HYDRIDE => Items::CHEMICAL_LITHIUM_HYDRIDE(),
 
  448            CompoundTypeIds::SODIUM_HYDRIDE => Items::CHEMICAL_SODIUM_HYDRIDE(),
 
  449            CompoundTypeIds::CALCIUM_BROMIDE => Items::CHEMICAL_CALCIUM_BROMIDE(),
 
  450            CompoundTypeIds::MAGNESIUM_OXIDE => Items::CHEMICAL_MAGNESIUM_OXIDE(),
 
  451            CompoundTypeIds::SODIUM_ACETATE => Items::CHEMICAL_SODIUM_ACETATE(),
 
  452            CompoundTypeIds::LUMINOL => Items::CHEMICAL_LUMINOL(),
 
  453            CompoundTypeIds::CHARCOAL => Items::CHEMICAL_CHARCOAL(),
 
  454            CompoundTypeIds::SUGAR => Items::CHEMICAL_SUGAR(),
 
  455            CompoundTypeIds::ALUMINIUM_OXIDE => Items::CHEMICAL_ALUMINIUM_OXIDE(),
 
  456            CompoundTypeIds::BORON_TRIOXIDE => Items::CHEMICAL_BORON_TRIOXIDE(),
 
  457            CompoundTypeIds::SOAP => Items::CHEMICAL_SOAP(),
 
  458            CompoundTypeIds::POLYETHYLENE => Items::CHEMICAL_POLYETHYLENE(),
 
  459            CompoundTypeIds::RUBBISH => Items::CHEMICAL_RUBBISH(),
 
  460            CompoundTypeIds::MAGNESIUM_SALTS => Items::CHEMICAL_MAGNESIUM_SALTS(),
 
  461            CompoundTypeIds::SULPHATE => Items::CHEMICAL_SULPHATE(),
 
  462            CompoundTypeIds::BARIUM_SULPHATE => Items::CHEMICAL_BARIUM_SULPHATE(),
 
  463            CompoundTypeIds::POTASSIUM_CHLORIDE => Items::CHEMICAL_POTASSIUM_CHLORIDE(),
 
  464            CompoundTypeIds::MERCURIC_CHLORIDE => Items::CHEMICAL_MERCURIC_CHLORIDE(),
 
  465            CompoundTypeIds::CERIUM_CHLORIDE => Items::CHEMICAL_CERIUM_CHLORIDE(),
 
  466            CompoundTypeIds::TUNGSTEN_CHLORIDE => Items::CHEMICAL_TUNGSTEN_CHLORIDE(),
 
  467            CompoundTypeIds::CALCIUM_CHLORIDE => Items::CHEMICAL_CALCIUM_CHLORIDE(),
 
  468            CompoundTypeIds::WATER => Items::CHEMICAL_WATER(),
 
  469            CompoundTypeIds::GLUE => Items::CHEMICAL_GLUE(),
 
  470            CompoundTypeIds::HYPOCHLORITE => Items::CHEMICAL_HYPOCHLORITE(),
 
  471            CompoundTypeIds::CRUDE_OIL => Items::CHEMICAL_CRUDE_OIL(),
 
  472            CompoundTypeIds::LATEX => Items::CHEMICAL_LATEX(),
 
  473            CompoundTypeIds::POTASSIUM_IODIDE => Items::CHEMICAL_POTASSIUM_IODIDE(),
 
  474            CompoundTypeIds::SODIUM_FLUORIDE => Items::CHEMICAL_SODIUM_FLUORIDE(),
 
  475            CompoundTypeIds::BENZENE => Items::CHEMICAL_BENZENE(),
 
  476            CompoundTypeIds::INK => Items::CHEMICAL_INK(),
 
  477            CompoundTypeIds::HYDROGEN_PEROXIDE => Items::CHEMICAL_HYDROGEN_PEROXIDE(),
 
  478            CompoundTypeIds::AMMONIA => Items::CHEMICAL_AMMONIA(),
 
  479            CompoundTypeIds::SODIUM_HYPOCHLORITE => Items::CHEMICAL_SODIUM_HYPOCHLORITE(),
 
  488    private function register1to1BlockWithMetaMappings() : void{
 
  489        $this->map1to1BlockWithMeta(
 
  492            function(Bed $block, int $meta) : void{
 
  493                $block->setColor(DyeColorIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException(
"Unknown bed color ID $meta"));
 
  495            fn(Bed $block) => DyeColorIdMap::getInstance()->toId($block->getColor())
 
  504    private function register1to1ItemWithMetaMappings() : void{
 
  505        $this->map1to1ItemWithMeta(
 
  507            Items::FIREWORK_STAR(),
 
  508            function(FireworkStar $item, int $meta) : void{
 
  511            fn(FireworkStar $item) => DyeColorIdMap::getInstance()->toInvertedId($item->getExplosion()->getFlashColor())
 
  513        $this->map1to1ItemWithMeta(
 
  516            function(GoatHorn $item, 
int $meta) : 
void{
 
  517                $item->setHornType(GoatHornTypeIdMap::getInstance()->fromId($meta) ?? 
throw new ItemTypeDeserializeException(
"Unknown goat horn type ID $meta"));
 
  519            fn(GoatHorn $item) => GoatHornTypeIdMap::getInstance()->toId($item->getHornType())
 
  521        $this->map1to1ItemWithMeta(
 
  522            Ids::LINGERING_POTION,
 
  523            Items::LINGERING_POTION(),
 
  524            function(SplashPotion $item, 
int $meta) : 
void{
 
  525                $item->setType(PotionTypeIdMap::getInstance()->fromId($meta) ?? 
throw new ItemTypeDeserializeException(
"Unknown potion type ID $meta"));
 
  527            fn(SplashPotion $item) => PotionTypeIdMap::getInstance()->toId($item->getType())
 
  529        $this->map1to1ItemWithMeta(
 
  532            function(Medicine $item, 
int $meta) : 
void{
 
  533                $item->setType(MedicineTypeIdMap::getInstance()->fromId($meta) ?? 
throw new ItemTypeDeserializeException(
"Unknown medicine type ID $meta"));
 
  535            fn(Medicine $item) => MedicineTypeIdMap::getInstance()->toId($item->getType())
 
  537        $this->map1to1ItemWithMeta(
 
  540            function(Potion $item, 
int $meta) : 
void{
 
  541                $item->setType(PotionTypeIdMap::getInstance()->fromId($meta) ?? 
throw new ItemTypeDeserializeException(
"Unknown potion type ID $meta"));
 
  543            fn(Potion $item) => PotionTypeIdMap::getInstance()->toId($item->getType())
 
  545        $this->map1to1ItemWithMeta(
 
  547            Items::SPLASH_POTION(),
 
  548            function(SplashPotion $item, 
int $meta) : 
void{
 
  549                $item->setType(PotionTypeIdMap::getInstance()->fromId($meta) ?? 
throw new ItemTypeDeserializeException(
"Unknown potion type ID $meta"));
 
  551            fn(SplashPotion $item) => PotionTypeIdMap::getInstance()->toId($item->getType())
 
  553        $this->map1to1ItemWithMeta(
 
  554            Ids::SUSPICIOUS_STEW,
 
  555            Items::SUSPICIOUS_STEW(),
 
  556            function(SuspiciousStew $item, 
int $meta) : 
void{
 
  557                $item->setType(SuspiciousStewTypeIdMap::getInstance()->fromId($meta) ?? 
throw new ItemTypeDeserializeException(
"Unknown suspicious stew type ID $meta"));
 
  559            fn(SuspiciousStew $item) => SuspiciousStewTypeIdMap::getInstance()->toId($item->getType())
 
  570    private function registerMiscItemMappings() : void{
 
  571        foreach(DyeColor::cases() as $color){
 
  572            $id = DyeColorIdMap::getInstance()->toItemId($color);
 
  573            $this->deserializer?->map($id, fn() => Items::DYE()->setColor($color));
 
  575        $this->serializer?->map(Items::DYE(), fn(Dye $item) => 
new Data(DyeColorIdMap::getInstance()->toItemId($item->getColor())));
 
  577        $this->deserializer?->map(Ids::BANNER, 
function(Data $data) : Item{
 
  578            $type = $data->getTag()?->getInt(TileBanner::TAG_TYPE, TileBanner::TYPE_NORMAL) ?? TileBanner::TYPE_NORMAL;
 
  579            if($type === TileBanner::TYPE_OMINOUS){
 
  580                return Items::OMINOUS_BANNER();
 
  582            $color = DyeColorIdMap::getInstance()->fromInvertedId($data->getMeta()) ?? 
throw new ItemTypeDeserializeException(
"Unknown banner meta " . $data->getMeta());
 
  583            return Items::BANNER()->setColor($color);
 
  585        $this->serializer?->map(Items::OMINOUS_BANNER(), fn() => 
new Data(Ids::BANNER, tag: CompoundTag::create()
 
  586            ->setInt(TileBanner::TAG_TYPE, TileBanner::TYPE_OMINOUS))
 
  588        $this->serializer?->map(Items::BANNER(), 
function(Banner $item) : Data{
 
  589            return new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()));
 
  600    private function registerMiscBlockMappings() : void{
 
  601        $copperDoorStateIdMap = [];
 
  603            [Ids::COPPER_DOOR, CopperOxidation::NONE, 
false],
 
  604            [Ids::EXPOSED_COPPER_DOOR, CopperOxidation::EXPOSED, 
false],
 
  605            [Ids::WEATHERED_COPPER_DOOR, CopperOxidation::WEATHERED, 
false],
 
  606            [Ids::OXIDIZED_COPPER_DOOR, CopperOxidation::OXIDIZED, 
false],
 
  607            [Ids::WAXED_COPPER_DOOR, CopperOxidation::NONE, 
true],
 
  608            [Ids::WAXED_EXPOSED_COPPER_DOOR, CopperOxidation::EXPOSED, 
true],
 
  609            [Ids::WAXED_WEATHERED_COPPER_DOOR, CopperOxidation::WEATHERED, 
true],
 
  610            [Ids::WAXED_OXIDIZED_COPPER_DOOR, CopperOxidation::OXIDIZED, 
true]
 
  611        ] as [$id, $oxidation, $waxed]) {
 
  612            $copperDoorStateIdMap[$oxidation->value][$waxed ? 1 : 0] = $id;
 
  613            $this->deserializer?->mapBlock($id, fn() => Blocks::COPPER_DOOR()->setOxidation($oxidation)->setWaxed($waxed));
 
  615        $this->serializer?->mapBlock(Blocks::COPPER_DOOR(), fn(CopperDoor $block) => 
new Data($copperDoorStateIdMap[$block->getOxidation()->value][$block->isWaxed() ? 1 : 0]));