ItemFactory: Check the bounds of durability, instead of trying to catch exceptions

This commit is contained in:
Dylan K. Taylor 2021-04-16 21:30:48 +01:00
parent da51f106de
commit 01c3668375
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
2 changed files with 8 additions and 4 deletions

View File

@ -440,11 +440,10 @@ class ItemFactory{
if(isset($this->list[$offset = self::getListOffset($id, $meta)])){
$item = clone $this->list[$offset];
}elseif(isset($this->list[$zero = self::getListOffset($id, 0)]) and $this->list[$zero] instanceof Durable){
/** @var Durable $item */
$item = clone $this->list[$zero];
try{
if($meta <= $this->list[$zero]->getMaxDurability()){
$item = clone $this->list[$zero];
$item->setDamage($meta);
}catch(\InvalidArgumentException $e){
}else{
$item = new Item(new ItemIdentifier($id, $meta));
}
}elseif($id < 256){ //intentionally includes negatives, for extended block IDs

View File

@ -48,4 +48,9 @@ class ItemFactoryTest extends TestCase{
/** @var Sword $i2 */
self::assertSame(1, $i2->getDamage());
}
public function testGetDurableItemWithTooLargeDurability() : void{
self::assertInstanceOf(Sword::class, ItemFactory::getInstance()->get(ItemIds::WOODEN_SWORD, ToolTier::WOOD()->getMaxDurability()));
self::assertInstanceOf(Item::class, ItemFactory::getInstance()->get(ItemIds::WOODEN_SWORD, ToolTier::WOOD()->getMaxDurability() + 1));
}
}