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 = $args[1]; $enchantLevel = isset($args[2]) ? (int) $args[2] : 1; $enchantment = Enchantment::getEnchantment($enchantId); if ($enchantment->getId() === Enchantment::TYPE_INVALID) { $enchantment = Enchantment::getEnchantmentByName($enchantId); if ($enchantment->getId() === Enchantment::TYPE_INVALID) { $sender->sendMessage(new TranslationContainer("commands.enchant.notFound", [$enchantment->getId()])); return true; } } $id = $enchantment->getId(); $maxLevel = Enchantment::getEnchantMaxLevel($id); if ($enchantLevel > $maxLevel or $enchantLevel <= 0) { $sender->sendMessage(new TranslationContainer("commands.enchant.maxLevel", [$maxLevel])); return true; } $enchantment->setLevel($enchantLevel); $item = $player->getInventory()->getItemInHand(); if ($item->getId() <= 0) { $sender->sendMessage(new TranslationContainer("commands.enchant.noItem")); return true; } if (Enchantment::getEnchantAbility($item) === 0) { $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.enchant.cantEnchant")); return true; } $item->addEnchantment($enchantment); $player->getInventory()->setItemInHand($item); self::broadcastCommandMessage($sender, new TranslationContainer("%commands.enchant.success")); return true; }
public function onSlotChange($index, $before) { parent::onSlotChange($index, $before); if ($index == 0) { $item = $this->getItem(0); if ($item->getId() == Item::AIR) { $this->entries = null; } elseif ($before->getId() == Item::AIR and !$item->hasEnchantments()) { //before enchant if ($this->entries == null) { $enchantAbility = Enchantment::getEnchantAbility($item); $this->entries = []; for ($i = 0; $i < 3; $i++) { $result = []; $level = $this->levels[$i]; $k = $level + mt_rand(0, round(round($enchantAbility / 4) * 2)) + 1; $bonus = ($this->randomFloat() + $this->randomFloat() - 1) * 0.15 + 1; $modifiedLevel = $k * (1 + $bonus) + 0.5; $possible = EnchantmentLevelTable::getPossibleEnchantments($item, $modifiedLevel); $weights = []; $total = 0; for ($j = 0; $j < count($possible); $j++) { $id = $possible[$j]->getId(); $weight = Enchantment::getEnchantWeight($id); $weights[$j] = $weight; $total += $weight; } $v = mt_rand(1, $total + 1); $sum = 0; for ($key = 0; $key < count($weights); ++$key) { $sum += $weights[$key]; if ($sum >= $v) { $key++; break; } } $key--; $enchantment = $possible[$key]; $result[] = $enchantment; unset($possible[$key]); //Extra enchantment while (count($possible) > 0) { $modifiedLevel = round($modifiedLevel / 2); $v = mt_rand(0, 51); if ($v <= $modifiedLevel + 1) { $possible = $this->removeConflictEnchantment($enchantment, $possible); $weights = []; $total = 0; for ($j = 0; $j < count($possible); $j++) { $id = $possible[$j]->getId(); $weight = Enchantment::getEnchantWeight($id); $weights[$j] = $weight; $total += $weight; } $v = mt_rand(1, $total + 1); $sum = 0; for ($key = 0; $key < count($weights); ++$key) { $sum += $weights[$key]; if ($sum >= $v) { $key++; break; } } $key--; $enchantment = $possible[$key]; $result[] = $enchantment; unset($possible[$key]); } else { break; } } $this->entries[$i] = new EnchantmentEntry($result, $level, Enchantment::generateName()); } $this->sendEnchantmentList(); } } } }