получить список всех ID и рецептов

127
0
Доброе утро,

Подскажите как можно получить список всех ID предметов и рецептов из игры(включая установленные моды)?
 

timaxa007

Модератор
5,831
409
672
Для какой версии?
До 1.7 в классах: Block и Item есть массив - BlockblocksList ItemitemsList, проверяешь эти списки на "!= null". Примечание itemsList, есть ItemBlock'и.
После 1.7... Вот тут я не знаю как сделать проще.
Набросал:
Код:
for (int i = 1; i < 32767; i++) {

    Item item = Item.getItemById(i);
    Block block = Block.getBlockFromItem(item);

    ArrayList<Block> block_list = new ArrayList<Block>();
    ArrayList<Item> item_list = new ArrayList<Item>();

    if (item != null)
        if (block != Blocks.air)
            block_list.add(block);
        else
            item_list.add(item);
}
О его работа способности, точно не знаю.
 
127
0
Версия 1.6.4
[merge_posts_bbcode]Добавлено: 31.07.2015 12:25:59[/merge_posts_bbcode]

Спасибо за код, но все id он не получит, есть же еще подтипы. Попробую щас.
 

timaxa007

Модератор
5,831
409
672
Что ты имеешь виду под "есть же еще подтипы"?
 
127
0
Ну например 4033:27
[merge_posts_bbcode]Добавлено: 31.07.2015 12:46:12[/merge_posts_bbcode]

Еще вопрос, считывание всех id в каком методе мода делать? (к тому моменту должны все остальные моды загрузиться же ведь?) Событие FMLLoadCompleteEvent подойдет?
 

timaxa007

Модератор
5,831
409
672
Да, подобное трудно будет сделать. Можно проверить предмет является он повреждаемым (в 1.7.: is.isItemStackDamageable()). А если у тебя ещё в под типы включены, такие как: энергия в батарейки из IC2, скрытые индикаторы повреждения, т.е. использование NBT тегов, то тут я явно не знаю как это сделать.
Думаю можно попробовать брать из списка креативной вкладки (где есть поиск), если конечно тебе это подходит.
А так не думаю, что это будет просто.
---
В Init'е или PostInit'е можно попробовать (зависть для чего тебе это надо).
---
На счёт рецептов... "CraftingManager.getInstance().getRecipeList()"
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Список предметов брать в PostInit, потому что обычно все предметы регаются в ините.
А в 1.7 получить все предметы можно намного легче:
Код:
List<Block> blockList = Lists.newArrayList(Block.blockRegistry.iterator()); //Блоки

List<Item> itemList = Lists.newArrayList(Item.itemRegistry.iterator()); //Предметы
Для 1.6:
Код:
Item[] items = Iterators.toArray(Iterators.filter(Iterators.forArray(Item.itemList), Predicates.notNull()), Item.class); //Предметы

Block[] blocks = Iterators.toArray(Iterators.filter(Iterators.forArray(Block.blockList), Predicates.notNull()), Block.class); //Блоки
P.S Guava рулит!
 
Сверху