From 2d0dd72ae7732cbaf752532a7e32f6f144e95b78 Mon Sep 17 00:00:00 2001 From: Renz Date: Fri, 17 Oct 2025 05:44:52 +0700 Subject: [PATCH] Fix StringToItemParser::override() not fully overriding aliases (#6835) --- src/item/StringToItemParser.php | 15 ++++ tests/phpunit/item/StringToItemParserTest.php | 80 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 tests/phpunit/item/StringToItemParserTest.php diff --git a/src/item/StringToItemParser.php b/src/item/StringToItemParser.php index 63fa88538..5928e440c 100644 --- a/src/item/StringToItemParser.php +++ b/src/item/StringToItemParser.php @@ -38,6 +38,7 @@ use pocketmine\item\VanillaItems as Items; use pocketmine\utils\SingletonTrait; use pocketmine\utils\StringToTParser; use function array_keys; +use function count; use function strtolower; /** @@ -1597,6 +1598,20 @@ final class StringToItemParser extends StringToTParser{ $this->reverseMap[$item->getStateId()][$alias] = true; } + public function override(string $alias, \Closure $callback) : void{ + $oldItem = $this->parse($alias); + if($oldItem !== null){ + $oldStateId = $oldItem->getStateId(); + unset($this->reverseMap[$oldStateId][$alias]); + if(count($this->reverseMap[$oldStateId]) === 0){ + unset($this->reverseMap[$oldStateId]); + } + } + parent::override($alias, $callback); + $newItem = $callback($alias); + $this->reverseMap[$newItem->getStateId()][$alias] = true; + } + /** @phpstan-param \Closure(string $input) : Block $callback */ public function registerBlock(string $alias, \Closure $callback) : void{ $this->register($alias, fn(string $input) => $callback($input)->asItem()); diff --git a/tests/phpunit/item/StringToItemParserTest.php b/tests/phpunit/item/StringToItemParserTest.php new file mode 100644 index 000000000..2bbb76e0e --- /dev/null +++ b/tests/phpunit/item/StringToItemParserTest.php @@ -0,0 +1,80 @@ +register("test_alias", fn() => $item1); + + self::assertContains("test_alias", $parser->lookupAliases($item1)); + self::assertNotContains("test_alias", $parser->lookupAliases($item2)); + + $parser->override("test_alias", fn() => $item2); + + self::assertNotContains("test_alias", $parser->lookupAliases($item1)); + self::assertContains("test_alias", $parser->lookupAliases($item2)); + } + + public function testOverrideWithNewAlias() : void{ + $parser = new StringToItemParser(); + + $item = VanillaItems::DIAMOND(); + + $parser->override("new_alias", fn() => $item); + + self::assertContains("new_alias", $parser->lookupAliases($item)); + self::assertSame($item, $parser->parse("new_alias")); + } + + public function testOverrideMultipleAliases() : void{ + $parser = new StringToItemParser(); + + $item1 = VanillaItems::DIAMOND(); + $item2 = VanillaItems::EMERALD(); + + $parser->register("alias1", fn() => $item1); + $parser->register("alias2", fn() => $item1); + $parser->register("alias3", fn() => $item1); + + self::assertCount(3, $parser->lookupAliases($item1)); + + $parser->override("alias2", fn() => $item2); + + self::assertCount(2, $parser->lookupAliases($item1)); + self::assertContains("alias1", $parser->lookupAliases($item1)); + self::assertContains("alias3", $parser->lookupAliases($item1)); + self::assertNotContains("alias2", $parser->lookupAliases($item1)); + + self::assertCount(1, $parser->lookupAliases($item2)); + self::assertContains("alias2", $parser->lookupAliases($item2)); + } +}