First look at modern-spec serializer/deserializer for items

this is not yet used by anything
This commit is contained in:
Dylan K. Taylor 2022-05-12 16:26:38 +01:00
parent 6c92e73b46
commit cb97f37d13
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
7 changed files with 1934 additions and 0 deletions

View File

@ -0,0 +1,63 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\data\bedrock;
use pocketmine\entity\effect\StringToEffectParser;
use pocketmine\utils\AssumptionFailedError;
use pocketmine\utils\SingletonTrait;
use Webmozart\PathUtil\Path;
use const pocketmine\BEDROCK_DATA_PATH;
/**
* Bidirectional map of block IDs to their corresponding blockitem IDs, used for storing items on disk
*/
final class BlockItemIdMap{
use SingletonTrait;
private static function make() : self{
$map = json_decode(file_get_contents(Path::join(BEDROCK_DATA_PATH, 'block_id_to_item_id_map.json')), true, flags: JSON_THROW_ON_ERROR);
if(!is_array($map)){
throw new AssumptionFailedError("Invalid blockitem ID mapping table, expected array as root type");
}
return new self($map);
}
/**
* @param string[] $blockToItemId
* @phpstan-param array<string, string> $blockToItemId
*/
public function __construct(private array $blockToItemId){}
public function lookupItemId(string $blockId) : ?string{
return $this->blockToItemId[$blockId] ?? null;
}
public function lookupBlockId(string $itemId) : ?string{
//we don't need this for any functionality, so we're not concerned about performance here
//however, it might be nice to have for debugging
$blockId = array_search($itemId, $this->blockToItemId, true);
return $blockId !== false ? $blockId : null;
}
}

View File

