diff --git a/src/data/bedrock/DyeColorIdMap.php b/src/data/bedrock/DyeColorIdMap.php index 112ffe937..63ee67b4b 100644 --- a/src/data/bedrock/DyeColorIdMap.php +++ b/src/data/bedrock/DyeColorIdMap.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock; use pocketmine\block\utils\DyeColor; +use pocketmine\data\bedrock\item\ItemTypeNames; use pocketmine\utils\SingletonTrait; final class DyeColorIdMap{ @@ -41,28 +42,42 @@ final class DyeColorIdMap{ */ private array $enumToId = []; + /** + * @var DyeColor[] + * @phpstan-var array + */ + private array $itemIdToEnum = []; + + /** + * @var string[] + * @phpstan-var array + */ + private array $enumToItemId = []; + private function __construct(){ - $this->register(0, DyeColor::WHITE()); - $this->register(1, DyeColor::ORANGE()); - $this->register(2, DyeColor::MAGENTA()); - $this->register(3, DyeColor::LIGHT_BLUE()); - $this->register(4, DyeColor::YELLOW()); - $this->register(5, DyeColor::LIME()); - $this->register(6, DyeColor::PINK()); - $this->register(7, DyeColor::GRAY()); - $this->register(8, DyeColor::LIGHT_GRAY()); - $this->register(9, DyeColor::CYAN()); - $this->register(10, DyeColor::PURPLE()); - $this->register(11, DyeColor::BLUE()); - $this->register(12, DyeColor::BROWN()); - $this->register(13, DyeColor::GREEN()); - $this->register(14, DyeColor::RED()); - $this->register(15, DyeColor::BLACK()); + $this->register(0, ItemTypeNames::WHITE_DYE, DyeColor::WHITE()); + $this->register(1, ItemTypeNames::ORANGE_DYE, DyeColor::ORANGE()); + $this->register(2, ItemTypeNames::MAGENTA_DYE, DyeColor::MAGENTA()); + $this->register(3, ItemTypeNames::LIGHT_BLUE_DYE, DyeColor::LIGHT_BLUE()); + $this->register(4, ItemTypeNames::YELLOW_DYE, DyeColor::YELLOW()); + $this->register(5, ItemTypeNames::LIME_DYE, DyeColor::LIME()); + $this->register(6, ItemTypeNames::PINK_DYE, DyeColor::PINK()); + $this->register(7, ItemTypeNames::GRAY_DYE, DyeColor::GRAY()); + $this->register(8, ItemTypeNames::LIGHT_GRAY_DYE, DyeColor::LIGHT_GRAY()); + $this->register(9, ItemTypeNames::CYAN_DYE, DyeColor::CYAN()); + $this->register(10, ItemTypeNames::PURPLE_DYE, DyeColor::PURPLE()); + $this->register(11, ItemTypeNames::BLUE_DYE, DyeColor::BLUE()); + $this->register(12, ItemTypeNames::BROWN_DYE, DyeColor::BROWN()); + $this->register(13, ItemTypeNames::GREEN_DYE, DyeColor::GREEN()); + $this->register(14, ItemTypeNames::RED_DYE, DyeColor::RED()); + $this->register(15, ItemTypeNames::BLACK_DYE, DyeColor::BLACK()); } - private function register(int $id, DyeColor $color) : void{ + private function register(int $id, string $itemId, DyeColor $color) : void{ $this->idToEnum[$id] = $color; $this->enumToId[$color->id()] = $id; + $this->itemIdToEnum[$itemId] = $color; + $this->enumToItemId[$color->id()] = $itemId; } public function toId(DyeColor $color) : int{ @@ -73,6 +88,10 @@ final class DyeColorIdMap{ return ~$this->toId($color) & 0xf; } + public function toItemId(DyeColor $color) : string{ + return $this->enumToItemId[$color->id()]; + } + public function fromId(int $id) : ?DyeColor{ return $this->idToEnum[$id]; } @@ -80,4 +99,8 @@ final class DyeColorIdMap{ public function fromInvertedId(int $id) : ?DyeColor{ return $this->fromId(~$id & 0xf); } + + public function fromItemId(string $itemId) : ?DyeColor{ + return $this->itemIdToEnum[$itemId] ?? null; + } } diff --git a/src/data/bedrock/item/ItemDeserializer.php b/src/data/bedrock/item/ItemDeserializer.php index d846b741b..bde907d4e 100644 --- a/src/data/bedrock/item/ItemDeserializer.php +++ b/src/data/bedrock/item/ItemDeserializer.php @@ -25,21 +25,12 @@ namespace pocketmine\data\bedrock\item; use pocketmine\block\Block; use pocketmine\block\BlockFactory; -use pocketmine\block\utils\DyeColor; -use pocketmine\block\utils\SkullType; -use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateDeserializer; use pocketmine\data\bedrock\block\convert\UnsupportedBlockStateException; -use pocketmine\data\bedrock\CompoundTypeIds; -use pocketmine\data\bedrock\DyeColorIdMap; -use pocketmine\data\bedrock\item\ItemTypeNames as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; -use pocketmine\data\bedrock\PotionTypeIdMap; -use pocketmine\data\bedrock\SuspiciousStewTypeIdMap; use pocketmine\item\Durable; use pocketmine\item\Item; -use pocketmine\item\VanillaItems as Items; use pocketmine\nbt\NbtException; use function min; @@ -53,7 +44,7 @@ final class ItemDeserializer{ public function __construct( private BlockStateDeserializer $blockStateDeserializer ){ - $this->registerDeserializers(); + new ItemSerializerDeserializerRegistrar($this, null); } /** @@ -119,484 +110,4 @@ final class ItemDeserializer{ return $itemStack; } - - private function registerSpecialBlockDeserializers() : void{ - $this->mapBlock(Ids::ACACIA_DOOR, fn() => Blocks::ACACIA_DOOR()); - $this->mapBlock(Ids::BIRCH_DOOR, fn() => Blocks::BIRCH_DOOR()); - $this->mapBlock(Ids::BREWING_STAND, fn() => Blocks::BREWING_STAND()); - $this->mapBlock(Ids::CAKE, fn() => Blocks::CAKE()); - $this->mapBlock(Ids::CAULDRON, fn() => Blocks::CAULDRON()); - $this->mapBlock(Ids::COMPARATOR, fn() => Blocks::REDSTONE_COMPARATOR()); - $this->mapBlock(Ids::CRIMSON_DOOR, fn() => Blocks::CRIMSON_DOOR()); - $this->mapBlock(Ids::DARK_OAK_DOOR, fn() => Blocks::DARK_OAK_DOOR()); - $this->mapBlock(Ids::FLOWER_POT, fn() => Blocks::FLOWER_POT()); - $this->mapBlock(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)); - $this->mapBlock(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)); - $this->mapBlock(Ids::HOPPER, fn() => Blocks::HOPPER()); - $this->mapBlock(Ids::IRON_DOOR, fn() => Blocks::IRON_DOOR()); - $this->mapBlock(Ids::JUNGLE_DOOR, fn() => Blocks::JUNGLE_DOOR()); - $this->mapBlock(Ids::MANGROVE_DOOR, fn() => Blocks::MANGROVE_DOOR()); - $this->mapBlock(Ids::NETHER_WART, fn() => Blocks::NETHER_WART()); - $this->mapBlock(Ids::REPEATER, fn() => Blocks::REDSTONE_REPEATER()); - $this->mapBlock(Ids::SPRUCE_DOOR, fn() => Blocks::SPRUCE_DOOR()); - $this->mapBlock(Ids::SUGAR_CANE, fn() => Blocks::SUGARCANE()); - $this->mapBlock(Ids::WARPED_DOOR, fn() => Blocks::WARPED_DOOR()); - $this->mapBlock(Ids::WOODEN_DOOR, fn() => Blocks::OAK_DOOR()); - - $this->mapBlock(Ids::BED, function(Data $data) : Block{ - $meta = $data->getMeta(); - $color = DyeColorIdMap::getInstance()->fromId($meta); - if($color === null){ - throw new ItemTypeDeserializeException("Unknown bed meta $meta"); - } - return Blocks::BED()->setColor($color); - }); - $this->mapBlock(Ids::SKULL, function(Data $data) : Block{ - $meta = $data->getMeta(); - try{ - $skullType = SkullType::fromMagicNumber($meta); - }catch(\InvalidArgumentException $e){ - throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); - } - return Blocks::MOB_HEAD()->setSkullType($skullType); - }); - } - - private function registerDeserializers() : void{ - $this->registerSpecialBlockDeserializers(); - - $this->map(Ids::ACACIA_BOAT, fn() => Items::ACACIA_BOAT()); - $this->map(Ids::ACACIA_SIGN, fn() => Items::ACACIA_SIGN()); - //TODO: minecraft:agent_spawn_egg - //TODO: minecraft:allay_spawn_egg - $this->map(Ids::AMETHYST_SHARD, fn() => Items::AMETHYST_SHARD()); - $this->map(Ids::APPLE, fn() => Items::APPLE()); - //TODO: minecraft:armor_stand - $this->map(Ids::ARROW, function(Data $data) : Item{ - if($data->getMeta() === 0){ - return Items::ARROW(); - } - throw new ItemTypeDeserializeException("Tipped arrows are not implemented yet"); - }); - //TODO: minecraft:axolotl_bucket - //TODO: minecraft:axolotl_spawn_egg - $this->map(Ids::BAKED_POTATO, fn() => Items::BAKED_POTATO()); - //TODO: minecraft:balloon - $this->map(Ids::BANNER, function(Data $data) : Item{ - $meta = $data->getMeta(); - $color = DyeColorIdMap::getInstance()->fromInvertedId($meta); - if($color === null){ - throw new ItemTypeDeserializeException("Unknown banner meta $meta"); - } - return Items::BANNER()->setColor($color); - }); - //TODO: minecraft:banner_pattern - //TODO: minecraft:bat_spawn_egg - //TODO: minecraft:bee_spawn_egg - $this->map(Ids::BEEF, fn() => Items::RAW_BEEF()); - $this->map(Ids::BEETROOT, fn() => Items::BEETROOT()); - $this->map(Ids::BEETROOT_SEEDS, fn() => Items::BEETROOT_SEEDS()); - $this->map(Ids::BEETROOT_SOUP, fn() => Items::BEETROOT_SOUP()); - $this->map(Ids::BIRCH_BOAT, fn() => Items::BIRCH_BOAT()); - $this->map(Ids::BIRCH_SIGN, fn() => Items::BIRCH_SIGN()); - $this->map(Ids::BLACK_DYE, fn() => Items::DYE()->setColor(DyeColor::BLACK())); - $this->map(Ids::BLAZE_POWDER, fn() => Items::BLAZE_POWDER()); - $this->map(Ids::BLAZE_ROD, fn() => Items::BLAZE_ROD()); - //TODO: minecraft:blaze_spawn_egg - $this->map(Ids::BLEACH, fn() => Items::BLEACH()); - $this->map(Ids::BLUE_DYE, fn() => Items::DYE()->setColor(DyeColor::BLUE())); - $this->map(Ids::BONE, fn() => Items::BONE()); - $this->map(Ids::BONE_MEAL, fn() => Items::BONE_MEAL()); - $this->map(Ids::BOOK, fn() => Items::BOOK()); - //TODO: minecraft:bordure_indented_banner_pattern - $this->map(Ids::BOW, fn() => Items::BOW()); - $this->map(Ids::BOWL, fn() => Items::BOWL()); - $this->map(Ids::BREAD, fn() => Items::BREAD()); - $this->map(Ids::BRICK, fn() => Items::BRICK()); - $this->map(Ids::BROWN_DYE, fn() => Items::DYE()->setColor(DyeColor::BROWN())); - $this->map(Ids::BUCKET, fn() => Items::BUCKET()); - //TODO: minecraft:camera - //TODO: minecraft:campfire - $this->map(Ids::CARROT, fn() => Items::CARROT()); - //TODO: minecraft:carrot_on_a_stick - //TODO: minecraft:cat_spawn_egg - //TODO: minecraft:cave_spider_spawn_egg - //TODO: minecraft:chain - $this->map(Ids::CHAINMAIL_BOOTS, fn() => Items::CHAINMAIL_BOOTS()); - $this->map(Ids::CHAINMAIL_CHESTPLATE, fn() => Items::CHAINMAIL_CHESTPLATE()); - $this->map(Ids::CHAINMAIL_HELMET, fn() => Items::CHAINMAIL_HELMET()); - $this->map(Ids::CHAINMAIL_LEGGINGS, fn() => Items::CHAINMAIL_LEGGINGS()); - $this->map(Ids::CHARCOAL, fn() => Items::CHARCOAL()); - //TODO: minecraft:chest_minecart - $this->map(Ids::CHICKEN, fn() => Items::RAW_CHICKEN()); - //TODO: minecraft:chicken_spawn_egg - $this->map(Ids::CHORUS_FRUIT, fn() => Items::CHORUS_FRUIT()); - $this->map(Ids::CLAY_BALL, fn() => Items::CLAY()); - $this->map(Ids::CLOCK, fn() => Items::CLOCK()); - $this->map(Ids::COAL, fn() => Items::COAL()); - $this->map(Ids::COCOA_BEANS, fn() => Items::COCOA_BEANS()); - $this->map(Ids::COD, fn() => Items::RAW_FISH()); - //TODO: minecraft:cod_bucket - //TODO: minecraft:cod_spawn_egg - //TODO: minecraft:command_block_minecart - $this->map(Ids::COMPASS, fn() => Items::COMPASS()); - $this->map(Ids::COMPOUND, fn(Data $data) => match($data->getMeta()){ - CompoundTypeIds::SALT => Items::CHEMICAL_SALT(), - CompoundTypeIds::SODIUM_OXIDE => Items::CHEMICAL_SODIUM_OXIDE(), - CompoundTypeIds::SODIUM_HYDROXIDE => Items::CHEMICAL_SODIUM_HYDROXIDE(), - CompoundTypeIds::MAGNESIUM_NITRATE => Items::CHEMICAL_MAGNESIUM_NITRATE(), - CompoundTypeIds::IRON_SULPHIDE => Items::CHEMICAL_IRON_SULPHIDE(), - CompoundTypeIds::LITHIUM_HYDRIDE => Items::CHEMICAL_LITHIUM_HYDRIDE(), - CompoundTypeIds::SODIUM_HYDRIDE => Items::CHEMICAL_SODIUM_HYDRIDE(), - CompoundTypeIds::CALCIUM_BROMIDE => Items::CHEMICAL_CALCIUM_BROMIDE(), - CompoundTypeIds::MAGNESIUM_OXIDE => Items::CHEMICAL_MAGNESIUM_OXIDE(), - CompoundTypeIds::SODIUM_ACETATE => Items::CHEMICAL_SODIUM_ACETATE(), - CompoundTypeIds::LUMINOL => Items::CHEMICAL_LUMINOL(), - CompoundTypeIds::CHARCOAL => Items::CHEMICAL_CHARCOAL(), - CompoundTypeIds::SUGAR => Items::CHEMICAL_SUGAR(), - CompoundTypeIds::ALUMINIUM_OXIDE => Items::CHEMICAL_ALUMINIUM_OXIDE(), - CompoundTypeIds::BORON_TRIOXIDE => Items::CHEMICAL_BORON_TRIOXIDE(), - CompoundTypeIds::SOAP => Items::CHEMICAL_SOAP(), - CompoundTypeIds::POLYETHYLENE => Items::CHEMICAL_POLYETHYLENE(), - CompoundTypeIds::RUBBISH => Items::CHEMICAL_RUBBISH(), - CompoundTypeIds::MAGNESIUM_SALTS => Items::CHEMICAL_MAGNESIUM_SALTS(), - CompoundTypeIds::SULPHATE => Items::CHEMICAL_SULPHATE(), - CompoundTypeIds::BARIUM_SULPHATE => Items::CHEMICAL_BARIUM_SULPHATE(), - CompoundTypeIds::POTASSIUM_CHLORIDE => Items::CHEMICAL_POTASSIUM_CHLORIDE(), - CompoundTypeIds::MERCURIC_CHLORIDE => Items::CHEMICAL_MERCURIC_CHLORIDE(), - CompoundTypeIds::CERIUM_CHLORIDE => Items::CHEMICAL_CERIUM_CHLORIDE(), - CompoundTypeIds::TUNGSTEN_CHLORIDE => Items::CHEMICAL_TUNGSTEN_CHLORIDE(), - CompoundTypeIds::CALCIUM_CHLORIDE => Items::CHEMICAL_CALCIUM_CHLORIDE(), - CompoundTypeIds::WATER => Items::CHEMICAL_WATER(), - CompoundTypeIds::GLUE => Items::CHEMICAL_GLUE(), - CompoundTypeIds::HYPOCHLORITE => Items::CHEMICAL_HYPOCHLORITE(), - CompoundTypeIds::CRUDE_OIL => Items::CHEMICAL_CRUDE_OIL(), - CompoundTypeIds::LATEX => Items::CHEMICAL_LATEX(), - CompoundTypeIds::POTASSIUM_IODIDE => Items::CHEMICAL_POTASSIUM_IODIDE(), - CompoundTypeIds::SODIUM_FLUORIDE => Items::CHEMICAL_SODIUM_FLUORIDE(), - CompoundTypeIds::BENZENE => Items::CHEMICAL_BENZENE(), - CompoundTypeIds::INK => Items::CHEMICAL_INK(), - CompoundTypeIds::HYDROGEN_PEROXIDE => Items::CHEMICAL_HYDROGEN_PEROXIDE(), - CompoundTypeIds::AMMONIA => Items::CHEMICAL_AMMONIA(), - CompoundTypeIds::SODIUM_HYPOCHLORITE => Items::CHEMICAL_SODIUM_HYPOCHLORITE(), - default => throw new ItemTypeDeserializeException("Unknown chemical meta " . $data->getMeta()) - }); - $this->map(Ids::COOKED_BEEF, fn() => Items::STEAK()); - $this->map(Ids::COOKED_CHICKEN, fn() => Items::COOKED_CHICKEN()); - $this->map(Ids::COOKED_COD, fn() => Items::COOKED_FISH()); - $this->map(Ids::COOKED_MUTTON, fn() => Items::COOKED_MUTTON()); - $this->map(Ids::COOKED_PORKCHOP, fn() => Items::COOKED_PORKCHOP()); - $this->map(Ids::COOKED_RABBIT, fn() => Items::COOKED_RABBIT()); - $this->map(Ids::COOKED_SALMON, fn() => Items::COOKED_SALMON()); - $this->map(Ids::COOKIE, fn() => Items::COOKIE()); - $this->map(Ids::COPPER_INGOT, fn() => Items::COPPER_INGOT()); - //TODO: minecraft:cow_spawn_egg - //TODO: minecraft:creeper_banner_pattern - //TODO: minecraft:creeper_spawn_egg - $this->map(Ids::CRIMSON_SIGN, fn() => Items::CRIMSON_SIGN()); - //TODO: minecraft:crossbow - $this->map(Ids::CYAN_DYE, fn() => Items::DYE()->setColor(DyeColor::CYAN())); - $this->map(Ids::DARK_OAK_BOAT, fn() => Items::DARK_OAK_BOAT()); - $this->map(Ids::DARK_OAK_SIGN, fn() => Items::DARK_OAK_SIGN()); - $this->map(Ids::DIAMOND, fn() => Items::DIAMOND()); - $this->map(Ids::DIAMOND_AXE, fn() => Items::DIAMOND_AXE()); - $this->map(Ids::DIAMOND_BOOTS, fn() => Items::DIAMOND_BOOTS()); - $this->map(Ids::DIAMOND_CHESTPLATE, fn() => Items::DIAMOND_CHESTPLATE()); - $this->map(Ids::DIAMOND_HELMET, fn() => Items::DIAMOND_HELMET()); - $this->map(Ids::DIAMOND_HOE, fn() => Items::DIAMOND_HOE()); - //TODO: minecraft:diamond_horse_armor - $this->map(Ids::DIAMOND_LEGGINGS, fn() => Items::DIAMOND_LEGGINGS()); - $this->map(Ids::DIAMOND_PICKAXE, fn() => Items::DIAMOND_PICKAXE()); - $this->map(Ids::DIAMOND_SHOVEL, fn() => Items::DIAMOND_SHOVEL()); - $this->map(Ids::DIAMOND_SWORD, fn() => Items::DIAMOND_SWORD()); - $this->map(Ids::DISC_FRAGMENT_5, fn() => Items::DISC_FRAGMENT_5()); - //TODO: minecraft:dolphin_spawn_egg - //TODO: minecraft:donkey_spawn_egg - $this->map(Ids::DRAGON_BREATH, fn() => Items::DRAGON_BREATH()); - $this->map(Ids::DRIED_KELP, fn() => Items::DRIED_KELP()); - //TODO: minecraft:drowned_spawn_egg - $this->map(Ids::ECHO_SHARD, fn() => Items::ECHO_SHARD()); - $this->map(Ids::EGG, fn() => Items::EGG()); - //TODO: minecraft:elder_guardian_spawn_egg - //TODO: minecraft:elytra - $this->map(Ids::EMERALD, fn() => Items::EMERALD()); - //TODO: minecraft:empty_map - //TODO: minecraft:enchanted_book - $this->map(Ids::ENCHANTED_GOLDEN_APPLE, fn() => Items::ENCHANTED_GOLDEN_APPLE()); - //TODO: minecraft:end_crystal - //TODO: minecraft:ender_eye - $this->map(Ids::ENDER_PEARL, fn() => Items::ENDER_PEARL()); - //TODO: minecraft:enderman_spawn_egg - //TODO: minecraft:endermite_spawn_egg - //TODO: minecraft:evoker_spawn_egg - $this->map(Ids::EXPERIENCE_BOTTLE, fn() => Items::EXPERIENCE_BOTTLE()); - $this->map(Ids::FEATHER, fn() => Items::FEATHER()); - $this->map(Ids::FERMENTED_SPIDER_EYE, fn() => Items::FERMENTED_SPIDER_EYE()); - //TODO: minecraft:field_masoned_banner_pattern - //TODO: minecraft:filled_map - $this->map(Ids::FIRE_CHARGE, fn() => Items::FIRE_CHARGE()); - //TODO: minecraft:firefly_spawn_egg - //TODO: minecraft:firework_rocket - //TODO: minecraft:firework_star - $this->map(Ids::FISHING_ROD, fn() => Items::FISHING_ROD()); - $this->map(Ids::FLINT, fn() => Items::FLINT()); - $this->map(Ids::FLINT_AND_STEEL, fn() => Items::FLINT_AND_STEEL()); - //TODO: minecraft:flower_banner_pattern - //TODO: minecraft:fox_spawn_egg - //TODO: minecraft:frog_spawn_egg - //TODO: minecraft:ghast_spawn_egg - $this->map(Ids::GHAST_TEAR, fn() => Items::GHAST_TEAR()); - $this->map(Ids::GLASS_BOTTLE, fn() => Items::GLASS_BOTTLE()); - $this->map(Ids::GLISTERING_MELON_SLICE, fn() => Items::GLISTERING_MELON()); - //TODO: minecraft:globe_banner_pattern - //TODO: minecraft:glow_berries - $this->map(Ids::GLOW_INK_SAC, fn() => Items::GLOW_INK_SAC()); - //TODO: minecraft:glow_squid_spawn_egg - //TODO: minecraft:glow_stick - $this->map(Ids::GLOWSTONE_DUST, fn() => Items::GLOWSTONE_DUST()); - //TODO: minecraft:goat_horn - //TODO: minecraft:goat_spawn_egg - $this->map(Ids::GOLD_INGOT, fn() => Items::GOLD_INGOT()); - $this->map(Ids::GOLD_NUGGET, fn() => Items::GOLD_NUGGET()); - $this->map(Ids::GOLDEN_APPLE, fn() => Items::GOLDEN_APPLE()); - $this->map(Ids::GOLDEN_AXE, fn() => Items::GOLDEN_AXE()); - $this->map(Ids::GOLDEN_BOOTS, fn() => Items::GOLDEN_BOOTS()); - $this->map(Ids::GOLDEN_CARROT, fn() => Items::GOLDEN_CARROT()); - $this->map(Ids::GOLDEN_CHESTPLATE, fn() => Items::GOLDEN_CHESTPLATE()); - $this->map(Ids::GOLDEN_HELMET, fn() => Items::GOLDEN_HELMET()); - $this->map(Ids::GOLDEN_HOE, fn() => Items::GOLDEN_HOE()); - //TODO: minecraft:golden_horse_armor - $this->map(Ids::GOLDEN_LEGGINGS, fn() => Items::GOLDEN_LEGGINGS()); - $this->map(Ids::GOLDEN_PICKAXE, fn() => Items::GOLDEN_PICKAXE()); - $this->map(Ids::GOLDEN_SHOVEL, fn() => Items::GOLDEN_SHOVEL()); - $this->map(Ids::GOLDEN_SWORD, fn() => Items::GOLDEN_SWORD()); - $this->map(Ids::GRAY_DYE, fn() => Items::DYE()->setColor(DyeColor::GRAY())); - $this->map(Ids::GREEN_DYE, fn() => Items::DYE()->setColor(DyeColor::GREEN())); - //TODO: minecraft:guardian_spawn_egg - $this->map(Ids::GUNPOWDER, fn() => Items::GUNPOWDER()); - $this->map(Ids::HEART_OF_THE_SEA, fn() => Items::HEART_OF_THE_SEA()); - //TODO: minecraft:hoglin_spawn_egg - $this->map(Ids::HONEY_BOTTLE, fn() => Items::HONEY_BOTTLE()); - $this->map(Ids::HONEYCOMB, fn() => Items::HONEYCOMB()); - //TODO: minecraft:hopper_minecart - //TODO: minecraft:horse_spawn_egg - //TODO: minecraft:husk_spawn_egg - //TODO: minecraft:ice_bomb - $this->map(Ids::INK_SAC, fn() => Items::INK_SAC()); - $this->map(Ids::IRON_AXE, fn() => Items::IRON_AXE()); - $this->map(Ids::IRON_BOOTS, fn() => Items::IRON_BOOTS()); - $this->map(Ids::IRON_CHESTPLATE, fn() => Items::IRON_CHESTPLATE()); - $this->map(Ids::IRON_HELMET, fn() => Items::IRON_HELMET()); - $this->map(Ids::IRON_HOE, fn() => Items::IRON_HOE()); - //TODO: minecraft:iron_horse_armor - $this->map(Ids::IRON_INGOT, fn() => Items::IRON_INGOT()); - $this->map(Ids::IRON_LEGGINGS, fn() => Items::IRON_LEGGINGS()); - $this->map(Ids::IRON_NUGGET, fn() => Items::IRON_NUGGET()); - $this->map(Ids::IRON_PICKAXE, fn() => Items::IRON_PICKAXE()); - $this->map(Ids::IRON_SHOVEL, fn() => Items::IRON_SHOVEL()); - $this->map(Ids::IRON_SWORD, fn() => Items::IRON_SWORD()); - $this->map(Ids::JUNGLE_BOAT, fn() => Items::JUNGLE_BOAT()); - $this->map(Ids::JUNGLE_SIGN, fn() => Items::JUNGLE_SIGN()); - //TODO: minecraft:kelp - $this->map(Ids::LAPIS_LAZULI, fn() => Items::LAPIS_LAZULI()); - $this->map(Ids::LAVA_BUCKET, fn() => Items::LAVA_BUCKET()); - //TODO: minecraft:lead - $this->map(Ids::LEATHER, fn() => Items::LEATHER()); - $this->map(Ids::LEATHER_BOOTS, fn() => Items::LEATHER_BOOTS()); - $this->map(Ids::LEATHER_CHESTPLATE, fn() => Items::LEATHER_TUNIC()); - $this->map(Ids::LEATHER_HELMET, fn() => Items::LEATHER_CAP()); - //TODO: minecraft:leather_horse_armor - $this->map(Ids::LEATHER_LEGGINGS, fn() => Items::LEATHER_PANTS()); - $this->map(Ids::LIGHT_BLUE_DYE, fn() => Items::DYE()->setColor(DyeColor::LIGHT_BLUE())); - $this->map(Ids::LIGHT_GRAY_DYE, fn() => Items::DYE()->setColor(DyeColor::LIGHT_GRAY())); - $this->map(Ids::LIME_DYE, fn() => Items::DYE()->setColor(DyeColor::LIME())); - //TODO: minecraft:lingering_potion - //TODO: minecraft:llama_spawn_egg - //TODO: minecraft:lodestone_compass - $this->map(Ids::MAGENTA_DYE, fn() => Items::DYE()->setColor(DyeColor::MAGENTA())); - $this->map(Ids::MAGMA_CREAM, fn() => Items::MAGMA_CREAM()); - //TODO: minecraft:magma_cube_spawn_egg - $this->map(Ids::MANGROVE_SIGN, fn() => Items::MANGROVE_SIGN()); - //TODO: minecraft:medicine - $this->map(Ids::MELON_SEEDS, fn() => Items::MELON_SEEDS()); - $this->map(Ids::MELON_SLICE, fn() => Items::MELON()); - $this->map(Ids::MILK_BUCKET, fn() => Items::MILK_BUCKET()); - $this->map(Ids::MINECART, fn() => Items::MINECART()); - //TODO: minecraft:mojang_banner_pattern - //TODO: minecraft:mooshroom_spawn_egg - //TODO: minecraft:mule_spawn_egg - $this->map(Ids::MUSHROOM_STEW, fn() => Items::MUSHROOM_STEW()); - $this->map(Ids::MUSIC_DISC_11, fn() => Items::RECORD_11()); - $this->map(Ids::MUSIC_DISC_13, fn() => Items::RECORD_13()); - $this->map(Ids::MUSIC_DISC_BLOCKS, fn() => Items::RECORD_BLOCKS()); - $this->map(Ids::MUSIC_DISC_CAT, fn() => Items::RECORD_CAT()); - $this->map(Ids::MUSIC_DISC_CHIRP, fn() => Items::RECORD_CHIRP()); - $this->map(Ids::MUSIC_DISC_FAR, fn() => Items::RECORD_FAR()); - $this->map(Ids::MUSIC_DISC_MALL, fn() => Items::RECORD_MALL()); - $this->map(Ids::MUSIC_DISC_MELLOHI, fn() => Items::RECORD_MELLOHI()); - //TODO: minecraft:music_disc_otherside - //TODO: minecraft:music_disc_pigstep - $this->map(Ids::MUSIC_DISC_STAL, fn() => Items::RECORD_STAL()); - $this->map(Ids::MUSIC_DISC_STRAD, fn() => Items::RECORD_STRAD()); - $this->map(Ids::MUSIC_DISC_WAIT, fn() => Items::RECORD_WAIT()); - $this->map(Ids::MUSIC_DISC_WARD, fn() => Items::RECORD_WARD()); - $this->map(Ids::MUTTON, fn() => Items::RAW_MUTTON()); - //TODO: minecraft:name_tag - $this->map(Ids::NAUTILUS_SHELL, fn() => Items::NAUTILUS_SHELL()); - //TODO: minecraft:nether_sprouts - $this->map(Ids::NETHER_STAR, fn() => Items::NETHER_STAR()); - $this->map(Ids::NETHERBRICK, fn() => Items::NETHER_BRICK()); - $this->map(Ids::NETHERITE_AXE, fn() => Items::NETHERITE_AXE()); - $this->map(Ids::NETHERITE_BOOTS, fn() => Items::NETHERITE_BOOTS()); - $this->map(Ids::NETHERITE_CHESTPLATE, fn() => Items::NETHERITE_CHESTPLATE()); - $this->map(Ids::NETHERITE_HELMET, fn() => Items::NETHERITE_HELMET()); - $this->map(Ids::NETHERITE_HOE, fn() => Items::NETHERITE_HOE()); - $this->map(Ids::NETHERITE_INGOT, fn() => Items::NETHERITE_INGOT()); - $this->map(Ids::NETHERITE_LEGGINGS, fn() => Items::NETHERITE_LEGGINGS()); - $this->map(Ids::NETHERITE_PICKAXE, fn() => Items::NETHERITE_PICKAXE()); - $this->map(Ids::NETHERITE_SCRAP, fn() => Items::NETHERITE_SCRAP()); - $this->map(Ids::NETHERITE_SHOVEL, fn() => Items::NETHERITE_SHOVEL()); - $this->map(Ids::NETHERITE_SWORD, fn() => Items::NETHERITE_SWORD()); - //TODO: minecraft:npc_spawn_egg - $this->map(Ids::OAK_BOAT, fn() => Items::OAK_BOAT()); - $this->map(Ids::OAK_SIGN, fn() => Items::OAK_SIGN()); - //TODO: minecraft:ocelot_spawn_egg - $this->map(Ids::ORANGE_DYE, fn() => Items::DYE()->setColor(DyeColor::ORANGE())); - $this->map(Ids::PAINTING, fn() => Items::PAINTING()); - //TODO: minecraft:panda_spawn_egg - $this->map(Ids::PAPER, fn() => Items::PAPER()); - //TODO: minecraft:parrot_spawn_egg - $this->map(Ids::PHANTOM_MEMBRANE, fn() => Items::PHANTOM_MEMBRANE()); - //TODO: minecraft:phantom_spawn_egg - //TODO: minecraft:pig_spawn_egg - //TODO: minecraft:piglin_banner_pattern - //TODO: minecraft:piglin_brute_spawn_egg - //TODO: minecraft:piglin_spawn_egg - //TODO: minecraft:pillager_spawn_egg - $this->map(Ids::PINK_DYE, fn() => Items::DYE()->setColor(DyeColor::PINK())); - $this->map(Ids::POISONOUS_POTATO, fn() => Items::POISONOUS_POTATO()); - //TODO: minecraft:polar_bear_spawn_egg - $this->map(Ids::POPPED_CHORUS_FRUIT, fn() => Items::POPPED_CHORUS_FRUIT()); - $this->map(Ids::PORKCHOP, fn() => Items::RAW_PORKCHOP()); - $this->map(Ids::POTATO, fn() => Items::POTATO()); - $this->map(Ids::POTION, function(Data $data) : Item{ - $meta = $data->getMeta(); - $potionType = PotionTypeIdMap::getInstance()->fromId($meta); - if($potionType === null){ - throw new ItemTypeDeserializeException("Unknown potion type ID $meta"); - } - return Items::POTION()->setType($potionType); - }); - //TODO: minecraft:powder_snow_bucket - $this->map(Ids::PRISMARINE_CRYSTALS, fn() => Items::PRISMARINE_CRYSTALS()); - $this->map(Ids::PRISMARINE_SHARD, fn() => Items::PRISMARINE_SHARD()); - $this->map(Ids::PUFFERFISH, fn() => Items::PUFFERFISH()); - //TODO: minecraft:pufferfish_bucket - //TODO: minecraft:pufferfish_spawn_egg - $this->map(Ids::PUMPKIN_PIE, fn() => Items::PUMPKIN_PIE()); - $this->map(Ids::PUMPKIN_SEEDS, fn() => Items::PUMPKIN_SEEDS()); - $this->map(Ids::PURPLE_DYE, fn() => Items::DYE()->setColor(DyeColor::PURPLE())); - $this->map(Ids::QUARTZ, fn() => Items::NETHER_QUARTZ()); - $this->map(Ids::RABBIT, fn() => Items::RAW_RABBIT()); - $this->map(Ids::RABBIT_FOOT, fn() => Items::RABBIT_FOOT()); - $this->map(Ids::RABBIT_HIDE, fn() => Items::RABBIT_HIDE()); - //TODO: minecraft:rabbit_spawn_egg - $this->map(Ids::RABBIT_STEW, fn() => Items::RABBIT_STEW()); - //TODO: minecraft:rapid_fertilizer - //TODO: minecraft:ravager_spawn_egg - $this->map(Ids::RAW_COPPER, fn() => Items::RAW_COPPER()); - $this->map(Ids::RAW_GOLD, fn() => Items::RAW_GOLD()); - $this->map(Ids::RAW_IRON, fn() => Items::RAW_IRON()); - $this->map(Ids::RED_DYE, fn() => Items::DYE()->setColor(DyeColor::RED())); - $this->map(Ids::REDSTONE, fn() => Items::REDSTONE_DUST()); - $this->map(Ids::ROTTEN_FLESH, fn() => Items::ROTTEN_FLESH()); - //TODO: minecraft:saddle - $this->map(Ids::SALMON, fn() => Items::RAW_SALMON()); - //TODO: minecraft:salmon_bucket - //TODO: minecraft:salmon_spawn_egg - $this->map(Ids::SCUTE, fn() => Items::SCUTE()); - $this->map(Ids::SHEARS, fn() => Items::SHEARS()); - //TODO: minecraft:sheep_spawn_egg - //TODO: minecraft:shield - $this->map(Ids::SHULKER_SHELL, fn() => Items::SHULKER_SHELL()); - //TODO: minecraft:shulker_spawn_egg - //TODO: minecraft:silverfish_spawn_egg - //TODO: minecraft:skeleton_horse_spawn_egg - //TODO: minecraft:skeleton_spawn_egg - //TODO: minecraft:skull_banner_pattern - $this->map(Ids::SLIME_BALL, fn() => Items::SLIMEBALL()); - //TODO: minecraft:slime_spawn_egg - $this->map(Ids::SNOWBALL, fn() => Items::SNOWBALL()); - //TODO: minecraft:soul_campfire - //TODO: minecraft:sparkler - $this->map(Ids::SPIDER_EYE, fn() => Items::SPIDER_EYE()); - //TODO: minecraft:spider_spawn_egg - $this->map(Ids::SPLASH_POTION, function(Data $data) : Item{ - $meta = $data->getMeta(); - $potionType = PotionTypeIdMap::getInstance()->fromId($meta); - if($potionType === null){ - throw new ItemTypeDeserializeException("Unknown potion type ID $meta"); - } - return Items::SPLASH_POTION()->setType($potionType); - }); - $this->map(Ids::SPRUCE_BOAT, fn() => Items::SPRUCE_BOAT()); - $this->map(Ids::SPRUCE_SIGN, fn() => Items::SPRUCE_SIGN()); - $this->map(Ids::SPYGLASS, fn() => Items::SPYGLASS()); - $this->map(Ids::SQUID_SPAWN_EGG, fn() => Items::SQUID_SPAWN_EGG()); - $this->map(Ids::STICK, fn() => Items::STICK()); - $this->map(Ids::STONE_AXE, fn() => Items::STONE_AXE()); - $this->map(Ids::STONE_HOE, fn() => Items::STONE_HOE()); - $this->map(Ids::STONE_PICKAXE, fn() => Items::STONE_PICKAXE()); - $this->map(Ids::STONE_SHOVEL, fn() => Items::STONE_SHOVEL()); - $this->map(Ids::STONE_SWORD, fn() => Items::STONE_SWORD()); - //TODO: minecraft:stray_spawn_egg - //TODO: minecraft:strider_spawn_egg - $this->map(Ids::STRING, fn() => Items::STRING()); - $this->map(Ids::SUGAR, fn() => Items::SUGAR()); - $this->map(Ids::SUSPICIOUS_STEW, function(Data $data) : Item{ - $meta = $data->getMeta(); - $suspiciousStewType = SuspiciousStewTypeIdMap::getInstance()->fromId($meta); - if($suspiciousStewType === null){ - throw new ItemTypeDeserializeException("Unknown suspicious stew type ID $meta"); - } - return Items::SUSPICIOUS_STEW()->setType($suspiciousStewType); - }); - $this->map(Ids::SWEET_BERRIES, fn() => Items::SWEET_BERRIES()); - //TODO: minecraft:tadpole_bucket - //TODO: minecraft:tadpole_spawn_egg - //TODO: minecraft:tnt_minecart - $this->map(Ids::TOTEM_OF_UNDYING, fn() => Items::TOTEM()); - //TODO: minecraft:trident - $this->map(Ids::TROPICAL_FISH, fn() => Items::CLOWNFISH()); - //TODO: minecraft:tropical_fish_bucket - //TODO: minecraft:tropical_fish_spawn_egg - //TODO: minecraft:turtle_helmet - //TODO: minecraft:turtle_spawn_egg - //TODO: minecraft:vex_spawn_egg - $this->map(Ids::VILLAGER_SPAWN_EGG, fn() => Items::VILLAGER_SPAWN_EGG()); - //TODO: minecraft:vindicator_spawn_egg - //TODO: minecraft:wandering_trader_spawn_egg - //TODO: minecraft:warped_fungus_on_a_stick - $this->map(Ids::WARPED_SIGN, fn() => Items::WARPED_SIGN()); - $this->map(Ids::WATER_BUCKET, fn() => Items::WATER_BUCKET()); - $this->map(Ids::WHEAT, fn() => Items::WHEAT()); - $this->map(Ids::WHEAT_SEEDS, fn() => Items::WHEAT_SEEDS()); - $this->map(Ids::WHITE_DYE, fn() => Items::DYE()->setColor(DyeColor::WHITE())); - //TODO: minecraft:witch_spawn_egg - //TODO: minecraft:wither_skeleton_spawn_egg - //TODO: minecraft:wolf_spawn_egg - $this->map(Ids::WOODEN_AXE, fn() => Items::WOODEN_AXE()); - $this->map(Ids::WOODEN_HOE, fn() => Items::WOODEN_HOE()); - $this->map(Ids::WOODEN_PICKAXE, fn() => Items::WOODEN_PICKAXE()); - $this->map(Ids::WOODEN_SHOVEL, fn() => Items::WOODEN_SHOVEL()); - $this->map(Ids::WOODEN_SWORD, fn() => Items::WOODEN_SWORD()); - $this->map(Ids::WRITABLE_BOOK, fn() => Items::WRITABLE_BOOK()); - $this->map(Ids::WRITTEN_BOOK, fn() => Items::WRITTEN_BOOK()); - $this->map(Ids::YELLOW_DYE, fn() => Items::DYE()->setColor(DyeColor::YELLOW())); - //TODO: minecraft:zoglin_spawn_egg - //TODO: minecraft:zombie_horse_spawn_egg - //TODO: minecraft:zombie_pigman_spawn_egg - $this->map(Ids::ZOMBIE_SPAWN_EGG, fn() => Items::ZOMBIE_SPAWN_EGG()); - //TODO: minecraft:zombie_villager_spawn_egg - } } diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 6945eac5e..152334d75 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -23,28 +23,14 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\item; -use pocketmine\block\Bed; use pocketmine\block\Block; -use pocketmine\block\ItemFrame; -use pocketmine\block\Skull; -use pocketmine\block\utils\DyeColor; use pocketmine\block\VanillaBlocks as Blocks; use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\block\BlockStateSerializer; -use pocketmine\data\bedrock\CompoundTypeIds; -use pocketmine\data\bedrock\DyeColorIdMap; -use pocketmine\data\bedrock\item\ItemTypeNames as Ids; use pocketmine\data\bedrock\item\SavedItemData as Data; -use pocketmine\data\bedrock\PotionTypeIdMap; -use pocketmine\data\bedrock\SuspiciousStewTypeIdMap; -use pocketmine\item\Banner; use pocketmine\item\CoralFan; -use pocketmine\item\Dye; use pocketmine\item\Item; use pocketmine\item\ItemBlock; -use pocketmine\item\Potion; -use pocketmine\item\SplashPotion; -use pocketmine\item\SuspiciousStew; use pocketmine\item\VanillaItems as Items; use pocketmine\utils\AssumptionFailedError; use function class_parents; @@ -69,7 +55,8 @@ final class ItemSerializer{ public function __construct( private BlockStateSerializer $blockStateSerializer ){ - $this->registerSerializers(); + $this->registerSpecialBlockSerializers(); + new ItemSerializerDeserializerRegistrar(null, $this); } /** @@ -212,324 +199,10 @@ final class ItemSerializer{ return new Data($itemNameId, 0, $blockStateData); } - /** - * @phpstan-return \Closure() : Data - */ - private static function id(string $id) : \Closure{ - return fn() => new Data($id); - } - - /** - * @phpstan-return \Closure() : Data - */ - private static function chemical(int $type) : \Closure{ - return fn() => new Data(Ids::COMPOUND, $type); - } - private function registerSpecialBlockSerializers() : void{ - $this->mapBlock(Blocks::ACACIA_DOOR(), self::id(Ids::ACACIA_DOOR)); - $this->mapBlock(Blocks::BIRCH_DOOR(), self::id(Ids::BIRCH_DOOR)); - $this->mapBlock(Blocks::BREWING_STAND(), self::id(Ids::BREWING_STAND)); - $this->mapBlock(Blocks::CAKE(), self::id(Ids::CAKE)); - $this->mapBlock(Blocks::CAULDRON(), self::id(Ids::CAULDRON)); - $this->mapBlock(Blocks::CRIMSON_DOOR(), self::id(Ids::CRIMSON_DOOR)); - $this->mapBlock(Blocks::DARK_OAK_DOOR(), self::id(Ids::DARK_OAK_DOOR)); - $this->mapBlock(Blocks::FLOWER_POT(), self::id(Ids::FLOWER_POT)); - $this->mapBlock(Blocks::HOPPER(), self::id(Ids::HOPPER)); - $this->mapBlock(Blocks::IRON_DOOR(), self::id(Ids::IRON_DOOR)); - $this->mapBlock(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => new Data($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME)); - $this->mapBlock(Blocks::JUNGLE_DOOR(), self::id(Ids::JUNGLE_DOOR)); - $this->mapBlock(Blocks::MANGROVE_DOOR(), self::id(Ids::MANGROVE_DOOR)); - $this->mapBlock(Blocks::NETHER_WART(), self::id(Ids::NETHER_WART)); - $this->mapBlock(Blocks::OAK_DOOR(), self::id(Ids::WOODEN_DOOR)); - $this->mapBlock(Blocks::REDSTONE_COMPARATOR(), self::id(Ids::COMPARATOR)); - $this->mapBlock(Blocks::REDSTONE_REPEATER(), self::id(Ids::REPEATER)); - $this->mapBlock(Blocks::SPRUCE_DOOR(), self::id(Ids::SPRUCE_DOOR)); - $this->mapBlock(Blocks::SUGARCANE(), self::id(Ids::SUGAR_CANE)); - $this->mapBlock(Blocks::WARPED_DOOR(), self::id(Ids::WARPED_DOOR)); - - $this->mapBlock(Blocks::BED(), fn(Bed $block) => new Data(Ids::BED, DyeColorIdMap::getInstance()->toId($block->getColor()))); - $this->mapBlock(Blocks::MOB_HEAD(), fn(Skull $block) => new Data(Ids::SKULL, $block->getSkullType()->getMagicNumber())); - } - - private function registerSerializers() : void{ - $this->registerSpecialBlockSerializers(); - //these are encoded as regular blocks, but they have to be accounted for explicitly since they don't use ItemBlock //Bamboo->getBlock() returns BambooSapling :( $this->map(Items::BAMBOO(), fn() => $this->standardBlock(Blocks::BAMBOO())); $this->map(Items::CORAL_FAN(), fn(CoralFan $item) => $this->standardBlock($item->getBlock())); - - $this->map(Items::ACACIA_BOAT(), self::id(Ids::ACACIA_BOAT)); - $this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN)); - $this->map(Items::AMETHYST_SHARD(), self::id(Ids::AMETHYST_SHARD)); - $this->map(Items::APPLE(), self::id(Ids::APPLE)); - $this->map(Items::ARROW(), self::id(Ids::ARROW)); - $this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO)); - $this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor()))); - $this->map(Items::BEETROOT(), self::id(Ids::BEETROOT)); - $this->map(Items::BEETROOT_SEEDS(), self::id(Ids::BEETROOT_SEEDS)); - $this->map(Items::BEETROOT_SOUP(), self::id(Ids::BEETROOT_SOUP)); - $this->map(Items::BIRCH_BOAT(), self::id(Ids::BIRCH_BOAT)); - $this->map(Items::BIRCH_SIGN(), self::id(Ids::BIRCH_SIGN)); - $this->map(Items::BLAZE_POWDER(), self::id(Ids::BLAZE_POWDER)); - $this->map(Items::BLAZE_ROD(), self::id(Ids::BLAZE_ROD)); - $this->map(Items::BLEACH(), self::id(Ids::BLEACH)); - $this->map(Items::BONE(), self::id(Ids::BONE)); - $this->map(Items::BONE_MEAL(), self::id(Ids::BONE_MEAL)); - $this->map(Items::BOOK(), self::id(Ids::BOOK)); - $this->map(Items::BOW(), self::id(Ids::BOW)); - $this->map(Items::BOWL(), self::id(Ids::BOWL)); - $this->map(Items::BREAD(), self::id(Ids::BREAD)); - $this->map(Items::BRICK(), self::id(Ids::BRICK)); - $this->map(Items::BUCKET(), self::id(Ids::BUCKET)); - $this->map(Items::CARROT(), self::id(Ids::CARROT)); - $this->map(Items::CHAINMAIL_BOOTS(), self::id(Ids::CHAINMAIL_BOOTS)); - $this->map(Items::CHAINMAIL_CHESTPLATE(), self::id(Ids::CHAINMAIL_CHESTPLATE)); - $this->map(Items::CHAINMAIL_HELMET(), self::id(Ids::CHAINMAIL_HELMET)); - $this->map(Items::CHAINMAIL_LEGGINGS(), self::id(Ids::CHAINMAIL_LEGGINGS)); - $this->map(Items::CHARCOAL(), self::id(Ids::CHARCOAL)); - $this->map(Items::CHEMICAL_ALUMINIUM_OXIDE(), self::chemical(CompoundTypeIds::ALUMINIUM_OXIDE)); - $this->map(Items::CHEMICAL_AMMONIA(), self::chemical(CompoundTypeIds::AMMONIA)); - $this->map(Items::CHEMICAL_BARIUM_SULPHATE(), self::chemical(CompoundTypeIds::BARIUM_SULPHATE)); - $this->map(Items::CHEMICAL_BENZENE(), self::chemical(CompoundTypeIds::BENZENE)); - $this->map(Items::CHEMICAL_BORON_TRIOXIDE(), self::chemical(CompoundTypeIds::BORON_TRIOXIDE)); - $this->map(Items::CHEMICAL_CALCIUM_BROMIDE(), self::chemical(CompoundTypeIds::CALCIUM_BROMIDE)); - $this->map(Items::CHEMICAL_CALCIUM_CHLORIDE(), self::chemical(CompoundTypeIds::CALCIUM_CHLORIDE)); - $this->map(Items::CHEMICAL_CERIUM_CHLORIDE(), self::chemical(CompoundTypeIds::CERIUM_CHLORIDE)); - $this->map(Items::CHEMICAL_CHARCOAL(), self::chemical(CompoundTypeIds::CHARCOAL)); - $this->map(Items::CHEMICAL_CRUDE_OIL(), self::chemical(CompoundTypeIds::CRUDE_OIL)); - $this->map(Items::CHEMICAL_GLUE(), self::chemical(CompoundTypeIds::GLUE)); - $this->map(Items::CHEMICAL_HYDROGEN_PEROXIDE(), self::chemical(CompoundTypeIds::HYDROGEN_PEROXIDE)); - $this->map(Items::CHEMICAL_HYPOCHLORITE(), self::chemical(CompoundTypeIds::HYPOCHLORITE)); - $this->map(Items::CHEMICAL_INK(), self::chemical(CompoundTypeIds::INK)); - $this->map(Items::CHEMICAL_IRON_SULPHIDE(), self::chemical(CompoundTypeIds::IRON_SULPHIDE)); - $this->map(Items::CHEMICAL_LATEX(), self::chemical(CompoundTypeIds::LATEX)); - $this->map(Items::CHEMICAL_LITHIUM_HYDRIDE(), self::chemical(CompoundTypeIds::LITHIUM_HYDRIDE)); - $this->map(Items::CHEMICAL_LUMINOL(), self::chemical(CompoundTypeIds::LUMINOL)); - $this->map(Items::CHEMICAL_MAGNESIUM_NITRATE(), self::chemical(CompoundTypeIds::MAGNESIUM_NITRATE)); - $this->map(Items::CHEMICAL_MAGNESIUM_OXIDE(), self::chemical(CompoundTypeIds::MAGNESIUM_OXIDE)); - $this->map(Items::CHEMICAL_MAGNESIUM_SALTS(), self::chemical(CompoundTypeIds::MAGNESIUM_SALTS)); - $this->map(Items::CHEMICAL_MERCURIC_CHLORIDE(), self::chemical(CompoundTypeIds::MERCURIC_CHLORIDE)); - $this->map(Items::CHEMICAL_POLYETHYLENE(), self::chemical(CompoundTypeIds::POLYETHYLENE)); - $this->map(Items::CHEMICAL_POTASSIUM_CHLORIDE(), self::chemical(CompoundTypeIds::POTASSIUM_CHLORIDE)); - $this->map(Items::CHEMICAL_POTASSIUM_IODIDE(), self::chemical(CompoundTypeIds::POTASSIUM_IODIDE)); - $this->map(Items::CHEMICAL_RUBBISH(), self::chemical(CompoundTypeIds::RUBBISH)); - $this->map(Items::CHEMICAL_SALT(), self::chemical(CompoundTypeIds::SALT)); - $this->map(Items::CHEMICAL_SOAP(), self::chemical(CompoundTypeIds::SOAP)); - $this->map(Items::CHEMICAL_SODIUM_ACETATE(), self::chemical(CompoundTypeIds::SODIUM_ACETATE)); - $this->map(Items::CHEMICAL_SODIUM_FLUORIDE(), self::chemical(CompoundTypeIds::SODIUM_FLUORIDE)); - $this->map(Items::CHEMICAL_SODIUM_HYDRIDE(), self::chemical(CompoundTypeIds::SODIUM_HYDRIDE)); - $this->map(Items::CHEMICAL_SODIUM_HYDROXIDE(), self::chemical(CompoundTypeIds::SODIUM_HYDROXIDE)); - $this->map(Items::CHEMICAL_SODIUM_HYPOCHLORITE(), self::chemical(CompoundTypeIds::SODIUM_HYPOCHLORITE)); - $this->map(Items::CHEMICAL_SODIUM_OXIDE(), self::chemical(CompoundTypeIds::SODIUM_OXIDE)); - $this->map(Items::CHEMICAL_SUGAR(), self::chemical(CompoundTypeIds::SUGAR)); - $this->map(Items::CHEMICAL_SULPHATE(), self::chemical(CompoundTypeIds::SULPHATE)); - $this->map(Items::CHEMICAL_TUNGSTEN_CHLORIDE(), self::chemical(CompoundTypeIds::TUNGSTEN_CHLORIDE)); - $this->map(Items::CHEMICAL_WATER(), self::chemical(CompoundTypeIds::WATER)); - $this->map(Items::CHORUS_FRUIT(), self::id(Ids::CHORUS_FRUIT)); - $this->map(Items::CLAY(), self::id(Ids::CLAY_BALL)); - $this->map(Items::CLOCK(), self::id(Ids::CLOCK)); - $this->map(Items::CLOWNFISH(), self::id(Ids::TROPICAL_FISH)); - $this->map(Items::COAL(), self::id(Ids::COAL)); - $this->map(Items::COCOA_BEANS(), self::id(Ids::COCOA_BEANS)); - $this->map(Items::COMPASS(), self::id(Ids::COMPASS)); - $this->map(Items::COOKED_CHICKEN(), self::id(Ids::COOKED_CHICKEN)); - $this->map(Items::COOKED_FISH(), self::id(Ids::COOKED_COD)); - $this->map(Items::COOKED_MUTTON(), self::id(Ids::COOKED_MUTTON)); - $this->map(Items::COOKED_PORKCHOP(), self::id(Ids::COOKED_PORKCHOP)); - $this->map(Items::COOKED_RABBIT(), self::id(Ids::COOKED_RABBIT)); - $this->map(Items::COOKED_SALMON(), self::id(Ids::COOKED_SALMON)); - $this->map(Items::COOKIE(), self::id(Ids::COOKIE)); - $this->map(Items::COPPER_INGOT(), self::id(Ids::COPPER_INGOT)); - $this->map(Items::CRIMSON_SIGN(), self::id(Ids::CRIMSON_SIGN)); - $this->map(Items::DARK_OAK_BOAT(), self::id(Ids::DARK_OAK_BOAT)); - $this->map(Items::DARK_OAK_SIGN(), self::id(Ids::DARK_OAK_SIGN)); - $this->map(Items::DIAMOND(), self::id(Ids::DIAMOND)); - $this->map(Items::DIAMOND_AXE(), self::id(Ids::DIAMOND_AXE)); - $this->map(Items::DIAMOND_BOOTS(), self::id(Ids::DIAMOND_BOOTS)); - $this->map(Items::DIAMOND_CHESTPLATE(), self::id(Ids::DIAMOND_CHESTPLATE)); - $this->map(Items::DIAMOND_HELMET(), self::id(Ids::DIAMOND_HELMET)); - $this->map(Items::DIAMOND_HOE(), self::id(Ids::DIAMOND_HOE)); - $this->map(Items::DIAMOND_LEGGINGS(), self::id(Ids::DIAMOND_LEGGINGS)); - $this->map(Items::DIAMOND_PICKAXE(), self::id(Ids::DIAMOND_PICKAXE)); - $this->map(Items::DIAMOND_SHOVEL(), self::id(Ids::DIAMOND_SHOVEL)); - $this->map(Items::DIAMOND_SWORD(), self::id(Ids::DIAMOND_SWORD)); - $this->map(Items::DISC_FRAGMENT_5(), self::id(Ids::DISC_FRAGMENT_5)); - $this->map(Items::DRAGON_BREATH(), self::id(Ids::DRAGON_BREATH)); - $this->map(Items::DRIED_KELP(), self::id(Ids::DRIED_KELP)); - $this->map(Items::DYE(), fn(Dye $item) => new Data(match($item->getColor()){ - DyeColor::BLACK() => Ids::BLACK_DYE, - DyeColor::BLUE() => Ids::BLUE_DYE, - DyeColor::BROWN() => Ids::BROWN_DYE, - DyeColor::CYAN() => Ids::CYAN_DYE, - DyeColor::GRAY() => Ids::GRAY_DYE, - DyeColor::GREEN() => Ids::GREEN_DYE, - DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_DYE, - DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_DYE, - DyeColor::LIME() => Ids::LIME_DYE, - DyeColor::MAGENTA() => Ids::MAGENTA_DYE, - DyeColor::ORANGE() => Ids::ORANGE_DYE, - DyeColor::PINK() => Ids::PINK_DYE, - DyeColor::PURPLE() => Ids::PURPLE_DYE, - DyeColor::RED() => Ids::RED_DYE, - DyeColor::WHITE() => Ids::WHITE_DYE, - DyeColor::YELLOW() => Ids::YELLOW_DYE, - default => throw new AssumptionFailedError("Unhandled dye color " . $item->getColor()->name()), - })); - $this->map(Items::ECHO_SHARD(), self::id(Ids::ECHO_SHARD)); - $this->map(Items::EGG(), self::id(Ids::EGG)); - $this->map(Items::EMERALD(), self::id(Ids::EMERALD)); - $this->map(Items::ENCHANTED_GOLDEN_APPLE(), self::id(Ids::ENCHANTED_GOLDEN_APPLE)); - $this->map(Items::ENDER_PEARL(), self::id(Ids::ENDER_PEARL)); - $this->map(Items::EXPERIENCE_BOTTLE(), self::id(Ids::EXPERIENCE_BOTTLE)); - $this->map(Items::FEATHER(), self::id(Ids::FEATHER)); - $this->map(Items::FERMENTED_SPIDER_EYE(), self::id(Ids::FERMENTED_SPIDER_EYE)); - $this->map(Items::FIRE_CHARGE(), self::id(Ids::FIRE_CHARGE)); - $this->map(Items::FISHING_ROD(), self::id(Ids::FISHING_ROD)); - $this->map(Items::FLINT(), self::id(Ids::FLINT)); - $this->map(Items::FLINT_AND_STEEL(), self::id(Ids::FLINT_AND_STEEL)); - $this->map(Items::GHAST_TEAR(), self::id(Ids::GHAST_TEAR)); - $this->map(Items::GLASS_BOTTLE(), self::id(Ids::GLASS_BOTTLE)); - $this->map(Items::GLISTERING_MELON(), self::id(Ids::GLISTERING_MELON_SLICE)); - $this->map(Items::GLOWSTONE_DUST(), self::id(Ids::GLOWSTONE_DUST)); - $this->map(Items::GLOW_INK_SAC(), self::id(Ids::GLOW_INK_SAC)); - $this->map(Items::GOLDEN_APPLE(), self::id(Ids::GOLDEN_APPLE)); - $this->map(Items::GOLDEN_AXE(), self::id(Ids::GOLDEN_AXE)); - $this->map(Items::GOLDEN_BOOTS(), self::id(Ids::GOLDEN_BOOTS)); - $this->map(Items::GOLDEN_CARROT(), self::id(Ids::GOLDEN_CARROT)); - $this->map(Items::GOLDEN_CHESTPLATE(), self::id(Ids::GOLDEN_CHESTPLATE)); - $this->map(Items::GOLDEN_HELMET(), self::id(Ids::GOLDEN_HELMET)); - $this->map(Items::GOLDEN_HOE(), self::id(Ids::GOLDEN_HOE)); - $this->map(Items::GOLDEN_LEGGINGS(), self::id(Ids::GOLDEN_LEGGINGS)); - $this->map(Items::GOLDEN_PICKAXE(), self::id(Ids::GOLDEN_PICKAXE)); - $this->map(Items::GOLDEN_SHOVEL(), self::id(Ids::GOLDEN_SHOVEL)); - $this->map(Items::GOLDEN_SWORD(), self::id(Ids::GOLDEN_SWORD)); - $this->map(Items::GOLD_INGOT(), self::id(Ids::GOLD_INGOT)); - $this->map(Items::GOLD_NUGGET(), self::id(Ids::GOLD_NUGGET)); - $this->map(Items::GUNPOWDER(), self::id(Ids::GUNPOWDER)); - $this->map(Items::HEART_OF_THE_SEA(), self::id(Ids::HEART_OF_THE_SEA)); - $this->map(Items::HONEYCOMB(), self::id(Ids::HONEYCOMB)); - $this->map(Items::HONEY_BOTTLE(), self::id(Ids::HONEY_BOTTLE)); - $this->map(Items::INK_SAC(), self::id(Ids::INK_SAC)); - $this->map(Items::IRON_AXE(), self::id(Ids::IRON_AXE)); - $this->map(Items::IRON_BOOTS(), self::id(Ids::IRON_BOOTS)); - $this->map(Items::IRON_CHESTPLATE(), self::id(Ids::IRON_CHESTPLATE)); - $this->map(Items::IRON_HELMET(), self::id(Ids::IRON_HELMET)); - $this->map(Items::IRON_HOE(), self::id(Ids::IRON_HOE)); - $this->map(Items::IRON_INGOT(), self::id(Ids::IRON_INGOT)); - $this->map(Items::IRON_LEGGINGS(), self::id(Ids::IRON_LEGGINGS)); - $this->map(Items::IRON_NUGGET(), self::id(Ids::IRON_NUGGET)); - $this->map(Items::IRON_PICKAXE(), self::id(Ids::IRON_PICKAXE)); - $this->map(Items::IRON_SHOVEL(), self::id(Ids::IRON_SHOVEL)); - $this->map(Items::IRON_SWORD(), self::id(Ids::IRON_SWORD)); - $this->map(Items::JUNGLE_BOAT(), self::id(Ids::JUNGLE_BOAT)); - $this->map(Items::JUNGLE_SIGN(), self::id(Ids::JUNGLE_SIGN)); - $this->map(Items::LAPIS_LAZULI(), self::id(Ids::LAPIS_LAZULI)); - $this->map(Items::LAVA_BUCKET(), self::id(Ids::LAVA_BUCKET)); - $this->map(Items::LEATHER(), self::id(Ids::LEATHER)); - $this->map(Items::LEATHER_BOOTS(), self::id(Ids::LEATHER_BOOTS)); - $this->map(Items::LEATHER_CAP(), self::id(Ids::LEATHER_HELMET)); - $this->map(Items::LEATHER_PANTS(), self::id(Ids::LEATHER_LEGGINGS)); - $this->map(Items::LEATHER_TUNIC(), self::id(Ids::LEATHER_CHESTPLATE)); - $this->map(Items::MAGMA_CREAM(), self::id(Ids::MAGMA_CREAM)); - $this->map(Items::MANGROVE_SIGN(), self::id(Ids::MANGROVE_SIGN)); - $this->map(Items::MELON(), self::id(Ids::MELON_SLICE)); - $this->map(Items::MELON_SEEDS(), self::id(Ids::MELON_SEEDS)); - $this->map(Items::MILK_BUCKET(), self::id(Ids::MILK_BUCKET)); - $this->map(Items::MINECART(), self::id(Ids::MINECART)); - $this->map(Items::MUSHROOM_STEW(), self::id(Ids::MUSHROOM_STEW)); - $this->map(Items::NAUTILUS_SHELL(), self::id(Ids::NAUTILUS_SHELL)); - $this->map(Items::NETHERITE_AXE(), self::id(Ids::NETHERITE_AXE)); - $this->map(Items::NETHERITE_BOOTS(), self::id(Ids::NETHERITE_BOOTS)); - $this->map(Items::NETHERITE_CHESTPLATE(), self::id(Ids::NETHERITE_CHESTPLATE)); - $this->map(Items::NETHERITE_HELMET(), self::id(Ids::NETHERITE_HELMET)); - $this->map(Items::NETHERITE_HOE(), self::id(Ids::NETHERITE_HOE)); - $this->map(Items::NETHERITE_INGOT(), self::id(Ids::NETHERITE_INGOT)); - $this->map(Items::NETHERITE_LEGGINGS(), self::id(Ids::NETHERITE_LEGGINGS)); - $this->map(Items::NETHERITE_PICKAXE(), self::id(Ids::NETHERITE_PICKAXE)); - $this->map(Items::NETHERITE_SCRAP(), self::id(Ids::NETHERITE_SCRAP)); - $this->map(Items::NETHERITE_SHOVEL(), self::id(Ids::NETHERITE_SHOVEL)); - $this->map(Items::NETHERITE_SWORD(), self::id(Ids::NETHERITE_SWORD)); - $this->map(Items::NETHER_BRICK(), self::id(Ids::NETHERBRICK)); - $this->map(Items::NETHER_QUARTZ(), self::id(Ids::QUARTZ)); - $this->map(Items::NETHER_STAR(), self::id(Ids::NETHER_STAR)); - $this->map(Items::OAK_BOAT(), self::id(Ids::OAK_BOAT)); - $this->map(Items::OAK_SIGN(), self::id(Ids::OAK_SIGN)); - $this->map(Items::PAINTING(), self::id(Ids::PAINTING)); - $this->map(Items::PAPER(), self::id(Ids::PAPER)); - $this->map(Items::PHANTOM_MEMBRANE(), self::id(Ids::PHANTOM_MEMBRANE)); - $this->map(Items::POISONOUS_POTATO(), self::id(Ids::POISONOUS_POTATO)); - $this->map(Items::POPPED_CHORUS_FRUIT(), self::id(Ids::POPPED_CHORUS_FRUIT)); - $this->map(Items::POTATO(), self::id(Ids::POTATO)); - $this->map(Items::POTION(), fn(Potion $item) => new Data(Ids::POTION, PotionTypeIdMap::getInstance()->toId($item->getType()))); - $this->map(Items::PRISMARINE_CRYSTALS(), self::id(Ids::PRISMARINE_CRYSTALS)); - $this->map(Items::PRISMARINE_SHARD(), self::id(Ids::PRISMARINE_SHARD)); - $this->map(Items::PUFFERFISH(), self::id(Ids::PUFFERFISH)); - $this->map(Items::PUMPKIN_PIE(), self::id(Ids::PUMPKIN_PIE)); - $this->map(Items::PUMPKIN_SEEDS(), self::id(Ids::PUMPKIN_SEEDS)); - $this->map(Items::RABBIT_FOOT(), self::id(Ids::RABBIT_FOOT)); - $this->map(Items::RABBIT_HIDE(), self::id(Ids::RABBIT_HIDE)); - $this->map(Items::RABBIT_STEW(), self::id(Ids::RABBIT_STEW)); - $this->map(Items::RAW_BEEF(), self::id(Ids::BEEF)); - $this->map(Items::RAW_CHICKEN(), self::id(Ids::CHICKEN)); - $this->map(Items::RAW_COPPER(), self::id(Ids::RAW_COPPER)); - $this->map(Items::RAW_FISH(), self::id(Ids::COD)); - $this->map(Items::RAW_GOLD(), self::id(Ids::RAW_GOLD)); - $this->map(Items::RAW_IRON(), self::id(Ids::RAW_IRON)); - $this->map(Items::RAW_MUTTON(), self::id(Ids::MUTTON)); - $this->map(Items::RAW_PORKCHOP(), self::id(Ids::PORKCHOP)); - $this->map(Items::RAW_RABBIT(), self::id(Ids::RABBIT)); - $this->map(Items::RAW_SALMON(), self::id(Ids::SALMON)); - $this->map(Items::RECORD_11(), self::id(Ids::MUSIC_DISC_11)); - $this->map(Items::RECORD_13(), self::id(Ids::MUSIC_DISC_13)); - $this->map(Items::RECORD_BLOCKS(), self::id(Ids::MUSIC_DISC_BLOCKS)); - $this->map(Items::RECORD_CAT(), self::id(Ids::MUSIC_DISC_CAT)); - $this->map(Items::RECORD_CHIRP(), self::id(Ids::MUSIC_DISC_CHIRP)); - $this->map(Items::RECORD_FAR(), self::id(Ids::MUSIC_DISC_FAR)); - $this->map(Items::RECORD_MALL(), self::id(Ids::MUSIC_DISC_MALL)); - $this->map(Items::RECORD_MELLOHI(), self::id(Ids::MUSIC_DISC_MELLOHI)); - $this->map(Items::RECORD_STAL(), self::id(Ids::MUSIC_DISC_STAL)); - $this->map(Items::RECORD_STRAD(), self::id(Ids::MUSIC_DISC_STRAD)); - $this->map(Items::RECORD_WAIT(), self::id(Ids::MUSIC_DISC_WAIT)); - $this->map(Items::RECORD_WARD(), self::id(Ids::MUSIC_DISC_WARD)); - $this->map(Items::REDSTONE_DUST(), self::id(Ids::REDSTONE)); - $this->map(Items::ROTTEN_FLESH(), self::id(Ids::ROTTEN_FLESH)); - $this->map(Items::SCUTE(), self::id(Ids::SCUTE)); - $this->map(Items::SHEARS(), self::id(Ids::SHEARS)); - $this->map(Items::SHULKER_SHELL(), self::id(Ids::SHULKER_SHELL)); - $this->map(Items::SLIMEBALL(), self::id(Ids::SLIME_BALL)); - $this->map(Items::SNOWBALL(), self::id(Ids::SNOWBALL)); - $this->map(Items::SPIDER_EYE(), self::id(Ids::SPIDER_EYE)); - $this->map(Items::SPLASH_POTION(), fn(SplashPotion $item) => new Data(Ids::SPLASH_POTION, PotionTypeIdMap::getInstance()->toId($item->getType()))); - $this->map(Items::SPRUCE_BOAT(), self::id(Ids::SPRUCE_BOAT)); - $this->map(Items::SPRUCE_SIGN(), self::id(Ids::SPRUCE_SIGN)); - $this->map(Items::SPYGLASS(), self::id(Ids::SPYGLASS)); - $this->map(Items::SQUID_SPAWN_EGG(), self::id(Ids::SQUID_SPAWN_EGG)); - $this->map(Items::STEAK(), self::id(Ids::COOKED_BEEF)); - $this->map(Items::STICK(), self::id(Ids::STICK)); - $this->map(Items::STONE_AXE(), self::id(Ids::STONE_AXE)); - $this->map(Items::STONE_HOE(), self::id(Ids::STONE_HOE)); - $this->map(Items::STONE_PICKAXE(), self::id(Ids::STONE_PICKAXE)); - $this->map(Items::STONE_SHOVEL(), self::id(Ids::STONE_SHOVEL)); - $this->map(Items::STONE_SWORD(), self::id(Ids::STONE_SWORD)); - $this->map(Items::STRING(), self::id(Ids::STRING)); - $this->map(Items::SUGAR(), self::id(Ids::SUGAR)); - $this->map(Items::SUSPICIOUS_STEW(), fn(SuspiciousStew $item) => new Data(Ids::SUSPICIOUS_STEW, SuspiciousStewTypeIdMap::getInstance()->toId($item->getType()))); - $this->map(Items::SWEET_BERRIES(), self::id(Ids::SWEET_BERRIES)); - $this->map(Items::TOTEM(), self::id(Ids::TOTEM_OF_UNDYING)); - $this->map(Items::VILLAGER_SPAWN_EGG(), self::id(Ids::VILLAGER_SPAWN_EGG)); - $this->map(Items::WARPED_SIGN(), self::id(Ids::WARPED_SIGN)); - $this->map(Items::WATER_BUCKET(), self::id(Ids::WATER_BUCKET)); - $this->map(Items::WHEAT(), self::id(Ids::WHEAT)); - $this->map(Items::WHEAT_SEEDS(), self::id(Ids::WHEAT_SEEDS)); - $this->map(Items::WOODEN_AXE(), self::id(Ids::WOODEN_AXE)); - $this->map(Items::WOODEN_HOE(), self::id(Ids::WOODEN_HOE)); - $this->map(Items::WOODEN_PICKAXE(), self::id(Ids::WOODEN_PICKAXE)); - $this->map(Items::WOODEN_SHOVEL(), self::id(Ids::WOODEN_SHOVEL)); - $this->map(Items::WOODEN_SWORD(), self::id(Ids::WOODEN_SWORD)); - $this->map(Items::WRITABLE_BOOK(), self::id(Ids::WRITABLE_BOOK)); - $this->map(Items::WRITTEN_BOOK(), self::id(Ids::WRITTEN_BOOK)); - $this->map(Items::ZOMBIE_SPAWN_EGG(), self::id(Ids::ZOMBIE_SPAWN_EGG)); } } diff --git a/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php new file mode 100644 index 000000000..62ab3d7f3 --- /dev/null +++ b/src/data/bedrock/item/ItemSerializerDeserializerRegistrar.php @@ -0,0 +1,517 @@ +register1to1BlockMappings(); + $this->register1to1ItemMappings(); + $this->register1to1BlockWithMetaMappings(); + $this->register1to1ItemWithMetaMappings(); + $this->register1ToNItemMappings(); + $this->registerMiscBlockMappings(); + $this->registerMiscItemMappings(); + } + + public function map1to1Item(string $id, Item $item) : void{ + $this->deserializer?->map($id, fn() => clone $item); + $this->serializer?->map($item, fn() => new Data($id)); + } + + /** + * @phpstan-template TItem of Item + * @phpstan-param TItem $item + * @phpstan-param \Closure(TItem, int) : void $deserializeMeta + * @phpstan-param \Closure(TItem) : int $serializeMeta + */ + public function map1to1ItemWithMeta(string $id, Item $item, \Closure $deserializeMeta, \Closure $serializeMeta) : void{ + $this->deserializer?->map($id, function(Data $data) use ($item, $deserializeMeta) : Item{ + $result = clone $item; + $deserializeMeta($result, $data->getMeta()); + return $result; + }); + $this->serializer?->map($item, function(Item $item) use ($id, $serializeMeta) : Data{ + /** @phpstan-var TItem $item */ + $meta = $serializeMeta($item); + return new Data($id, $meta); + }); + } + + public function map1to1Block(string $id, Block $block) : void{ + $this->deserializer?->mapBlock($id, fn() => $block); + $this->serializer?->mapBlock($block, fn() => new Data($id)); + } + + /** + * @phpstan-template TBlock of Block + * @phpstan-param TBlock $block + * @phpstan-param \Closure(TBlock, int) : void $deserializeMeta + * @phpstan-param \Closure(TBlock) : int $serializeMeta + */ + public function map1to1BlockWithMeta(string $id, Block $block, \Closure $deserializeMeta, \Closure $serializeMeta) : void{ + $this->deserializer?->mapBlock($id, function(Data $data) use ($block, $deserializeMeta) : Block{ + $result = clone $block; + $deserializeMeta($result, $data->getMeta()); + return $result; + }); + $this->serializer?->mapBlock($block, function(Block $block) use ($id, $serializeMeta) : Data{ + $meta = $serializeMeta($block); + return new Data($id, $meta); + }); + } + + /** + * @param Item[] $items + * @phpstan-param array $items + */ + public function map1ToNItem(string $id, array $items) : void{ + $this->deserializer?->map($id, function(Data $data) use ($items) : Item{ + $result = $items[$data->getMeta()] ?? null; + if($result === null){ + throw new ItemTypeDeserializeException("Unhandled meta value " . $data->getMeta() . " for item ID " . $data->getName()); + } + return clone $result; + }); + foreach($items as $meta => $item){ + $this->serializer?->map($item, fn() => new Data($id, $meta)); + } + } + + /** + * Registers mappings for item IDs which directly correspond to PocketMine-MP blockitems. + * Mappings here are only necessary when the item has a dedicated item ID; in these cases, the blockstate is not + * included in the itemstack, and the item ID may be different from the block ID. + */ + private function register1to1BlockMappings() : void{ + $this->map1to1Block(Ids::ACACIA_DOOR, Blocks::ACACIA_DOOR()); + $this->map1to1Block(Ids::BIRCH_DOOR, Blocks::BIRCH_DOOR()); + $this->map1to1Block(Ids::BREWING_STAND, Blocks::BREWING_STAND()); + $this->map1to1Block(Ids::CAKE, Blocks::CAKE()); + $this->map1to1Block(Ids::CAULDRON, Blocks::CAULDRON()); + $this->map1to1Block(Ids::COMPARATOR, Blocks::REDSTONE_COMPARATOR()); + $this->map1to1Block(Ids::CRIMSON_DOOR, Blocks::CRIMSON_DOOR()); + $this->map1to1Block(Ids::DARK_OAK_DOOR, Blocks::DARK_OAK_DOOR()); + $this->map1to1Block(Ids::FLOWER_POT, Blocks::FLOWER_POT()); + $this->map1to1Block(Ids::HOPPER, Blocks::HOPPER()); + $this->map1to1Block(Ids::IRON_DOOR, Blocks::IRON_DOOR()); + $this->map1to1Block(Ids::JUNGLE_DOOR, Blocks::JUNGLE_DOOR()); + $this->map1to1Block(Ids::MANGROVE_DOOR, Blocks::MANGROVE_DOOR()); + $this->map1to1Block(Ids::NETHER_WART, Blocks::NETHER_WART()); + $this->map1to1Block(Ids::REPEATER, Blocks::REDSTONE_REPEATER()); + $this->map1to1Block(Ids::SPRUCE_DOOR, Blocks::SPRUCE_DOOR()); + $this->map1to1Block(Ids::SUGAR_CANE, Blocks::SUGARCANE()); + $this->map1to1Block(Ids::WARPED_DOOR, Blocks::WARPED_DOOR()); + $this->map1to1Block(Ids::WOODEN_DOOR, Blocks::OAK_DOOR()); + } + + /** + * Registers mappings for item IDs which directly correspond to PocketMine-MP items. + */ + private function register1to1ItemMappings() : void{ + $this->map1to1Item(Ids::ACACIA_BOAT, Items::ACACIA_BOAT()); + $this->map1to1Item(Ids::ACACIA_SIGN, Items::ACACIA_SIGN()); + $this->map1to1Item(Ids::AMETHYST_SHARD, Items::AMETHYST_SHARD()); + $this->map1to1Item(Ids::APPLE, Items::APPLE()); + $this->map1to1Item(Ids::BAKED_POTATO, Items::BAKED_POTATO()); + $this->map1to1Item(Ids::BEEF, Items::RAW_BEEF()); + $this->map1to1Item(Ids::BEETROOT, Items::BEETROOT()); + $this->map1to1Item(Ids::BEETROOT_SEEDS, Items::BEETROOT_SEEDS()); + $this->map1to1Item(Ids::BEETROOT_SOUP, Items::BEETROOT_SOUP()); + $this->map1to1Item(Ids::BIRCH_BOAT, Items::BIRCH_BOAT()); + $this->map1to1Item(Ids::BIRCH_SIGN, Items::BIRCH_SIGN()); + $this->map1to1Item(Ids::BLAZE_POWDER, Items::BLAZE_POWDER()); + $this->map1to1Item(Ids::BLAZE_ROD, Items::BLAZE_ROD()); + $this->map1to1Item(Ids::BLEACH, Items::BLEACH()); + $this->map1to1Item(Ids::BONE, Items::BONE()); + $this->map1to1Item(Ids::BONE_MEAL, Items::BONE_MEAL()); + $this->map1to1Item(Ids::BOOK, Items::BOOK()); + $this->map1to1Item(Ids::BOW, Items::BOW()); + $this->map1to1Item(Ids::BOWL, Items::BOWL()); + $this->map1to1Item(Ids::BREAD, Items::BREAD()); + $this->map1to1Item(Ids::BRICK, Items::BRICK()); + $this->map1to1Item(Ids::BUCKET, Items::BUCKET()); + $this->map1to1Item(Ids::CARROT, Items::CARROT()); + $this->map1to1Item(Ids::CHAINMAIL_BOOTS, Items::CHAINMAIL_BOOTS()); + $this->map1to1Item(Ids::CHAINMAIL_CHESTPLATE, Items::CHAINMAIL_CHESTPLATE()); + $this->map1to1Item(Ids::CHAINMAIL_HELMET, Items::CHAINMAIL_HELMET()); + $this->map1to1Item(Ids::CHAINMAIL_LEGGINGS, Items::CHAINMAIL_LEGGINGS()); + $this->map1to1Item(Ids::CHARCOAL, Items::CHARCOAL()); + $this->map1to1Item(Ids::CHICKEN, Items::RAW_CHICKEN()); + $this->map1to1Item(Ids::CHORUS_FRUIT, Items::CHORUS_FRUIT()); + $this->map1to1Item(Ids::CLAY_BALL, Items::CLAY()); + $this->map1to1Item(Ids::CLOCK, Items::CLOCK()); + $this->map1to1Item(Ids::COAL, Items::COAL()); + $this->map1to1Item(Ids::COCOA_BEANS, Items::COCOA_BEANS()); + $this->map1to1Item(Ids::COD, Items::RAW_FISH()); + $this->map1to1Item(Ids::COMPASS, Items::COMPASS()); + $this->map1to1Item(Ids::COOKED_BEEF, Items::STEAK()); + $this->map1to1Item(Ids::COOKED_CHICKEN, Items::COOKED_CHICKEN()); + $this->map1to1Item(Ids::COOKED_COD, Items::COOKED_FISH()); + $this->map1to1Item(Ids::COOKED_MUTTON, Items::COOKED_MUTTON()); + $this->map1to1Item(Ids::COOKED_PORKCHOP, Items::COOKED_PORKCHOP()); + $this->map1to1Item(Ids::COOKED_RABBIT, Items::COOKED_RABBIT()); + $this->map1to1Item(Ids::COOKED_SALMON, Items::COOKED_SALMON()); + $this->map1to1Item(Ids::COOKIE, Items::COOKIE()); + $this->map1to1Item(Ids::COPPER_INGOT, Items::COPPER_INGOT()); + $this->map1to1Item(Ids::CRIMSON_SIGN, Items::CRIMSON_SIGN()); + $this->map1to1Item(Ids::DARK_OAK_BOAT, Items::DARK_OAK_BOAT()); + $this->map1to1Item(Ids::DARK_OAK_SIGN, Items::DARK_OAK_SIGN()); + $this->map1to1Item(Ids::DIAMOND, Items::DIAMOND()); + $this->map1to1Item(Ids::DIAMOND_AXE, Items::DIAMOND_AXE()); + $this->map1to1Item(Ids::DIAMOND_BOOTS, Items::DIAMOND_BOOTS()); + $this->map1to1Item(Ids::DIAMOND_CHESTPLATE, Items::DIAMOND_CHESTPLATE()); + $this->map1to1Item(Ids::DIAMOND_HELMET, Items::DIAMOND_HELMET()); + $this->map1to1Item(Ids::DIAMOND_HOE, Items::DIAMOND_HOE()); + $this->map1to1Item(Ids::DIAMOND_LEGGINGS, Items::DIAMOND_LEGGINGS()); + $this->map1to1Item(Ids::DIAMOND_PICKAXE, Items::DIAMOND_PICKAXE()); + $this->map1to1Item(Ids::DIAMOND_SHOVEL, Items::DIAMOND_SHOVEL()); + $this->map1to1Item(Ids::DIAMOND_SWORD, Items::DIAMOND_SWORD()); + $this->map1to1Item(Ids::DISC_FRAGMENT_5, Items::DISC_FRAGMENT_5()); + $this->map1to1Item(Ids::DRAGON_BREATH, Items::DRAGON_BREATH()); + $this->map1to1Item(Ids::DRIED_KELP, Items::DRIED_KELP()); + $this->map1to1Item(Ids::ECHO_SHARD, Items::ECHO_SHARD()); + $this->map1to1Item(Ids::EGG, Items::EGG()); + $this->map1to1Item(Ids::EMERALD, Items::EMERALD()); + $this->map1to1Item(Ids::ENCHANTED_GOLDEN_APPLE, Items::ENCHANTED_GOLDEN_APPLE()); + $this->map1to1Item(Ids::ENDER_PEARL, Items::ENDER_PEARL()); + $this->map1to1Item(Ids::EXPERIENCE_BOTTLE, Items::EXPERIENCE_BOTTLE()); + $this->map1to1Item(Ids::FEATHER, Items::FEATHER()); + $this->map1to1Item(Ids::FERMENTED_SPIDER_EYE, Items::FERMENTED_SPIDER_EYE()); + $this->map1to1Item(Ids::FIRE_CHARGE, Items::FIRE_CHARGE()); + $this->map1to1Item(Ids::FISHING_ROD, Items::FISHING_ROD()); + $this->map1to1Item(Ids::FLINT, Items::FLINT()); + $this->map1to1Item(Ids::FLINT_AND_STEEL, Items::FLINT_AND_STEEL()); + $this->map1to1Item(Ids::GHAST_TEAR, Items::GHAST_TEAR()); + $this->map1to1Item(Ids::GLASS_BOTTLE, Items::GLASS_BOTTLE()); + $this->map1to1Item(Ids::GLISTERING_MELON_SLICE, Items::GLISTERING_MELON()); + $this->map1to1Item(Ids::GLOW_INK_SAC, Items::GLOW_INK_SAC()); + $this->map1to1Item(Ids::GLOWSTONE_DUST, Items::GLOWSTONE_DUST()); + $this->map1to1Item(Ids::GOLD_INGOT, Items::GOLD_INGOT()); + $this->map1to1Item(Ids::GOLD_NUGGET, Items::GOLD_NUGGET()); + $this->map1to1Item(Ids::GOLDEN_APPLE, Items::GOLDEN_APPLE()); + $this->map1to1Item(Ids::GOLDEN_AXE, Items::GOLDEN_AXE()); + $this->map1to1Item(Ids::GOLDEN_BOOTS, Items::GOLDEN_BOOTS()); + $this->map1to1Item(Ids::GOLDEN_CARROT, Items::GOLDEN_CARROT()); + $this->map1to1Item(Ids::GOLDEN_CHESTPLATE, Items::GOLDEN_CHESTPLATE()); + $this->map1to1Item(Ids::GOLDEN_HELMET, Items::GOLDEN_HELMET()); + $this->map1to1Item(Ids::GOLDEN_HOE, Items::GOLDEN_HOE()); + $this->map1to1Item(Ids::GOLDEN_LEGGINGS, Items::GOLDEN_LEGGINGS()); + $this->map1to1Item(Ids::GOLDEN_PICKAXE, Items::GOLDEN_PICKAXE()); + $this->map1to1Item(Ids::GOLDEN_SHOVEL, Items::GOLDEN_SHOVEL()); + $this->map1to1Item(Ids::GOLDEN_SWORD, Items::GOLDEN_SWORD()); + $this->map1to1Item(Ids::GUNPOWDER, Items::GUNPOWDER()); + $this->map1to1Item(Ids::HEART_OF_THE_SEA, Items::HEART_OF_THE_SEA()); + $this->map1to1Item(Ids::HONEY_BOTTLE, Items::HONEY_BOTTLE()); + $this->map1to1Item(Ids::HONEYCOMB, Items::HONEYCOMB()); + $this->map1to1Item(Ids::INK_SAC, Items::INK_SAC()); + $this->map1to1Item(Ids::IRON_AXE, Items::IRON_AXE()); + $this->map1to1Item(Ids::IRON_BOOTS, Items::IRON_BOOTS()); + $this->map1to1Item(Ids::IRON_CHESTPLATE, Items::IRON_CHESTPLATE()); + $this->map1to1Item(Ids::IRON_HELMET, Items::IRON_HELMET()); + $this->map1to1Item(Ids::IRON_HOE, Items::IRON_HOE()); + $this->map1to1Item(Ids::IRON_INGOT, Items::IRON_INGOT()); + $this->map1to1Item(Ids::IRON_LEGGINGS, Items::IRON_LEGGINGS()); + $this->map1to1Item(Ids::IRON_NUGGET, Items::IRON_NUGGET()); + $this->map1to1Item(Ids::IRON_PICKAXE, Items::IRON_PICKAXE()); + $this->map1to1Item(Ids::IRON_SHOVEL, Items::IRON_SHOVEL()); + $this->map1to1Item(Ids::IRON_SWORD, Items::IRON_SWORD()); + $this->map1to1Item(Ids::JUNGLE_BOAT, Items::JUNGLE_BOAT()); + $this->map1to1Item(Ids::JUNGLE_SIGN, Items::JUNGLE_SIGN()); + $this->map1to1Item(Ids::LAPIS_LAZULI, Items::LAPIS_LAZULI()); + $this->map1to1Item(Ids::LAVA_BUCKET, Items::LAVA_BUCKET()); + $this->map1to1Item(Ids::LEATHER, Items::LEATHER()); + $this->map1to1Item(Ids::LEATHER_BOOTS, Items::LEATHER_BOOTS()); + $this->map1to1Item(Ids::LEATHER_CHESTPLATE, Items::LEATHER_TUNIC()); + $this->map1to1Item(Ids::LEATHER_HELMET, Items::LEATHER_CAP()); + $this->map1to1Item(Ids::LEATHER_LEGGINGS, Items::LEATHER_PANTS()); + $this->map1to1Item(Ids::MAGMA_CREAM, Items::MAGMA_CREAM()); + $this->map1to1Item(Ids::MANGROVE_SIGN, Items::MANGROVE_SIGN()); + $this->map1to1Item(Ids::MELON_SEEDS, Items::MELON_SEEDS()); + $this->map1to1Item(Ids::MELON_SLICE, Items::MELON()); + $this->map1to1Item(Ids::MILK_BUCKET, Items::MILK_BUCKET()); + $this->map1to1Item(Ids::MINECART, Items::MINECART()); + $this->map1to1Item(Ids::MUSHROOM_STEW, Items::MUSHROOM_STEW()); + $this->map1to1Item(Ids::MUSIC_DISC_11, Items::RECORD_11()); + $this->map1to1Item(Ids::MUSIC_DISC_13, Items::RECORD_13()); + $this->map1to1Item(Ids::MUSIC_DISC_BLOCKS, Items::RECORD_BLOCKS()); + $this->map1to1Item(Ids::MUSIC_DISC_CAT, Items::RECORD_CAT()); + $this->map1to1Item(Ids::MUSIC_DISC_CHIRP, Items::RECORD_CHIRP()); + $this->map1to1Item(Ids::MUSIC_DISC_FAR, Items::RECORD_FAR()); + $this->map1to1Item(Ids::MUSIC_DISC_MALL, Items::RECORD_MALL()); + $this->map1to1Item(Ids::MUSIC_DISC_MELLOHI, Items::RECORD_MELLOHI()); + $this->map1to1Item(Ids::MUSIC_DISC_STAL, Items::RECORD_STAL()); + $this->map1to1Item(Ids::MUSIC_DISC_STRAD, Items::RECORD_STRAD()); + $this->map1to1Item(Ids::MUSIC_DISC_WAIT, Items::RECORD_WAIT()); + $this->map1to1Item(Ids::MUSIC_DISC_WARD, Items::RECORD_WARD()); + $this->map1to1Item(Ids::MUTTON, Items::RAW_MUTTON()); + $this->map1to1Item(Ids::NAUTILUS_SHELL, Items::NAUTILUS_SHELL()); + $this->map1to1Item(Ids::NETHER_STAR, Items::NETHER_STAR()); + $this->map1to1Item(Ids::NETHERBRICK, Items::NETHER_BRICK()); + $this->map1to1Item(Ids::NETHERITE_AXE, Items::NETHERITE_AXE()); + $this->map1to1Item(Ids::NETHERITE_BOOTS, Items::NETHERITE_BOOTS()); + $this->map1to1Item(Ids::NETHERITE_CHESTPLATE, Items::NETHERITE_CHESTPLATE()); + $this->map1to1Item(Ids::NETHERITE_HELMET, Items::NETHERITE_HELMET()); + $this->map1to1Item(Ids::NETHERITE_HOE, Items::NETHERITE_HOE()); + $this->map1to1Item(Ids::NETHERITE_INGOT, Items::NETHERITE_INGOT()); + $this->map1to1Item(Ids::NETHERITE_LEGGINGS, Items::NETHERITE_LEGGINGS()); + $this->map1to1Item(Ids::NETHERITE_PICKAXE, Items::NETHERITE_PICKAXE()); + $this->map1to1Item(Ids::NETHERITE_SCRAP, Items::NETHERITE_SCRAP()); + $this->map1to1Item(Ids::NETHERITE_SHOVEL, Items::NETHERITE_SHOVEL()); + $this->map1to1Item(Ids::NETHERITE_SWORD, Items::NETHERITE_SWORD()); + $this->map1to1Item(Ids::OAK_BOAT, Items::OAK_BOAT()); + $this->map1to1Item(Ids::OAK_SIGN, Items::OAK_SIGN()); + $this->map1to1Item(Ids::PAINTING, Items::PAINTING()); + $this->map1to1Item(Ids::PAPER, Items::PAPER()); + $this->map1to1Item(Ids::PHANTOM_MEMBRANE, Items::PHANTOM_MEMBRANE()); + $this->map1to1Item(Ids::POISONOUS_POTATO, Items::POISONOUS_POTATO()); + $this->map1to1Item(Ids::POPPED_CHORUS_FRUIT, Items::POPPED_CHORUS_FRUIT()); + $this->map1to1Item(Ids::PORKCHOP, Items::RAW_PORKCHOP()); + $this->map1to1Item(Ids::POTATO, Items::POTATO()); + $this->map1to1Item(Ids::PRISMARINE_CRYSTALS, Items::PRISMARINE_CRYSTALS()); + $this->map1to1Item(Ids::PRISMARINE_SHARD, Items::PRISMARINE_SHARD()); + $this->map1to1Item(Ids::PUFFERFISH, Items::PUFFERFISH()); + $this->map1to1Item(Ids::PUMPKIN_PIE, Items::PUMPKIN_PIE()); + $this->map1to1Item(Ids::PUMPKIN_SEEDS, Items::PUMPKIN_SEEDS()); + $this->map1to1Item(Ids::QUARTZ, Items::NETHER_QUARTZ()); + $this->map1to1Item(Ids::RABBIT, Items::RAW_RABBIT()); + $this->map1to1Item(Ids::RABBIT_FOOT, Items::RABBIT_FOOT()); + $this->map1to1Item(Ids::RABBIT_HIDE, Items::RABBIT_HIDE()); + $this->map1to1Item(Ids::RABBIT_STEW, Items::RABBIT_STEW()); + $this->map1to1Item(Ids::RAW_COPPER, Items::RAW_COPPER()); + $this->map1to1Item(Ids::RAW_GOLD, Items::RAW_GOLD()); + $this->map1to1Item(Ids::RAW_IRON, Items::RAW_IRON()); + $this->map1to1Item(Ids::REDSTONE, Items::REDSTONE_DUST()); + $this->map1to1Item(Ids::ROTTEN_FLESH, Items::ROTTEN_FLESH()); + $this->map1to1Item(Ids::SALMON, Items::RAW_SALMON()); + $this->map1to1Item(Ids::SCUTE, Items::SCUTE()); + $this->map1to1Item(Ids::SHEARS, Items::SHEARS()); + $this->map1to1Item(Ids::SHULKER_SHELL, Items::SHULKER_SHELL()); + $this->map1to1Item(Ids::SLIME_BALL, Items::SLIMEBALL()); + $this->map1to1Item(Ids::SNOWBALL, Items::SNOWBALL()); + $this->map1to1Item(Ids::SPIDER_EYE, Items::SPIDER_EYE()); + $this->map1to1Item(Ids::SPRUCE_BOAT, Items::SPRUCE_BOAT()); + $this->map1to1Item(Ids::SPRUCE_SIGN, Items::SPRUCE_SIGN()); + $this->map1to1Item(Ids::SPYGLASS, Items::SPYGLASS()); + $this->map1to1Item(Ids::SQUID_SPAWN_EGG, Items::SQUID_SPAWN_EGG()); + $this->map1to1Item(Ids::STICK, Items::STICK()); + $this->map1to1Item(Ids::STONE_AXE, Items::STONE_AXE()); + $this->map1to1Item(Ids::STONE_HOE, Items::STONE_HOE()); + $this->map1to1Item(Ids::STONE_PICKAXE, Items::STONE_PICKAXE()); + $this->map1to1Item(Ids::STONE_SHOVEL, Items::STONE_SHOVEL()); + $this->map1to1Item(Ids::STONE_SWORD, Items::STONE_SWORD()); + $this->map1to1Item(Ids::STRING, Items::STRING()); + $this->map1to1Item(Ids::SUGAR, Items::SUGAR()); + $this->map1to1Item(Ids::SWEET_BERRIES, Items::SWEET_BERRIES()); + $this->map1to1Item(Ids::TOTEM_OF_UNDYING, Items::TOTEM()); + $this->map1to1Item(Ids::TROPICAL_FISH, Items::CLOWNFISH()); + $this->map1to1Item(Ids::VILLAGER_SPAWN_EGG, Items::VILLAGER_SPAWN_EGG()); + $this->map1to1Item(Ids::WARPED_SIGN, Items::WARPED_SIGN()); + $this->map1to1Item(Ids::WATER_BUCKET, Items::WATER_BUCKET()); + $this->map1to1Item(Ids::WHEAT, Items::WHEAT()); + $this->map1to1Item(Ids::WHEAT_SEEDS, Items::WHEAT_SEEDS()); + $this->map1to1Item(Ids::WOODEN_AXE, Items::WOODEN_AXE()); + $this->map1to1Item(Ids::WOODEN_HOE, Items::WOODEN_HOE()); + $this->map1to1Item(Ids::WOODEN_PICKAXE, Items::WOODEN_PICKAXE()); + $this->map1to1Item(Ids::WOODEN_SHOVEL, Items::WOODEN_SHOVEL()); + $this->map1to1Item(Ids::WOODEN_SWORD, Items::WOODEN_SWORD()); + $this->map1to1Item(Ids::WRITABLE_BOOK, Items::WRITABLE_BOOK()); + $this->map1to1Item(Ids::WRITTEN_BOOK, Items::WRITTEN_BOOK()); + $this->map1to1Item(Ids::ZOMBIE_SPAWN_EGG, Items::ZOMBIE_SPAWN_EGG()); + } + + /** + * Registers mappings for item IDs which map to different PocketMine-MP item types, depending on their meta + * values. + * This can only be used if the target item type doesn't require any additional properties, since the items are + * indexed by their base type ID. + */ + private function register1ToNItemMappings() : void{ + $this->map1ToNItem(Ids::ARROW, [ + 0 => Items::ARROW(), + //TODO: tipped arrows + ]); + $this->map1ToNItem(Ids::COMPOUND, [ + CompoundTypeIds::SALT => Items::CHEMICAL_SALT(), + CompoundTypeIds::SODIUM_OXIDE => Items::CHEMICAL_SODIUM_OXIDE(), + CompoundTypeIds::SODIUM_HYDROXIDE => Items::CHEMICAL_SODIUM_HYDROXIDE(), + CompoundTypeIds::MAGNESIUM_NITRATE => Items::CHEMICAL_MAGNESIUM_NITRATE(), + CompoundTypeIds::IRON_SULPHIDE => Items::CHEMICAL_IRON_SULPHIDE(), + CompoundTypeIds::LITHIUM_HYDRIDE => Items::CHEMICAL_LITHIUM_HYDRIDE(), + CompoundTypeIds::SODIUM_HYDRIDE => Items::CHEMICAL_SODIUM_HYDRIDE(), + CompoundTypeIds::CALCIUM_BROMIDE => Items::CHEMICAL_CALCIUM_BROMIDE(), + CompoundTypeIds::MAGNESIUM_OXIDE => Items::CHEMICAL_MAGNESIUM_OXIDE(), + CompoundTypeIds::SODIUM_ACETATE => Items::CHEMICAL_SODIUM_ACETATE(), + CompoundTypeIds::LUMINOL => Items::CHEMICAL_LUMINOL(), + CompoundTypeIds::CHARCOAL => Items::CHEMICAL_CHARCOAL(), + CompoundTypeIds::SUGAR => Items::CHEMICAL_SUGAR(), + CompoundTypeIds::ALUMINIUM_OXIDE => Items::CHEMICAL_ALUMINIUM_OXIDE(), + CompoundTypeIds::BORON_TRIOXIDE => Items::CHEMICAL_BORON_TRIOXIDE(), + CompoundTypeIds::SOAP => Items::CHEMICAL_SOAP(), + CompoundTypeIds::POLYETHYLENE => Items::CHEMICAL_POLYETHYLENE(), + CompoundTypeIds::RUBBISH => Items::CHEMICAL_RUBBISH(), + CompoundTypeIds::MAGNESIUM_SALTS => Items::CHEMICAL_MAGNESIUM_SALTS(), + CompoundTypeIds::SULPHATE => Items::CHEMICAL_SULPHATE(), + CompoundTypeIds::BARIUM_SULPHATE => Items::CHEMICAL_BARIUM_SULPHATE(), + CompoundTypeIds::POTASSIUM_CHLORIDE => Items::CHEMICAL_POTASSIUM_CHLORIDE(), + CompoundTypeIds::MERCURIC_CHLORIDE => Items::CHEMICAL_MERCURIC_CHLORIDE(), + CompoundTypeIds::CERIUM_CHLORIDE => Items::CHEMICAL_CERIUM_CHLORIDE(), + CompoundTypeIds::TUNGSTEN_CHLORIDE => Items::CHEMICAL_TUNGSTEN_CHLORIDE(), + CompoundTypeIds::CALCIUM_CHLORIDE => Items::CHEMICAL_CALCIUM_CHLORIDE(), + CompoundTypeIds::WATER => Items::CHEMICAL_WATER(), + CompoundTypeIds::GLUE => Items::CHEMICAL_GLUE(), + CompoundTypeIds::HYPOCHLORITE => Items::CHEMICAL_HYPOCHLORITE(), + CompoundTypeIds::CRUDE_OIL => Items::CHEMICAL_CRUDE_OIL(), + CompoundTypeIds::LATEX => Items::CHEMICAL_LATEX(), + CompoundTypeIds::POTASSIUM_IODIDE => Items::CHEMICAL_POTASSIUM_IODIDE(), + CompoundTypeIds::SODIUM_FLUORIDE => Items::CHEMICAL_SODIUM_FLUORIDE(), + CompoundTypeIds::BENZENE => Items::CHEMICAL_BENZENE(), + CompoundTypeIds::INK => Items::CHEMICAL_INK(), + CompoundTypeIds::HYDROGEN_PEROXIDE => Items::CHEMICAL_HYDROGEN_PEROXIDE(), + CompoundTypeIds::AMMONIA => Items::CHEMICAL_AMMONIA(), + CompoundTypeIds::SODIUM_HYPOCHLORITE => Items::CHEMICAL_SODIUM_HYPOCHLORITE(), + ]); + } + + /** + * Registers mappings for item IDs which map to single blockitems, and have meta values that alter their properties. + * TODO: try and make this less ugly; for the most part the logic is symmetrical, it's just difficult to write it + * in a unified manner. + */ + private function register1to1BlockWithMetaMappings() : void{ + $this->map1to1BlockWithMeta( + Ids::BED, + Blocks::BED(), + function(Bed $block, int $meta) : void{ + $block->setColor(DyeColorIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown bed color ID $meta")); + }, + fn(Bed $block) => DyeColorIdMap::getInstance()->toId($block->getColor()) + ); + $this->map1to1BlockWithMeta( + Ids::SKULL, + Blocks::MOB_HEAD(), + function(Skull $block, int $meta) : void{ + try{ + $skullType = SkullType::fromMagicNumber($meta); + }catch(\InvalidArgumentException $e){ + throw new ItemTypeDeserializeException($e->getMessage(), 0, $e); + } + $block->setSkullType($skullType); + }, + fn(Skull $block) => $block->getSkullType()->getMagicNumber() + ); + } + + /** + * Registers mappings for item IDs which map to single items, and have meta values that alter their properties. + * TODO: try and make this less ugly; for the most part the logic is symmetrical, it's just difficult to write it + * in a unified manner. + */ + private function register1to1ItemWithMetaMappings() : void{ + $this->map1to1ItemWithMeta( + Ids::BANNER, + Items::BANNER(), + function(Banner $item, int $meta) : void{ + $item->setColor(DyeColorIdMap::getInstance()->fromInvertedId($meta) ?? throw new ItemTypeDeserializeException("Unknown banner meta $meta")); + }, + fn(Banner $item) => DyeColorIdMap::getInstance()->toInvertedId($item->getColor()) + ); + $this->map1to1ItemWithMeta( + Ids::POTION, + Items::POTION(), + function(Potion $item, int $meta) : void{ + $item->setType(PotionTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown potion type ID $meta")); + }, + fn(Potion $item) => PotionTypeIdMap::getInstance()->toId($item->getType()) + ); + $this->map1to1ItemWithMeta( + Ids::SPLASH_POTION, + Items::SPLASH_POTION(), + function(SplashPotion $item, int $meta) : void{ + $item->setType(PotionTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown potion type ID $meta")); + }, + fn(SplashPotion $item) => PotionTypeIdMap::getInstance()->toId($item->getType()) + ); + $this->map1to1ItemWithMeta( + Ids::SUSPICIOUS_STEW, + Items::SUSPICIOUS_STEW(), + function(SuspiciousStew $item, int $meta) : void{ + $item->setType(SuspiciousStewTypeIdMap::getInstance()->fromId($meta) ?? throw new ItemTypeDeserializeException("Unknown suspicious stew type ID $meta")); + }, + fn(SuspiciousStew $item) => SuspiciousStewTypeIdMap::getInstance()->toId($item->getType()) + ); + } + + /** + * Registers serializers and deserializers for blocks that don't fit any other pattern. + * Ideally we want to get rid of this completely, if possible. + * + * Most of these are single PocketMine-MP items which map to multiple IDs depending on their properties, which is + * complex to implement in a generic way. + */ + private function registerMiscBlockMappings() : void{ + $this->deserializer?->mapBlock(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)); + $this->deserializer?->mapBlock(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)); + $this->serializer?->mapBlock(Blocks::ITEM_FRAME(), fn(ItemFrame $block) => new Data($block->isGlowing() ? Ids::GLOW_FRAME : Ids::FRAME)); + } + + /** + * Registers serializers and deserializers for items that don't fit any other pattern. + * Ideally we want to get rid of this completely, if possible. + * + * Most of these are single PocketMine-MP items which map to multiple IDs depending on their properties, which is + * complex to implement in a generic way. + */ + private function registerMiscItemMappings() : void{ + foreach(DyeColor::getAll() as $color){ + $id = DyeColorIdMap::getInstance()->toItemId($color); + $this->deserializer?->map($id, fn() => Items::DYE()->setColor($color)); + } + $this->serializer?->map(Items::DYE(), fn(Dye $item) => new Data(DyeColorIdMap::getInstance()->toItemId($item->getColor()))); + } +}