diff --git a/src/pocketmine/item/Durable.php b/src/pocketmine/item/Durable.php index 445d19e9a..d2960f836 100644 --- a/src/pocketmine/item/Durable.php +++ b/src/pocketmine/item/Durable.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\item\enchantment\Enchantment; use pocketmine\nbt\tag\ByteTag; abstract class Durable extends Item{ @@ -54,7 +55,7 @@ abstract class Durable extends Item{ return false; } - //TODO: Unbreaking enchantment + $amount -= $this->getUnbreakingDamageReduction($amount); $this->meta += $amount; if($this->isBroken()){ @@ -64,6 +65,23 @@ abstract class Durable extends Item{ return true; } + protected function getUnbreakingDamageReduction(int $amount) : int{ + if(($unbreakingLevel = $this->getEnchantmentLevel(Enchantment::UNBREAKING)) > 0){ + $negated = 0; + + $chance = 1 / ($unbreakingLevel + 1); + for($i = 0; $i < $amount; ++$i){ + if(lcg_value() > $chance){ + $negated++; + } + } + + return $negated; + } + + return 0; + } + /** * Returns whether the item is broken. * @return bool diff --git a/src/pocketmine/item/enchantment/Enchantment.php b/src/pocketmine/item/enchantment/Enchantment.php index e87c78e29..3d95cd6a8 100644 --- a/src/pocketmine/item/enchantment/Enchantment.php +++ b/src/pocketmine/item/enchantment/Enchantment.php @@ -95,6 +95,8 @@ class Enchantment{ self::registerEnchantment(new Enchantment(self::RESPIRATION, "%enchantment.oxygen", self::RARITY_RARE, self::SLOT_HEAD, 3)); self::registerEnchantment(new Enchantment(self::EFFICIENCY, "%enchantment.digging", self::RARITY_COMMON, self::SLOT_DIG | self::SLOT_SHEARS, 5)); + + self::registerEnchantment(new Enchantment(self::UNBREAKING, "%enchantment.durability", self::RARITY_UNCOMMON, self::SLOT_ALL, 3)); //TODO: item type flags need to be split up } /**