При изготовлении необходимых предметов увеличивается.Spigot Плагин - PullRequest
0 голосов
/ 14 февраля 2019

Это точная копия поста на Spigot.mc: https://www.spigotmc.org/threads/1-13-2-when-crafting-the-required-items-increases.359924/

Моя проблема в том, что когда я создаю предметы, используя наборы предметов для рецепта, необходимые предметы увеличиваются даже выше предела стека.Я использую «PrepareItemCraftEvent», чтобы проверить, содержит ли рецепт необходимый элемент (Имя, Знания).Мой текущий код:

import java.util.HashMap;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.CraftingInventory;
import org.bukkit.inventory.ItemStack;
public class ItemstackCrafting implements Listener {

private int i = 0;

@SuppressWarnings("serial")
@EventHandler
public void onPlayerCraftItem(PrepareItemCraftEvent e){
    if(e.getInventory().getMatrix().length < 9){
        return;
    }
        checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier1(), 9), e.getInventory(), new HashMap<Integer, ItemStack>(){{
            put(0, CoustomItems.rareEmeraldTier2());
        }});

    checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier2(), 1), e.getInventory(), new HashMap<Integer, ItemStack>(){{
        for(int n = 0; n < 9; n++) {
            put(n, CoustomItems.rareEmeraldTier1());
        }
    }});
    i = 0;
    while (i < 9) {
        checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier2(), 9), e.getInventory(), new HashMap<Integer, ItemStack>(){{
            put(i, CoustomItems.rareEmeraldTier3());
            i++;
        }});
    }
    checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier3(), 1), e.getInventory(), new HashMap<Integer, ItemStack>(){{
        for(int n = 0; n < 9; n++) {
            put(n, CoustomItems.rareEmeraldTier2());
        }
    }});
    i = 0;
    while (i < 9) {
        checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier3(), 9), e.getInventory(), new HashMap<Integer, ItemStack>(){{
            put(i, CoustomItems.rareEmeraldTier4());
            i++;
        }});
    }
    checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier4(), 1), e.getInventory(), new HashMap<Integer, ItemStack>(){{
        for(int n = 0; n < 9; n++) {
            put(n, CoustomItems.rareEmeraldTier3());
        }
    }});
    i = 0;
    while (i < 9) {
        checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier4(), 9), e.getInventory(), new HashMap<Integer, ItemStack>(){{
            put(i, CoustomItems.rareEmeraldTier5());
            i++;
        }});
    }
    checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier5(), 1), e.getInventory(), new HashMap<Integer, ItemStack>(){{
        for(int n = 0; n < 9; n++) {
            put(n, CoustomItems.rareEmeraldTier4());
        }
    }});
    i = 0;
    while (i < 9) {
        checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier5(), 9), e.getInventory(), new HashMap<Integer, ItemStack>(){{
            put(i, CoustomItems.rareEmeraldBlockTier5());
            i++;
        }});
    }
        checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldBlockTier5(), 1), e.getInventory(), new HashMap<Integer, ItemStack>(){{
            for(int n = 0; n < 9; n++) {
            put(n, CoustomItems.rareEmeraldTier5());
            }
        }});
    }

    public void checkCraft(ItemStack result, CraftingInventory inv, HashMap<Integer, ItemStack> ingredients){
        ItemStack[] matrix = inv.getMatrix();
        for(int n = 0; n < 9; n++){
            if(ingredients.containsKey(n)){
                if(matrix[n] == null
                     || !matrix[n].getItemMeta().getDisplayName().equals(ingredients.get(n).getItemMeta().getDisplayName())
                     || !matrix[n].getItemMeta().getLore().equals(ingredients.get(n).getItemMeta().getLore())){
                    return;
                }
            } else {
                if(matrix[n] != null){
                    return;
                }
            }
        }
        inv.setResult(result);
    }
}

примечание Моя единственная проблема заключается в этом коде:

    i = 0;
    while (i < 9) {
        checkCraft(CoustomItems.changeAmount(CoustomItems.rareEmeraldTier2(), 9), e.getInventory(), new HashMap<Integer, ItemStack>(){{
            put(i, CoustomItems.rareEmeraldTier3());
            i++;
        }});
    }

, и это может быть бесформенный рецепт, чтобы сделатьблок вставляется в любой из 9 слотов, чтобы можно было конвертировать в 9 из раннего уровня Tier Emerald.Я могу добавить пользовательский класс элементов, но он содержит только методы для создания пользовательских ItemStacks и для изменения количества, которое содержит ItemStack.если вы не понимаете мои примеры, я предоставил 1 изображение и 1 gif, показывающие проблему из первых рук: Изображение https://gyazo.com/83bc55ac2efaccb1fbc524e90cc88887

Gif https://gyazo.com/517bf73805e40dbe0acf75bc0927d6c6

...