From 9b52af62b6f469771f2355a964b35ecffa5117d9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 10 Jul 2020 21:32:39 +0100 Subject: [PATCH] Item: skip a step when decoding PC itemstacks --- src/item/Item.php | 9 ++++----- src/item/LegacyStringToItemParser.php | 5 +++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/item/Item.php b/src/item/Item.php index 17dc9dc295..d58089201f 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -658,13 +658,12 @@ class Item implements \JsonSerializable{ if($idTag instanceof ShortTag){ $item = ItemFactory::getInstance()->get($idTag->getValue(), $meta, $count); }elseif($idTag instanceof StringTag){ //PC item save format - try{ - $item = LegacyStringToItemParser::getInstance()->parse($idTag->getValue() . ":$meta"); - }catch(\InvalidArgumentException $e){ - //TODO: improve error handling + //TODO: this isn't a very good mapping source, we need a dedicated mapping for PC + $id = LegacyStringToItemParser::getInstance()->parseId($idTag->getValue()); + if($id === null){ return ItemFactory::air(); } - $item->setCount($count); + $item = ItemFactory::getInstance()->get($id, $meta, $count); }else{ throw new \InvalidArgumentException("Item CompoundTag ID must be an instance of StringTag or ShortTag, " . get_class($idTag) . " given"); } diff --git a/src/item/LegacyStringToItemParser.php b/src/item/LegacyStringToItemParser.php index ea5eb5c228..6eaa62ff92 100644 --- a/src/item/LegacyStringToItemParser.php +++ b/src/item/LegacyStringToItemParser.php @@ -32,6 +32,7 @@ use function is_int; use function is_numeric; use function is_string; use function json_decode; +use function mb_strtolower; use function str_replace; use function strtolower; use function trim; @@ -78,6 +79,10 @@ final class LegacyStringToItemParser{ $this->map[$alias] = $id; } + public function parseId(string $input) : ?int{ + return $this->map[mb_strtolower($this->reprocess($input))] ?? null; + } + /** * Tries to parse the specified string into Item types. *