mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-29 06:05:54 +00:00
Preparations for attempted unification of ItemSerializer and ItemDeserializer
This commit is contained in:
parent
6799dcff51
commit
ca3612e4ff
@ -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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user