Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by Lisenochek, Feb 10, 2017.

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

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

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

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

    Trophy Points:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    getTopViewInventory
     
  4. Автор темы
    Lisenochek

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

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

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

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    Юзай цикл.
     
  6. Автор темы
    Lisenochek

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

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

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    А вот забирать предмет придется модифицированным методом removeItem со своими проверками, имени, лоре и тп.
     
    Last edited: Feb 10, 2017
  8. Blc_Dragon

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

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

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    Как то запутано.

    Code:
        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;
        }
     
  10. Blc_Dragon

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

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

Share This Page