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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем axmen20010, 23 июл 2015.

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

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

    Баллы:
    63
    Допустим у меня есть значение стринг, с форматом itemstack[], но как его преобразовать что бы "запихнуть" в GUI инвентаря?
     
  2. Хостинг MineCraft
    <
  3. leonmark061

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

    Баллы:
    76
    Парсить в ручную.
     
  4. mrshake

    mrshake Активный участник

    Баллы:
    61
    Имя в Minecraft:
    mrShake86
    Ну мне если бы мне это нужно было бы сделать один раз, или были одинаковые итемы, это одно, а у меня всегда разные значения и количество предметов
     
  5. leonmark061

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

    Баллы:
    76
    Тогда мне нужен пример строки из нескольких объектов ItemStack и я напишу пример класса-парсера.
     
  6. mrshake

    mrshake Активный участник

    Баллы:
    61
    Имя в Minecraft:
    mrShake86
    кода нет(т.к я не сейчас не дома), но я получаю список предметов в виде id-count:id-count, потом начинаю парсить его 2 раза, сначала что бы получить 1 предмет, а потом его ид и количество, и с этими данными могу делать что угодно, можно выдать их через цикл, но мне нужно именно все "загнать" в один ItemStack[].
     
  7. leonmark061

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

    Баллы:
    76
    Так в чем проблема?
    Считывайте строку, получаете количество получившихся объектов или разбивайте на подстроки items.split(":") и берите оттуда length.
    Создаете массив ItemStack[] items = new ItemStack[count];.
    Далее берите то, что разбивали(массив) и в цикле заполняйте массив items.

    Пример(я использовал List):
    Код:
        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;
        }
    Пример работы:
    Вывод:
    Код:
            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}
     
    Последнее редактирование: 24 июл 2015
  8. mrshake

    mrshake Активный участник

    Баллы:
    61
    Имя в Minecraft:
    mrShake86
    Спасибо огромное, именно то что нужно, я хотел сделать примерно так же. Но не получалось сделать так, что бы все правильно работало, завтра попробую и отпишусь. Еще раз спасибо!
     
  9. leonmark061

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

    Баллы:
    76
    Пожалуйста. ;)
     
  10. mrshake

    mrshake Активный участник

    Баллы:
    61
    Имя в Minecraft:
    mrShake86
    еще вопрос, если у меня на входе больше стака итемов, я их делил, можно ли как то аккуратно сюда добавить такую возможность что бы не велосипедить?
     
  11. leonmark061

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

    Баллы:
    76
    Полагаю, если давать игроку ItemStack с amount > 64 через inventory.addItem(ItemStack args...), то Bukkit автоматически добавит еще один ItemStack с amount равным item.getAmount() - 64 и так будет делать пока amount > 64. Если же вы хотите заполнять инвентарь через inventory.setContents(ItemStack[] array), то, скорее всего, придется дополнительные ItemStack добавлять самому.

    В цикле:
    Код:
            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 шт., придется добавлять условия.
     
    Последнее редактирование: 24 июл 2015
  12. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Если ItemStack в yaml, то проще юзать config.getItemStack("item.awesomeStick") .
     
  13. leonmark061

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

    Баллы:
    76
    Вот только ItemStack в String. Не по теме.
     
  14. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Пример его String'a то где?
    Вот с этого чот всполыхнуло.
     

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