@ -0,0 +1,703 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\data\bedrock\item;
use pocketmine\block\BlockFactory;
use pocketmine\block\utils\DyeColor;
use pocketmine\block\utils\SkullType;
use pocketmine\block\utils\TreeType;
use pocketmine\block\VanillaBlocks as Blocks;
use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException;
use pocketmine\data\bedrock\CompoundTypeIds;
use pocketmine\data\bedrock\DyeColorIdMap;
use pocketmine\data\bedrock\EntityLegacyIds;
use pocketmine\data\bedrock\item\ItemTypeIds as Ids;
use pocketmine\data\bedrock\item\SavedItemData as Data;
use pocketmine\data\bedrock\PotionTypeIdMap;
use pocketmine\data\SavedDataLoadingException;
use pocketmine\item\Item;
use pocketmine\item\PotionType;
use pocketmine\item\VanillaItems as Items;
use pocketmine\utils\AssumptionFailedError;
use pocketmine\utils\SingletonTrait;
use pocketmine\world\format\io\GlobalBlockStateHandlers;
final class ItemDeserializer{
use SingletonTrait;
/**
* @var \Closure[]
* @phpstan-var array<string, \Closure(Data) : Item>
*/
private array $deserializers = [];
public function __construct(){
$this->registerDeserializers();
}
/**
* @phpstan-param \Closure(Data) : Item $deserializer
*/
public function map(string $id, \Closure $deserializer) : void{
$this->deserializers[$id] = $deserializer;
}
public function deserialize(Data $data) : Item{
if(($blockData = $data->getBlock()) !== null){
//TODO: this is rough duct tape; we need a better way to deal with this
try{
$block = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockData);
}catch(BlockStateDeserializeException $e){
throw new SavedDataLoadingException("Failed to deserialize item data: " . $e->getMessage(), 0, $e);
}
//TODO: worth caching this or not?
return BlockFactory::getInstance()->fromFullBlock($block)->asItem();
}
$id = $data->getName();
if(!isset($this->deserializers[$id])){
throw new SavedDataLoadingException("No deserializer found for ID $id");
}
return ($this->deserializers[$id])($data);
}
private function registerDeserializers() : void{
$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());
//TODO: minecraft:agent_spawn_egg
//TODO: minecraft:allay_spawn_egg
//TODO: minecraft: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 SavedDataLoadingException("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 SavedDataLoadingException("Unknown banner meta $meta");
}
return Items::BANNER()->setColor($color);
});
//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 SavedDataLoadingException("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::BLACK_DYE, fn() => Items::BLACK_DYE());
$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::BLUE_DYE());
$this->map(Ids::BOAT, function(Data $data) : Item{
try{
$treeType = TreeType::fromMagicNumber($data->getMeta());
}catch(\InvalidArgumentException $e){
throw new SavedDataLoadingException($e->getMessage(), 0, $e);
}
return match($treeType->id()){
TreeType::OAK()->id() => Items::OAK_BOAT(),
TreeType::SPRUCE()->id() => Items::SPRUCE_BOAT(),
TreeType::BIRCH()->id() => Items::BIRCH_BOAT(),
TreeType::JUNGLE()->id() => Items::JUNGLE_BOAT(),
TreeType::ACACIA()->id() => Items::ACACIA_BOAT(),
TreeType::DARK_OAK()->id() => Items::DARK_OAK_BOAT(),
default => throw new AssumptionFailedError("Unexpected tree type " . $treeType->name())
};
});
$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::BREWING_STAND, fn() => Blocks::BREWING_STAND()->asItem());
$this->map(Ids::BRICK, fn() => Items::BRICK());
$this->map(Ids::BROWN_DYE, fn() => Items::BROWN_DYE());
$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
//TODO: minecraft:cauldron
//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::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(),
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 SavedDataLoadingException("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());
//TODO: minecraft:copper_ingot
//TODO: minecraft:cow_spawn_egg
//TODO: minecraft:creeper_banner_pattern
//TODO: minecraft:creeper_spawn_egg
//TODO: minecraft:crimson_door
//TODO: minecraft:crimson_sign
//TODO: minecraft:crossbow
$this->map(Ids::CYAN_DYE, fn() => Items::CYAN_DYE());
$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::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());
//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::DYE, function(Data $data) : Item{
$meta = $data->getMeta();
$item = match($meta) {
0 => Items::INK_SAC(),
3 => Items::COCOA_BEANS(),
4 => Items::LAPIS_LAZULI(),
15 => Items::BONE_MEAL(),
16 => Items::BLACK_DYE(),
17 => Items::BROWN_DYE(),
18 => Items::BLUE_DYE(),
19 => Items::WHITE_DYE(),
default => null
};
if($item !== null){
return $item;
}
$dyeColor = DyeColorIdMap::getInstance()->fromInvertedId($meta);
if($dyeColor === null){
throw new SavedDataLoadingException("Unknown dye meta $meta");
}
return match($dyeColor->id()){
DyeColor::CYAN()->id() => Items::CYAN_DYE(),
DyeColor::GRAY()->id() => Items::GRAY_DYE(),
DyeColor::GREEN()->id() => Items::GREEN_DYE(),
DyeColor::LIGHT_BLUE()->id() => Items::LIGHT_BLUE_DYE(),
DyeColor::LIGHT_GRAY()->id() => Items::LIGHT_GRAY_DYE(),
DyeColor::LIME()->id() => Items::LIME_DYE(),
DyeColor::MAGENTA()->id() => Items::MAGENTA_DYE(),
DyeColor::ORANGE()->id() => Items::ORANGE_DYE(),
DyeColor::PINK()->id() => Items::PINK_DYE(),
DyeColor::PURPLE()->id() => Items::PURPLE_DYE(),
DyeColor::RED()->id() => Items::RED_DYE(),
DyeColor::YELLOW()->id() => Items::YELLOW_DYE(),
default => throw new AssumptionFailedError("Unhandled dye color " . $dyeColor->name())
};
});
$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
//TODO: minecraft: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
$this->map(Ids::FLOWER_POT, fn() => Blocks::FLOWER_POT()->asItem());
//TODO: minecraft:fox_spawn_egg
$this->map(Ids::FRAME, fn() => Blocks::ITEM_FRAME()->asItem());
//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
//TODO: minecraft:glow_frame
//TODO: minecraft: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::GRAY_DYE());
$this->map(Ids::GREEN_DYE, fn() => Items::GREEN_DYE());
//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
//TODO: minecraft:honey_bottle
//TODO: minecraft:honeycomb
$this->map(Ids::HOPPER, fn() => Blocks::HOPPER()->asItem());
//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_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
$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_DOOR, fn() => Blocks::JUNGLE_DOOR()->asItem());
$this->map(Ids::JUNGLE_SIGN, fn() => Blocks::JUNGLE_SIGN()->asItem());
//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::LIGHT_BLUE_DYE());
$this->map(Ids::LIGHT_GRAY_DYE, fn() => Items::LIGHT_GRAY_DYE());
$this->map(Ids::LIME_DYE, fn() => Items::LIME_DYE());
//TODO: minecraft:lingering_potion
//TODO: minecraft:llama_spawn_egg
//TODO: minecraft:lodestone_compass
$this->map(Ids::MAGENTA_DYE, fn() => Items::MAGENTA_DYE());
$this->map(Ids::MAGMA_CREAM, fn() => Items::MAGMA_CREAM());
//TODO: minecraft:magma_cube_spawn_egg
//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::NETHER_WART, fn() => Blocks::NETHER_WART()->asItem());
$this->map(Ids::NETHERBRICK, fn() => Items::NETHER_BRICK());
//TODO: minecraft:netherite_axe
//TODO: minecraft:netherite_boots
//TODO: minecraft:netherite_chestplate
//TODO: minecraft:netherite_helmet
//TODO: minecraft:netherite_hoe
//TODO: minecraft:netherite_ingot
//TODO: minecraft:netherite_leggings
//TODO: minecraft:netherite_pickaxe
//TODO: minecraft:netherite_scrap
//TODO: minecraft:netherite_shovel
//TODO: minecraft: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());
//TODO: minecraft:ocelot_spawn_egg
$this->map(Ids::ORANGE_DYE, fn() => Items::ORANGE_DYE());
$this->map(Ids::PAINTING, fn() => Items::PAINTING());
//TODO: minecraft:panda_spawn_egg
$this->map(Ids::PAPER, fn() => Items::PAPER());
//TODO: minecraft:parrot_spawn_egg
//TODO: minecraft: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::PINK_DYE());
$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 SavedDataLoadingException("Unknown potion type ID $meta");
}
return match($potionType->id()){
PotionType::WATER()->id() => Items::WATER_POTION(),
PotionType::MUNDANE()->id() => Items::MUNDANE_POTION(),
PotionType::LONG_MUNDANE()->id() => Items::LONG_MUNDANE_POTION(),
PotionType::THICK()->id() => Items::THICK_POTION(),
PotionType::AWKWARD()->id() => Items::AWKWARD_POTION(),
PotionType::NIGHT_VISION()->id() => Items::NIGHT_VISION_POTION(),
PotionType::LONG_NIGHT_VISION()->id() => Items::LONG_NIGHT_VISION_POTION(),
PotionType::INVISIBILITY()->id() => Items::INVISIBILITY_POTION(),
PotionType::LONG_INVISIBILITY()->id() => Items::LONG_INVISIBILITY_POTION(),
PotionType::LEAPING()->id() => Items::LEAPING_POTION(),
PotionType::LONG_LEAPING()->id() => Items::LONG_LEAPING_POTION(),
PotionType::STRONG_LEAPING()->id() => Items::STRONG_LEAPING_POTION(),
PotionType::FIRE_RESISTANCE()->id() => Items::FIRE_RESISTANCE_POTION(),
PotionType::LONG_FIRE_RESISTANCE()->id() => Items::LONG_FIRE_RESISTANCE_POTION(),
PotionType::SWIFTNESS()->id() => Items::SWIFTNESS_POTION(),
PotionType::LONG_SWIFTNESS()->id() => Items::LONG_SWIFTNESS_POTION(),
PotionType::STRONG_SWIFTNESS()->id() => Items::STRONG_SWIFTNESS_POTION(),
PotionType::SLOWNESS()->id() => Items::SLOWNESS_POTION(),
PotionType::LONG_SLOWNESS()->id() => Items::LONG_SLOWNESS_POTION(),
PotionType::WATER_BREATHING()->id() => Items::WATER_BREATHING_POTION(),
PotionType::LONG_WATER_BREATHING()->id() => Items::LONG_WATER_BREATHING_POTION(),
PotionType::HEALING()->id() => Items::HEALING_POTION(),
PotionType::STRONG_HEALING()->id() => Items::STRONG_HEALING_POTION(),
PotionType::HARMING()->id() => Items::HARMING_POTION(),
PotionType::STRONG_HARMING()->id() => Items::STRONG_HARMING_POTION(),
PotionType::POISON()->id() => Items::POISON_POTION(),
PotionType::LONG_POISON()->id() => Items::LONG_POISON_POTION(),
PotionType::STRONG_POISON()->id() => Items::STRONG_POISON_POTION(),
PotionType::REGENERATION()->id() => Items::REGENERATION_POTION(),
PotionType::LONG_REGENERATION()->id() => Items::LONG_REGENERATION_POTION(),
PotionType::STRONG_REGENERATION()->id() => Items::STRONG_REGENERATION_POTION(),
PotionType::STRENGTH()->id() => Items::STRENGTH_POTION(),
PotionType::LONG_STRENGTH()->id() => Items::LONG_STRENGTH_POTION(),
PotionType::STRONG_STRENGTH()->id() => Items::STRONG_STRENGTH_POTION(),
PotionType::WEAKNESS()->id() => Items::WEAKNESS_POTION(),
PotionType::LONG_WEAKNESS()->id() => Items::LONG_WEAKNESS_POTION(),
PotionType::WITHER()->id() => Items::WITHER_POTION(),
PotionType::TURTLE_MASTER()->id() => Items::TURTLE_MASTER_POTION(),
PotionType::LONG_TURTLE_MASTER()->id() => Items::LONG_TURTLE_MASTER_POTION(),
PotionType::STRONG_TURTLE_MASTER()->id() => Items::STRONG_TURTLE_MASTER_POTION(),
PotionType::SLOW_FALLING()->id() => Items::SLOW_FALLING_POTION(),
PotionType::LONG_SLOW_FALLING()->id() => Items::LONG_SLOW_FALLING_POTION(),
default => throw new SavedDataLoadingException("Unhandled potion type " . $potionType->getDisplayName())
};
});
//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::PURPLE_DYE());
$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
//TODO: minecraft:raw_copper
//TODO: minecraft:raw_gold
//TODO: minecraft:raw_iron
$this->map(Ids::RED_DYE, fn() => Items::RED_DYE());
$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());
//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
$this->map(Ids::SKULL, function(Data $data) : Item{
$meta = $data->getMeta();
try{
$skullType = SkullType::fromMagicNumber($meta);
}catch(\InvalidArgumentException $e){
throw new SavedDataLoadingException($e->getMessage(), 0, $e);
}
return match($skullType->id()) {
SkullType::SKELETON()->id() => Items::SKELETON_SKULL(),
SkullType::WITHER_SKELETON()->id() => Items::WITHER_SKELETON_SKULL(),
SkullType::ZOMBIE()->id() => Items::ZOMBIE_HEAD(),
SkullType::CREEPER()->id() => Items::CREEPER_HEAD(),
SkullType::PLAYER()->id() => Items::PLAYER_HEAD(),
SkullType::DRAGON()->id() => Items::DRAGON_HEAD(),
default => throw new SavedDataLoadingException("Unexpected skull type " . $skullType->getDisplayName())
};
});
//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::SPAWN_EGG, fn(Data $data) => match($data->getMeta()){
EntityLegacyIds::ZOMBIE => Items::ZOMBIE_SPAWN_EGG(),
EntityLegacyIds::SQUID => Items::SQUID_SPAWN_EGG(),
EntityLegacyIds::VILLAGER => Items::VILLAGER_SPAWN_EGG(),
default => throw new SavedDataLoadingException("Unhandled spawn egg meta " . $data->getMeta())
});
$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 SavedDataLoadingException("Unknown potion type ID $meta");
}
return match($potionType->id()){
PotionType::WATER()->id() => Items::WATER_SPLASH_POTION(),
PotionType::MUNDANE()->id() => Items::MUNDANE_SPLASH_POTION(),
PotionType::LONG_MUNDANE()->id() => Items::LONG_MUNDANE_SPLASH_POTION(),
PotionType::THICK()->id() => Items::THICK_SPLASH_POTION(),
PotionType::AWKWARD()->id() => Items::AWKWARD_SPLASH_POTION(),
PotionType::NIGHT_VISION()->id() => Items::NIGHT_VISION_SPLASH_POTION(),
PotionType::LONG_NIGHT_VISION()->id() => Items::LONG_NIGHT_VISION_SPLASH_POTION(),
PotionType::INVISIBILITY()->id() => Items::INVISIBILITY_SPLASH_POTION(),
PotionType::LONG_INVISIBILITY()->id() => Items::LONG_INVISIBILITY_SPLASH_POTION(),
PotionType::LEAPING()->id() => Items::LEAPING_SPLASH_POTION(),
PotionType::LONG_LEAPING()->id() => Items::LONG_LEAPING_SPLASH_POTION(),
PotionType::STRONG_LEAPING()->id() => Items::STRONG_LEAPING_SPLASH_POTION(),
PotionType::FIRE_RESISTANCE()->id() => Items::FIRE_RESISTANCE_SPLASH_POTION(),
PotionType::LONG_FIRE_RESISTANCE()->id() => Items::LONG_FIRE_RESISTANCE_SPLASH_POTION(),
PotionType::SWIFTNESS()->id() => Items::SWIFTNESS_SPLASH_POTION(),
PotionType::LONG_SWIFTNESS()->id() => Items::LONG_SWIFTNESS_SPLASH_POTION(),
PotionType::STRONG_SWIFTNESS()->id() => Items::STRONG_SWIFTNESS_SPLASH_POTION(),
PotionType::SLOWNESS()->id() => Items::SLOWNESS_SPLASH_POTION(),
PotionType::LONG_SLOWNESS()->id() => Items::LONG_SLOWNESS_SPLASH_POTION(),
PotionType::WATER_BREATHING()->id() => Items::WATER_BREATHING_SPLASH_POTION(),
PotionType::LONG_WATER_BREATHING()->id() => Items::LONG_WATER_BREATHING_SPLASH_POTION(),
PotionType::HEALING()->id() => Items::HEALING_SPLASH_POTION(),
PotionType::STRONG_HEALING()->id() => Items::STRONG_HEALING_SPLASH_POTION(),
PotionType::HARMING()->id() => Items::HARMING_SPLASH_POTION(),
PotionType::STRONG_HARMING()->id() => Items::STRONG_HARMING_SPLASH_POTION(),
PotionType::POISON()->id() => Items::POISON_SPLASH_POTION(),
PotionType::LONG_POISON()->id() => Items::LONG_POISON_SPLASH_POTION(),
PotionType::STRONG_POISON()->id() => Items::STRONG_POISON_SPLASH_POTION(),
PotionType::REGENERATION()->id() => Items::REGENERATION_SPLASH_POTION(),
PotionType::LONG_REGENERATION()->id() => Items::LONG_REGENERATION_SPLASH_POTION(),
PotionType::STRONG_REGENERATION()->id() => Items::STRONG_REGENERATION_SPLASH_POTION(),
PotionType::STRENGTH()->id() => Items::STRENGTH_SPLASH_POTION(),
PotionType::LONG_STRENGTH()->id() => Items::LONG_STRENGTH_SPLASH_POTION(),
PotionType::STRONG_STRENGTH()->id() => Items::STRONG_STRENGTH_SPLASH_POTION(),
PotionType::WEAKNESS()->id() => Items::WEAKNESS_SPLASH_POTION(),
PotionType::LONG_WEAKNESS()->id() => Items::LONG_WEAKNESS_SPLASH_POTION(),
PotionType::WITHER()->id() => Items::WITHER_SPLASH_POTION(),
PotionType::TURTLE_MASTER()->id() => Items::TURTLE_MASTER_SPLASH_POTION(),
PotionType::LONG_TURTLE_MASTER()->id() => Items::LONG_TURTLE_MASTER_SPLASH_POTION(),
PotionType::STRONG_TURTLE_MASTER()->id() => Items::STRONG_TURTLE_MASTER_SPLASH_POTION(),
PotionType::SLOW_FALLING()->id() => Items::SLOW_FALLING_SPLASH_POTION(),
PotionType::LONG_SLOW_FALLING()->id() => Items::LONG_SLOW_FALLING_SPLASH_POTION(),
default => throw new SavedDataLoadingException("Unhandled potion type " . $potionType->getDisplayName())
};
});
$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());
//TODO: minecraft: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::SUGAR_CANE, fn() => Blocks::SUGARCANE()->asItem());
//TODO: minecraft:suspicious_stew
$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_door
//TODO: minecraft:warped_fungus_on_a_stick
//TODO: minecraft: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::WHITE_DYE());
//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_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());
$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::YELLOW_DYE());
//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
}
}

