Создание вашего первого предмета
На этой странице вы познакомитесь с некоторыми ключевыми концепциями, касающимися предметов, а также с тем, как их регистрировать, задавать текстуры, моделировать и давать названия.
Если вы не знали, то все в Майнкрафте хранится в реестрах, и предметы не стали исключением.
Подготовка класса вашего предмета
Для упрощения регистрирования предметов вы можете создать метод, который принимает строковый идентификатор, некоторые свойства предмета и фабрику для создания экземпляра 'Item'.
Этот метод будет создавать предмет с данным идентификатором и регистрировать его с помощью реестра предметов игры.
Вы можете поместить этот метод в класс под именем ModItems (или как вы его назовете).
Mojang уже сделали это со своими предметами! Загляните в класс Items для вдохновения.
java
public class ModItems {
public static <T extends Item> T register(String name, Function<Item.Properties, T> itemFactory, Item.Properties settings) {
// Create the item key.
ResourceKey<Item> itemKey = ResourceKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name));
// Create the item instance.
T item = itemFactory.apply(settings.setId(itemKey));
// Register the item.
Registry.register(BuiltInRegistries.ITEM, itemKey, item);
return item;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Обратите внимание как мы используем 'T' generic type, расширяющий 'Item'. Это позволяет нам использовать метод 'register' для регистрации любого предмета который является наследником 'Item'. Мы также используем 'Function' в качестве фабрики, которая позже позволит нам указать, как мы хотим создать наш предмет из настроек.
Регистрация предмета
Теперь вы можете зарегистрировать предмет, используя метод.
Метод регистрации принимает экземпляр класса 'Item.Properties' как параметр. Этот класс позволяет вам настраивать свойства предмета через различные методы.
TIP
Если вы хотите изменить максимальный размер стака вашего предмета, вы можете использовать метод stacksTo в классе Item.Properties.
Это не сработает, если вы пометили предмет как повреждаемый, потому что размер стака для повреждаемых предметов всегда равен 1, для предотвращения эксплойтов дублирования.
java
public static final Item SUSPICIOUS_SUBSTANCE = register("suspicious_substance", Item::new, new Item.Properties());1
'Item::new' сообщает функции регистрации о создании экземпляра 'Item', вызывая конструктор 'Item' ('new Item(...)'), принимающий Item.Properties в качестве параметра.
Однако, если вы сейчас попробуете запустить модифицированный клиент, вы увидите, что наш предмет не существует в игре! Это происходит, потому что вы не инициализировали класс статически.
Чтобы сделать это, вы можете добавить публичный статический метод 'initialize' вашему классу и вызывать его в mod's initializer вашего класса. На данный момент этот метод может оставаться пустым.
java
public static void initialize() {
}1
2
2
java
public class ExampleModItems implements ModInitializer {
@Override
public void onInitialize() {
ModItems.initialize();
}
}1
2
3
4
5
6
2
3
4
5
6
Вызов метода у класса статически инициализирует его, если он не был загружен ранее. Это означает, что вычисляются все поля static. Для этого и существует фиктивный метод initialize.
Добавление предмета во вкладку Творческого режима
INFO
Если вы хотите добавить предмет в пользовательскую вкладку творческого режима, посетите страницу 'Пользовательские вкладки Творческого режима' для получения дополнительной информации.
Для примера, мы добавим этот предмет во вкладку ингредиенты 'CreativeModeTab', вам необходимо использовать события вкладок Творческого режима Fabric API, а именно CreativeModeTabEvents.modifyOutputEvent.
Это может быть сделано в методе 'initialize' класса ваших предметов.
java
// Get the event for modifying entries in the ingredients group.
// And register an event handler that adds our suspicious item to the ingredients group.
CreativeModeTabEvents.modifyOutputEvent(CreativeModeTabs.INGREDIENTS)
.register((creativeTab) -> creativeTab.accept(ModItems.SUSPICIOUS_SUBSTANCE));1
2
3
4
2
3
4
Запустив игру, вы можете увидеть, что наш предмет зарегистрирован и находится во вкладке "ингредиенты".

