Помогите Крафт через GUI

Lisenochek

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Lisenochek
Всем привет. Целый день пытаюсь сделать свой крафт через GUI, так как крафт через матрицу (дефолтный крафт) работает криво, не особо хочется париться с проверкой названий предметов. Я сделал саму GUI, проверяю его в ивенте, но вот как реализовать крафт? Я пытался проверять через for, но ничего не получилось, затем пробовал через contains, удалял предметы, но вот он удалял уже все предметы, которые были в моем инве, помогите мне, как все же сделать?
 
Всем привет. Целый день пытаюсь сделать свой крафт через GUI, так как крафт через матрицу (дефолтный крафт) работает криво, не особо хочется париться с проверкой названий предметов. Я сделал саму GUI, проверяю его в ивенте, но вот как реализовать крафт? Я пытался проверять через for, но ничего не получилось, затем пробовал через contains, удалял предметы, но вот он удалял уже все предметы, которые были в моем инве, помогите мне, как все же сделать?
getTopViewInventory
 
Неа, не понял.

Вызывается GUI, нажимаешь внутри инва на иконку, и если количество и айтемстак есть в инве игрока, то они списываются и добавляется результат.
 
А вот забирать предмет придется модифицированным методом removeItem со своими проверками, имени, лоре и тп.
 
Последнее редактирование:
Код по удалению вещи из инентаря
Java:
/**
    * Удалит из инвентаря игрока нужное кол-во указанных вещей и вернет true если вещей хватило
    * Если вещей недостаточно то вернет false  удаление не будет произведено
    * @param p Игрок
    * @param amm Кол-во
    * @param item Вещь
    * @return
    */
    public static boolean sellItem(Player p, int amm, ItemStack item) {
        int totalamm = 0; //общее количество вещей в инвентаре
        for (int a = 0; a<p.getInventory().getSize(); a++) { //считаем эти вещи
            if (p.getInventory().getItem(a)!=null){
                /*весь ItemStack можно описать тремя параметрами. item.getData, item.getItemMeta и item.getAmmaount.
                *При item.equas(item2)ammount тоже сравнивается, поэтому видим такое сравнение
                */
                if (p.getInventory().getItem(a).getData().equals(item.getData())
                        &&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())){
                    totalamm += p.getInventory().getItem(a).getAmount();
                }
            }
        }
       if (totalamm==0) {
          return false;
        }
        if (totalamm<amm) {
            return false;
        }
        int ammountleft =amm; //эта переменная не очень нужна, но мне с ней удобнее
        for (int a = 0; a<p.getInventory().getSize(); a++) {
            if (ammountleft==0){return true;}
            if (p.getInventory().getItem(a)==null) continue;
            if (p.getInventory().getItem(a).getData().equals(item.getData())&&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())) {
                if (p.getInventory().getItem(a).getAmount()<ammountleft) {
                    ammountleft-=p.getInventory().getItem(a).getAmount();
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                }
                if (p.getInventory().getItem(a)!=null&&p.getInventory().getItem(a).getAmount()==ammountleft) {
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                    return true;
                }
             
                if (p.getInventory().getItem(a).getAmount()>ammountleft&&p.getInventory().getItem(a)!=null) {
                    p.getInventory().getItem(a).setAmount(p.getInventory().getItem(a).getAmount()-ammountleft);
                    return true;
                }
            }
        }
        return false;
    }
Работа с инвентарем. в данном случае получение количества свободного места для Item'a
Java:
public static int getFreeSpaceForItem(Player p, ItemStack item) {
        int freespace = 0;
        final Inventory inv = p.getInventory();
        for (int i = 0; i<inv.getSize()-5; i++){
            if (inv.getItem(i)==null) {freespace+=item.getMaxStackSize(); continue;}
            if (inv.getItem(i).getType()==Material.AIR) {freespace+= item.getMaxStackSize(); continue;}
            if (inv.getItem(i).getData().equals(item.getData())){
                if (inv.getItem(i).getItemMeta().equals(item.getItemMeta())) freespace+= inv.getItem(i).getMaxStackSize()-inv.getItem(i).getAmount();
            }
           
        }
        return freespace;
    }
 
