1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Дублирование предметов

Тема в разделе "Разработка плагинов для новичков", создана пользователем fedortik, 3 мар 2024.

  1. Автор темы
    fedortik

    fedortik Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    FEDORTIK
    Код:
    @EventHandler
        public void onCraftPrepare(PrepareItemCraftEvent event) {
            CraftingInventory inventory = event.getInventory();
            ItemStack[] matrix = inventory.getMatrix();
    
            if (matrix.length != 9) {return;}
            ItemStack centerItem = matrix[4];
            if (centerItem != null && centerItem.getType().toString().endsWith("_PICKAXE")) {
                boolean validUpgrade = true;
                
                for (int i = 0; i < matrix.length; i++) {
                    if (i == 4) continue;
                    ItemStack slotItem = matrix[i];
    
                    if (slotItem == null || slotItem.getType() != Material.COBBLESTONE) {
                        validUpgrade = false;
                        break;
                    }
                }
    
                if (validUpgrade) {
                    ItemStack upgradedPickaxe = centerItem.clone();
                    ItemMeta meta = upgradedPickaxe.getItemMeta();
                    if (meta != null) {
                        int enchantLevel = meta.getEnchantLevel(Enchantment.DIG_SPEED) + 1;
                        meta.addEnchant(Enchantment.DIG_SPEED, enchantLevel, true);
                        upgradedPickaxe.setItemMeta(meta);
    
                        inventory.setResult(upgradedPickaxe);
                    }
                }
            }
        }
    Имеется такой обработчик события. Казалось бы элементарно просто. Если в центре кирка а вокруг неё 8 булыжника то ставит в результат крафта кирку с эффективностью +1 . Но если один баг. Если положить в верстак upload_2024-3-3_9-56-56.png
    то после крафта оставшийся булыжник становится на 1 меньше(как и должно быть), а затем умножается на 2(Так не должно быть)
    На всякий случай уточню, что это единственный слушатель в плагине
     
  2. Автор темы
    fedortik

    fedortik Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    FEDORTIK
    Я конечно добавил условие
    Код:
    if (slotItem == null || slotItem.getType() != Material.COBBLESTONE || slotItem.getAmount() != 1) {
                        validUpgrade = false;
                        break;
                    }
    что бы в слоте верстака был только 1 булыжник. Так после крафта 0 x 2 = 0
    но всё же хотелось бы понимать почему так происходит
     
  3. FeniksDEV

    FeniksDEV Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Тут явно не весь код, ибо не вижу ничего, что умножает стак.
     
  5. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Как написали выше - баг. Возникает, когда устанавливаешь результат крафта во время PrepareItemCraftEvent.
     
  6. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Выше приведен запрос с гитхаба Paper, проблема присутствует. Сам имел дело, но уже не помню всего контекста. Возможно, связано с отсутствием соответствующего Recipe.
    В твоём примеры ты в целом наоборот устанавливаешь результат на воздух - и у ТС, и на гитхабе, случай обратный.
     
  7. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    У меня существующий рецепт и предметом в результате да, ну значит пусть регистрирует рецепт как положено, если баг при отсутствие рецепта.
     
  8. Автор темы
    fedortik

    fedortik Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    FEDORTIK
    Спасибо вам за ваше компетентное мнение, но задумка в том что разные предметы в том числе и кастомные будут прокачивать разные зачарования. Три зачанования по 10 уровней это уже 1000 рецептов, поэтому в моём случае эффективнее запретить класть больше 1 предмета в слот верстака
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Зачем тебе 1000 рецептов? Тебе одного хватит, что бы обойти баг. Закастомишь ивентом и все.
     

Поделиться этой страницей