diff --git a/src/pocketmine/command/defaults/EnchantCommand.php b/src/pocketmine/command/defaults/EnchantCommand.php index 16db27812..a64dc1be3 100644 --- a/src/pocketmine/command/defaults/EnchantCommand.php +++ b/src/pocketmine/command/defaults/EnchantCommand.php @@ -27,6 +27,7 @@ use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\event\TranslationContainer; use pocketmine\item\enchantment\Enchantment; +use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\utils\TextFormat; class EnchantCommand extends VanillaCommand{ @@ -74,9 +75,7 @@ class EnchantCommand extends VanillaCommand{ return true; } - $enchantment->setLevel((int) ($args[2] ?? 1)); - - $item->addEnchantment($enchantment); + $item->addEnchantment(new EnchantmentInstance($enchantment, (int) ($args[2] ?? 1))); $player->getInventory()->setItemInHand($item); diff --git a/src/pocketmine/item/Item.php b/src/pocketmine/item/Item.php index 01d080282..a54ed33eb 100644 --- a/src/pocketmine/item/Item.php +++ b/src/pocketmine/item/Item.php @@ -31,6 +31,7 @@ use pocketmine\block\BlockFactory; use pocketmine\block\BlockToolType; use pocketmine\entity\Entity; use pocketmine\item\enchantment\Enchantment; +use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\level\Level; use pocketmine\math\Vector3; use pocketmine\nbt\NBT; @@ -310,9 +311,9 @@ class Item implements ItemIds, \JsonSerializable{ /** * @param int $id * - * @return Enchantment|null + * @return EnchantmentInstance|null */ - public function getEnchantment(int $id) : ?Enchantment{ + public function getEnchantment(int $id) : ?EnchantmentInstance{ $ench = $this->getNamedTagEntry(self::TAG_ENCH); if(!($ench instanceof ListTag)){ return null; @@ -323,8 +324,7 @@ class Item implements ItemIds, \JsonSerializable{ if($entry->getShort("id") === $id){ $e = Enchantment::getEnchantment($entry->getShort("id")); if($e !== null){ - $e->setLevel($entry->getShort("lvl")); - return $e; + return new EnchantmentInstance($e, $entry->getShort("lvl")); } } } @@ -358,9 +358,9 @@ class Item implements ItemIds, \JsonSerializable{ } /** - * @param Enchantment $enchantment + * @param EnchantmentInstance $enchantment */ - public function addEnchantment(Enchantment $enchantment) : void{ + public function addEnchantment(EnchantmentInstance $enchantment) : void{ $found = false; $ench = $this->getNamedTagEntry(self::TAG_ENCH); @@ -391,10 +391,10 @@ class Item implements ItemIds, \JsonSerializable{ } /** - * @return Enchantment[] + * @return EnchantmentInstance[] */ public function getEnchantments() : array{ - /** @var Enchantment[] $enchantments */ + /** @var EnchantmentInstance[] $enchantments */ $enchantments = []; $ench = $this->getNamedTagEntry(self::TAG_ENCH); @@ -403,8 +403,7 @@ class Item implements ItemIds, \JsonSerializable{ foreach($ench as $entry){ $e = Enchantment::getEnchantment($entry->getShort("id")); if($e !== null){ - $e->setLevel($entry->getShort("lvl")); - $enchantments[] = $e; + $enchantments[] = new EnchantmentInstance($e, $entry->getShort("lvl")); } } } diff --git a/src/pocketmine/item/enchantment/Enchantment.php b/src/pocketmine/item/enchantment/Enchantment.php index 5057ba418..58fc55e1d 100644 --- a/src/pocketmine/item/enchantment/Enchantment.php +++ b/src/pocketmine/item/enchantment/Enchantment.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\item\enchantment; - +/** + * Manages enchantment type data. + */ class Enchantment{ public const PROTECTION = 0; @@ -110,7 +112,7 @@ class Enchantment{ */ public static function getEnchantment(int $id){ if(isset(self::$enchantments[$id])){ - return clone self::$enchantments[$id]; + return self::$enchantments[$id]; } return null; } @@ -129,8 +131,6 @@ class Enchantment{ /** @var int */ private $id; - /** @var int */ - private $level = 1; /** @var string */ private $name; /** @var int */ @@ -204,25 +204,4 @@ class Enchantment{ public function hasSlot(int $slot) : bool{ return ($this->slot & $slot) > 0; } - - /** - * Returns the level of the enchantment. - * @return int - */ - public function getLevel() : int{ - return $this->level; - } - - /** - * Sets the level of the enchantment. - * @param int $level - * - * @return $this - */ - public function setLevel(int $level){ - $this->level = $level; - - return $this; - } - } diff --git a/src/pocketmine/item/enchantment/EnchantmentInstance.php b/src/pocketmine/item/enchantment/EnchantmentInstance.php new file mode 100644 index 000000000..432c96261 --- /dev/null +++ b/src/pocketmine/item/enchantment/EnchantmentInstance.php @@ -0,0 +1,81 @@ +enchantment = $enchantment; + $this->level = $level; + } + + /** + * Returns the type of this enchantment. + * @return Enchantment + */ + public function getType() : Enchantment{ + return $this->enchantment; + } + + /** + * Returns the type identifier of this enchantment instance. + * @return int + */ + public function getId() : int{ + return $this->enchantment->getId(); + } + + /** + * Returns the level of the enchantment. + * @return int + */ + public function getLevel() : int{ + return $this->level; + } + + /** + * Sets the level of the enchantment. + * @param int $level + * + * @return $this + */ + public function setLevel(int $level){ + $this->level = $level; + + return $this; + } +}