public function execute(CommandSender $sender, $currentAlias, array $args) { if (!$this->testPermission($sender)) { return true; } if (count($args) < 2) { $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } $player = $sender->getServer()->getPlayer($args[0]); if ($player === null) { $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.player.notFound")); return true; } $enchantId = (int) $args[1]; $enchantLevel = isset($args[2]) ? (int) $args[2] : 1; $enchantment = Enchantment::getEnchantment($enchantId); if ($enchantment->getId() === Enchantment::TYPE_INVALID) { $sender->sendMessage(new TranslationContainer("commands.enchant.notFound", [$enchantId])); return true; } $enchantment->setLevel($enchantLevel); $item = $player->getInventory()->getItemInHand(); if ($item->getId() <= 0) { $sender->sendMessage(new TranslationContainer("commands.enchant.noItem")); return true; } $item->addEnchantment($enchantment); $player->getInventory()->setItemInHand($item); self::broadcastCommandMessage($sender, new TranslationContainer("%commands.enchant.success")); return true; }
/** * @param Item $item * @param int $modifiedLevel * @return Enchantment[] */ public static function getPossibleEnchantments(Item $item, int $modifiedLevel) { $result = []; $enchantmentIds = []; if ($item->getId() == Item::BOOK) { $enchantmentIds = array_keys(self::$map); } elseif ($item->isArmor()) { $enchantmentIds[] = Enchantment::TYPE_ARMOR_PROTECTION; $enchantmentIds[] = Enchantment::TYPE_ARMOR_FIRE_PROTECTION; $enchantmentIds[] = Enchantment::TYPE_ARMOR_EXPLOSION_PROTECTION; $enchantmentIds[] = Enchantment::TYPE_ARMOR_PROJECTILE_PROTECTION; $enchantmentIds[] = Enchantment::TYPE_ARMOR_THORNS; if ($item->isBoots()) { $enchantmentIds[] = Enchantment::TYPE_ARMOR_FALL_PROTECTION; } if ($item->isHelmet()) { $enchantmentIds[] = Enchantment::TYPE_WATER_BREATHING; $enchantmentIds[] = Enchantment::TYPE_WATER_AFFINITY; } } elseif ($item->isSword()) { $enchantmentIds[] = Enchantment::TYPE_WEAPON_SHARPNESS; $enchantmentIds[] = Enchantment::TYPE_WEAPON_SMITE; $enchantmentIds[] = Enchantment::TYPE_WEAPON_ARTHROPODS; $enchantmentIds[] = Enchantment::TYPE_WEAPON_KNOCKBACK; $enchantmentIds[] = Enchantment::TYPE_WEAPON_FIRE_ASPECT; $enchantmentIds[] = Enchantment::TYPE_WEAPON_LOOTING; } elseif ($item->isTool()) { $enchantmentIds[] = Enchantment::TYPE_MINING_EFFICIENCY; $enchantmentIds[] = Enchantment::TYPE_MINING_SILK_TOUCH; $enchantmentIds[] = Enchantment::TYPE_MINING_FORTUNE; } elseif ($item->getId() == Item::BOW) { $enchantmentIds[] = Enchantment::TYPE_BOW_POWER; $enchantmentIds[] = Enchantment::TYPE_BOW_KNOCKBACK; $enchantmentIds[] = Enchantment::TYPE_BOW_FLAME; $enchantmentIds[] = Enchantment::TYPE_BOW_INFINITY; } elseif ($item->getId() == Item::FISHING_ROD) { $enchantmentIds[] = Enchantment::TYPE_FISHING_FORTUNE; $enchantmentIds[] = Enchantment::TYPE_FISHING_LURE; } if ($item->isTool() || $item->isArmor()) { $enchantmentIds[] = Enchantment::TYPE_MINING_DURABILITY; } foreach ($enchantmentIds as $enchantmentId) { $enchantment = Enchantment::getEnchantment($enchantmentId); $ranges = self::$map[$enchantmentId]; $i = 0; /** @var Range $range */ foreach ($ranges as $range) { $i++; if (self::isInRange($range[0], $range[1], $modifiedLevel)) { $result[] = $enchantment->setLevel($i); } } } return $result; }
/** * @return Enchantment[] */ public function getEnchantments() { if (!$this->hasEnchantments()) { return []; } $enchantments = []; foreach ($this->getNamedTag()->ench as $entry) { $e = Enchantment::getEnchantment($entry["id"]); $e->setLevel($entry["lvl"]); $enchantments[] = $e; } return $enchantments; }
public function onUpdate() { if ($this->getLevel()->getServer()->getTick() % 20 == 0) { //Update per second $item = $this->inventory->getItem(0); if (!isset($this->item) or !$item->deepEquals($this->item)) { $this->item = $item; $enchantmentList = new EnchantmentList(3); for ($i = 0; $i < 3; $i++) { $enchantmentList->setSlot($i, new EnchantmentEntry([Enchantment::getEnchantment(mt_rand(0, 24))], 1, "Test")); } $pk = new CraftingDataPacket(); $pk->entries = [$enchantmentList]; foreach ($this->getInventory()->getViewers() as $player) { $windowId = $player->getWindowId($this->getInventory()); if ($windowId > 0) { $player->dataPacket($pk); } } } } return true; }