View File

@ -0,0 +1,567 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\data\bedrock\item;
use pocketmine\block\Block;
use pocketmine\block\utils\DyeColor;
use pocketmine\block\utils\SkullType;
use pocketmine\data\bedrock\BlockItemIdMap;
use pocketmine\data\bedrock\CompoundTypeIds;
use pocketmine\data\bedrock\DyeColorIdMap;
use pocketmine\data\bedrock\item\ItemTypeIds as Ids;
use pocketmine\data\bedrock\item\SavedItemData as Data;
use pocketmine\data\bedrock\PotionTypeIdMap;
use pocketmine\item\Banner;
use pocketmine\item\Durable;
use pocketmine\item\Item;
use pocketmine\item\ItemBlock;
use pocketmine\item\PotionType;
use pocketmine\item\VanillaItems as Items;
use pocketmine\utils\AssumptionFailedError;
use pocketmine\world\format\io\GlobalBlockStateHandlers;
use function class_parents;
use function get_class;
final class ItemSerializer{
/**
* These callables actually accept Item, but for the sake of type completeness, it has to be never, since we can't
* describe the bottom type of a type hierarchy only containing Item.
*
* @var \Closure[][]
* @phpstan-var array<int, array<class-string, \Closure(never) : Data>>
*/
private array $serializers = [];
/**
* @var \Closure[]
* @phpstan-var array<int, \Closure(ItemBlock) : Data>>
*/
private array $blockItemSerializers = [];
public function __construct(){
$this->registerSerializers();
}
/**
* @phpstan-template TItemType of Item
* @phpstan-param TItemType $item
* @phpstan-param \Closure(TItemType) : Data $serializer
*/
public function map(Item $item, \Closure $serializer) : void{
if($item->hasAnyDamageValue()){
throw new \InvalidArgumentException("Cannot serialize a recipe wildcard");
}
$index = ($item->getId() << 16) | $item->getMeta();
if(isset($this->serializers[$index])){
//TODO: REMOVE ME
throw new AssumptionFailedError("Registering the same item twice!");
}
$this->serializers[$index][get_class($item)] = $serializer;
}
/**
* @phpstan-param \Closure(ItemBlock) : Data $serializer
*/
public function mapBlock(Block $block, \Closure $serializer) : void{
if(!$block->asItem() instanceof ItemBlock){
throw new AssumptionFailedError("Mapped item must be an ItemBlock");
}
$index = $block->getTypeId();
if(isset($this->blockItemSerializers[$index])){
throw new AssumptionFailedError("Registering the same item twice!");
}
$this->blockItemSerializers[$index] = $serializer;
}
/**
* @phpstan-template TItemType of Item
* @phpstan-param TItemType $item
*/
public function serialize(Item $item) : Data{
if($item->isNull()){
throw new \InvalidArgumentException("Cannot serialize a null itemstack");
}
if($item instanceof ItemBlock){
$block = $item->getBlock();
$index = $block->getTypeId();
$serializer = $this->blockItemSerializers[$index] ?? null;
if($serializer !== null){
$data = $serializer($item);
}else{ //assume that this is just a standard itemblock
$data = self::standardBlock($block);
}
}else{
$index = ($item->getId() << 16) | ($item instanceof Durable ? 0 : $item->getMeta());
$locatedSerializer = $this->serializers[$index][get_class($item)] ?? null;
if($locatedSerializer === null){
$parents = class_parents($item);
if($parents !== false){
foreach($parents as $parent){
if(isset($this->serializers[$index][$parent])){
$locatedSerializer = $this->serializers[$index][$parent];
break;
}
}
}
}
if($locatedSerializer === null){
//TODO: proper exceptions
throw new \LogicException("No serializer registered for " . get_class($item) . " " . $item->getName());
}
/**
* @var \Closure $serializer
* @phpstan-var \Closure(TItemType) : Data $serializer
*/
$serializer = $locatedSerializer;
/** @var Data $data */
$data = $serializer($item);
}
return $data;
}
private static function standardBlock(Block $block) : Data{
$blockStateData = GlobalBlockStateHandlers::getSerializer()->serialize($block->getFullId());
$itemNameId = BlockItemIdMap::getInstance()->lookupItemId($blockStateData->getName());
if($itemNameId === null){
//TODO: this might end up being a hassle for custom blocks, since it'll force providing an item
//serializer for every custom block
//it would probably be better if we allow adding custom item <-> block ID mappings for this
throw new \LogicException("No blockitem serializer or blockitem ID mapping registered for block " . $blockStateData->getName());
}
return new Data($itemNameId, 0, $blockStateData);
}
/**
* @phpstan-return \Closure(Item) : Data
*/
private static function standardBlockWrapper() : \Closure{
return fn(Item $item) => self::standardBlock($item->getBlock());
}
/**
* @phpstan-return \Closure() : Data
*/
private static function id(string $id) : \Closure{
return fn() => new Data($id);
}
/**
* @phpstan-return \Closure() : Data
*/
private static function bed(DyeColor $color) : \Closure{
$meta = DyeColorIdMap::getInstance()->toId($color);
return fn() => new Data(Ids::BED, $meta);
}
/**
* @phpstan-return \Closure() : Data
*/
private static function skull(SkullType $skullType) : \Closure{
$meta = $skullType->getMagicNumber();
return fn() => new Data(Ids::SKULL, $meta);
}
/**
* @phpstan-return \Closure() : Data
*/
private static function chemical(int $type) : \Closure{
return fn() => new Data(Ids::COMPOUND, $type);
}
/**
* @phpstan-return \Closure() : Data
*/
private static function potion(PotionType $type) : \Closure{
$meta = PotionTypeIdMap::getInstance()->toId($type);
return fn() => new Data(Ids::POTION, $meta);
}
/**
* @phpstan-return \Closure() : Data
*/
private static function splashPotion(PotionType $type) : \Closure{
$meta = PotionTypeIdMap::getInstance()->toId($type);
return fn() => new Data(Ids::SPLASH_POTION, $meta);
}
private function registerSerializers() : void{
//these are encoded as regular blocks, but they have to be accounted for explicitly since they don't use ItemBlock
$this->map(Items::BAMBOO(), self::standardBlockWrapper());
$this->map(Items::CORAL_FAN(), self::standardBlockWrapper());
$this->map(Items::BANNER(), fn(Banner $item) => new Data(Ids::BANNER, DyeColorIdMap::getInstance()->toInvertedId($item->getColor())));
$this->map(Items::ACACIA_BOAT(), self::id(Ids::ACACIA_BOAT));
$this->map(Items::ACACIA_SIGN(), self::id(Ids::ACACIA_SIGN));
$this->map(Items::APPLE(), self::id(Ids::APPLE));
$this->map(Items::ARROW(), self::id(Ids::ARROW));
$this->map(Items::AWKWARD_POTION(), self::potion(PotionType::AWKWARD()));
$this->map(Items::AWKWARD_SPLASH_POTION(), self::splashPotion(PotionType::AWKWARD()));
$this->map(Items::BAKED_POTATO(), self::id(Ids::BAKED_POTATO));
$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::BLACK_BED(), self::bed(DyeColor::BLACK()));
$this->map(Items::BLACK_DYE(), self::id(Ids::BLACK_DYE));
$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::BLUE_BED(), self::bed(DyeColor::BLUE()));
$this->map(Items::BLUE_DYE(), self::id(Ids::BLUE_DYE));
$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::BROWN_BED(), self::bed(DyeColor::BROWN()));
$this->map(Items::BROWN_DYE(), self::id(Ids::BROWN_DYE));
$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::CREEPER_HEAD(), self::skull(SkullType::CREEPER()));
$this->map(Items::CYAN_BED(), self::bed(DyeColor::CYAN()));
$this->map(Items::CYAN_DYE(), self::id(Ids::CYAN_DYE));
$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::DRAGON_BREATH(), self::id(Ids::DRAGON_BREATH));
$this->map(Items::DRAGON_HEAD(), self::skull(SkullType::DRAGON()));
$this->map(Items::DRIED_KELP(), self::id(Ids::DRIED_KELP));
$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_RESISTANCE_POTION(), self::potion(PotionType::FIRE_RESISTANCE()));
$this->map(Items::FIRE_RESISTANCE_SPLASH_POTION(), self::splashPotion(PotionType::FIRE_RESISTANCE()));
$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::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::GRAY_BED(), self::bed(DyeColor::GRAY()));
$this->map(Items::GRAY_DYE(), self::id(Ids::GRAY_DYE));
$this->map(Items::GREEN_BED(), self::bed(DyeColor::GREEN()));
$this->map(Items::GREEN_DYE(), self::id(Ids::GREEN_DYE));
$this->map(Items::GUNPOWDER(), self::id(Ids::GUNPOWDER));
$this->map(Items::HARMING_POTION(), self::potion(PotionType::HARMING()));
$this->map(Items::HARMING_SPLASH_POTION(), self::splashPotion(PotionType::HARMING()));
$this->map(Items::HEALING_POTION(), self::potion(PotionType::HEALING()));
$this->map(Items::HEALING_SPLASH_POTION(), self::splashPotion(PotionType::HEALING()));
$this->map(Items::HEART_OF_THE_SEA(), self::id(Ids::HEART_OF_THE_SEA));
$this->map(Items::INK_SAC(), self::id(Ids::INK_SAC));
$this->map(Items::INVISIBILITY_POTION(), self::potion(PotionType::INVISIBILITY()));
$this->map(Items::INVISIBILITY_SPLASH_POTION(), self::splashPotion(PotionType::INVISIBILITY()));
$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::LEAPING_POTION(), self::potion(PotionType::LEAPING()));
$this->map(Items::LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::LEAPING()));
$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::LIGHT_BLUE_BED(), self::bed(DyeColor::LIGHT_BLUE()));
$this->map(Items::LIGHT_BLUE_DYE(), self::id(Ids::LIGHT_BLUE_DYE));
$this->map(Items::LIGHT_GRAY_BED(), self::bed(DyeColor::LIGHT_GRAY()));
$this->map(Items::LIGHT_GRAY_DYE(), self::id(Ids::LIGHT_GRAY_DYE));
$this->map(Items::LIME_BED(), self::bed(DyeColor::LIME()));
$this->map(Items::LIME_DYE(), self::id(Ids::LIME_DYE));
$this->map(Items::LONG_FIRE_RESISTANCE_POTION(), self::potion(PotionType::LONG_FIRE_RESISTANCE()));
$this->map(Items::LONG_FIRE_RESISTANCE_SPLASH_POTION(), self::splashPotion(PotionType::LONG_FIRE_RESISTANCE()));
$this->map(Items::LONG_INVISIBILITY_POTION(), self::potion(PotionType::LONG_INVISIBILITY()));
$this->map(Items::LONG_INVISIBILITY_SPLASH_POTION(), self::splashPotion(PotionType::LONG_INVISIBILITY()));
$this->map(Items::LONG_LEAPING_POTION(), self::potion(PotionType::LONG_LEAPING()));
$this->map(Items::LONG_LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_LEAPING()));
$this->map(Items::LONG_MUNDANE_POTION(), self::potion(PotionType::LONG_MUNDANE()));
$this->map(Items::LONG_MUNDANE_SPLASH_POTION(), self::splashPotion(PotionType::LONG_MUNDANE()));
$this->map(Items::LONG_NIGHT_VISION_POTION(), self::potion(PotionType::LONG_NIGHT_VISION()));
$this->map(Items::LONG_NIGHT_VISION_SPLASH_POTION(), self::splashPotion(PotionType::LONG_NIGHT_VISION()));
$this->map(Items::LONG_POISON_POTION(), self::potion(PotionType::LONG_POISON()));
$this->map(Items::LONG_POISON_SPLASH_POTION(), self::splashPotion(PotionType::LONG_POISON()));
$this->map(Items::LONG_REGENERATION_POTION(), self::potion(PotionType::LONG_REGENERATION()));
$this->map(Items::LONG_REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::LONG_REGENERATION()));
$this->map(Items::LONG_SLOWNESS_POTION(), self::potion(PotionType::LONG_SLOWNESS()));
$this->map(Items::LONG_SLOWNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SLOWNESS()));
$this->map(Items::LONG_SLOW_FALLING_POTION(), self::potion(PotionType::LONG_SLOW_FALLING()));
$this->map(Items::LONG_SLOW_FALLING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SLOW_FALLING()));
$this->map(Items::LONG_STRENGTH_POTION(), self::potion(PotionType::LONG_STRENGTH()));
$this->map(Items::LONG_STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::LONG_STRENGTH()));
$this->map(Items::LONG_SWIFTNESS_POTION(), self::potion(PotionType::LONG_SWIFTNESS()));
$this->map(Items::LONG_SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_SWIFTNESS()));
$this->map(Items::LONG_TURTLE_MASTER_POTION(), self::potion(PotionType::LONG_TURTLE_MASTER()));
$this->map(Items::LONG_TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::LONG_TURTLE_MASTER()));
$this->map(Items::LONG_WATER_BREATHING_POTION(), self::potion(PotionType::LONG_WATER_BREATHING()));
$this->map(Items::LONG_WATER_BREATHING_SPLASH_POTION(), self::splashPotion(PotionType::LONG_WATER_BREATHING()));
$this->map(Items::LONG_WEAKNESS_POTION(), self::potion(PotionType::LONG_WEAKNESS()));
$this->map(Items::LONG_WEAKNESS_SPLASH_POTION(), self::splashPotion(PotionType::LONG_WEAKNESS()));
$this->map(Items::MAGENTA_BED(), self::bed(DyeColor::MAGENTA()));
$this->map(Items::MAGENTA_DYE(), self::id(Ids::MAGENTA_DYE));
$this->map(Items::MAGMA_CREAM(), self::id(Ids::MAGMA_CREAM));
$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::MUNDANE_POTION(), self::potion(PotionType::MUNDANE()));
$this->map(Items::MUNDANE_SPLASH_POTION(), self::splashPotion(PotionType::MUNDANE()));
$this->map(Items::MUSHROOM_STEW(), self::id(Ids::MUSHROOM_STEW));
$this->map(Items::NAUTILUS_SHELL(), self::id(Ids::NAUTILUS_SHELL));
$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::NIGHT_VISION_POTION(), self::potion(PotionType::NIGHT_VISION()));
$this->map(Items::NIGHT_VISION_SPLASH_POTION(), self::splashPotion(PotionType::NIGHT_VISION()));
$this->map(Items::OAK_BOAT(), self::id(Ids::OAK_BOAT));
$this->map(Items::OAK_SIGN(), self::id(Ids::OAK_SIGN));
$this->map(Items::ORANGE_BED(), self::bed(DyeColor::ORANGE()));
$this->map(Items::ORANGE_DYE(), self::id(Ids::ORANGE_DYE));
$this->map(Items::PAINTING(), self::id(Ids::PAINTING));
$this->map(Items::PAPER(), self::id(Ids::PAPER));
$this->map(Items::PINK_BED(), self::bed(DyeColor::PINK()));
$this->map(Items::PINK_DYE(), self::id(Ids::PINK_DYE));
$this->map(Items::PLAYER_HEAD(), self::skull(SkullType::PLAYER()));
$this->map(Items::POISONOUS_POTATO(), self::id(Ids::POISONOUS_POTATO));
$this->map(Items::POISON_POTION(), self::potion(PotionType::POISON()));
$this->map(Items::POISON_SPLASH_POTION(), self::splashPotion(PotionType::POISON()));
$this->map(Items::POPPED_CHORUS_FRUIT(), self::id(Ids::POPPED_CHORUS_FRUIT));
$this->map(Items::POTATO(), self::id(Ids::POTATO));
$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::PURPLE_BED(), self::bed(DyeColor::PURPLE()));
$this->map(Items::PURPLE_DYE(), self::id(Ids::PURPLE_DYE));
$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_FISH(), self::id(Ids::COD));
$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::RED_BED(), self::bed(DyeColor::RED()));
$this->map(Items::RED_DYE(), self::id(Ids::RED_DYE));
$this->map(Items::REGENERATION_POTION(), self::potion(PotionType::REGENERATION()));
$this->map(Items::REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::REGENERATION()));
$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::SKELETON_SKULL(), self::skull(SkullType::SKELETON()));
$this->map(Items::SLIMEBALL(), self::id(Ids::SLIME_BALL));
$this->map(Items::SLOWNESS_POTION(), self::potion(PotionType::SLOWNESS()));
$this->map(Items::SLOWNESS_SPLASH_POTION(), self::splashPotion(PotionType::SLOWNESS()));
$this->map(Items::SLOW_FALLING_POTION(), self::potion(PotionType::SLOW_FALLING()));
$this->map(Items::SLOW_FALLING_SPLASH_POTION(), self::splashPotion(PotionType::SLOW_FALLING()));
$this->map(Items::SNOWBALL(), self::id(Ids::SNOWBALL));
$this->map(Items::SPIDER_EYE(), self::id(Ids::SPIDER_EYE));
$this->map(Items::SPRUCE_BOAT(), self::id(Ids::SPRUCE_BOAT));
$this->map(Items::SPRUCE_SIGN(), self::id(Ids::SPRUCE_SIGN));
$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::STRENGTH_POTION(), self::potion(PotionType::STRENGTH()));
$this->map(Items::STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::STRENGTH()));
$this->map(Items::STRING(), self::id(Ids::STRING));
$this->map(Items::STRONG_HARMING_POTION(), self::potion(PotionType::STRONG_HARMING()));
$this->map(Items::STRONG_HARMING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_HARMING()));
$this->map(Items::STRONG_HEALING_POTION(), self::potion(PotionType::STRONG_HEALING()));
$this->map(Items::STRONG_HEALING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_HEALING()));
$this->map(Items::STRONG_LEAPING_POTION(), self::potion(PotionType::STRONG_LEAPING()));
$this->map(Items::STRONG_LEAPING_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_LEAPING()));
$this->map(Items::STRONG_POISON_POTION(), self::potion(PotionType::STRONG_POISON()));
$this->map(Items::STRONG_POISON_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_POISON()));
$this->map(Items::STRONG_REGENERATION_POTION(), self::potion(PotionType::STRONG_REGENERATION()));
$this->map(Items::STRONG_REGENERATION_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_REGENERATION()));
$this->map(Items::STRONG_STRENGTH_POTION(), self::potion(PotionType::STRONG_STRENGTH()));
$this->map(Items::STRONG_STRENGTH_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_STRENGTH()));
$this->map(Items::STRONG_SWIFTNESS_POTION(), self::potion(PotionType::STRONG_SWIFTNESS()));
$this->map(Items::STRONG_SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_SWIFTNESS()));
$this->map(Items::STRONG_TURTLE_MASTER_POTION(), self::potion(PotionType::STRONG_TURTLE_MASTER()));
$this->map(Items::STRONG_TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::STRONG_TURTLE_MASTER()));
$this->map(Items::SUGAR(), self::id(Ids::SUGAR));
$this->map(Items::SWEET_BERRIES(), self::id(Ids::SWEET_BERRIES));
$this->map(Items::SWIFTNESS_POTION(), self::potion(PotionType::SWIFTNESS()));
$this->map(Items::SWIFTNESS_SPLASH_POTION(), self::splashPotion(PotionType::SWIFTNESS()));
$this->map(Items::THICK_POTION(), self::potion(PotionType::THICK()));
$this->map(Items::THICK_SPLASH_POTION(), self::splashPotion(PotionType::THICK()));
$this->map(Items::TOTEM(), self::id(Ids::TOTEM_OF_UNDYING));
$this->map(Items::TURTLE_MASTER_POTION(), self::potion(PotionType::TURTLE_MASTER()));
$this->map(Items::TURTLE_MASTER_SPLASH_POTION(), self::splashPotion(PotionType::TURTLE_MASTER()));
$this->map(Items::VILLAGER_SPAWN_EGG(), self::id(Ids::VILLAGER_SPAWN_EGG));
$this->map(Items::WATER_BREATHING_POTION(), self::potion(PotionType::WATER_BREATHING()));
$this->map(Items::WATER_BREATHING_SPLASH_POTION(), self::splashPotion(PotionType::WATER_BREATHING()));
$this->map(Items::WATER_BUCKET(), self::id(Ids::WATER_BUCKET));
$this->map(Items::WATER_POTION(), self::potion(PotionType::WATER()));
$this->map(Items::WATER_SPLASH_POTION(), self::splashPotion(PotionType::WATER()));
$this->map(Items::WEAKNESS_POTION(), self::potion(PotionType::WEAKNESS()));
$this->map(Items::WEAKNESS_SPLASH_POTION(), self::splashPotion(PotionType::WEAKNESS()));
$this->map(Items::WHEAT(), self::id(Ids::WHEAT));
$this->map(Items::WHEAT_SEEDS(), self::id(Ids::WHEAT_SEEDS));
$this->map(Items::WHITE_BED(), self::bed(DyeColor::WHITE()));
$this->map(Items::WHITE_DYE(), self::id(Ids::WHITE_DYE));
$this->map(Items::WITHER_POTION(), self::potion(PotionType::WITHER()));
$this->map(Items::WITHER_SKELETON_SKULL(), self::skull(SkullType::WITHER_SKELETON()));
$this->map(Items::WITHER_SPLASH_POTION(), self::splashPotion(PotionType::WITHER()));
$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::YELLOW_BED(), self::bed(DyeColor::YELLOW()));
$this->map(Items::YELLOW_DYE(), self::id(Ids::YELLOW_DYE));
$this->map(Items::ZOMBIE_HEAD(), self::skull(SkullType::ZOMBIE()));
$this->map(Items::ZOMBIE_SPAWN_EGG(), self::id(Ids::ZOMBIE_SPAWN_EGG));
}
}

