Item: make nbtDeserialize() return AIR when reading an unknown PC item

This is scummy, but it's better than crashing the whole server just because a chest contained an unknown item.
This commit is contained in:
Dylan K. Taylor 2018-09-20 18:53:41 +01:00
parent 8085b81f5c
commit 5d56030afa
2 changed files with 9 additions and 1 deletions

View File

@ -73,6 +73,9 @@ class ItemEntity extends Entity{
}
$this->item = Item::nbtDeserialize($itemTag);
if($this->item->isNull()){
throw new \UnexpectedValueException("Item for " . get_class($this) . " is invalid");
}
$this->server->getPluginManager()->callEvent(new ItemSpawnEvent($this));

View File

@ -953,7 +953,12 @@ class Item implements ItemIds, \JsonSerializable{
if($idTag instanceof ShortTag){
$item = ItemFactory::get(Binary::unsignShort($idTag->getValue()), $meta, $count);
}elseif($idTag instanceof StringTag){ //PC item save format
$item = ItemFactory::fromString($idTag->getValue());
try{
$item = ItemFactory::fromString($idTag->getValue());
}catch(\InvalidArgumentException $e){
//TODO: improve error handling
return ItemFactory::get(Item::AIR, 0, 0);
}
$item->setDamage($meta);
$item->setCount($count);
}else{