Подтипы#
Основа#
Каждый предмет может иметь в себе метадату ограничивающуюся лишь размером Short(32768). Для того, чтобы добавить подтип предмету нужно добавить в конструктор setHasSubtypes и выставить значение на true. Пример: setHasSubtypes(true). Данная функция будет говорить Minecraft, что наш предмет имеет подтипы.
Добавим в класс с нашим предметом метод getSubItems:
@Override
public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
}
Для создания предметов с подтипами рекомендуется использовать перечисляемые типы(Enum). Пример такого класса:
public enum AppleTypes {
ANTONOVKA, PAPIROVKA, WHITEFILLING;
// Получение вида яблока по индексу
public static AppleTypes getByMeta(int index) {
return values()[index % values().length];
}
}
Теперь вернёмся к нашему методу getSubItems. Добавим в него такой код:
if (tab == Tutorial.CTAB) {
for (AppleTypes type : AppleTypes.values()) {
items.add(new ItemStack(this, 1, type.ordinal()));
}
}
Tutorial.CTAB - это ранее созданная нами вкладка. Далее мы с помощью цикла проходимся по всем типам нашего предмета, затем добавляем в список новый ItemStack с указанием метадаты.
- this - это наш текущий предмет
- 1 - это число предметов которое содержится в стаке. Если вы хотите, чтобы один из ваших типов выдавался в количестве 5-10-15 шт., то вместо 1 укажите любое другое количество.
- type.ordinal - это метадата нашего подтипа, т.е. если мы хотим в творческой вкладке видеть стаки с метой: 20-40-50, то соответственно, вместо type.ordinal нам нужно указать 20, 40, 50 и т.п.
!!!Внимание! Устаревший часть статьи!
Регистрация такого предмета проходит, как обычно, а вот добавление иконки/модели уже через событие ModelRegistryEvent. Создадим обработчик события ModelRegistryEvent в любом удобном месте (не забудьте зарегистрировать его!). Теперь добавим такой код в данный метод:
final Item APPLE = ItemsRegister.APPLE;
for (AppleTypes type : AppleTypes.values()) {
ModelLoader.setCustomModelResourceLocation(APPLE, type.ordinal(), new ModelResourceLocation(APPLE.registryName() + "_" + type.name.toLowerCase(), "inventory"));
}
register из getItemModelMesher(ранее был использован при создании предмета). Данный способ устарел и к тому же, уже больше не работает для предметов с метадатой. Поэтому регистрация рендеров с метой нужно проводить через событие ModelRegistryEvent!
Мы создали переменную APPLE в классе ItemsRegister и теперь получаем наш предмет в данном методе. Через ModelLoader мы устанавливаем путь до модели предмета. Через type.name.toLowerCase() мы получаем имя нашего типа и преобразовываем его в нижней регистр, вы можете этого не делать, если вы напишите перечисляемые типы не в верхнем регистре. Так же видно, что мы поставили нижнее подчёркивание между зарегистрированным именем предмета и именем типа, это нужно чтобы мы могли понимать, что данный тип принадлежит к конкретному предмету, и чтобы не создавать путаницы. Вид моделей нашего предмета должен быть таким: apple_antonovka.json. (на каждую модель, свой тип!)
Контейнер#
TODO