getId()] = clone $enchantment; } /** * @param int $id * * @return Enchantment|null */ public static function getEnchantment(int $id){ return self::$enchantments[$id] ?? null; } /** * @param string $name * * @return Enchantment|null */ public static function getEnchantmentByName(string $name){ $const = Enchantment::class . "::" . strtoupper($name); if(defined($const)){ return self::getEnchantment(constant($const)); } return null; } /** @var int */ private $id; /** @var string */ private $name; /** @var int */ private $rarity; /** @var int */ private $primaryItemFlags; /** @var int */ private $secondaryItemFlags; /** @var int */ private $maxLevel; /** * @param int $id * @param string $name * @param int $rarity * @param int $primaryItemFlags * @param int $secondaryItemFlags * @param int $maxLevel */ public function __construct(int $id, string $name, int $rarity, int $primaryItemFlags, int $secondaryItemFlags, int $maxLevel){ $this->id = $id; $this->name = $name; $this->rarity = $rarity; $this->primaryItemFlags = $primaryItemFlags; $this->secondaryItemFlags = $secondaryItemFlags; $this->maxLevel = $maxLevel; } /** * Returns the ID of this enchantment as per Minecraft PE * @return int */ public function getId() : int{ return $this->id; } /** * Returns a translation key for this enchantment's name. * @return string */ public function getName() : string{ return $this->name; } /** * Returns an int constant indicating how rare this enchantment type is. * @return int */ public function getRarity() : int{ return $this->rarity; } /** * Returns a bitset indicating what item types can have this item applied from an enchanting table. * * @return int */ public function getPrimaryItemFlags() : int{ return $this->primaryItemFlags; } /** * Returns a bitset indicating what item types cannot have this item applied from an enchanting table, but can from * an anvil. * * @return int */ public function getSecondaryItemFlags() : int{ return $this->secondaryItemFlags; } /** * Returns whether this enchantment can apply to the item type from an enchanting table. * * @param int $flag * * @return bool */ public function hasPrimaryItemType(int $flag) : bool{ return ($this->primaryItemFlags & $flag) !== 0; } /** * Returns whether this enchantment can apply to the item type from an anvil, if it is not a primary item. * * @param int $flag * * @return bool */ public function hasSecondaryItemType(int $flag) : bool{ return ($this->secondaryItemFlags & $flag) !== 0; } /** * Returns the maximum level of this enchantment that can be found on an enchantment table. * @return int */ public function getMaxLevel() : int{ return $this->maxLevel; } //TODO: methods for min/max XP cost bounds based on enchantment level (not needed yet - enchanting is client-side) }