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

Помогите String to ItemStack[]

axmen20010

Активный участник
Пользователь
Баллы
63
Допустим у меня есть значение стринг, с форматом itemstack[], но как его преобразовать что бы "запихнуть" в GUI инвентаря?
 
Тогда мне нужен пример строки из нескольких объектов ItemStack и я напишу пример класса-парсера.
 
Тогда мне нужен пример строки из нескольких объектов ItemStack и я напишу пример класса-парсера.
кода нет(т.к я не сейчас не дома), но я получаю список предметов в виде id-count:id-count, потом начинаю парсить его 2 раза, сначала что бы получить 1 предмет, а потом его ид и количество, и с этими данными могу делать что угодно, можно выдать их через цикл, но мне нужно именно все "загнать" в один ItemStack[].
 
Так в чем проблема?
Считывайте строку, получаете количество получившихся объектов или разбивайте на подстроки items.split(":") и берите оттуда length.
Создаете массив ItemStack[] items = new ItemStack[count];.
Далее берите то, что разбивали(массив) и в цикле заполняйте массив items.

Пример(я использовал List):
Java:
    public ItemStack[] getFromString(String s)
    {
        String[] dataArray = s.split(":");
   
        List<ItemStack> items = new ArrayList<ItemStack>();
   
        for(String i : dataArray)
        {
            String[] data = i.split("-");
       
            int id = Integer.parseInt(data[0]);
            int count = Integer.parseInt(data[1]);
       
            ItemStack item = new ItemStack(id);
            item.setAmount(count);
       
            items.add(item);
        }
   
        ItemStack[] array = new ItemStack[dataArray.length];
   
        items.toArray(array);
   
        return array;
    }

Пример работы:
Вывод:
Java:
        for(ItemStack item : array)//ItemStack[] array = getFromString("1-64:2-64:4-32")
        {
            getLogger().info(item.toString());
        }
Вход: "1-64:2-64:4-32";
Выход:
ItemStack{STONE x 64}
ItemStack{GRASS x 64}
ItemStack{COBBLESTONE x 32}
 
Последнее редактирование:
Так в чем проблема?
Считывайте строку, получаете количество получившихся объектов или разбивайте на подстроки items.split(":") и берите оттуда length.
Создаете массив ItemStack[] items = new ItemStack[count];.
Далее берите то, что разбивали(массив) и в цикле заполняйте массив items.

Пример(я использовал List):
Java:
    public ItemStack[] getFromString(String s)
    {  
        String[] dataArray = s.split(":");
      
        List<ItemStack> items = new ArrayList<ItemStack>();
      
        for(String i : dataArray)
        {
            String[] data = i.split("-");
          
            int id = Integer.parseInt(data[0]);
            int count = Integer.parseInt(data[1]);
          
            ItemStack item = new ItemStack(id);
            item.setAmount(count);
          
            items.add(item);
        }
      
        ItemStack[] array = new ItemStack[dataArray.length];
      
        items.toArray(array);
      
        return array;
    }
Спасибо огромное, именно то что нужно, я хотел сделать примерно так же. Но не получалось сделать так, что бы все правильно работало, завтра попробую и отпишусь. Еще раз спасибо!
 
Полагаю, если давать игроку ItemStack с amount > 64 через inventory.addItem(ItemStack args...), то Bukkit автоматически добавит еще один ItemStack с amount равным item.getAmount() - 64 и так будет делать пока amount > 64. Если же вы хотите заполнять инвентарь через inventory.setContents(ItemStack[] array), то, скорее всего, придется дополнительные ItemStack добавлять самому.

В цикле:
Java:
        for(String i : arrayData)
        {
            String[] data = i.split("-");

            int id = Integer.parseInt(data[0]);
            int count = Integer.parseInt(data[1]);

            while(count > 64)
            {
                count -= 64;

                ItemStack item = new ItemStack(id);
                item.setAmount(64);

                items.add(item);
            }

            ItemStack item = new ItemStack(id);
            item.setAmount(count);

            items.add(item);
        }
И тогда:
Вход: "1-128:2-64";
Выход:
ItemStack{STONE x 64}//////////////////
ItemStack{STONE x 64}//два стака камня
ItemStack{GRASS x 64}

Кстати, для уникальных ID с размером стака в 16 и в 1 шт., придется добавлять условия.
 
Последнее редактирование:
Если ItemStack в yaml, то проще юзать config.getItemStack("item.awesomeStick") .
 

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

Назад
Верх