View File

@ -0,0 +1,409 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\data\bedrock\item;
final class ItemTypeIds{
public const ACACIA_BOAT = "minecraft:acacia_boat";
public const ACACIA_DOOR = "minecraft:acacia_door";
public const ACACIA_SIGN = "minecraft:acacia_sign";
public const AGENT_SPAWN_EGG = "minecraft:agent_spawn_egg";
public const ALLAY_SPAWN_EGG = "minecraft:allay_spawn_egg";
public const AMETHYST_SHARD = "minecraft:amethyst_shard";
public const APPLE = "minecraft:apple";
public const ARMOR_STAND = "minecraft:armor_stand";
public const ARROW = "minecraft:arrow";
public const AXOLOTL_BUCKET = "minecraft:axolotl_bucket";
public const AXOLOTL_SPAWN_EGG = "minecraft:axolotl_spawn_egg";
public const BAKED_POTATO = "minecraft:baked_potato";
public const BALLOON = "minecraft:balloon";
public const BANNER = "minecraft:banner";
public const BANNER_PATTERN = "minecraft:banner_pattern";
public const BAT_SPAWN_EGG = "minecraft:bat_spawn_egg";
public const BED = "minecraft:bed";
public const BEE_SPAWN_EGG = "minecraft:bee_spawn_egg";
public const BEEF = "minecraft:beef";
public const BEETROOT = "minecraft:beetroot";
public const BEETROOT_SEEDS = "minecraft:beetroot_seeds";
public const BEETROOT_SOUP = "minecraft:beetroot_soup";
public const BIRCH_BOAT = "minecraft:birch_boat";
public const BIRCH_DOOR = "minecraft:birch_door";
public const BIRCH_SIGN = "minecraft:birch_sign";
public const BLACK_DYE = "minecraft:black_dye";
public const BLAZE_POWDER = "minecraft:blaze_powder";
public const BLAZE_ROD = "minecraft:blaze_rod";
public const BLAZE_SPAWN_EGG = "minecraft:blaze_spawn_egg";
public const BLEACH = "minecraft:bleach";
public const BLUE_DYE = "minecraft:blue_dye";
public const BOAT = "minecraft:boat";
public const BONE = "minecraft:bone";
public const BONE_MEAL = "minecraft:bone_meal";
public const BOOK = "minecraft:book";
public const BORDURE_INDENTED_BANNER_PATTERN = "minecraft:bordure_indented_banner_pattern";
public const BOW = "minecraft:bow";
public const BOWL = "minecraft:bowl";
public const BREAD = "minecraft:bread";
public const BREWING_STAND = "minecraft:brewing_stand";
public const BRICK = "minecraft:brick";
public const BROWN_DYE = "minecraft:brown_dye";
public const BUCKET = "minecraft:bucket";
public const CAKE = "minecraft:cake";
public const CAMERA = "minecraft:camera";
public const CAMPFIRE = "minecraft:campfire";
public const CARROT = "minecraft:carrot";
public const CARROT_ON_A_STICK = "minecraft:carrot_on_a_stick";
public const CAT_SPAWN_EGG = "minecraft:cat_spawn_egg";
public const CAULDRON = "minecraft:cauldron";
public const CAVE_SPIDER_SPAWN_EGG = "minecraft:cave_spider_spawn_egg";
public const CHAIN = "minecraft:chain";
public const CHAINMAIL_BOOTS = "minecraft:chainmail_boots";
public const CHAINMAIL_CHESTPLATE = "minecraft:chainmail_chestplate";
public const CHAINMAIL_HELMET = "minecraft:chainmail_helmet";
public const CHAINMAIL_LEGGINGS = "minecraft:chainmail_leggings";
public const CHARCOAL = "minecraft:charcoal";
public const CHEST_MINECART = "minecraft:chest_minecart";
public const CHICKEN = "minecraft:chicken";
public const CHICKEN_SPAWN_EGG = "minecraft:chicken_spawn_egg";
public const CHORUS_FRUIT = "minecraft:chorus_fruit";
public const CLAY_BALL = "minecraft:clay_ball";
public const CLOCK = "minecraft:clock";
public const COAL = "minecraft:coal";
public const COCOA_BEANS = "minecraft:cocoa_beans";
public const COD = "minecraft:cod";
public const COD_BUCKET = "minecraft:cod_bucket";
public const COD_SPAWN_EGG = "minecraft:cod_spawn_egg";
public const COMMAND_BLOCK_MINECART = "minecraft:command_block_minecart";
public const COMPARATOR = "minecraft:comparator";
public const COMPASS = "minecraft:compass";
public const COMPOUND = "minecraft:compound";
public const COOKED_BEEF = "minecraft:cooked_beef";
public const COOKED_CHICKEN = "minecraft:cooked_chicken";
public const COOKED_COD = "minecraft:cooked_cod";
public const COOKED_MUTTON = "minecraft:cooked_mutton";
public const COOKED_PORKCHOP = "minecraft:cooked_porkchop";
public const COOKED_RABBIT = "minecraft:cooked_rabbit";
public const COOKED_SALMON = "minecraft:cooked_salmon";
public const COOKIE = "minecraft:cookie";
public const COPPER_INGOT = "minecraft:copper_ingot";
public const COW_SPAWN_EGG = "minecraft:cow_spawn_egg";
public const CREEPER_BANNER_PATTERN = "minecraft:creeper_banner_pattern";
public const CREEPER_SPAWN_EGG = "minecraft:creeper_spawn_egg";
public const CRIMSON_DOOR = "minecraft:crimson_door";
public const CRIMSON_SIGN = "minecraft:crimson_sign";
public const CROSSBOW = "minecraft:crossbow";
public const CYAN_DYE = "minecraft:cyan_dye";
public const DARK_OAK_BOAT = "minecraft:dark_oak_boat";
public const DARK_OAK_DOOR = "minecraft:dark_oak_door";
public const DARK_OAK_SIGN = "minecraft:dark_oak_sign";
public const DIAMOND = "minecraft:diamond";
public const DIAMOND_AXE = "minecraft:diamond_axe";
public const DIAMOND_BOOTS = "minecraft:diamond_boots";
public const DIAMOND_CHESTPLATE = "minecraft:diamond_chestplate";
public const DIAMOND_HELMET = "minecraft:diamond_helmet";
public const DIAMOND_HOE = "minecraft:diamond_hoe";
public const DIAMOND_HORSE_ARMOR = "minecraft:diamond_horse_armor";
public const DIAMOND_LEGGINGS = "minecraft:diamond_leggings";
public const DIAMOND_PICKAXE = "minecraft:diamond_pickaxe";
public const DIAMOND_SHOVEL = "minecraft:diamond_shovel";
public const DIAMOND_SWORD = "minecraft:diamond_sword";
public const DOLPHIN_SPAWN_EGG = "minecraft:dolphin_spawn_egg";
public const DONKEY_SPAWN_EGG = "minecraft:donkey_spawn_egg";
public const DRAGON_BREATH = "minecraft:dragon_breath";
public const DRIED_KELP = "minecraft:dried_kelp";
public const DROWNED_SPAWN_EGG = "minecraft:drowned_spawn_egg";
public const DYE = "minecraft:dye";
public const EGG = "minecraft:egg";
public const ELDER_GUARDIAN_SPAWN_EGG = "minecraft:elder_guardian_spawn_egg";
public const ELYTRA = "minecraft:elytra";
public const EMERALD = "minecraft:emerald";
public const EMPTY_MAP = "minecraft:empty_map";
public const ENCHANTED_BOOK = "minecraft:enchanted_book";
public const ENCHANTED_GOLDEN_APPLE = "minecraft:enchanted_golden_apple";
public const END_CRYSTAL = "minecraft:end_crystal";
public const ENDER_EYE = "minecraft:ender_eye";
public const ENDER_PEARL = "minecraft:ender_pearl";
public const ENDERMAN_SPAWN_EGG = "minecraft:enderman_spawn_egg";
public const ENDERMITE_SPAWN_EGG = "minecraft:endermite_spawn_egg";
public const EVOKER_SPAWN_EGG = "minecraft:evoker_spawn_egg";
public const EXPERIENCE_BOTTLE = "minecraft:experience_bottle";
public const FEATHER = "minecraft:feather";
public const FERMENTED_SPIDER_EYE = "minecraft:fermented_spider_eye";
public const FIELD_MASONED_BANNER_PATTERN = "minecraft:field_masoned_banner_pattern";
public const FILLED_MAP = "minecraft:filled_map";
public const FIRE_CHARGE = "minecraft:fire_charge";
public const FIREFLY_SPAWN_EGG = "minecraft:firefly_spawn_egg";
public const FIREWORK_ROCKET = "minecraft:firework_rocket";
public const FIREWORK_STAR = "minecraft:firework_star";
public const FISHING_ROD = "minecraft:fishing_rod";
public const FLINT = "minecraft:flint";
public const FLINT_AND_STEEL = "minecraft:flint_and_steel";
public const FLOWER_BANNER_PATTERN = "minecraft:flower_banner_pattern";
public const FLOWER_POT = "minecraft:flower_pot";
public const FOX_SPAWN_EGG = "minecraft:fox_spawn_egg";
public const FRAME = "minecraft:frame";
public const FROG_SPAWN_EGG = "minecraft:frog_spawn_egg";
public const GHAST_SPAWN_EGG = "minecraft:ghast_spawn_egg";
public const GHAST_TEAR = "minecraft:ghast_tear";
public const GLASS_BOTTLE = "minecraft:glass_bottle";
public const GLISTERING_MELON_SLICE = "minecraft:glistering_melon_slice";
public const GLOBE_BANNER_PATTERN = "minecraft:globe_banner_pattern";
public const GLOW_BERRIES = "minecraft:glow_berries";
public const GLOW_FRAME = "minecraft:glow_frame";
public const GLOW_INK_SAC = "minecraft:glow_ink_sac";
public const GLOW_SQUID_SPAWN_EGG = "minecraft:glow_squid_spawn_egg";
public const GLOW_STICK = "minecraft:glow_stick";
public const GLOWSTONE_DUST = "minecraft:glowstone_dust";
public const GOAT_HORN = "minecraft:goat_horn";
public const GOAT_SPAWN_EGG = "minecraft:goat_spawn_egg";
public const GOLD_INGOT = "minecraft:gold_ingot";
public const GOLD_NUGGET = "minecraft:gold_nugget";
public const GOLDEN_APPLE = "minecraft:golden_apple";
public const GOLDEN_AXE = "minecraft:golden_axe";
public const GOLDEN_BOOTS = "minecraft:golden_boots";
public const GOLDEN_CARROT = "minecraft:golden_carrot";
public const GOLDEN_CHESTPLATE = "minecraft:golden_chestplate";
public const GOLDEN_HELMET = "minecraft:golden_helmet";
public const GOLDEN_HOE = "minecraft:golden_hoe";
public const GOLDEN_HORSE_ARMOR = "minecraft:golden_horse_armor";
public const GOLDEN_LEGGINGS = "minecraft:golden_leggings";
public const GOLDEN_PICKAXE = "minecraft:golden_pickaxe";
public const GOLDEN_SHOVEL = "minecraft:golden_shovel";
public const GOLDEN_SWORD = "minecraft:golden_sword";
public const GRAY_DYE = "minecraft:gray_dye";
public const GREEN_DYE = "minecraft:green_dye";
public const GUARDIAN_SPAWN_EGG = "minecraft:guardian_spawn_egg";
public const GUNPOWDER = "minecraft:gunpowder";
public const HEART_OF_THE_SEA = "minecraft:heart_of_the_sea";
public const HOGLIN_SPAWN_EGG = "minecraft:hoglin_spawn_egg";
public const HONEY_BOTTLE = "minecraft:honey_bottle";
public const HONEYCOMB = "minecraft:honeycomb";
public const HOPPER = "minecraft:hopper";
public const HOPPER_MINECART = "minecraft:hopper_minecart";
public const HORSE_SPAWN_EGG = "minecraft:horse_spawn_egg";
public const HUSK_SPAWN_EGG = "minecraft:husk_spawn_egg";
public const ICE_BOMB = "minecraft:ice_bomb";
public const INK_SAC = "minecraft:ink_sac";
public const IRON_AXE = "minecraft:iron_axe";
public const IRON_BOOTS = "minecraft:iron_boots";
public const IRON_CHESTPLATE = "minecraft:iron_chestplate";
public const IRON_DOOR = "minecraft:iron_door";
public const IRON_HELMET = "minecraft:iron_helmet";
public const IRON_HOE = "minecraft:iron_hoe";
public const IRON_HORSE_ARMOR = "minecraft:iron_horse_armor";
public const IRON_INGOT = "minecraft:iron_ingot";
public const IRON_LEGGINGS = "minecraft:iron_leggings";
public const IRON_NUGGET = "minecraft:iron_nugget";
public const IRON_PICKAXE = "minecraft:iron_pickaxe";
public const IRON_SHOVEL = "minecraft:iron_shovel";
public const IRON_SWORD = "minecraft:iron_sword";
public const JUNGLE_BOAT = "minecraft:jungle_boat";
public const JUNGLE_DOOR = "minecraft:jungle_door";
public const JUNGLE_SIGN = "minecraft:jungle_sign";
public const KELP = "minecraft:kelp";
public const LAPIS_LAZULI = "minecraft:lapis_lazuli";
public const LAVA_BUCKET = "minecraft:lava_bucket";
public const LEAD = "minecraft:lead";
public const LEATHER = "minecraft:leather";
public const LEATHER_BOOTS = "minecraft:leather_boots";
public const LEATHER_CHESTPLATE = "minecraft:leather_chestplate";
public const LEATHER_HELMET = "minecraft:leather_helmet";
public const LEATHER_HORSE_ARMOR = "minecraft:leather_horse_armor";
public const LEATHER_LEGGINGS = "minecraft:leather_leggings";
public const LIGHT_BLUE_DYE = "minecraft:light_blue_dye";
public const LIGHT_GRAY_DYE = "minecraft:light_gray_dye";
public const LIME_DYE = "minecraft:lime_dye";
public const LINGERING_POTION = "minecraft:lingering_potion";
public const LLAMA_SPAWN_EGG = "minecraft:llama_spawn_egg";
public const LODESTONE_COMPASS = "minecraft:lodestone_compass";
public const MAGENTA_DYE = "minecraft:magenta_dye";
public const MAGMA_CREAM = "minecraft:magma_cream";
public const MAGMA_CUBE_SPAWN_EGG = "minecraft:magma_cube_spawn_egg";
public const MEDICINE = "minecraft:medicine";
public const MELON_SEEDS = "minecraft:melon_seeds";
public const MELON_SLICE = "minecraft:melon_slice";
public const MILK_BUCKET = "minecraft:milk_bucket";
public const MINECART = "minecraft:minecart";
public const MOJANG_BANNER_PATTERN = "minecraft:mojang_banner_pattern";
public const MOOSHROOM_SPAWN_EGG = "minecraft:mooshroom_spawn_egg";
public const MULE_SPAWN_EGG = "minecraft:mule_spawn_egg";
public const MUSHROOM_STEW = "minecraft:mushroom_stew";
public const MUSIC_DISC_11 = "minecraft:music_disc_11";
public const MUSIC_DISC_13 = "minecraft:music_disc_13";
public const MUSIC_DISC_BLOCKS = "minecraft:music_disc_blocks";
public const MUSIC_DISC_CAT = "minecraft:music_disc_cat";
public const MUSIC_DISC_CHIRP = "minecraft:music_disc_chirp";
public const MUSIC_DISC_FAR = "minecraft:music_disc_far";
public const MUSIC_DISC_MALL = "minecraft:music_disc_mall";
public const MUSIC_DISC_MELLOHI = "minecraft:music_disc_mellohi";
public const MUSIC_DISC_OTHERSIDE = "minecraft:music_disc_otherside";
public const MUSIC_DISC_PIGSTEP = "minecraft:music_disc_pigstep";
public const MUSIC_DISC_STAL = "minecraft:music_disc_stal";
public const MUSIC_DISC_STRAD = "minecraft:music_disc_strad";
public const MUSIC_DISC_WAIT = "minecraft:music_disc_wait";
public const MUSIC_DISC_WARD = "minecraft:music_disc_ward";
public const MUTTON = "minecraft:mutton";
public const NAME_TAG = "minecraft:name_tag";
public const NAUTILUS_SHELL = "minecraft:nautilus_shell";
public const NETHER_SPROUTS = "minecraft:nether_sprouts";
public const NETHER_STAR = "minecraft:nether_star";
public const NETHER_WART = "minecraft:nether_wart";
public const NETHERBRICK = "minecraft:netherbrick";
public const NETHERITE_AXE = "minecraft:netherite_axe";
public const NETHERITE_BOOTS = "minecraft:netherite_boots";
public const NETHERITE_CHESTPLATE = "minecraft:netherite_chestplate";
public const NETHERITE_HELMET = "minecraft:netherite_helmet";
public const NETHERITE_HOE = "minecraft:netherite_hoe";
public const NETHERITE_INGOT = "minecraft:netherite_ingot";
public const NETHERITE_LEGGINGS = "minecraft:netherite_leggings";
public const NETHERITE_PICKAXE = "minecraft:netherite_pickaxe";
public const NETHERITE_SCRAP = "minecraft:netherite_scrap";
public const NETHERITE_SHOVEL = "minecraft:netherite_shovel";
public const NETHERITE_SWORD = "minecraft:netherite_sword";
public const NPC_SPAWN_EGG = "minecraft:npc_spawn_egg";
public const OAK_BOAT = "minecraft:oak_boat";
public const OAK_SIGN = "minecraft:oak_sign";
public const OCELOT_SPAWN_EGG = "minecraft:ocelot_spawn_egg";
public const ORANGE_DYE = "minecraft:orange_dye";
public const PAINTING = "minecraft:painting";
public const PANDA_SPAWN_EGG = "minecraft:panda_spawn_egg";
public const PAPER = "minecraft:paper";
public const PARROT_SPAWN_EGG = "minecraft:parrot_spawn_egg";
public const PHANTOM_MEMBRANE = "minecraft:phantom_membrane";
public const PHANTOM_SPAWN_EGG = "minecraft:phantom_spawn_egg";
public const PIG_SPAWN_EGG = "minecraft:pig_spawn_egg";
public const PIGLIN_BANNER_PATTERN = "minecraft:piglin_banner_pattern";
public const PIGLIN_BRUTE_SPAWN_EGG = "minecraft:piglin_brute_spawn_egg";
public const PIGLIN_SPAWN_EGG = "minecraft:piglin_spawn_egg";
public const PILLAGER_SPAWN_EGG = "minecraft:pillager_spawn_egg";
public const PINK_DYE = "minecraft:pink_dye";
public const POISONOUS_POTATO = "minecraft:poisonous_potato";
public const POLAR_BEAR_SPAWN_EGG = "minecraft:polar_bear_spawn_egg";
public const POPPED_CHORUS_FRUIT = "minecraft:popped_chorus_fruit";
public const PORKCHOP = "minecraft:porkchop";
public const POTATO = "minecraft:potato";
public const POTION = "minecraft:potion";
public const POWDER_SNOW_BUCKET = "minecraft:powder_snow_bucket";
public const PRISMARINE_CRYSTALS = "minecraft:prismarine_crystals";
public const PRISMARINE_SHARD = "minecraft:prismarine_shard";
public const PUFFERFISH = "minecraft:pufferfish";
public const PUFFERFISH_BUCKET = "minecraft:pufferfish_bucket";
public const PUFFERFISH_SPAWN_EGG = "minecraft:pufferfish_spawn_egg";
public const PUMPKIN_PIE = "minecraft:pumpkin_pie";
public const PUMPKIN_SEEDS = "minecraft:pumpkin_seeds";
public const PURPLE_DYE = "minecraft:purple_dye";
public const QUARTZ = "minecraft:quartz";
public const RABBIT = "minecraft:rabbit";
public const RABBIT_FOOT = "minecraft:rabbit_foot";
public const RABBIT_HIDE = "minecraft:rabbit_hide";
public const RABBIT_SPAWN_EGG = "minecraft:rabbit_spawn_egg";
public const RABBIT_STEW = "minecraft:rabbit_stew";
public const RAPID_FERTILIZER = "minecraft:rapid_fertilizer";
public const RAVAGER_SPAWN_EGG = "minecraft:ravager_spawn_egg";
public const RAW_COPPER = "minecraft:raw_copper";
public const RAW_GOLD = "minecraft:raw_gold";
public const RAW_IRON = "minecraft:raw_iron";
public const RED_DYE = "minecraft:red_dye";
public const REDSTONE = "minecraft:redstone";
public const REPEATER = "minecraft:repeater";
public const ROTTEN_FLESH = "minecraft:rotten_flesh";
public const SADDLE = "minecraft:saddle";
public const SALMON = "minecraft:salmon";
public const SALMON_BUCKET = "minecraft:salmon_bucket";
public const SALMON_SPAWN_EGG = "minecraft:salmon_spawn_egg";
public const SCUTE = "minecraft:scute";
public const SHEARS = "minecraft:shears";
public const SHEEP_SPAWN_EGG = "minecraft:sheep_spawn_egg";
public const SHIELD = "minecraft:shield";
public const SHULKER_SHELL = "minecraft:shulker_shell";
public const SHULKER_SPAWN_EGG = "minecraft:shulker_spawn_egg";
public const SILVERFISH_SPAWN_EGG = "minecraft:silverfish_spawn_egg";
public const SKELETON_HORSE_SPAWN_EGG = "minecraft:skeleton_horse_spawn_egg";
public const SKELETON_SPAWN_EGG = "minecraft:skeleton_spawn_egg";
public const SKULL = "minecraft:skull";
public const SKULL_BANNER_PATTERN = "minecraft:skull_banner_pattern";
public const SLIME_BALL = "minecraft:slime_ball";
public const SLIME_SPAWN_EGG = "minecraft:slime_spawn_egg";
public const SNOWBALL = "minecraft:snowball";
public const SOUL_CAMPFIRE = "minecraft:soul_campfire";
public const SPARKLER = "minecraft:sparkler";
public const SPAWN_EGG = "minecraft:spawn_egg";
public const SPIDER_EYE = "minecraft:spider_eye";
public const SPIDER_SPAWN_EGG = "minecraft:spider_spawn_egg";
public const SPLASH_POTION = "minecraft:splash_potion";
public const SPRUCE_BOAT = "minecraft:spruce_boat";
public const SPRUCE_DOOR = "minecraft:spruce_door";
public const SPRUCE_SIGN = "minecraft:spruce_sign";
public const SPYGLASS = "minecraft:spyglass";
public const SQUID_SPAWN_EGG = "minecraft:squid_spawn_egg";
public const STICK = "minecraft:stick";
public const STONE_AXE = "minecraft:stone_axe";
public const STONE_HOE = "minecraft:stone_hoe";
public const STONE_PICKAXE = "minecraft:stone_pickaxe";
public const STONE_SHOVEL = "minecraft:stone_shovel";
public const STONE_SWORD = "minecraft:stone_sword";
public const STRAY_SPAWN_EGG = "minecraft:stray_spawn_egg";
public const STRIDER_SPAWN_EGG = "minecraft:strider_spawn_egg";
public const STRING = "minecraft:string";
public const SUGAR = "minecraft:sugar";
public const SUGAR_CANE = "minecraft:sugar_cane";
public const SUSPICIOUS_STEW = "minecraft:suspicious_stew";
public const SWEET_BERRIES = "minecraft:sweet_berries";
public const TADPOLE_BUCKET = "minecraft:tadpole_bucket";
public const TADPOLE_SPAWN_EGG = "minecraft:tadpole_spawn_egg";
public const TNT_MINECART = "minecraft:tnt_minecart";
public const TOTEM_OF_UNDYING = "minecraft:totem_of_undying";
public const TRIDENT = "minecraft:trident";
public const TROPICAL_FISH = "minecraft:tropical_fish";
public const TROPICAL_FISH_BUCKET = "minecraft:tropical_fish_bucket";
public const TROPICAL_FISH_SPAWN_EGG = "minecraft:tropical_fish_spawn_egg";
public const TURTLE_HELMET = "minecraft:turtle_helmet";
public const TURTLE_SPAWN_EGG = "minecraft:turtle_spawn_egg";
public const VEX_SPAWN_EGG = "minecraft:vex_spawn_egg";
public const VILLAGER_SPAWN_EGG = "minecraft:villager_spawn_egg";
public const VINDICATOR_SPAWN_EGG = "minecraft:vindicator_spawn_egg";
public const WANDERING_TRADER_SPAWN_EGG = "minecraft:wandering_trader_spawn_egg";
public const WARPED_DOOR = "minecraft:warped_door";
public const WARPED_FUNGUS_ON_A_STICK = "minecraft:warped_fungus_on_a_stick";
public const WARPED_SIGN = "minecraft:warped_sign";
public const WATER_BUCKET = "minecraft:water_bucket";
public const WHEAT = "minecraft:wheat";
public const WHEAT_SEEDS = "minecraft:wheat_seeds";
public const WHITE_DYE = "minecraft:white_dye";
public const WITCH_SPAWN_EGG = "minecraft:witch_spawn_egg";
public const WITHER_SKELETON_SPAWN_EGG = "minecraft:wither_skeleton_spawn_egg";
public const WOLF_SPAWN_EGG = "minecraft:wolf_spawn_egg";
public const WOODEN_AXE = "minecraft:wooden_axe";
public const WOODEN_DOOR = "minecraft:wooden_door";
public const WOODEN_HOE = "minecraft:wooden_hoe";
public const WOODEN_PICKAXE = "minecraft:wooden_pickaxe";
public const WOODEN_SHOVEL = "minecraft:wooden_shovel";
public const WOODEN_SWORD = "minecraft:wooden_sword";
public const WRITABLE_BOOK = "minecraft:writable_book";
public const WRITTEN_BOOK = "minecraft:written_book";
public const YELLOW_DYE = "minecraft:yellow_dye";
public const ZOGLIN_SPAWN_EGG = "minecraft:zoglin_spawn_egg";
public const ZOMBIE_HORSE_SPAWN_EGG = "minecraft:zombie_horse_spawn_egg";
public const ZOMBIE_PIGMAN_SPAWN_EGG = "minecraft:zombie_pigman_spawn_egg";
public const ZOMBIE_SPAWN_EGG = "minecraft:zombie_spawn_egg";
public const ZOMBIE_VILLAGER_SPAWN_EGG = "minecraft:zombie_villager_spawn_egg";
}

