From 68cbe46600ce10629ff83c8c2e438ea3b700755c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 5 Jul 2022 15:12:55 +0100 Subject: [PATCH] Exterminate legacy item IDs --- src/crafting/CraftingManager.php | 9 +- src/crafting/FurnaceRecipeManager.php | 2 +- src/data/bedrock/CoralTypeIdMap.php | 68 -- src/data/runtime/RuntimeEnumDeserializer.php | 48 ++ src/data/runtime/RuntimeEnumSerializer.php | 48 ++ src/item/Banner.php | 6 +- src/item/CoralFan.php | 21 +- src/item/Dye.php | 13 +- src/item/Item.php | 19 +- src/item/ItemBlock.php | 5 + src/item/ItemFactory.php | 447 ++++++----- src/item/ItemIdentifier.php | 28 +- src/item/ItemIdentifierFlattened.php | 41 - src/item/ItemIds.php | 736 ------------------ src/item/Potion.php | 7 +- src/item/SplashPotion.php | 7 +- src/network/mcpe/convert/TypeConverter.php | 5 +- src/player/Player.php | 7 +- .../data/bedrock/CoralTypeIdMapTest.php | 38 - 19 files changed, 375 insertions(+), 1180 deletions(-) delete mode 100644 src/data/bedrock/CoralTypeIdMap.php delete mode 100644 src/item/ItemIdentifierFlattened.php delete mode 100644 src/item/ItemIds.php delete mode 100644 tests/phpunit/data/bedrock/CoralTypeIdMapTest.php diff --git a/src/crafting/CraftingManager.php b/src/crafting/CraftingManager.php index 42e0db705..f83901d33 100644 --- a/src/crafting/CraftingManager.php +++ b/src/crafting/CraftingManager.php @@ -91,7 +91,7 @@ class CraftingManager{ */ public static function sort(Item $i1, Item $i2) : int{ //Use spaceship operator to compare each property, then try the next one if they are equivalent. - ($retval = $i1->getId() <=> $i2->getId()) === 0 && ($retval = $i1->getMeta() <=> $i2->getMeta()) === 0 && ($retval = $i1->getCount() <=> $i2->getCount()) === 0; + ($retval = $i1->getTypeId() <=> $i2->getTypeId()) === 0 && ($retval = $i1->computeTypeData() <=> $i2->computeTypeData()) === 0 && ($retval = $i1->getCount() <=> $i2->getCount()) === 0; return $retval; } @@ -130,8 +130,7 @@ class CraftingManager{ foreach($outputs as $o){ //count is not written because the outputs might be from multiple repetitions of a single recipe //this reduces the accuracy of the hash, but it won't matter in most cases. - $result->putVarInt($o->getId()); - $result->putVarInt($o->getMeta()); + $result->putVarInt(morton2d_encode($o->getTypeId(), $o->computeTypeData())); $result->put((new LittleEndianNbtSerializer())->write(new TreeRoot($o->getNamedTag()))); } @@ -256,8 +255,8 @@ class CraftingManager{ } public function matchBrewingRecipe(Item $input, Item $ingredient) : ?BrewingRecipe{ - $inputHash = morton2d_encode($input->getId(), $input->getMeta()); - $ingredientHash = morton2d_encode($ingredient->getId(), $ingredient->getMeta()); + $inputHash = morton2d_encode($input->getTypeId(), $input->computeTypeData()); + $ingredientHash = morton2d_encode($ingredient->getTypeId(), $ingredient->computeTypeData()); $cached = $this->brewingRecipeCache[$inputHash][$ingredientHash] ?? null; if($cached !== null){ return $cached; diff --git a/src/crafting/FurnaceRecipeManager.php b/src/crafting/FurnaceRecipeManager.php index 5d46f0e19..74e2817b6 100644 --- a/src/crafting/FurnaceRecipeManager.php +++ b/src/crafting/FurnaceRecipeManager.php @@ -66,7 +66,7 @@ final class FurnaceRecipeManager{ } public function match(Item $input) : ?FurnaceRecipe{ - $index = morton2d_encode($input->getId(), $input->getMeta()); + $index = morton2d_encode($input->getTypeId(), $input->computeTypeData()); $simpleRecipe = $this->lookupCache[$index] ?? null; if($simpleRecipe !== null){ return $simpleRecipe; diff --git a/src/data/bedrock/CoralTypeIdMap.php b/src/data/bedrock/CoralTypeIdMap.php deleted file mode 100644 index fd1651206..000000000 --- a/src/data/bedrock/CoralTypeIdMap.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ - private array $idToEnum = []; - /** - * @var int[] - * @phpstan-var array - */ - private array $enumToId = []; - - public function __construct(){ - $this->register(BlockLegacyMetadata::CORAL_VARIANT_TUBE, CoralType::TUBE()); - $this->register(BlockLegacyMetadata::CORAL_VARIANT_BRAIN, CoralType::BRAIN()); - $this->register(BlockLegacyMetadata::CORAL_VARIANT_BUBBLE, CoralType::BUBBLE()); - $this->register(BlockLegacyMetadata::CORAL_VARIANT_FIRE, CoralType::FIRE()); - $this->register(BlockLegacyMetadata::CORAL_VARIANT_HORN, CoralType::HORN()); - } - - public function register(int $id, CoralType $type) : void{ - $this->idToEnum[$id] = $type; - $this->enumToId[$type->id()] = $id; - } - - public function fromId(int $id) : ?CoralType{ - return $this->idToEnum[$id] ?? null; - } - - public function toId(CoralType $type) : int{ - if(!array_key_exists($type->id(), $this->enumToId)){ - throw new \InvalidArgumentException("Coral type does not have a mapped ID"); //this should never happen - } - return $this->enumToId[$type->id()]; - } -} diff --git a/src/data/runtime/RuntimeEnumDeserializer.php b/src/data/runtime/RuntimeEnumDeserializer.php index 3c7eb5ad8..f5835f962 100644 --- a/src/data/runtime/RuntimeEnumDeserializer.php +++ b/src/data/runtime/RuntimeEnumDeserializer.php @@ -103,6 +103,54 @@ final class RuntimeEnumDeserializer{ }; } + public static function readPotionType(RuntimeDataReader $r) : \pocketmine\item\PotionType{ + return match($r->readInt(6)){ + 0 => \pocketmine\item\PotionType::AWKWARD(), + 1 => \pocketmine\item\PotionType::FIRE_RESISTANCE(), + 2 => \pocketmine\item\PotionType::HARMING(), + 3 => \pocketmine\item\PotionType::HEALING(), + 4 => \pocketmine\item\PotionType::INVISIBILITY(), + 5 => \pocketmine\item\PotionType::LEAPING(), + 6 => \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE(), + 7 => \pocketmine\item\PotionType::LONG_INVISIBILITY(), + 8 => \pocketmine\item\PotionType::LONG_LEAPING(), + 9 => \pocketmine\item\PotionType::LONG_MUNDANE(), + 10 => \pocketmine\item\PotionType::LONG_NIGHT_VISION(), + 11 => \pocketmine\item\PotionType::LONG_POISON(), + 12 => \pocketmine\item\PotionType::LONG_REGENERATION(), + 13 => \pocketmine\item\PotionType::LONG_SLOWNESS(), + 14 => \pocketmine\item\PotionType::LONG_SLOW_FALLING(), + 15 => \pocketmine\item\PotionType::LONG_STRENGTH(), + 16 => \pocketmine\item\PotionType::LONG_SWIFTNESS(), + 17 => \pocketmine\item\PotionType::LONG_TURTLE_MASTER(), + 18 => \pocketmine\item\PotionType::LONG_WATER_BREATHING(), + 19 => \pocketmine\item\PotionType::LONG_WEAKNESS(), + 20 => \pocketmine\item\PotionType::MUNDANE(), + 21 => \pocketmine\item\PotionType::NIGHT_VISION(), + 22 => \pocketmine\item\PotionType::POISON(), + 23 => \pocketmine\item\PotionType::REGENERATION(), + 24 => \pocketmine\item\PotionType::SLOWNESS(), + 25 => \pocketmine\item\PotionType::SLOW_FALLING(), + 26 => \pocketmine\item\PotionType::STRENGTH(), + 27 => \pocketmine\item\PotionType::STRONG_HARMING(), + 28 => \pocketmine\item\PotionType::STRONG_HEALING(), + 29 => \pocketmine\item\PotionType::STRONG_LEAPING(), + 30 => \pocketmine\item\PotionType::STRONG_POISON(), + 31 => \pocketmine\item\PotionType::STRONG_REGENERATION(), + 32 => \pocketmine\item\PotionType::STRONG_STRENGTH(), + 33 => \pocketmine\item\PotionType::STRONG_SWIFTNESS(), + 34 => \pocketmine\item\PotionType::STRONG_TURTLE_MASTER(), + 35 => \pocketmine\item\PotionType::SWIFTNESS(), + 36 => \pocketmine\item\PotionType::THICK(), + 37 => \pocketmine\item\PotionType::TURTLE_MASTER(), + 38 => \pocketmine\item\PotionType::WATER(), + 39 => \pocketmine\item\PotionType::WATER_BREATHING(), + 40 => \pocketmine\item\PotionType::WEAKNESS(), + 41 => \pocketmine\item\PotionType::WITHER(), + default => throw new InvalidSerializedRuntimeDataException("Invalid serialized value for PotionType") + }; + } + public static function readSkullType(RuntimeDataReader $r) : \pocketmine\block\utils\SkullType{ return match($r->readInt(3)){ 0 => \pocketmine\block\utils\SkullType::CREEPER(), diff --git a/src/data/runtime/RuntimeEnumSerializer.php b/src/data/runtime/RuntimeEnumSerializer.php index 409f942c8..1b942d0a1 100644 --- a/src/data/runtime/RuntimeEnumSerializer.php +++ b/src/data/runtime/RuntimeEnumSerializer.php @@ -103,6 +103,54 @@ final class RuntimeEnumSerializer{ }); } + public static function writePotionType(RuntimeDataWriter $w, \pocketmine\item\PotionType $value) : void{ + $w->writeInt(6, match($value){ + \pocketmine\item\PotionType::AWKWARD() => 0, + \pocketmine\item\PotionType::FIRE_RESISTANCE() => 1, + \pocketmine\item\PotionType::HARMING() => 2, + \pocketmine\item\PotionType::HEALING() => 3, + \pocketmine\item\PotionType::INVISIBILITY() => 4, + \pocketmine\item\PotionType::LEAPING() => 5, + \pocketmine\item\PotionType::LONG_FIRE_RESISTANCE() => 6, + \pocketmine\item\PotionType::LONG_INVISIBILITY() => 7, + \pocketmine\item\PotionType::LONG_LEAPING() => 8, + \pocketmine\item\PotionType::LONG_MUNDANE() => 9, + \pocketmine\item\PotionType::LONG_NIGHT_VISION() => 10, + \pocketmine\item\PotionType::LONG_POISON() => 11, + \pocketmine\item\PotionType::LONG_REGENERATION() => 12, + \pocketmine\item\PotionType::LONG_SLOWNESS() => 13, + \pocketmine\item\PotionType::LONG_SLOW_FALLING() => 14, + \pocketmine\item\PotionType::LONG_STRENGTH() => 15, + \pocketmine\item\PotionType::LONG_SWIFTNESS() => 16, + \pocketmine\item\PotionType::LONG_TURTLE_MASTER() => 17, + \pocketmine\item\PotionType::LONG_WATER_BREATHING() => 18, + \pocketmine\item\PotionType::LONG_WEAKNESS() => 19, + \pocketmine\item\PotionType::MUNDANE() => 20, + \pocketmine\item\PotionType::NIGHT_VISION() => 21, + \pocketmine\item\PotionType::POISON() => 22, + \pocketmine\item\PotionType::REGENERATION() => 23, + \pocketmine\item\PotionType::SLOWNESS() => 24, + \pocketmine\item\PotionType::SLOW_FALLING() => 25, + \pocketmine\item\PotionType::STRENGTH() => 26, + \pocketmine\item\PotionType::STRONG_HARMING() => 27, + \pocketmine\item\PotionType::STRONG_HEALING() => 28, + \pocketmine\item\PotionType::STRONG_LEAPING() => 29, + \pocketmine\item\PotionType::STRONG_POISON() => 30, + \pocketmine\item\PotionType::STRONG_REGENERATION() => 31, + \pocketmine\item\PotionType::STRONG_STRENGTH() => 32, + \pocketmine\item\PotionType::STRONG_SWIFTNESS() => 33, + \pocketmine\item\PotionType::STRONG_TURTLE_MASTER() => 34, + \pocketmine\item\PotionType::SWIFTNESS() => 35, + \pocketmine\item\PotionType::THICK() => 36, + \pocketmine\item\PotionType::TURTLE_MASTER() => 37, + \pocketmine\item\PotionType::WATER() => 38, + \pocketmine\item\PotionType::WATER_BREATHING() => 39, + \pocketmine\item\PotionType::WEAKNESS() => 40, + \pocketmine\item\PotionType::WITHER() => 41, + default => throw new \pocketmine\utils\AssumptionFailedError("All PotionType cases should be covered") + }); + } + public static function writeSkullType(RuntimeDataWriter $w, \pocketmine\block\utils\SkullType $value) : void{ $w->writeInt(3, match($value){ \pocketmine\block\utils\SkullType::CREEPER() => 0, diff --git a/src/item/Banner.php b/src/item/Banner.php index 343fe8e24..57202d388 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -29,6 +29,8 @@ use pocketmine\block\utils\BannerPatternLayer; use pocketmine\block\utils\DyeColor; use pocketmine\data\bedrock\BannerPatternTypeIdMap; use pocketmine\data\bedrock\DyeColorIdMap; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\nbt\NBT; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; @@ -62,8 +64,8 @@ class Banner extends ItemBlockWallOrFloor{ return $this; } - public function getMeta() : int{ - return DyeColorIdMap::getInstance()->toInvertedId($this->color); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeDyeColor($w, $this->color); } /** diff --git a/src/item/CoralFan.php b/src/item/CoralFan.php index d6aae4f8c..964420503 100644 --- a/src/item/CoralFan.php +++ b/src/item/CoralFan.php @@ -27,24 +27,25 @@ use pocketmine\block\Block; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; use pocketmine\block\VanillaBlocks; -use pocketmine\data\bedrock\CoralTypeIdMap; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\math\Axis; use pocketmine\math\Facing; final class CoralFan extends Item{ - use CoralTypeTrait; + use CoralTypeTrait { + encodeType as encodeCoralType; + } - public function __construct(private ItemIdentifierFlattened $identifierFlattened){ + public function __construct(ItemIdentifier $identifier){ $this->coralType = CoralType::TUBE(); - parent::__construct($this->identifierFlattened, VanillaBlocks::CORAL_FAN()->getName()); + parent::__construct($identifier, VanillaBlocks::CORAL_FAN()->getName()); } - public function getId() : int{ - return $this->dead ? $this->identifierFlattened->getAdditionalLegacyIds()[0] : $this->identifierFlattened->getLegacyId(); - } - - public function getMeta() : int{ - return CoralTypeIdMap::getInstance()->toId($this->coralType); + protected function encodeType(RuntimeDataWriter $w) : void{ + //this is aliased to ensure a compile error in case the functions in Item or Block start to differ in future + //right now we can directly reuse encodeType from CoralTypeTrait, but that might silently stop working if Item + //were to be altered. CoralTypeTrait was originally intended for blocks, so it's better not to assume anything. + $this->encodeCoralType($w); } public function getBlock(?int $clickedFace = null) : Block{ diff --git a/src/item/Dye.php b/src/item/Dye.php index 9c831b13a..fa93a1471 100644 --- a/src/item/Dye.php +++ b/src/item/Dye.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\block\utils\DyeColor; -use pocketmine\data\bedrock\DyeColorIdMap; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumSerializer; class Dye extends Item{ private DyeColor $color; @@ -34,14 +35,8 @@ class Dye extends Item{ parent::__construct($identifier, $name); } - public function getMeta() : int{ - return match($this->color->id()){ - DyeColor::BLACK()->id() => 16, - DyeColor::BROWN()->id() => 17, - DyeColor::BLUE()->id() => 18, - DyeColor::WHITE()->id() => 19, - default => DyeColorIdMap::getInstance()->toInvertedId($this->color) - }; + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writeDyeColor($w, $this->color); } public function getColor() : DyeColor{ diff --git a/src/item/Item.php b/src/item/Item.php index a22232b74..b12bb080d 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -32,6 +32,7 @@ use pocketmine\block\BlockToolType; use pocketmine\block\VanillaBlocks; use pocketmine\data\bedrock\EnchantmentIdMap; use pocketmine\data\bedrock\item\ItemTypeDeserializeException; +use pocketmine\data\runtime\RuntimeDataWriter; use pocketmine\data\SavedDataLoadingException; use pocketmine\entity\Entity; use pocketmine\item\enchantment\EnchantmentInstance; @@ -431,12 +432,14 @@ class Item implements \JsonSerializable{ return $this->identifier->getTypeId(); } - public function getId() : int{ - return $this->identifier->getLegacyId(); + final public function computeTypeData() : int{ + $writer = new RuntimeDataWriter(16); //TODO: max bits should be a constant instead of being hardcoded all over the place + $this->encodeType($writer); + return $writer->getValue(); } - public function getMeta() : int{ - return $this->identifier->getLegacyMeta(); + protected function encodeType(RuntimeDataWriter $w) : void{ + //NOOP } /** @@ -547,12 +550,12 @@ class Item implements \JsonSerializable{ /** * Compares an Item to this Item and check if they match. * - * @param bool $checkDamage Whether to verify that the damage values match. + * @param bool $checkDamage @deprecated * @param bool $checkCompound Whether to verify that the items' NBT match. */ final public function equals(Item $item, bool $checkDamage = true, bool $checkCompound = true) : bool{ - return $this->getId() === $item->getId() && - (!$checkDamage || $this->getMeta() === $item->getMeta()) && + return $this->getTypeId() === $item->getTypeId() && + $this->computeTypeData() === $item->computeTypeData() && (!$checkCompound || $this->getNamedTag()->equals($item->getNamedTag())); } @@ -571,7 +574,7 @@ class Item implements \JsonSerializable{ } final public function __toString() : string{ - return "Item " . $this->name . " (" . $this->getId() . ":" . $this->getMeta() . ")x" . $this->count . ($this->hasNamedTag() ? " tags:0x" . base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))) : ""); + return "Item " . $this->name . " (" . $this->getTypeId() . ":" . $this->computeTypeData() . ")x" . $this->count . ($this->hasNamedTag() ? " tags:0x" . base64_encode((new LittleEndianNbtSerializer())->write(new TreeRoot($this->getNamedTag()))) : ""); } /** diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index c36b78608..8eb46cbdd 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -26,6 +26,7 @@ namespace pocketmine\item; use pocketmine\block\Block; use pocketmine\block\BlockFactory; use pocketmine\block\VanillaBlocks; +use pocketmine\data\runtime\RuntimeDataWriter; /** * Class used for Items that directly represent blocks, such as stone, dirt, wood etc. @@ -43,6 +44,10 @@ final class ItemBlock extends Item{ $this->blockTypeData = $block->computeTypeData(); } + protected function encodeType(RuntimeDataWriter $w) : void{ + $w->writeInt(Block::INTERNAL_STATE_DATA_BITS, $this->blockTypeData); + } + public function getBlock(?int $clickedFace = null) : Block{ //TODO: HACKY MESS, CLEAN IT UP $factory = BlockFactory::getInstance(); diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 2b3fdd3fe..cfcc05dd1 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -27,8 +27,6 @@ use pocketmine\block\BlockFactory; use pocketmine\block\utils\RecordType; use pocketmine\block\utils\TreeType; use pocketmine\block\VanillaBlocks as Blocks; -use pocketmine\data\bedrock\CompoundTypeIds; -use pocketmine\data\bedrock\EntityLegacyIds; use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\Squid; @@ -36,7 +34,6 @@ use pocketmine\entity\Villager; use pocketmine\entity\Zombie; use pocketmine\inventory\ArmorInventory; use pocketmine\item\ItemIdentifier as IID; -use pocketmine\item\ItemIds as LegacyIds; use pocketmine\item\ItemTypeIds as Ids; use pocketmine\math\Vector3; use pocketmine\utils\AssumptionFailedError; @@ -58,191 +55,191 @@ class ItemFactory{ $this->registerSpawnEggs(); $this->registerTierToolItems(); - $this->register(new Apple(new IID(Ids::APPLE, LegacyIds::APPLE, 0), "Apple")); - $this->register(new Arrow(new IID(Ids::ARROW, LegacyIds::ARROW, 0), "Arrow")); + $this->register(new Apple(new IID(Ids::APPLE), "Apple")); + $this->register(new Arrow(new IID(Ids::ARROW), "Arrow")); - $this->register(new BakedPotato(new IID(Ids::BAKED_POTATO, LegacyIds::BAKED_POTATO, 0), "Baked Potato")); - $this->register(new Bamboo(new IID(Ids::BAMBOO, LegacyIds::BAMBOO, 0), "Bamboo"), true); - $this->register(new Beetroot(new IID(Ids::BEETROOT, LegacyIds::BEETROOT, 0), "Beetroot")); - $this->register(new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS, LegacyIds::BEETROOT_SEEDS, 0), "Beetroot Seeds")); - $this->register(new BeetrootSoup(new IID(Ids::BEETROOT_SOUP, LegacyIds::BEETROOT_SOUP, 0), "Beetroot Soup")); - $this->register(new BlazeRod(new IID(Ids::BLAZE_ROD, LegacyIds::BLAZE_ROD, 0), "Blaze Rod")); - $this->register(new Book(new IID(Ids::BOOK, LegacyIds::BOOK, 0), "Book")); - $this->register(new Bow(new IID(Ids::BOW, LegacyIds::BOW, 0), "Bow")); - $this->register(new Bowl(new IID(Ids::BOWL, LegacyIds::BOWL, 0), "Bowl")); - $this->register(new Bread(new IID(Ids::BREAD, LegacyIds::BREAD, 0), "Bread")); - $this->register(new Bucket(new IID(Ids::BUCKET, LegacyIds::BUCKET, 0), "Bucket")); - $this->register(new Carrot(new IID(Ids::CARROT, LegacyIds::CARROT, 0), "Carrot")); - $this->register(new ChorusFruit(new IID(Ids::CHORUS_FRUIT, LegacyIds::CHORUS_FRUIT, 0), "Chorus Fruit")); - $this->register(new Clock(new IID(Ids::CLOCK, LegacyIds::CLOCK, 0), "Clock")); - $this->register(new Clownfish(new IID(Ids::CLOWNFISH, LegacyIds::CLOWNFISH, 0), "Clownfish")); - $this->register(new Coal(new IID(Ids::COAL, LegacyIds::COAL, 0), "Coal")); + $this->register(new BakedPotato(new IID(Ids::BAKED_POTATO), "Baked Potato")); + $this->register(new Bamboo(new IID(Ids::BAMBOO), "Bamboo"), true); + $this->register(new Beetroot(new IID(Ids::BEETROOT), "Beetroot")); + $this->register(new BeetrootSeeds(new IID(Ids::BEETROOT_SEEDS), "Beetroot Seeds")); + $this->register(new BeetrootSoup(new IID(Ids::BEETROOT_SOUP), "Beetroot Soup")); + $this->register(new BlazeRod(new IID(Ids::BLAZE_ROD), "Blaze Rod")); + $this->register(new Book(new IID(Ids::BOOK), "Book")); + $this->register(new Bow(new IID(Ids::BOW), "Bow")); + $this->register(new Bowl(new IID(Ids::BOWL), "Bowl")); + $this->register(new Bread(new IID(Ids::BREAD), "Bread")); + $this->register(new Bucket(new IID(Ids::BUCKET), "Bucket")); + $this->register(new Carrot(new IID(Ids::CARROT), "Carrot")); + $this->register(new ChorusFruit(new IID(Ids::CHORUS_FRUIT), "Chorus Fruit")); + $this->register(new Clock(new IID(Ids::CLOCK), "Clock")); + $this->register(new Clownfish(new IID(Ids::CLOWNFISH), "Clownfish")); + $this->register(new Coal(new IID(Ids::COAL), "Coal")); - $this->register(new CoralFan(new ItemIdentifierFlattened(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, 0, [LegacyIds::CORAL_FAN_DEAD]))); + $this->register(new CoralFan(new IID(Ids::CORAL_FAN))); - $this->register(new Coal(new IID(Ids::CHARCOAL, LegacyIds::COAL, 1), "Charcoal")); - $this->register(new CocoaBeans(new IID(Ids::COCOA_BEANS, LegacyIds::DYE, 3), "Cocoa Beans")); - $this->register(new Compass(new IID(Ids::COMPASS, LegacyIds::COMPASS, 0), "Compass")); - $this->register(new CookedChicken(new IID(Ids::COOKED_CHICKEN, LegacyIds::COOKED_CHICKEN, 0), "Cooked Chicken")); - $this->register(new CookedFish(new IID(Ids::COOKED_FISH, LegacyIds::COOKED_FISH, 0), "Cooked Fish")); - $this->register(new CookedMutton(new IID(Ids::COOKED_MUTTON, LegacyIds::COOKED_MUTTON, 0), "Cooked Mutton")); - $this->register(new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP, LegacyIds::COOKED_PORKCHOP, 0), "Cooked Porkchop")); - $this->register(new CookedRabbit(new IID(Ids::COOKED_RABBIT, LegacyIds::COOKED_RABBIT, 0), "Cooked Rabbit")); - $this->register(new CookedSalmon(new IID(Ids::COOKED_SALMON, LegacyIds::COOKED_SALMON, 0), "Cooked Salmon")); - $this->register(new Cookie(new IID(Ids::COOKIE, LegacyIds::COOKIE, 0), "Cookie")); - $this->register(new DriedKelp(new IID(Ids::DRIED_KELP, LegacyIds::DRIED_KELP, 0), "Dried Kelp")); - $this->register(new Egg(new IID(Ids::EGG, LegacyIds::EGG, 0), "Egg")); - $this->register(new EnderPearl(new IID(Ids::ENDER_PEARL, LegacyIds::ENDER_PEARL, 0), "Ender Pearl")); - $this->register(new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE, LegacyIds::EXPERIENCE_BOTTLE, 0), "Bottle o' Enchanting")); - $this->register(new Fertilizer(new IID(Ids::BONE_MEAL, LegacyIds::DYE, 15), "Bone Meal")); - $this->register(new FishingRod(new IID(Ids::FISHING_ROD, LegacyIds::FISHING_ROD, 0), "Fishing Rod")); - $this->register(new FlintSteel(new IID(Ids::FLINT_AND_STEEL, LegacyIds::FLINT_STEEL, 0), "Flint and Steel")); - $this->register(new GlassBottle(new IID(Ids::GLASS_BOTTLE, LegacyIds::GLASS_BOTTLE, 0), "Glass Bottle")); - $this->register(new GoldenApple(new IID(Ids::GOLDEN_APPLE, LegacyIds::GOLDEN_APPLE, 0), "Golden Apple")); - $this->register(new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE, LegacyIds::ENCHANTED_GOLDEN_APPLE, 0), "Enchanted Golden Apple")); - $this->register(new GoldenCarrot(new IID(Ids::GOLDEN_CARROT, LegacyIds::GOLDEN_CARROT, 0), "Golden Carrot")); - $this->register(new Item(new IID(Ids::BLAZE_POWDER, LegacyIds::BLAZE_POWDER, 0), "Blaze Powder")); - $this->register(new Item(new IID(Ids::BLEACH, LegacyIds::BLEACH, 0), "Bleach")); //EDU - $this->register(new Item(new IID(Ids::BONE, LegacyIds::BONE, 0), "Bone")); - $this->register(new Item(new IID(Ids::BRICK, LegacyIds::BRICK, 0), "Brick")); - $this->register(new Item(new IID(Ids::POPPED_CHORUS_FRUIT, LegacyIds::CHORUS_FRUIT_POPPED, 0), "Popped Chorus Fruit")); - $this->register(new Item(new IID(Ids::CLAY, LegacyIds::CLAY_BALL, 0), "Clay")); - $this->register(new Item(new IID(Ids::CHEMICAL_SALT, LegacyIds::COMPOUND, CompoundTypeIds::SALT), "Salt")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_OXIDE), "Sodium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYDROXIDE), "Sodium Hydroxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_NITRATE), "Magnesium Nitrate")); - $this->register(new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE, LegacyIds::COMPOUND, CompoundTypeIds::IRON_SULPHIDE), "Iron Sulphide")); - $this->register(new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE, LegacyIds::COMPOUND, CompoundTypeIds::LITHIUM_HYDRIDE), "Lithium Hydride")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYDRIDE), "Sodium Hydride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE, LegacyIds::COMPOUND, CompoundTypeIds::CALCIUM_BROMIDE), "Calcium Bromide")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_OXIDE), "Magnesium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_ACETATE), "Sodium Acetate")); - $this->register(new Item(new IID(Ids::CHEMICAL_LUMINOL, LegacyIds::COMPOUND, CompoundTypeIds::LUMINOL), "Luminol")); - $this->register(new Item(new IID(Ids::CHEMICAL_CHARCOAL, LegacyIds::COMPOUND, CompoundTypeIds::CHARCOAL), "Charcoal")); //??? maybe bug - $this->register(new Item(new IID(Ids::CHEMICAL_SUGAR, LegacyIds::COMPOUND, CompoundTypeIds::SUGAR), "Sugar")); //??? maybe bug - $this->register(new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE, LegacyIds::COMPOUND, CompoundTypeIds::ALUMINIUM_OXIDE), "Aluminium Oxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE, LegacyIds::COMPOUND, CompoundTypeIds::BORON_TRIOXIDE), "Boron Trioxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SOAP, LegacyIds::COMPOUND, CompoundTypeIds::SOAP), "Soap")); - $this->register(new Item(new IID(Ids::CHEMICAL_POLYETHYLENE, LegacyIds::COMPOUND, CompoundTypeIds::POLYETHYLENE), "Polyethylene")); - $this->register(new Item(new IID(Ids::CHEMICAL_RUBBISH, LegacyIds::COMPOUND, CompoundTypeIds::RUBBISH), "Rubbish")); - $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS, LegacyIds::COMPOUND, CompoundTypeIds::MAGNESIUM_SALTS), "Magnesium Salts")); - $this->register(new Item(new IID(Ids::CHEMICAL_SULPHATE, LegacyIds::COMPOUND, CompoundTypeIds::SULPHATE), "Sulphate")); - $this->register(new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE, LegacyIds::COMPOUND, CompoundTypeIds::BARIUM_SULPHATE), "Barium Sulphate")); - $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::POTASSIUM_CHLORIDE), "Potassium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::MERCURIC_CHLORIDE), "Mercuric Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::CERIUM_CHLORIDE), "Cerium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::TUNGSTEN_CHLORIDE), "Tungsten Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE, LegacyIds::COMPOUND, CompoundTypeIds::CALCIUM_CHLORIDE), "Calcium Chloride")); - $this->register(new Item(new IID(Ids::CHEMICAL_WATER, LegacyIds::COMPOUND, CompoundTypeIds::WATER), "Water")); //??? - $this->register(new Item(new IID(Ids::CHEMICAL_GLUE, LegacyIds::COMPOUND, CompoundTypeIds::GLUE), "Glue")); - $this->register(new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE, LegacyIds::COMPOUND, CompoundTypeIds::HYPOCHLORITE), "Hypochlorite")); - $this->register(new Item(new IID(Ids::CHEMICAL_CRUDE_OIL, LegacyIds::COMPOUND, CompoundTypeIds::CRUDE_OIL), "Crude Oil")); - $this->register(new Item(new IID(Ids::CHEMICAL_LATEX, LegacyIds::COMPOUND, CompoundTypeIds::LATEX), "Latex")); - $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE, LegacyIds::COMPOUND, CompoundTypeIds::POTASSIUM_IODIDE), "Potassium Iodide")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_FLUORIDE), "Sodium Fluoride")); - $this->register(new Item(new IID(Ids::CHEMICAL_BENZENE, LegacyIds::COMPOUND, CompoundTypeIds::BENZENE), "Benzene")); - $this->register(new Item(new IID(Ids::CHEMICAL_INK, LegacyIds::COMPOUND, CompoundTypeIds::INK), "Ink")); - $this->register(new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE, LegacyIds::COMPOUND, CompoundTypeIds::HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); - $this->register(new Item(new IID(Ids::CHEMICAL_AMMONIA, LegacyIds::COMPOUND, CompoundTypeIds::AMMONIA), "Ammonia")); - $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE, LegacyIds::COMPOUND, CompoundTypeIds::SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); - $this->register(new Item(new IID(Ids::DIAMOND, LegacyIds::DIAMOND, 0), "Diamond")); - $this->register(new Item(new IID(Ids::DRAGON_BREATH, LegacyIds::DRAGON_BREATH, 0), "Dragon's Breath")); - $this->register(new Item(new IID(Ids::INK_SAC, LegacyIds::DYE, 0), "Ink Sac")); - $this->register(new Item(new IID(Ids::LAPIS_LAZULI, LegacyIds::DYE, 4), "Lapis Lazuli")); - $this->register(new Item(new IID(Ids::EMERALD, LegacyIds::EMERALD, 0), "Emerald")); - $this->register(new Item(new IID(Ids::FEATHER, LegacyIds::FEATHER, 0), "Feather")); - $this->register(new Item(new IID(Ids::FERMENTED_SPIDER_EYE, LegacyIds::FERMENTED_SPIDER_EYE, 0), "Fermented Spider Eye")); - $this->register(new Item(new IID(Ids::FLINT, LegacyIds::FLINT, 0), "Flint")); - $this->register(new Item(new IID(Ids::GHAST_TEAR, LegacyIds::GHAST_TEAR, 0), "Ghast Tear")); - $this->register(new Item(new IID(Ids::GLISTERING_MELON, LegacyIds::GLISTERING_MELON, 0), "Glistering Melon")); - $this->register(new Item(new IID(Ids::GLOWSTONE_DUST, LegacyIds::GLOWSTONE_DUST, 0), "Glowstone Dust")); - $this->register(new Item(new IID(Ids::GOLD_INGOT, LegacyIds::GOLD_INGOT, 0), "Gold Ingot")); - $this->register(new Item(new IID(Ids::GOLD_NUGGET, LegacyIds::GOLD_NUGGET, 0), "Gold Nugget")); - $this->register(new Item(new IID(Ids::GUNPOWDER, LegacyIds::GUNPOWDER, 0), "Gunpowder")); - $this->register(new Item(new IID(Ids::HEART_OF_THE_SEA, LegacyIds::HEART_OF_THE_SEA, 0), "Heart of the Sea")); - $this->register(new Item(new IID(Ids::IRON_INGOT, LegacyIds::IRON_INGOT, 0), "Iron Ingot")); - $this->register(new Item(new IID(Ids::IRON_NUGGET, LegacyIds::IRON_NUGGET, 0), "Iron Nugget")); - $this->register(new Item(new IID(Ids::LEATHER, LegacyIds::LEATHER, 0), "Leather")); - $this->register(new Item(new IID(Ids::MAGMA_CREAM, LegacyIds::MAGMA_CREAM, 0), "Magma Cream")); - $this->register(new Item(new IID(Ids::NAUTILUS_SHELL, LegacyIds::NAUTILUS_SHELL, 0), "Nautilus Shell")); - $this->register(new Item(new IID(Ids::NETHER_BRICK, LegacyIds::NETHER_BRICK, 0), "Nether Brick")); - $this->register(new Item(new IID(Ids::NETHER_QUARTZ, LegacyIds::NETHER_QUARTZ, 0), "Nether Quartz")); - $this->register(new Item(new IID(Ids::NETHER_STAR, LegacyIds::NETHER_STAR, 0), "Nether Star")); - $this->register(new Item(new IID(Ids::PAPER, LegacyIds::PAPER, 0), "Paper")); - $this->register(new Item(new IID(Ids::PRISMARINE_CRYSTALS, LegacyIds::PRISMARINE_CRYSTALS, 0), "Prismarine Crystals")); - $this->register(new Item(new IID(Ids::PRISMARINE_SHARD, LegacyIds::PRISMARINE_SHARD, 0), "Prismarine Shard")); - $this->register(new Item(new IID(Ids::RABBIT_FOOT, LegacyIds::RABBIT_FOOT, 0), "Rabbit's Foot")); - $this->register(new Item(new IID(Ids::RABBIT_HIDE, LegacyIds::RABBIT_HIDE, 0), "Rabbit Hide")); - $this->register(new Item(new IID(Ids::SHULKER_SHELL, LegacyIds::SHULKER_SHELL, 0), "Shulker Shell")); - $this->register(new Item(new IID(Ids::SLIMEBALL, LegacyIds::SLIME_BALL, 0), "Slimeball")); - $this->register(new Item(new IID(Ids::SUGAR, LegacyIds::SUGAR, 0), "Sugar")); - $this->register(new Item(new IID(Ids::SCUTE, LegacyIds::TURTLE_SHELL_PIECE, 0), "Scute")); - $this->register(new Item(new IID(Ids::WHEAT, LegacyIds::WHEAT, 0), "Wheat")); + $this->register(new Coal(new IID(Ids::CHARCOAL), "Charcoal")); + $this->register(new CocoaBeans(new IID(Ids::COCOA_BEANS), "Cocoa Beans")); + $this->register(new Compass(new IID(Ids::COMPASS), "Compass")); + $this->register(new CookedChicken(new IID(Ids::COOKED_CHICKEN), "Cooked Chicken")); + $this->register(new CookedFish(new IID(Ids::COOKED_FISH), "Cooked Fish")); + $this->register(new CookedMutton(new IID(Ids::COOKED_MUTTON), "Cooked Mutton")); + $this->register(new CookedPorkchop(new IID(Ids::COOKED_PORKCHOP), "Cooked Porkchop")); + $this->register(new CookedRabbit(new IID(Ids::COOKED_RABBIT), "Cooked Rabbit")); + $this->register(new CookedSalmon(new IID(Ids::COOKED_SALMON), "Cooked Salmon")); + $this->register(new Cookie(new IID(Ids::COOKIE), "Cookie")); + $this->register(new DriedKelp(new IID(Ids::DRIED_KELP), "Dried Kelp")); + $this->register(new Egg(new IID(Ids::EGG), "Egg")); + $this->register(new EnderPearl(new IID(Ids::ENDER_PEARL), "Ender Pearl")); + $this->register(new ExperienceBottle(new IID(Ids::EXPERIENCE_BOTTLE), "Bottle o' Enchanting")); + $this->register(new Fertilizer(new IID(Ids::BONE_MEAL), "Bone Meal")); + $this->register(new FishingRod(new IID(Ids::FISHING_ROD), "Fishing Rod")); + $this->register(new FlintSteel(new IID(Ids::FLINT_AND_STEEL), "Flint and Steel")); + $this->register(new GlassBottle(new IID(Ids::GLASS_BOTTLE), "Glass Bottle")); + $this->register(new GoldenApple(new IID(Ids::GOLDEN_APPLE), "Golden Apple")); + $this->register(new GoldenAppleEnchanted(new IID(Ids::ENCHANTED_GOLDEN_APPLE), "Enchanted Golden Apple")); + $this->register(new GoldenCarrot(new IID(Ids::GOLDEN_CARROT), "Golden Carrot")); + $this->register(new Item(new IID(Ids::BLAZE_POWDER), "Blaze Powder")); + $this->register(new Item(new IID(Ids::BLEACH), "Bleach")); //EDU + $this->register(new Item(new IID(Ids::BONE), "Bone")); + $this->register(new Item(new IID(Ids::BRICK), "Brick")); + $this->register(new Item(new IID(Ids::POPPED_CHORUS_FRUIT), "Popped Chorus Fruit")); + $this->register(new Item(new IID(Ids::CLAY), "Clay")); + $this->register(new Item(new IID(Ids::CHEMICAL_SALT), "Salt")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_OXIDE), "Sodium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDROXIDE), "Sodium Hydroxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_NITRATE), "Magnesium Nitrate")); + $this->register(new Item(new IID(Ids::CHEMICAL_IRON_SULPHIDE), "Iron Sulphide")); + $this->register(new Item(new IID(Ids::CHEMICAL_LITHIUM_HYDRIDE), "Lithium Hydride")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYDRIDE), "Sodium Hydride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_BROMIDE), "Calcium Bromide")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_OXIDE), "Magnesium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_ACETATE), "Sodium Acetate")); + $this->register(new Item(new IID(Ids::CHEMICAL_LUMINOL), "Luminol")); + $this->register(new Item(new IID(Ids::CHEMICAL_CHARCOAL), "Charcoal")); //??? maybe bug + $this->register(new Item(new IID(Ids::CHEMICAL_SUGAR), "Sugar")); //??? maybe bug + $this->register(new Item(new IID(Ids::CHEMICAL_ALUMINIUM_OXIDE), "Aluminium Oxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_BORON_TRIOXIDE), "Boron Trioxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SOAP), "Soap")); + $this->register(new Item(new IID(Ids::CHEMICAL_POLYETHYLENE), "Polyethylene")); + $this->register(new Item(new IID(Ids::CHEMICAL_RUBBISH), "Rubbish")); + $this->register(new Item(new IID(Ids::CHEMICAL_MAGNESIUM_SALTS), "Magnesium Salts")); + $this->register(new Item(new IID(Ids::CHEMICAL_SULPHATE), "Sulphate")); + $this->register(new Item(new IID(Ids::CHEMICAL_BARIUM_SULPHATE), "Barium Sulphate")); + $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_CHLORIDE), "Potassium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_MERCURIC_CHLORIDE), "Mercuric Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CERIUM_CHLORIDE), "Cerium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_TUNGSTEN_CHLORIDE), "Tungsten Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_CALCIUM_CHLORIDE), "Calcium Chloride")); + $this->register(new Item(new IID(Ids::CHEMICAL_WATER), "Water")); //??? + $this->register(new Item(new IID(Ids::CHEMICAL_GLUE), "Glue")); + $this->register(new Item(new IID(Ids::CHEMICAL_HYPOCHLORITE), "Hypochlorite")); + $this->register(new Item(new IID(Ids::CHEMICAL_CRUDE_OIL), "Crude Oil")); + $this->register(new Item(new IID(Ids::CHEMICAL_LATEX), "Latex")); + $this->register(new Item(new IID(Ids::CHEMICAL_POTASSIUM_IODIDE), "Potassium Iodide")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_FLUORIDE), "Sodium Fluoride")); + $this->register(new Item(new IID(Ids::CHEMICAL_BENZENE), "Benzene")); + $this->register(new Item(new IID(Ids::CHEMICAL_INK), "Ink")); + $this->register(new Item(new IID(Ids::CHEMICAL_HYDROGEN_PEROXIDE), "Hydrogen Peroxide")); + $this->register(new Item(new IID(Ids::CHEMICAL_AMMONIA), "Ammonia")); + $this->register(new Item(new IID(Ids::CHEMICAL_SODIUM_HYPOCHLORITE), "Sodium Hypochlorite")); + $this->register(new Item(new IID(Ids::DIAMOND), "Diamond")); + $this->register(new Item(new IID(Ids::DRAGON_BREATH), "Dragon's Breath")); + $this->register(new Item(new IID(Ids::INK_SAC), "Ink Sac")); + $this->register(new Item(new IID(Ids::LAPIS_LAZULI), "Lapis Lazuli")); + $this->register(new Item(new IID(Ids::EMERALD), "Emerald")); + $this->register(new Item(new IID(Ids::FEATHER), "Feather")); + $this->register(new Item(new IID(Ids::FERMENTED_SPIDER_EYE), "Fermented Spider Eye")); + $this->register(new Item(new IID(Ids::FLINT), "Flint")); + $this->register(new Item(new IID(Ids::GHAST_TEAR), "Ghast Tear")); + $this->register(new Item(new IID(Ids::GLISTERING_MELON), "Glistering Melon")); + $this->register(new Item(new IID(Ids::GLOWSTONE_DUST), "Glowstone Dust")); + $this->register(new Item(new IID(Ids::GOLD_INGOT), "Gold Ingot")); + $this->register(new Item(new IID(Ids::GOLD_NUGGET), "Gold Nugget")); + $this->register(new Item(new IID(Ids::GUNPOWDER), "Gunpowder")); + $this->register(new Item(new IID(Ids::HEART_OF_THE_SEA), "Heart of the Sea")); + $this->register(new Item(new IID(Ids::IRON_INGOT), "Iron Ingot")); + $this->register(new Item(new IID(Ids::IRON_NUGGET), "Iron Nugget")); + $this->register(new Item(new IID(Ids::LEATHER), "Leather")); + $this->register(new Item(new IID(Ids::MAGMA_CREAM), "Magma Cream")); + $this->register(new Item(new IID(Ids::NAUTILUS_SHELL), "Nautilus Shell")); + $this->register(new Item(new IID(Ids::NETHER_BRICK), "Nether Brick")); + $this->register(new Item(new IID(Ids::NETHER_QUARTZ), "Nether Quartz")); + $this->register(new Item(new IID(Ids::NETHER_STAR), "Nether Star")); + $this->register(new Item(new IID(Ids::PAPER), "Paper")); + $this->register(new Item(new IID(Ids::PRISMARINE_CRYSTALS), "Prismarine Crystals")); + $this->register(new Item(new IID(Ids::PRISMARINE_SHARD), "Prismarine Shard")); + $this->register(new Item(new IID(Ids::RABBIT_FOOT), "Rabbit's Foot")); + $this->register(new Item(new IID(Ids::RABBIT_HIDE), "Rabbit Hide")); + $this->register(new Item(new IID(Ids::SHULKER_SHELL), "Shulker Shell")); + $this->register(new Item(new IID(Ids::SLIMEBALL), "Slimeball")); + $this->register(new Item(new IID(Ids::SUGAR), "Sugar")); + $this->register(new Item(new IID(Ids::SCUTE), "Scute")); + $this->register(new Item(new IID(Ids::WHEAT), "Wheat")); //the meta values for buckets are intentionally hardcoded because block IDs will change in the future - $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET, LegacyIds::BUCKET, 8), "Water Bucket", Blocks::WATER())); - $this->register(new LiquidBucket(new IID(Ids::LAVA_BUCKET, LegacyIds::BUCKET, 10), "Lava Bucket", Blocks::LAVA())); - $this->register(new Melon(new IID(Ids::MELON, LegacyIds::MELON, 0), "Melon")); - $this->register(new MelonSeeds(new IID(Ids::MELON_SEEDS, LegacyIds::MELON_SEEDS, 0), "Melon Seeds")); - $this->register(new MilkBucket(new IID(Ids::MILK_BUCKET, LegacyIds::BUCKET, 1), "Milk Bucket")); - $this->register(new Minecart(new IID(Ids::MINECART, LegacyIds::MINECART, 0), "Minecart")); - $this->register(new MushroomStew(new IID(Ids::MUSHROOM_STEW, LegacyIds::MUSHROOM_STEW, 0), "Mushroom Stew")); - $this->register(new PaintingItem(new IID(Ids::PAINTING, LegacyIds::PAINTING, 0), "Painting")); - $this->register(new PoisonousPotato(new IID(Ids::POISONOUS_POTATO, LegacyIds::POISONOUS_POTATO, 0), "Poisonous Potato")); - $this->register(new Potato(new IID(Ids::POTATO, LegacyIds::POTATO, 0), "Potato")); - $this->register(new Pufferfish(new IID(Ids::PUFFERFISH, LegacyIds::PUFFERFISH, 0), "Pufferfish")); - $this->register(new PumpkinPie(new IID(Ids::PUMPKIN_PIE, LegacyIds::PUMPKIN_PIE, 0), "Pumpkin Pie")); - $this->register(new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS, LegacyIds::PUMPKIN_SEEDS, 0), "Pumpkin Seeds")); - $this->register(new RabbitStew(new IID(Ids::RABBIT_STEW, LegacyIds::RABBIT_STEW, 0), "Rabbit Stew")); - $this->register(new RawBeef(new IID(Ids::RAW_BEEF, LegacyIds::RAW_BEEF, 0), "Raw Beef")); - $this->register(new RawChicken(new IID(Ids::RAW_CHICKEN, LegacyIds::RAW_CHICKEN, 0), "Raw Chicken")); - $this->register(new RawFish(new IID(Ids::RAW_FISH, LegacyIds::RAW_FISH, 0), "Raw Fish")); - $this->register(new RawMutton(new IID(Ids::RAW_MUTTON, LegacyIds::RAW_MUTTON, 0), "Raw Mutton")); - $this->register(new RawPorkchop(new IID(Ids::RAW_PORKCHOP, LegacyIds::RAW_PORKCHOP, 0), "Raw Porkchop")); - $this->register(new RawRabbit(new IID(Ids::RAW_RABBIT, LegacyIds::RAW_RABBIT, 0), "Raw Rabbit")); - $this->register(new RawSalmon(new IID(Ids::RAW_SALMON, LegacyIds::RAW_SALMON, 0), "Raw Salmon")); - $this->register(new Record(new IID(Ids::RECORD_13, LegacyIds::RECORD_13, 0), RecordType::DISK_13(), "Record 13")); - $this->register(new Record(new IID(Ids::RECORD_CAT, LegacyIds::RECORD_CAT, 0), RecordType::DISK_CAT(), "Record Cat")); - $this->register(new Record(new IID(Ids::RECORD_BLOCKS, LegacyIds::RECORD_BLOCKS, 0), RecordType::DISK_BLOCKS(), "Record Blocks")); - $this->register(new Record(new IID(Ids::RECORD_CHIRP, LegacyIds::RECORD_CHIRP, 0), RecordType::DISK_CHIRP(), "Record Chirp")); - $this->register(new Record(new IID(Ids::RECORD_FAR, LegacyIds::RECORD_FAR, 0), RecordType::DISK_FAR(), "Record Far")); - $this->register(new Record(new IID(Ids::RECORD_MALL, LegacyIds::RECORD_MALL, 0), RecordType::DISK_MALL(), "Record Mall")); - $this->register(new Record(new IID(Ids::RECORD_MELLOHI, LegacyIds::RECORD_MELLOHI, 0), RecordType::DISK_MELLOHI(), "Record Mellohi")); - $this->register(new Record(new IID(Ids::RECORD_STAL, LegacyIds::RECORD_STAL, 0), RecordType::DISK_STAL(), "Record Stal")); - $this->register(new Record(new IID(Ids::RECORD_STRAD, LegacyIds::RECORD_STRAD, 0), RecordType::DISK_STRAD(), "Record Strad")); - $this->register(new Record(new IID(Ids::RECORD_WARD, LegacyIds::RECORD_WARD, 0), RecordType::DISK_WARD(), "Record Ward")); - $this->register(new Record(new IID(Ids::RECORD_11, LegacyIds::RECORD_11, 0), RecordType::DISK_11(), "Record 11")); - $this->register(new Record(new IID(Ids::RECORD_WAIT, LegacyIds::RECORD_WAIT, 0), RecordType::DISK_WAIT(), "Record Wait")); - $this->register(new Redstone(new IID(Ids::REDSTONE_DUST, LegacyIds::REDSTONE, 0), "Redstone")); - $this->register(new RottenFlesh(new IID(Ids::ROTTEN_FLESH, LegacyIds::ROTTEN_FLESH, 0), "Rotten Flesh")); - $this->register(new Shears(new IID(Ids::SHEARS, LegacyIds::SHEARS, 0), "Shears")); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN, LegacyIds::SIGN, 0), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN, LegacyIds::SPRUCE_SIGN, 0), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN, LegacyIds::BIRCH_SIGN, 0), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN, LegacyIds::JUNGLE_SIGN, 0), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN, LegacyIds::ACACIA_SIGN, 0), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); - $this->register(new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN, LegacyIds::DARKOAK_SIGN, 0), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); - $this->register(new Snowball(new IID(Ids::SNOWBALL, LegacyIds::SNOWBALL, 0), "Snowball")); - $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE, LegacyIds::SPIDER_EYE, 0), "Spider Eye")); - $this->register(new Steak(new IID(Ids::STEAK, LegacyIds::STEAK, 0), "Steak")); - $this->register(new Stick(new IID(Ids::STICK, LegacyIds::STICK, 0), "Stick")); - $this->register(new StringItem(new IID(Ids::STRING, LegacyIds::STRING, 0), "String")); - $this->register(new SweetBerries(new IID(Ids::SWEET_BERRIES, LegacyIds::SWEET_BERRIES, 0), "Sweet Berries")); - $this->register(new Totem(new IID(Ids::TOTEM, LegacyIds::TOTEM, 0), "Totem of Undying")); - $this->register(new WheatSeeds(new IID(Ids::WHEAT_SEEDS, LegacyIds::WHEAT_SEEDS, 0), "Wheat Seeds")); - $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK, LegacyIds::WRITABLE_BOOK, 0), "Book & Quill")); - $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK, LegacyIds::WRITTEN_BOOK, 0), "Written Book")); + $this->register(new LiquidBucket(new IID(Ids::WATER_BUCKET), "Water Bucket", Blocks::WATER())); + $this->register(new LiquidBucket(new IID(Ids::LAVA_BUCKET), "Lava Bucket", Blocks::LAVA())); + $this->register(new Melon(new IID(Ids::MELON), "Melon")); + $this->register(new MelonSeeds(new IID(Ids::MELON_SEEDS), "Melon Seeds")); + $this->register(new MilkBucket(new IID(Ids::MILK_BUCKET), "Milk Bucket")); + $this->register(new Minecart(new IID(Ids::MINECART), "Minecart")); + $this->register(new MushroomStew(new IID(Ids::MUSHROOM_STEW), "Mushroom Stew")); + $this->register(new PaintingItem(new IID(Ids::PAINTING), "Painting")); + $this->register(new PoisonousPotato(new IID(Ids::POISONOUS_POTATO), "Poisonous Potato")); + $this->register(new Potato(new IID(Ids::POTATO), "Potato")); + $this->register(new Pufferfish(new IID(Ids::PUFFERFISH), "Pufferfish")); + $this->register(new PumpkinPie(new IID(Ids::PUMPKIN_PIE), "Pumpkin Pie")); + $this->register(new PumpkinSeeds(new IID(Ids::PUMPKIN_SEEDS), "Pumpkin Seeds")); + $this->register(new RabbitStew(new IID(Ids::RABBIT_STEW), "Rabbit Stew")); + $this->register(new RawBeef(new IID(Ids::RAW_BEEF), "Raw Beef")); + $this->register(new RawChicken(new IID(Ids::RAW_CHICKEN), "Raw Chicken")); + $this->register(new RawFish(new IID(Ids::RAW_FISH), "Raw Fish")); + $this->register(new RawMutton(new IID(Ids::RAW_MUTTON), "Raw Mutton")); + $this->register(new RawPorkchop(new IID(Ids::RAW_PORKCHOP), "Raw Porkchop")); + $this->register(new RawRabbit(new IID(Ids::RAW_RABBIT), "Raw Rabbit")); + $this->register(new RawSalmon(new IID(Ids::RAW_SALMON), "Raw Salmon")); + $this->register(new Record(new IID(Ids::RECORD_13), RecordType::DISK_13(), "Record 13")); + $this->register(new Record(new IID(Ids::RECORD_CAT), RecordType::DISK_CAT(), "Record Cat")); + $this->register(new Record(new IID(Ids::RECORD_BLOCKS), RecordType::DISK_BLOCKS(), "Record Blocks")); + $this->register(new Record(new IID(Ids::RECORD_CHIRP), RecordType::DISK_CHIRP(), "Record Chirp")); + $this->register(new Record(new IID(Ids::RECORD_FAR), RecordType::DISK_FAR(), "Record Far")); + $this->register(new Record(new IID(Ids::RECORD_MALL), RecordType::DISK_MALL(), "Record Mall")); + $this->register(new Record(new IID(Ids::RECORD_MELLOHI), RecordType::DISK_MELLOHI(), "Record Mellohi")); + $this->register(new Record(new IID(Ids::RECORD_STAL), RecordType::DISK_STAL(), "Record Stal")); + $this->register(new Record(new IID(Ids::RECORD_STRAD), RecordType::DISK_STRAD(), "Record Strad")); + $this->register(new Record(new IID(Ids::RECORD_WARD), RecordType::DISK_WARD(), "Record Ward")); + $this->register(new Record(new IID(Ids::RECORD_11), RecordType::DISK_11(), "Record 11")); + $this->register(new Record(new IID(Ids::RECORD_WAIT), RecordType::DISK_WAIT(), "Record Wait")); + $this->register(new Redstone(new IID(Ids::REDSTONE_DUST), "Redstone")); + $this->register(new RottenFlesh(new IID(Ids::ROTTEN_FLESH), "Rotten Flesh")); + $this->register(new Shears(new IID(Ids::SHEARS), "Shears")); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::OAK_SIGN), Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::SPRUCE_SIGN), Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::BIRCH_SIGN), Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::JUNGLE_SIGN), Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::ACACIA_SIGN), Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN())); + $this->register(new ItemBlockWallOrFloor(new IID(Ids::DARK_OAK_SIGN), Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN())); + $this->register(new Snowball(new IID(Ids::SNOWBALL), "Snowball")); + $this->register(new SpiderEye(new IID(Ids::SPIDER_EYE), "Spider Eye")); + $this->register(new Steak(new IID(Ids::STEAK), "Steak")); + $this->register(new Stick(new IID(Ids::STICK), "Stick")); + $this->register(new StringItem(new IID(Ids::STRING), "String")); + $this->register(new SweetBerries(new IID(Ids::SWEET_BERRIES), "Sweet Berries")); + $this->register(new Totem(new IID(Ids::TOTEM), "Totem of Undying")); + $this->register(new WheatSeeds(new IID(Ids::WHEAT_SEEDS), "Wheat Seeds")); + $this->register(new WritableBook(new IID(Ids::WRITABLE_BOOK), "Book & Quill")); + $this->register(new WrittenBook(new IID(Ids::WRITTEN_BOOK), "Written Book")); //TODO: add interface to dye-colour objects - $this->register(new Dye(new IID(Ids::DYE, LegacyIds::DYE, 0), "Dye")); + $this->register(new Dye(new IID(Ids::DYE), "Dye")); $this->register(new Banner( - new IID(Ids::BANNER, LegacyIds::BANNER, 0), + new IID(Ids::BANNER), Blocks::BANNER(), Blocks::WALL_BANNER() )); - $this->register(new Potion(new IID(Ids::POTION, LegacyIds::POTION, 0), "Potion")); - $this->register(new SplashPotion(new IID(Ids::SPLASH_POTION, LegacyIds::SPLASH_POTION, 0), "Splash Potion")); + $this->register(new Potion(new IID(Ids::POTION), "Potion")); + $this->register(new SplashPotion(new IID(Ids::SPLASH_POTION), "Splash Potion")); foreach(TreeType::getAll() as $type){ //TODO: tree type should be dynamic in the future, but we're staying static for now for the sake of consistency @@ -254,7 +251,7 @@ class ItemFactory{ TreeType::ACACIA() => Ids::ACACIA_BOAT, TreeType::DARK_OAK() => Ids::DARK_OAK_BOAT, default => throw new AssumptionFailedError("Unhandled tree type " . $type->name()) - }, LegacyIds::BOAT, $type->getMagicNumber()), $type->getDisplayName() . " Boat", $type)); + }), $type->getDisplayName() . " Boat", $type)); } //region --- auto-generated TODOs --- @@ -302,17 +299,17 @@ class ItemFactory{ private function registerSpawnEggs() : void{ //TODO: the meta values should probably be hardcoded; they won't change, but the EntityLegacyIds might - $this->register(new class(new IID(Ids::ZOMBIE_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::ZOMBIE), "Zombie Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::ZOMBIE_SPAWN_EGG), "Zombie Spawn Egg") extends SpawnEgg{ protected function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Zombie(Location::fromObject($pos, $world, $yaw, $pitch)); } }); - $this->register(new class(new IID(Ids::SQUID_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::SQUID), "Squid Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::SQUID_SPAWN_EGG), "Squid Spawn Egg") extends SpawnEgg{ public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Squid(Location::fromObject($pos, $world, $yaw, $pitch)); } }); - $this->register(new class(new IID(Ids::VILLAGER_SPAWN_EGG, LegacyIds::SPAWN_EGG, EntityLegacyIds::VILLAGER), "Villager Spawn Egg") extends SpawnEgg{ + $this->register(new class(new IID(Ids::VILLAGER_SPAWN_EGG), "Villager Spawn Egg") extends SpawnEgg{ public function createEntity(World $world, Vector3 $pos, float $yaw, float $pitch) : Entity{ return new Villager(Location::fromObject($pos, $world, $yaw, $pitch)); } @@ -320,54 +317,54 @@ class ItemFactory{ } private function registerTierToolItems() : void{ - $this->register(new Axe(new IID(Ids::DIAMOND_AXE, LegacyIds::DIAMOND_AXE, 0), "Diamond Axe", ToolTier::DIAMOND())); - $this->register(new Axe(new IID(Ids::GOLDEN_AXE, LegacyIds::GOLDEN_AXE, 0), "Golden Axe", ToolTier::GOLD())); - $this->register(new Axe(new IID(Ids::IRON_AXE, LegacyIds::IRON_AXE, 0), "Iron Axe", ToolTier::IRON())); - $this->register(new Axe(new IID(Ids::STONE_AXE, LegacyIds::STONE_AXE, 0), "Stone Axe", ToolTier::STONE())); - $this->register(new Axe(new IID(Ids::WOODEN_AXE, LegacyIds::WOODEN_AXE, 0), "Wooden Axe", ToolTier::WOOD())); - $this->register(new Hoe(new IID(Ids::DIAMOND_HOE, LegacyIds::DIAMOND_HOE, 0), "Diamond Hoe", ToolTier::DIAMOND())); - $this->register(new Hoe(new IID(Ids::GOLDEN_HOE, LegacyIds::GOLDEN_HOE, 0), "Golden Hoe", ToolTier::GOLD())); - $this->register(new Hoe(new IID(Ids::IRON_HOE, LegacyIds::IRON_HOE, 0), "Iron Hoe", ToolTier::IRON())); - $this->register(new Hoe(new IID(Ids::STONE_HOE, LegacyIds::STONE_HOE, 0), "Stone Hoe", ToolTier::STONE())); - $this->register(new Hoe(new IID(Ids::WOODEN_HOE, LegacyIds::WOODEN_HOE, 0), "Wooden Hoe", ToolTier::WOOD())); - $this->register(new Pickaxe(new IID(Ids::DIAMOND_PICKAXE, LegacyIds::DIAMOND_PICKAXE, 0), "Diamond Pickaxe", ToolTier::DIAMOND())); - $this->register(new Pickaxe(new IID(Ids::GOLDEN_PICKAXE, LegacyIds::GOLDEN_PICKAXE, 0), "Golden Pickaxe", ToolTier::GOLD())); - $this->register(new Pickaxe(new IID(Ids::IRON_PICKAXE, LegacyIds::IRON_PICKAXE, 0), "Iron Pickaxe", ToolTier::IRON())); - $this->register(new Pickaxe(new IID(Ids::STONE_PICKAXE, LegacyIds::STONE_PICKAXE, 0), "Stone Pickaxe", ToolTier::STONE())); - $this->register(new Pickaxe(new IID(Ids::WOODEN_PICKAXE, LegacyIds::WOODEN_PICKAXE, 0), "Wooden Pickaxe", ToolTier::WOOD())); - $this->register(new Shovel(new IID(Ids::DIAMOND_SHOVEL, LegacyIds::DIAMOND_SHOVEL, 0), "Diamond Shovel", ToolTier::DIAMOND())); - $this->register(new Shovel(new IID(Ids::GOLDEN_SHOVEL, LegacyIds::GOLDEN_SHOVEL, 0), "Golden Shovel", ToolTier::GOLD())); - $this->register(new Shovel(new IID(Ids::IRON_SHOVEL, LegacyIds::IRON_SHOVEL, 0), "Iron Shovel", ToolTier::IRON())); - $this->register(new Shovel(new IID(Ids::STONE_SHOVEL, LegacyIds::STONE_SHOVEL, 0), "Stone Shovel", ToolTier::STONE())); - $this->register(new Shovel(new IID(Ids::WOODEN_SHOVEL, LegacyIds::WOODEN_SHOVEL, 0), "Wooden Shovel", ToolTier::WOOD())); - $this->register(new Sword(new IID(Ids::DIAMOND_SWORD, LegacyIds::DIAMOND_SWORD, 0), "Diamond Sword", ToolTier::DIAMOND())); - $this->register(new Sword(new IID(Ids::GOLDEN_SWORD, LegacyIds::GOLDEN_SWORD, 0), "Golden Sword", ToolTier::GOLD())); - $this->register(new Sword(new IID(Ids::IRON_SWORD, LegacyIds::IRON_SWORD, 0), "Iron Sword", ToolTier::IRON())); - $this->register(new Sword(new IID(Ids::STONE_SWORD, LegacyIds::STONE_SWORD, 0), "Stone Sword", ToolTier::STONE())); - $this->register(new Sword(new IID(Ids::WOODEN_SWORD, LegacyIds::WOODEN_SWORD, 0), "Wooden Sword", ToolTier::WOOD())); + $this->register(new Axe(new IID(Ids::DIAMOND_AXE), "Diamond Axe", ToolTier::DIAMOND())); + $this->register(new Axe(new IID(Ids::GOLDEN_AXE), "Golden Axe", ToolTier::GOLD())); + $this->register(new Axe(new IID(Ids::IRON_AXE), "Iron Axe", ToolTier::IRON())); + $this->register(new Axe(new IID(Ids::STONE_AXE), "Stone Axe", ToolTier::STONE())); + $this->register(new Axe(new IID(Ids::WOODEN_AXE), "Wooden Axe", ToolTier::WOOD())); + $this->register(new Hoe(new IID(Ids::DIAMOND_HOE), "Diamond Hoe", ToolTier::DIAMOND())); + $this->register(new Hoe(new IID(Ids::GOLDEN_HOE), "Golden Hoe", ToolTier::GOLD())); + $this->register(new Hoe(new IID(Ids::IRON_HOE), "Iron Hoe", ToolTier::IRON())); + $this->register(new Hoe(new IID(Ids::STONE_HOE), "Stone Hoe", ToolTier::STONE())); + $this->register(new Hoe(new IID(Ids::WOODEN_HOE), "Wooden Hoe", ToolTier::WOOD())); + $this->register(new Pickaxe(new IID(Ids::DIAMOND_PICKAXE), "Diamond Pickaxe", ToolTier::DIAMOND())); + $this->register(new Pickaxe(new IID(Ids::GOLDEN_PICKAXE), "Golden Pickaxe", ToolTier::GOLD())); + $this->register(new Pickaxe(new IID(Ids::IRON_PICKAXE), "Iron Pickaxe", ToolTier::IRON())); + $this->register(new Pickaxe(new IID(Ids::STONE_PICKAXE), "Stone Pickaxe", ToolTier::STONE())); + $this->register(new Pickaxe(new IID(Ids::WOODEN_PICKAXE), "Wooden Pickaxe", ToolTier::WOOD())); + $this->register(new Shovel(new IID(Ids::DIAMOND_SHOVEL), "Diamond Shovel", ToolTier::DIAMOND())); + $this->register(new Shovel(new IID(Ids::GOLDEN_SHOVEL), "Golden Shovel", ToolTier::GOLD())); + $this->register(new Shovel(new IID(Ids::IRON_SHOVEL), "Iron Shovel", ToolTier::IRON())); + $this->register(new Shovel(new IID(Ids::STONE_SHOVEL), "Stone Shovel", ToolTier::STONE())); + $this->register(new Shovel(new IID(Ids::WOODEN_SHOVEL), "Wooden Shovel", ToolTier::WOOD())); + $this->register(new Sword(new IID(Ids::DIAMOND_SWORD), "Diamond Sword", ToolTier::DIAMOND())); + $this->register(new Sword(new IID(Ids::GOLDEN_SWORD), "Golden Sword", ToolTier::GOLD())); + $this->register(new Sword(new IID(Ids::IRON_SWORD), "Iron Sword", ToolTier::IRON())); + $this->register(new Sword(new IID(Ids::STONE_SWORD), "Stone Sword", ToolTier::STONE())); + $this->register(new Sword(new IID(Ids::WOODEN_SWORD), "Wooden Sword", ToolTier::WOOD())); } private function registerArmorItems() : void{ - $this->register(new Armor(new IID(Ids::CHAINMAIL_BOOTS, LegacyIds::CHAIN_BOOTS, 0), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::DIAMOND_BOOTS, LegacyIds::DIAMOND_BOOTS, 0), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::GOLDEN_BOOTS, LegacyIds::GOLDEN_BOOTS, 0), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::IRON_BOOTS, LegacyIds::IRON_BOOTS, 0), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::LEATHER_BOOTS, LegacyIds::LEATHER_BOOTS, 0), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE, LegacyIds::CHAIN_CHESTPLATE, 0), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::DIAMOND_CHESTPLATE, LegacyIds::DIAMOND_CHESTPLATE, 0), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::GOLDEN_CHESTPLATE, LegacyIds::GOLDEN_CHESTPLATE, 0), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::IRON_CHESTPLATE, LegacyIds::IRON_CHESTPLATE, 0), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::LEATHER_TUNIC, LegacyIds::LEATHER_CHESTPLATE, 0), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_HELMET, LegacyIds::CHAIN_HELMET, 0), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::DIAMOND_HELMET, LegacyIds::DIAMOND_HELMET, 0), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::GOLDEN_HELMET, LegacyIds::GOLDEN_HELMET, 0), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::IRON_HELMET, LegacyIds::IRON_HELMET, 0), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::LEATHER_CAP, LegacyIds::LEATHER_HELMET, 0), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); - $this->register(new Armor(new IID(Ids::CHAINMAIL_LEGGINGS, LegacyIds::CHAIN_LEGGINGS, 0), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::DIAMOND_LEGGINGS, LegacyIds::DIAMOND_LEGGINGS, 0), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::GOLDEN_LEGGINGS, LegacyIds::GOLDEN_LEGGINGS, 0), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::IRON_LEGGINGS, LegacyIds::IRON_LEGGINGS, 0), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); - $this->register(new Armor(new IID(Ids::LEATHER_PANTS, LegacyIds::LEATHER_LEGGINGS, 0), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_BOOTS), "Chainmail Boots", new ArmorTypeInfo(1, 196, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::DIAMOND_BOOTS), "Diamond Boots", new ArmorTypeInfo(3, 430, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::GOLDEN_BOOTS), "Golden Boots", new ArmorTypeInfo(1, 92, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::IRON_BOOTS), "Iron Boots", new ArmorTypeInfo(2, 196, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::LEATHER_BOOTS), "Leather Boots", new ArmorTypeInfo(1, 66, ArmorInventory::SLOT_FEET))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_CHESTPLATE), "Chainmail Chestplate", new ArmorTypeInfo(5, 241, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::DIAMOND_CHESTPLATE), "Diamond Chestplate", new ArmorTypeInfo(8, 529, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::GOLDEN_CHESTPLATE), "Golden Chestplate", new ArmorTypeInfo(5, 113, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::IRON_CHESTPLATE), "Iron Chestplate", new ArmorTypeInfo(6, 241, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::LEATHER_TUNIC), "Leather Tunic", new ArmorTypeInfo(3, 81, ArmorInventory::SLOT_CHEST))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_HELMET), "Chainmail Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::DIAMOND_HELMET), "Diamond Helmet", new ArmorTypeInfo(3, 364, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::GOLDEN_HELMET), "Golden Helmet", new ArmorTypeInfo(2, 78, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::IRON_HELMET), "Iron Helmet", new ArmorTypeInfo(2, 166, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::LEATHER_CAP), "Leather Cap", new ArmorTypeInfo(1, 56, ArmorInventory::SLOT_HEAD))); + $this->register(new Armor(new IID(Ids::CHAINMAIL_LEGGINGS), "Chainmail Leggings", new ArmorTypeInfo(4, 226, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::DIAMOND_LEGGINGS), "Diamond Leggings", new ArmorTypeInfo(6, 496, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::GOLDEN_LEGGINGS), "Golden Leggings", new ArmorTypeInfo(3, 106, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::IRON_LEGGINGS), "Iron Leggings", new ArmorTypeInfo(5, 226, ArmorInventory::SLOT_LEGS))); + $this->register(new Armor(new IID(Ids::LEATHER_PANTS), "Leather Pants", new ArmorTypeInfo(2, 76, ArmorInventory::SLOT_LEGS))); } /** diff --git a/src/item/ItemIdentifier.php b/src/item/ItemIdentifier.php index cf9729379..5ddf652bd 100644 --- a/src/item/ItemIdentifier.php +++ b/src/item/ItemIdentifier.php @@ -26,23 +26,9 @@ namespace pocketmine\item; use pocketmine\block\Block; class ItemIdentifier{ - private int $legacyId; - private int $legacyMeta; - public function __construct( - private int $typeId, - int $legacyId, - int $legacyMeta - ){ - if($legacyId < -0x8000 || $legacyId > 0x7fff){ //signed short range - throw new \InvalidArgumentException("ID must be in range " . -0x8000 . " - " . 0x7fff); - } - if($legacyMeta < 0 || $legacyMeta > 0x7ffe){ - throw new \InvalidArgumentException("Meta must be in range 0 - " . 0x7ffe); - } - $this->legacyId = $legacyId; - $this->legacyMeta = $legacyMeta; - } + private int $typeId + ){} public static function fromBlock(Block $block) : self{ //negative item type IDs are treated as block IDs @@ -50,16 +36,8 @@ class ItemIdentifier{ //TODO: this isn't vanilla-compliant, but it'll do for now - we only use the "legacy" item ID/meta for full type //indexing right now, because item type IDs aren't granular enough //this should be removed once that's addressed - return new self(-$block->getTypeId(), -$block->getTypeId(), $block->computeTypeData()); + return new self(-$block->getTypeId()); } public function getTypeId() : int{ return $this->typeId; } - - public function getLegacyId() : int{ - return $this->legacyId; - } - - public function getLegacyMeta() : int{ - return $this->legacyMeta; - } } diff --git a/src/item/ItemIdentifierFlattened.php b/src/item/ItemIdentifierFlattened.php deleted file mode 100644 index d137ee994..000000000 --- a/src/item/ItemIdentifierFlattened.php +++ /dev/null @@ -1,41 +0,0 @@ -additionalLegacyIds; } - - /** @return int[] */ - public function getAllLegacyIds() : array{ - return [$this->getLegacyId(), ...$this->additionalLegacyIds]; - } -} diff --git a/src/item/ItemIds.php b/src/item/ItemIds.php deleted file mode 100644 index 7790a1d7a..000000000 --- a/src/item/ItemIds.php +++ /dev/null @@ -1,736 +0,0 @@ -toId($this->potionType); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writePotionType($w, $this->potionType); } public function getType() : PotionType{ return $this->potionType; } diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index 39db4d6d7..ab1bab4d3 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\item; -use pocketmine\data\bedrock\PotionTypeIdMap; +use pocketmine\data\runtime\RuntimeDataWriter; +use pocketmine\data\runtime\RuntimeEnumSerializer; use pocketmine\entity\Location; use pocketmine\entity\projectile\SplashPotion as SplashPotionEntity; use pocketmine\entity\projectile\Throwable; @@ -38,8 +39,8 @@ class SplashPotion extends ProjectileItem{ parent::__construct($identifier, $name); } - public function getMeta() : int{ - return PotionTypeIdMap::getInstance()->toId($this->potionType); + protected function encodeType(RuntimeDataWriter $w) : void{ + RuntimeEnumSerializer::writePotionType($w, $this->potionType); } public function getType() : PotionType{ return $this->potionType; } diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 72b883104..179fd8e8e 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -54,12 +54,12 @@ use pocketmine\player\Player; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use function get_class; +use function morton2d_encode; class TypeConverter{ use SingletonTrait; private const PM_ID_TAG = "___Id___"; - private const PM_META_TAG = "___Meta___"; private const RECIPE_INPUT_WILDCARD_META = 0x7fff; @@ -176,8 +176,7 @@ class TypeConverter{ if($nbt === null){ $nbt = new CompoundTag(); } - $nbt->setInt(self::PM_ID_TAG, $itemStack->getId()); - $nbt->setInt(self::PM_META_TAG, $itemStack->getMeta()); + $nbt->setInt(self::PM_ID_TAG, morton2d_encode($itemStack->getTypeId(), $itemStack->computeTypeData())); }else{ [$id, $meta, $blockRuntimeId] = $idMeta; } diff --git a/src/player/Player.php b/src/player/Player.php index f2b8f1486..7c189ae57 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -142,6 +142,7 @@ use function max; use function mb_strlen; use function microtime; use function min; +use function morton2d_encode; use function preg_match; use function spl_object_id; use function sqrt; @@ -641,7 +642,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function getItemCooldownExpiry(Item $item) : int{ $this->checkItemCooldowns(); - return $this->usedItemsCooldown[$item->getId()] ?? 0; + return $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())] ?? 0; } /** @@ -649,7 +650,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ public function hasItemCooldown(Item $item) : bool{ $this->checkItemCooldowns(); - return isset($this->usedItemsCooldown[$item->getId()]); + return isset($this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())]); } /** @@ -658,7 +659,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ public function resetItemCooldown(Item $item, ?int $ticks = null) : void{ $ticks = $ticks ?? $item->getCooldownTicks(); if($ticks > 0){ - $this->usedItemsCooldown[$item->getId()] = $this->server->getTick() + $ticks; + $this->usedItemsCooldown[morton2d_encode($item->getTypeId(), $item->computeTypeData())] = $this->server->getTick() + $ticks; } } diff --git a/tests/phpunit/data/bedrock/CoralTypeIdMapTest.php b/tests/phpunit/data/bedrock/CoralTypeIdMapTest.php deleted file mode 100644 index edd686cd0..000000000 --- a/tests/phpunit/data/bedrock/CoralTypeIdMapTest.php +++ /dev/null @@ -1,38 +0,0 @@ -toId($type); - $type2 = CoralTypeIdMap::getInstance()->fromId($id); - self::assertTrue($type2 !== null && $type->equals($type2)); - } - } -}