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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lisenochek, 10 фев 2017.

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

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

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

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

    Баллы:
    96
    getTopViewInventory
     
  3. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Неа, не понял.

    Вызывается GUI, нажимаешь внутри инва на иконку, и если количество и айтемстак есть в инве игрока, то они списываются и добавляется результат.
     
  4. alexandrage

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

    Баллы:
    173
    Юзай цикл.
     
  5. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Я все перепробовал, говорю же, толку никакого...
     
  6. alexandrage

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

    Баллы:
    173
    А вот забирать предмет придется модифицированным методом removeItem со своими проверками, имени, лоре и тп.
     
    Последнее редактирование: 10 фев 2017
  7. Blc_Dragon

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

    Баллы:
    76
    Код по удалению вещи из инентаря
    Код:
    /**
        * Удалит из инвентаря игрока нужное кол-во указанных вещей и вернет 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
    Код:
    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;
        }
    
     
  8. alexandrage

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

    Баллы:
    173
    Как то запутано.

    Код:
        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;
        }
     
  9. Blc_Dragon

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

    Баллы:
    76
    я написал этот код когда я только только начал кодить. сейчас он гораздо проще, но разбит по методам, и не подходит под конкретный случай
     

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