Однако, не хватает следующего:
- Модели предмета
- Текстуры
- Перевода (названия)
Наименование предмета
Сейчас у предмета нет перевода, поэтому вам необходимо его добавить. Ключ перевода уже был предоставлен Minecraft: item.example-mod.suspicious_substance.
Создайте новый JSON-файл по пути: src/main/resources/assets/example-mod/lang/en_us.json и поместите ключ перевода и его значение.
json
{
"item.example-mod.suspicious_substance": "Suspicious Substance"
}1
2
3
2
3
Вы можете перезапустить игру, либо собрать мод и нажать F3+T, чтобы подтвердить изменения.
Добавление клиентского предмета, текстуры и модели
Чтобы ваш предмет выглядел правильно, необходимы:
Добавление текстуры
INFO
Дополнительную информацию по этой теме см. на странице Модели предметов.
Чтобы задать вашему предмету текстуру и модель, просто создайте изображение текстуры с расширением 16х16 для вашего предмета и сохраните в папке assets/example-mod/textures/item. Назовите файл текстуры так же, как идентификатор предмета, но с расширением .png.
Для примера, вы можете использовать эту текстуру для suspicious_substance.png
<0>Текстура</0>
Добавление модели
При перезапуске/перезагрузке игры вы должны увидеть, что у предмета по-прежнему нет текстуры, это потому, что вам нужно добавить модель, использующую эту текстуру.
Вы создадите простую модель item/generated, которой нужна только входная текстура.
Создайте JSON модель в папке assets/example-mod/models/item, с тем же именем, что и у предмета: suspicious_substance.json
json
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "example-mod:item/suspicious_substance"
}
}1
2
3
4
5
6
2
3
4
5
6
Разбор JSON модели
parent: Это родительская модель, от которой будет унаследована данная модель. В данном случае это модельitem/generated.textures: Здесь вы определяете текстуры для модели. Ключlayer0— это текстура, которую будет использовать модель.
Большинство элементов будут использовать модель item/generated в качестве родительской, поскольку это простая модель, которая просто отображает текстуру.
Существуют и другие варианты, например item/handheld, который используется для предметов, «удерживаемых» в руке игрока, — таких, как инструменты.
Создание клиентского предмета
Minecraft автоматические не узнает, где можно найти файлы модели вашего предмета, нам необходимо предоставить клиентский предмет.
Создайте JSON клиентского предмета по пути assets/example-mod/items так же, как идентификатор предмета: suspicious_substance.json.
json
{
"model": {
"type": "minecraft:model",
"model": "example-mod:item/suspicious_substance"
}
}1
2
3
4
5
6
2
3
4
5
6
Разбор JSON клиентского предмета
model: это свойство, содержащее ссылку на нашу модель.type: это тип нашей модели. Для большинства предметов это должно бытьminecraft:modelmodel: это идентификатор модели. Он должен иметь та
Теперь ваш предмет в игре должен выглядеть так:

Сделать предмет компостируемым или топливом
Fabric API предоставляет различные реестры, которые можно использовать для добавления дополнительных свойств вашему предмету.
Например, если вы хотите сделать свой предмет компостируемым, то вы можете использовать CompostableRegistry:
java
// Add the suspicious substance to the composting registry with a 30% chance of increasing the composter's level.
CompostableRegistry.INSTANCE.add(ModItems.SUSPICIOUS_SUBSTANCE, 0.3f);1
2
2
Также если вы хотите сделать ваш предмет топливом, вы можете использовать класс FuelRegistry:
java
// Add the suspicious substance to the registry of fuels, with a burn time of 30 seconds.
// Remember, Minecraft deals with logical based-time using ticks.
// 20 ticks = 1 second.
FuelValueEvents.BUILD.register((builder, context) -> {
builder.add(ModItems.SUSPICIOUS_SUBSTANCE, 30 * 20);
});1
2
3
4
5
6
2
3
4
5
6
Добавление рецепта создания
Если вы хотите добавить рецепт создания вашего предмета, вам понадобиться разместить JSON-файл рецепта в папку data/example-mod/recipe.
Чтобы узнать больше о формате рецептов, ознакомьтесь со следующими ресурсами:
Пользовательские подсказки
Если вы хотите добавить пользовательскую подсказку вашему предмету, вам необходимо создать класс, расширяющий класс 'Item' и переопределить метод appendHoverText. Обратите внимание, что этот метод является устаревшим, поскольку Mojang стремится к тому, чтобы поведение предметов обрабатывалось полностью через компоненты, а не через сами предметы. Дополнительные сведения см. в разделе Пользовательские компоненты данных.
INFO
В данном примере используется класс 'LightningStick', созданный на странице Взаимодействия пользовательских элементов.
java
@Override
public void appendHoverText(ItemStack stack, TooltipContext context, TooltipDisplay displayComponent, Consumer<Component> textConsumer, TooltipFlag type) {
textConsumer.accept(Component.translatable("itemTooltip.example-mod.lightning_stick").withStyle(ChatFormatting.GOLD));
}1
2
3
4
2
3
4
Каждый вызов accept() добавляет одну строку в подсказку.




