ItemStack всех блоков и предметов в игре

Версия Minecraft
1.7.10
124
1
0
Здравствуйте. Пытаюсь поменять крафты блоков и предметов самой игры, а также других модов без редактирования исходников. решение найдено - после завершения загрузки игры получать itemstack каждого блока или предмета и если надо менять его крафт. При написании всего этого выявилась единственная проблема - у некоторых блоков есть подвиды (например шерсть или цветная глина), а получить их я смог только на клиенте через item.getSubItems (на сервере этого метода нет). Как мне получить подвиды на сервере?
 
7,099
324
1,510
Попробуй поработать с OreDictionary
 
124
1
0
hohserg написал(а):
Попробуй поработать с OreDictionary

Нет, там только малая часть блоков


Мне нужны нелокализованные имена абсолютно всех блоков и предметов в игре (на клиента как я говорил через getSubItems это работает, а на сервере этого метода нет, но как-то надо выполнить эту задачу)
 
7,099
324
1,510
Ты не понял: когда крафт меняешь - используй для сравнения стаков OreDictionary(если свой IRecipe создаешь)


Тогда, скажем, медь из разных модов будет поддерживаться рецептом
 
124
1
0
hohserg написал(а):
Ты не понял: когда крафт меняешь - используй для сравнения стаков OreDictionary(если свой IRecipe создаешь)


ты тоже не понял: я меняю крафты по такому принципу:
получаю из класса Item Iterator, через него получаю все блоки и предметы
Получаю ItemStack из каждого блока или предмета
Получаю подвиды и по нелокализованному имени проверяю, нужно ли менять крафт этого блока или предмета (через конфиг).
если надо менять - по аналогичному методу через нелокализованные имена получаем все необходимые для крафта ItemStack'и и меняю рецепт. Так сложно из-за того, что мне надо менять крафты модов не залезая в исходники
 
124
1
0
Agravaine написал(а):
Проверь у Item hasSubTypes(), если тру - значит есть подтипы. Потом сделай цикл от нуля до getMaxDamage(), так пробежишься по всем подтипами предмета.

А как в этом цикле получить ItemStack этого подтипа?
 
2,505
81
397
mnsbabydoll написал(а):
Мне нужны нелокализованные имена абсолютно всех блоков и предметов в игре
Код:
// Список всех итемов
List<Item> items = Lists.newArrayList(Item.itemRegistry.iterator());

Iterable<Item> iterable = () -> Item.itemRegistry.iterator();

// Список всех имен (если не создавать список итемов)
List<String> names = StreamSupport.stream(iterable.spliterator(), false)
    .map(item -> item.delegate.name())
    .collect(Collectors.toList());

// Или можешь не делать список вообще, а сразу выполять полезную работу
StreamSupport.stream(iterable.spliterator(), false)
    .map(item -> item.delegate.name())
    .forEach(name -> {
        // some job
    });
 
124
1
0
Всем, кто помогал Огромное Спасибо!!! Собрав все идеи получилось так, как должно быть. Вот результат:
Код:
Iterator it = GameData.getItemRegistry().iterator();
        while (it.hasNext()) {
         Item item = (Item)it.next();
            if (item == null) continue;
            if (item.getHasSubtypes()) {
             int i = 0;
             ArrayList<String> namesTemp = new ArrayList<String>();
             while (true) {
             if (namesTemp.contains(new ItemStack(item, 1, i).getUnlocalizedName())) break;
             
             AWMain.items.add(new ItemStack(item, 1, i));
             namesTemp.add(new ItemStack(item, 1, i).getUnlocalizedName());
             i++;
             }
            } else {
             AWMain.items.add(new ItemStack(item, 1, 0));
            }
        }



(почему сделал while, а не for? метод getMaxDamage выдавал всегда 0)
 
Сверху