Код по удалению вещи из инентаря
Java:
/**
    * Удалит из инвентаря игрока нужное кол-во указанных вещей и вернет true если вещей хватило
    * Если вещей недостаточно то вернет false  удаление не будет произведено
    * @param p Игрок
    * @param amm Кол-во
    * @param item Вещь
    * @return
    */
    public static boolean sellItem(Player p, int amm, ItemStack item) {
        int totalamm = 0; //общее количество вещей в инвентаре
        for (int a = 0; a<p.getInventory().getSize(); a++) { //считаем эти вещи
            if (p.getInventory().getItem(a)!=null){
                /*весь ItemStack можно описать тремя параметрами. item.getData, item.getItemMeta и item.getAmmaount.
                *При item.equas(item2)ammount тоже сравнивается, поэтому видим такое сравнение
                */
                if (p.getInventory().getItem(a).getData().equals(item.getData())
                        &&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())){
                    totalamm += p.getInventory().getItem(a).getAmount();
                }
            }
        }
       if (totalamm==0) {
          return false;
        }
        if (totalamm<amm) {
            return false;
        }
        int ammountleft =amm; //эта переменная не очень нужна, но мне с ней удобнее
        for (int a = 0; a<p.getInventory().getSize(); a++) {
            if (ammountleft==0){return true;}
            if (p.getInventory().getItem(a)==null) continue;
            if (p.getInventory().getItem(a).getData().equals(item.getData())&&p.getInventory().getItem(a).getItemMeta().equals(item.getItemMeta())) {
                if (p.getInventory().getItem(a).getAmount()<ammountleft) {
                    ammountleft-=p.getInventory().getItem(a).getAmount();
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                }
                if (p.getInventory().getItem(a)!=null&&p.getInventory().getItem(a).getAmount()==ammountleft) {
                    p.getInventory().setItem(a, new ItemStack(Material.AIR));
                    return true;
                }
        
                if (p.getInventory().getItem(a).getAmount()>ammountleft&&p.getInventory().getItem(a)!=null) {
                    p.getInventory().getItem(a).setAmount(p.getInventory().getItem(a).getAmount()-ammountleft);
                    return true;
                }
            }
        }
        return false;
    }
Работа с инвентарем. в данном случае получение количества свободного места для Item'a
Java:
public static int getFreeSpaceForItem(Player p, ItemStack item) {
        int freespace = 0;
        final Inventory inv = p.getInventory();
        for (int i = 0; i<inv.getSize()-5; i++){
            if (inv.getItem(i)==null) {freespace+=item.getMaxStackSize(); continue;}
            if (inv.getItem(i).getType()==Material.AIR) {freespace+= item.getMaxStackSize(); continue;}
            if (inv.getItem(i).getData().equals(item.getData())){
                if (inv.getItem(i).getItemMeta().equals(item.getItemMeta())) freespace+= inv.getItem(i).getMaxStackSize()-inv.getItem(i).getAmount();
            }
      
        }
        return freespace;
    }
Как то запутано.

Java:
    boolean removeitem(Player p, ItemStack stack, int count) {
        int curent = 0;
        PlayerInventory items = p.getInventory();
        for(int a = 0; a<items.getSize(); a++) {
            ItemStack clot = items.getItem(a);
            if(clot !=null && clot.getData().equals(stack.getData()) &&
                clot.getItemMeta().equals(stack.getItemMeta())
            ) {
                curent +=clot.getAmount();
            }
        }
        if(curent>=count) {
            for(int a = 0; a<items.getSize(); a++) {
                ItemStack clot = items.getItem(a);
                if(clot !=null && clot.getData().equals(stack.getData()) &&
                    clot.getItemMeta().equals(stack.getItemMeta())
                ) {
                    if(count>=clot.getAmount()) {
                        count=count-clot.getAmount();
                        items.setItem(a, new ItemStack(Material.AIR));
                        if(count==0) return true;
                    } else {
                        clot.setAmount(clot.getAmount()-count);
                        return true;
                    }
                }
            }
        }
        return false;
    }
 
Как то запутано.

Java:
    boolean removeitem(Player p, ItemStack stack, int count) {
        int curent = 0;
        PlayerInventory items = p.getInventory();
        for(int a = 0; a<items.getSize(); a++) {
            ItemStack clot = items.getItem(a);
            if(clot !=null && clot.getData().equals(stack.getData()) &&
                clot.getItemMeta().equals(stack.getItemMeta())
            ) {
                curent +=clot.getAmount();
            }
        }
        if(curent>=count) {
            for(int a = 0; a<items.getSize(); a++) {
                ItemStack clot = items.getItem(a);
                if(clot !=null && clot.getData().equals(stack.getData()) &&
                    clot.getItemMeta().equals(stack.getItemMeta())
                ) {
                    if(count>=clot.getAmount()) {
                        count=count-clot.getAmount();
                        items.setItem(a, new ItemStack(Material.AIR));
                        if(count==0) return true;
                    } else {
                        clot.setAmount(clot.getAmount()-count);
                        return true;
                    }
                }
            }
        }
        return false;
    }
я написал этот код когда я только только начал кодить. сейчас он гораздо проще, но разбит по методам, и не подходит под конкретный случай
 
Назад
Верх