pocketmine\item\enchantment\EnchantmentLevelTable::getPossibleEnchantments PHP Метод

getPossibleEnchantments() публичный статический Метод

public static getPossibleEnchantments ( Item $item, integer $modifiedLevel ) : Enchantment[]
$item pocketmine\item\Item
$modifiedLevel integer
Результат 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 ($range->isInRange($modifiedLevel)) {
                    $result[] = $enchantment->setLevel($i);
                }
            }
        }
        return $result;
    }

Usage Example

Пример #1
0
 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();
             }
         }
     }
 }
EnchantmentLevelTable