View File

@ -0,0 +1,108 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\data\bedrock\item;
use pocketmine\data\bedrock\blockstate\BlockStateData;
use pocketmine\data\bedrock\blockstate\BlockStateDeserializeException;
use pocketmine\data\SavedDataLoadingException;
use pocketmine\nbt\NbtException;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\StringTag;
use function str_starts_with;
final class SavedItemData{
public const TAG_NAME = "Name";
private const TAG_DAMAGE = "Damage";
public const TAG_BLOCK = "Block";
private const TAG_TAG = "tag";
private const TAG_ITEM_IDENTIFIER = "ItemIdentifier";
public function __construct(
private string $name,
private int $meta = 0,
private ?BlockStateData $block = null,
private ?CompoundTag $tag = null
){}
public function getName() : string{ return $this->name; }
public function getMeta() : int{ return $this->meta; }
public function getBlock() : ?BlockStateData{ return $this->block; }
public function getTag() : ?CompoundTag{ return $this->tag; }
public static function fromNbt(CompoundTag $tag) : self{
try{
//required
$name = $tag->getString(self::TAG_NAME);
$damage = $tag->getShort(self::TAG_DAMAGE);
//optional
$blockStateNbt = $tag->getCompoundTag(self::TAG_BLOCK);
$extraData = $tag->getCompoundTag(self::TAG_TAG);
}catch(NbtException $e){
throw new SavedDataLoadingException($e->getMessage(), 0, $e);
}
//TODO: this hack probably doesn't belong here; it's necessary to deal with spawn eggs from before 1.16.100
if(
$name === ItemTypeIds::SPAWN_EGG &&
($itemIdentifierTag = $tag->getTag(self::TAG_ITEM_IDENTIFIER)) instanceof StringTag &&
str_starts_with($itemIdentifierTag->getValue(), "minecraft:")
){
\GlobalLogger::get()->debug("Handling legacy spawn egg for " . $itemIdentifierTag->getValue());
$name = $itemIdentifierTag->getValue() . "_spawn_egg";
}
try{
$blockStateData = $blockStateNbt !== null ? BlockStateData::fromNbt($blockStateNbt) : null;
}catch(BlockStateDeserializeException $e){
throw new SavedDataLoadingException("Failed to load item saved data: " . $e->getMessage(), 0, $e);
}
return new self(
$name,
$damage,
$blockStateData,
$extraData
);
}
public function toNbt() : CompoundTag{
$result = CompoundTag::create();
$result->setString(self::TAG_NAME, $this->name);
$result->setShort(self::TAG_DAMAGE, $this->meta);
if($this->block !== null){
$result->setTag(self::TAG_BLOCK, $this->block->toNbt());
}
if($this->tag !== null){
$result->setTag(self::TAG_TAG, $this->tag);
}
return $result;
}
}

