Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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(Так не должно быть)
На всякий случай уточню, что это единственный слушатель в плагине
 
Я конечно добавил условие
Код:
if (slotItem == null || slotItem.getType() != Material.COBBLESTONE || slotItem.getAmount() != 1) {
                    validUpgrade = false;
                    break;
                }

что бы в слоте верстака был только 1 булыжник. Так после крафта 0 x 2 = 0
но всё же хотелось бы понимать почему так происходит
 
Не правда, вон собери мой плагин, он ровно таки же заменяет предмет в PrepareItemCraftEvent.
Выше приведен запрос с гитхаба Paper, проблема присутствует. Сам имел дело, но уже не помню всего контекста. Возможно, связано с отсутствием соответствующего Recipe.
В твоём примеры ты в целом наоборот устанавливаешь результат на воздух - и у ТС, и на гитхабе, случай обратный.
 
Выше приведен запрос с гитхаба Paper, проблема присутствует. Сам имел дело, но уже не помню всего контекста. Возможно, связано с отсутствием соответствующего Recipe.
В твоём примеры ты в целом наоборот устанавливаешь результат на воздух - и у ТС, и на гитхабе, случай обратный.
У меня существующий рецепт и предметом в результате да, ну значит пусть регистрирует рецепт как положено, если баг при отсутствие рецепта.
 
У меня существующий рецепт и предметом в результате да, ну значит пусть регистрирует рецепт как положено, если баг при отсутствие рецепта.
Спасибо вам за ваше компетентное мнение, но задумка в том что разные предметы в том числе и кастомные будут прокачивать разные зачарования. Три зачанования по 10 уровней это уже 1000 рецептов, поэтому в моём случае эффективнее запретить класть больше 1 предмета в слот верстака
 
Спасибо вам за ваше компетентное мнение, но задумка в том что разные предметы в том числе и кастомные будут прокачивать разные зачарования. Три зачанования по 10 уровней это уже 1000 рецептов, поэтому в моём случае эффективнее запретить класть больше 1 предмета в слот верстака
Зачем тебе 1000 рецептов? Тебе одного хватит, что бы обойти баг. Закастомишь ивентом и все.
 

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

Назад
Верх