Универсальный ингредиент

1,976
68
220
И снова Здравствуйте
Подскажите, пожалуйста, как получить массив со всеми предметами из всех установленных модов, чтобы потом циклом зарегестрировать свой предмет в OreDictionary для замены им любого ингредиента. Ну или любой другой способ сделать универсальный ингредиент для любого рецепта :D
 

timaxa007

Модератор
5,831
409
672
Здорово.
Возможно тебе понадобиться типа этого:
Код:
Iterator iterator = GameData.getItemRegistry().iterator();
while(iterator.hasNext()) {
    Item item = (Item)iterator.next();
    if (item != null && !(item instanceof ItemBlock)) {//Не равно null, и чтобы не было родителя ItemBlock
        if (!item.toString().contains("net.minecraft.item"))//Исключаем предметы из ванилы
            System.out.println(item.toString());//Проверить можешь по своему, но я сделал так
    }
}
Но другого способа я не знаю.
Конечно не до конца понимаю зачем тебе массив предметов, но может пойму потом.
 
1,976
68
220
Массив нужен всего, что может быть в рецептах крафта - алмазы, доски, провода, кристаллы, всё и отовсюду.
А потом через цикл я свой предмет добавлю в OreDictionary к каждому элементу массива. 
Это для того, чтобы, например, если у игрока нет возможности получить Primodial Pearl из таума или нет звезды ада для маяка, он мог поставить мой предмет и имел возможность скрафтить что ему надо.
[merge_posts_bbcode]Добавлено: 21.03.2016 15:20:16[/merge_posts_bbcode]

P.S. массив не обязателен, просто мне показалось, что так будет удобнее
 
52
0
Сразу могу тебя предупредить о баге, который может произойти, проходя по массиву предметов в методе, аля preInit.
Прикол в том, что другой мод может регистрировать новые предметы в postInit'е. В таком случае они будут зарегистрированы уже после того, как ты пройдешь циклом по "всем" предметам.

Один из выходов - В ивентХандлере ловить ивент WorldLoadEvent и выполнять все там. Создай булеан, дабы выполнять это все только один раз.

И да, не вижу смысла юзать для этого итератор. Ты ведь не собираешься предметы удалять :/
 
1,976
68
220
Nichie написал(а):
Так-то это Баккит - org.bukkit.event.world.WorldLoadEvent ._.
[merge_posts_bbcode]Добавлено: 30.04.2016 17:45:03[/merge_posts_bbcode]

И ещё одна проблема - OreDictionary требует названия предметов, что значит невозможность регистрации предмета, не поддерживающего OreDictionary...
Есть-ли какие-то другие способы замены ингредиентов?
 
7,099
324
1,510
регистрация новых рецептов:lol:
 
808
3
124
Регистрировать по несколько новых рецептов на каждый существующий рецепт только ради такой фичи - довольно странно выглядящая затея. Намного логичнее будет заимплементить IRecipe, и в нем пробегаться по листу рецептов (CraftingManager.getInstance().getRecipes()), искать там ShapedRecipes и ShapelessRecipes и проверять, подходит ли содержимое верстака под рецепт.
 
2,955
12
У форджа для загрузки мира есть событие WorldEvent.Load, аналогично и событие разгрузки.
 
1,976
68
220
Dragon2488 написал(а):
Эвент-эвентом, это не такая проблема. Но спасибо

GloomyFolken написал(а):
заимплементить IRecipe, и в нем пробегаться по листу рецептов (CraftingManager.getInstance().getRecipes()), искать там ShapedRecipes и ShapelessRecipes и проверять, подходит ли содержимое верстака под рецепт.
Подробнее можно? :D
 
808
3
124
О чем подробнее? Есть интерфейс IRecipe, в нем два ключевых метода - matches и getCraftingResult. Реализуешь этот интерфейс как тебе надо, добавляешь инстанс реализации в CraftingManager.getInstance().getRecipes(). Плохо понимаю, что здесь непонятного.
 
4,045
63
645
Слушай, а если ты из своих предметов будешь собирать, скажем, дверь, какая она в итоге получится? Берёзовая али дубовая... Ведь есть куча схожих по расположению рецептов. Как собираешься с этим бороться?
 
1,976
68
220
А никак. Что выйдет, то выйдет. Если кто-то захочет конкретики - есть мод No More Recipe Conflicts
Этот ингредиент предназначен для замены труднодоступных компонентов, особенно для серверов. Но если кто-то захочет крафтить только из него - его проблемы. Пусть выкладывает какой-то дополнительный компонент, позволяющий определить рецепт (берёзовые или дубовые доски, по твоему примеру)
 
Сверху