View File

@ -33,16 +33,20 @@ use pocketmine\utils\CloningRegistryTrait;
* @generate-registry-docblock
*
* @method static Boat ACACIA_BOAT()
* @method static ItemBlockWallOrFloor ACACIA_SIGN()
* @method static ItemBlock AIR()
* @method static Apple APPLE()
* @method static Arrow ARROW()
* @method static Potion AWKWARD_POTION()
* @method static SplashPotion AWKWARD_SPLASH_POTION()
* @method static BakedPotato BAKED_POTATO()
* @method static Bamboo BAMBOO()
* @method static Banner BANNER()
* @method static Beetroot BEETROOT()
* @method static BeetrootSeeds BEETROOT_SEEDS()
* @method static BeetrootSoup BEETROOT_SOUP()
* @method static Boat BIRCH_BOAT()
* @method static ItemBlockWallOrFloor BIRCH_SIGN()
* @method static Bed BLACK_BED()
* @method static Dye BLACK_DYE()
* @method static Item BLAZE_POWDER()
@ -118,10 +122,12 @@ use pocketmine\utils\CloningRegistryTrait;
* @method static CookedRabbit COOKED_RABBIT()
* @method static CookedSalmon COOKED_SALMON()
* @method static Cookie COOKIE()
* @method static ItemBlockWallOrFloor CORAL_FAN()
* @method static Skull CREEPER_HEAD()
* @method static Bed CYAN_BED()
* @method static Dye CYAN_DYE()
* @method static Boat DARK_OAK_BOAT()
* @method static ItemBlockWallOrFloor DARK_OAK_SIGN()
* @method static Item DIAMOND()
* @method static Axe DIAMOND_AXE()
* @method static Armor DIAMOND_BOOTS()
@ -189,6 +195,7 @@ use pocketmine\utils\CloningRegistryTrait;
* @method static Shovel IRON_SHOVEL()
* @method static Sword IRON_SWORD()
* @method static Boat JUNGLE_BOAT()
* @method static ItemBlockWallOrFloor JUNGLE_SIGN()
* @method static Item LAPIS_LAZULI()
* @method static LiquidBucket LAVA_BUCKET()
* @method static Potion LEAPING_POTION()
@ -249,6 +256,7 @@ use pocketmine\utils\CloningRegistryTrait;
* @method static Potion NIGHT_VISION_POTION()
* @method static SplashPotion NIGHT_VISION_SPLASH_POTION()
* @method static Boat OAK_BOAT()
* @method static ItemBlockWallOrFloor OAK_SIGN()
* @method static Bed ORANGE_BED()
* @method static Dye ORANGE_DYE()
* @method static PaintingItem PAINTING()
@ -308,6 +316,7 @@ use pocketmine\utils\CloningRegistryTrait;
* @method static Snowball SNOWBALL()
* @method static SpiderEye SPIDER_EYE()
* @method static Boat SPRUCE_BOAT()
* @method static ItemBlockWallOrFloor SPRUCE_SIGN()
* @method static SpawnEgg SQUID_SPAWN_EGG()
* @method static Steak STEAK()
* @method static Stick STICK()
@ -395,16 +404,20 @@ final class VanillaItems{
protected static function setup() : void{
$factory = ItemFactory::getInstance();
self::register("acacia_boat", $factory->get(Ids::BOAT, 4));
self::register("acacia_sign", $factory->get(Ids::ACACIA_SIGN));
self::register("air", $factory->get(Ids::AIR, 0, 0));
self::register("apple", $factory->get(Ids::APPLE));
self::register("arrow", $factory->get(Ids::ARROW));
self::register("awkward_potion", $factory->get(Ids::POTION, 4));
self::register("awkward_splash_potion", $factory->get(Ids::SPLASH_POTION, 4));
self::register("baked_potato", $factory->get(Ids::BAKED_POTATO));
self::register("bamboo", $factory->get(Ids::BAMBOO));
self::register("banner", $factory->get(Ids::BANNER));
self::register("beetroot", $factory->get(Ids::BEETROOT));
self::register("beetroot_seeds", $factory->get(Ids::BEETROOT_SEEDS));
self::register("beetroot_soup", $factory->get(Ids::BEETROOT_SOUP));
self::register("birch_boat", $factory->get(Ids::BOAT, 2));
self::register("birch_sign", $factory->get(Ids::BIRCH_SIGN));
self::register("black_bed", $factory->get(Ids::BED, 15));
self::register("black_dye", $factory->get(Ids::DYE, 16));
self::register("blaze_powder", $factory->get(Ids::BLAZE_POWDER));
@ -480,10 +493,12 @@ final class VanillaItems{
self::register("cooked_rabbit", $factory->get(Ids::COOKED_RABBIT));
self::register("cooked_salmon", $factory->get(Ids::COOKED_SALMON));
self::register("cookie", $factory->get(Ids::COOKIE));
self::register("coral_fan", $factory->get(Ids::CORAL_FAN));
self::register("creeper_head", $factory->get(Ids::MOB_HEAD, 4));
self::register("cyan_bed", $factory->get(Ids::BED, 9));
self::register("cyan_dye", $factory->get(Ids::DYE, 6));
self::register("dark_oak_boat", $factory->get(Ids::BOAT, 5));
self::register("dark_oak_sign", $factory->get(Ids::DARKOAK_SIGN));
self::register("diamond", $factory->get(Ids::DIAMOND));
self::register("diamond_axe", $factory->get(Ids::DIAMOND_AXE));
self::register("diamond_boots", $factory->get(Ids::DIAMOND_BOOTS));
@ -551,6 +566,7 @@ final class VanillaItems{
self::register("iron_shovel", $factory->get(Ids::IRON_SHOVEL));
self::register("iron_sword", $factory->get(Ids::IRON_SWORD));
self::register("jungle_boat", $factory->get(Ids::BOAT, 3));
self::register("jungle_sign", $factory->get(Ids::JUNGLE_SIGN));
self::register("lapis_lazuli", $factory->get(Ids::DYE, 4));
self::register("lava_bucket", $factory->get(Ids::BUCKET, 10));
self::register("leaping_potion", $factory->get(Ids::POTION, 9));
@ -611,6 +627,7 @@ final class VanillaItems{
self::register("night_vision_potion", $factory->get(Ids::POTION, 5));
self::register("night_vision_splash_potion", $factory->get(Ids::SPLASH_POTION, 5));
self::register("oak_boat", $factory->get(Ids::BOAT));
self::register("oak_sign", $factory->get(Ids::SIGN));
self::register("orange_bed", $factory->get(Ids::BED, 1));
self::register("orange_dye", $factory->get(Ids::DYE, 14));
self::register("painting", $factory->get(Ids::PAINTING));
@ -670,6 +687,7 @@ final class VanillaItems{
self::register("snowball", $factory->get(Ids::SNOWBALL));
self::register("spider_eye", $factory->get(Ids::SPIDER_EYE));
self::register("spruce_boat", $factory->get(Ids::BOAT, 1));
self::register("spruce_sign", $factory->get(Ids::SPRUCE_SIGN));
self::register("squid_spawn_egg", $factory->get(Ids::SPAWN_EGG, 17));
self::register("steak", $factory->get(Ids::COOKED_BEEF));
self::register("stick", $factory->get(Ids::STICK));

View File

@ -0,0 +1,66 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\data\bedrock\item;
use PHPUnit\Framework\TestCase;
use pocketmine\block\VanillaBlocks;
use pocketmine\item\VanillaItems;
final class ItemSerializerDeserializerTest extends TestCase{
private ItemDeserializer $deserializer;
private ItemSerializer $serializer;
public function setUp() : void{
$this->deserializer = new ItemDeserializer();
$this->serializer = new ItemSerializer();
}
public function testAllVanillaItemsSerializableAndDeserializable() : void{
foreach(VanillaItems::getAll() as $item){
if($item->isNull()){
continue;
}
$itemData = $this->serializer->serialize($item);
$newItem = $this->deserializer->deserialize($itemData);
self::assertTrue($item->equalsExact($newItem));
}
}
public function testAllVanillaBlocksSerializableAndDeserializable() : void{
foreach(VanillaBlocks::getAll() as $block){
$item = $block->asItem();
if($item->isNull()){
continue;
}
$itemData = $this->serializer->serialize($item);
$newItem = $this->deserializer->deserialize($itemData);
self::assertTrue($item->equalsExact($newItem));
}
}
}