Preparations for attempted unification of ItemSerializer and ItemDeserializer

This commit is contained in:
Dylan K. Taylor 2022-08-26 16:18:13 +01:00
parent 6799dcff51
commit ca3612e4ff
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\data\bedrock\item;
use pocketmine\block\Block;
use pocketmine\block\BlockFactory;
use pocketmine\block\utils\DyeColor;
use pocketmine\block\utils\SkullType;
@ -65,6 +66,13 @@ final class ItemDeserializer{
$this->deserializers[$id] = $deserializer;
}
/**
* @phpstan-param \Closure(Data) : Block $deserializer
*/
public function mapBlock(string $id, \Closure $deserializer) : void{
$this->map($id, fn(Data $data) => $deserializer($data)->asItem());
}
/**
* @throws ItemTypeDeserializeException
*/
@ -115,10 +123,53 @@ 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_DOOR, fn() => Blocks::ACACIA_DOOR()->asItem());
$this->map(Ids::ACACIA_SIGN, fn() => Blocks::ACACIA_SIGN()->asItem());
$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());
@ -144,22 +195,13 @@ final class ItemDeserializer{
});
//TODO: minecraft:banner_pattern
//TODO: minecraft:bat_spawn_egg
$this->map(Ids::BED, function(Data $data) : Item{
$meta = $data->getMeta();
$color = DyeColorIdMap::getInstance()->fromId($meta);
if($color === null){
throw new ItemTypeDeserializeException("Unknown bed meta $meta");
}
return Blocks::BED()->setColor($color)->asItem();
});
//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_DOOR, fn() => Blocks::BIRCH_DOOR()->asItem());
$this->map(Ids::BIRCH_SIGN, fn() => Blocks::BIRCH_SIGN()->asItem());
$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());
@ -189,17 +231,14 @@ final class ItemDeserializer{
$this->map(Ids::BOW, fn() => Items::BOW());
$this->map(Ids::BOWL, fn() => Items::BOWL());
$this->map(Ids::BREAD, fn() => Items::BREAD());
$this->map(Ids::BREWING_STAND, fn() => Blocks::BREWING_STAND()->asItem());
$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());
$this->map(Ids::CAKE, fn() => Blocks::CAKE()->asItem());
//TODO: minecraft:camera
//TODO: minecraft:campfire
$this->map(Ids::CARROT, fn() => Items::CARROT());
//TODO: minecraft:carrot_on_a_stick
//TODO: minecraft:cat_spawn_egg
$this->map(Ids::CAULDRON, fn() => Blocks::CAULDRON()->asItem());
//TODO: minecraft:cave_spider_spawn_egg
//TODO: minecraft:chain
$this->map(Ids::CHAINMAIL_BOOTS, fn() => Items::CHAINMAIL_BOOTS());
@ -219,7 +258,6 @@ final class ItemDeserializer{
//TODO: minecraft:cod_bucket
//TODO: minecraft:cod_spawn_egg
//TODO: minecraft:command_block_minecart
$this->map(Ids::COMPARATOR, fn() => Blocks::REDSTONE_COMPARATOR()->asItem());
$this->map(Ids::COMPASS, fn() => Items::COMPASS());
$this->map(Ids::COMPOUND, fn(Data $data) => match($data->getMeta()){
CompoundTypeIds::SALT => Items::CHEMICAL_SALT(),
@ -274,13 +312,11 @@ final class ItemDeserializer{
//TODO: minecraft:cow_spawn_egg
//TODO: minecraft:creeper_banner_pattern
//TODO: minecraft:creeper_spawn_egg
$this->map(Ids::CRIMSON_DOOR, fn() => Blocks::CRIMSON_DOOR()->asItem());
$this->map(Ids::CRIMSON_SIGN, fn() => Blocks::CRIMSON_SIGN()->asItem());
$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_DOOR, fn() => Blocks::DARK_OAK_DOOR()->asItem());
$this->map(Ids::DARK_OAK_SIGN, fn() => Blocks::DARK_OAK_SIGN()->asItem());
$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());
@ -347,9 +383,7 @@ final class ItemDeserializer{
$this->map(Ids::FLINT, fn() => Items::FLINT());
$this->map(Ids::FLINT_AND_STEEL, fn() => Items::FLINT_AND_STEEL());
//TODO: minecraft:flower_banner_pattern
$this->map(Ids::FLOWER_POT, fn() => Blocks::FLOWER_POT()->asItem());
//TODO: minecraft:fox_spawn_egg
$this->map(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(false)->asItem());
//TODO: minecraft:frog_spawn_egg
//TODO: minecraft:ghast_spawn_egg
$this->map(Ids::GHAST_TEAR, fn() => Items::GHAST_TEAR());
@ -357,7 +391,6 @@ final class ItemDeserializer{
$this->map(Ids::GLISTERING_MELON_SLICE, fn() => Items::GLISTERING_MELON());
//TODO: minecraft:globe_banner_pattern
//TODO: minecraft:glow_berries
$this->map(Ids::GLOW_FRAME, fn() => Blocks::ITEM_FRAME()->setGlowing(true)->asItem());
$this->map(Ids::GLOW_INK_SAC, fn() => Items::GLOW_INK_SAC());
//TODO: minecraft:glow_squid_spawn_egg
//TODO: minecraft:glow_stick
@ -386,7 +419,6 @@ final class ItemDeserializer{
//TODO: minecraft:hoglin_spawn_egg
$this->map(Ids::HONEY_BOTTLE, fn() => Items::HONEY_BOTTLE());
$this->map(Ids::HONEYCOMB, fn() => Items::HONEYCOMB());
$this->map(Ids::HOPPER, fn() => Blocks::HOPPER()->asItem());
//TODO: minecraft:hopper_minecart
//TODO: minecraft:horse_spawn_egg
//TODO: minecraft:husk_spawn_egg
@ -395,7 +427,6 @@ final class ItemDeserializer{
$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_DOOR, fn() => Blocks::IRON_DOOR()->asItem());
$this->map(Ids::IRON_HELMET, fn() => Items::IRON_HELMET());
$this->map(Ids::IRON_HOE, fn() => Items::IRON_HOE());
//TODO: minecraft:iron_horse_armor
@ -406,8 +437,7 @@ final class ItemDeserializer{
$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_DOOR, fn() => Blocks::JUNGLE_DOOR()->asItem());
$this->map(Ids::JUNGLE_SIGN, fn() => Blocks::JUNGLE_SIGN()->asItem());
$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());
@ -427,8 +457,7 @@ final class ItemDeserializer{
$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_DOOR, fn() => Blocks::MANGROVE_DOOR()->asItem());
$this->map(Ids::MANGROVE_SIGN, fn() => Blocks::MANGROVE_SIGN()->asItem());
$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());
@ -457,7 +486,6 @@ final class ItemDeserializer{
$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::NETHER_WART, fn() => Blocks::NETHER_WART()->asItem());
$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());
@ -472,7 +500,7 @@ final class ItemDeserializer{
$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() => Blocks::OAK_SIGN()->asItem());
$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());
@ -522,7 +550,6 @@ final class ItemDeserializer{
$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::REPEATER, fn() => Blocks::REDSTONE_REPEATER()->asItem());
$this->map(Ids::ROTTEN_FLESH, fn() => Items::ROTTEN_FLESH());
//TODO: minecraft:saddle
$this->map(Ids::SALMON, fn() => Items::RAW_SALMON());
@ -537,15 +564,6 @@ final class ItemDeserializer{
//TODO: minecraft:silverfish_spawn_egg
//TODO: minecraft:skeleton_horse_spawn_egg
//TODO: minecraft:skeleton_spawn_egg
$this->map(Ids::SKULL, function(Data $data) : Item{
$meta = $data->getMeta();
try{
$skullType = SkullType::fromMagicNumber($meta);
}catch(\InvalidArgumentException $e){
throw new ItemTypeDeserializeException($e->getMessage(), 0, $e);
}
return Blocks::MOB_HEAD()->setSkullType($skullType)->asItem();
});
//TODO: minecraft:skull_banner_pattern
$this->map(Ids::SLIME_BALL, fn() => Items::SLIMEBALL());
//TODO: minecraft:slime_spawn_egg
@ -569,8 +587,7 @@ final class ItemDeserializer{
return Items::SPLASH_POTION()->setType($potionType);
});
$this->map(Ids::SPRUCE_BOAT, fn() => Items::SPRUCE_BOAT());
$this->map(Ids::SPRUCE_DOOR, fn() => Blocks::SPRUCE_DOOR()->asItem());
$this->map(Ids::SPRUCE_SIGN, fn() => Blocks::SPRUCE_SIGN()->asItem());
$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());
@ -583,7 +600,6 @@ final class ItemDeserializer{
//TODO: minecraft:strider_spawn_egg
$this->map(Ids::STRING, fn() => Items::STRING());
$this->map(Ids::SUGAR, fn() => Items::SUGAR());
$this->map(Ids::SUGAR_CANE, fn() => Blocks::SUGARCANE()->asItem());
$this->map(Ids::SUSPICIOUS_STEW, function(Data $data) : Item{
$meta = $data->getMeta();
$suspiciousStewType = SuspiciousStewTypeIdMap::getInstance()->fromId($meta);
@ -607,9 +623,8 @@ final class ItemDeserializer{
$this->map(Ids::VILLAGER_SPAWN_EGG, fn() => Items::VILLAGER_SPAWN_EGG());
//TODO: minecraft:vindicator_spawn_egg
//TODO: minecraft:wandering_trader_spawn_egg
$this->map(Ids::WARPED_DOOR, fn() => Blocks::WARPED_DOOR()->asItem());
//TODO: minecraft:warped_fungus_on_a_stick
$this->map(Ids::WARPED_SIGN, fn() => Blocks::WARPED_SIGN()->asItem());
$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());
@ -618,7 +633,6 @@ final class ItemDeserializer{
//TODO: minecraft:wither_skeleton_spawn_egg
//TODO: minecraft:wolf_spawn_egg
$this->map(Ids::WOODEN_AXE, fn() => Items::WOODEN_AXE());
$this->map(Ids::WOODEN_DOOR, fn() => Blocks::OAK_DOOR()->asItem());
$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());