В этом гайде ты сделаешь рубиновое яблоко: перекус, который хорошо заполняет шкалу голода, его можно съесть даже на полный желудок, и он ненадолго даёт скорость. Ты узнаешь, как работают голод и насыщение и сколько длится поедание.
Этот гайд продолжает Твой первый предмет. Если ты ещё не делал предмет, начни оттуда: шаги с иконкой, текстурой и названием точно такие же.
Быстрый способ: GodCraft
В GodCraft есть объект "Еда" с ползунками для всего, о чём пойдёт речь ниже, и скрипт эффекта приложение напишет само.
- Открой Мастерскую и добавь в аддон объект Еда.
- Нарисуй иконку в пиксельном редакторе.
- Задай очки голода, насыщение и нужные эффекты.
- Нажми Экспорт и съешь яблоко в игре.
Хочешь посмотреть, какие файлы получаются? Вот они.
Вручную
Мы используем пространство имён myname. Везде замени его на своё.
Шаг 1: предмет-еда
Создай этот файл в пакете поведения:
{
"format_version": "1.26.30",
"minecraft:item": {
"description": {
"identifier": "myname:ruby_apple",
"menu_category": {
"category": "items"
}
},
"components": {
"minecraft:icon": {
"textures": {
"default": "myname_ruby_apple"
}
},
"minecraft:display_name": {
"value": "item.myname:ruby_apple.name"
},
"minecraft:max_stack_size": 16,
"minecraft:food": {
"nutrition": 6,
"saturation_modifier": 0.8,
"can_always_eat": true
},
"minecraft:use_modifiers": {
"use_duration": 1.6,
"movement_modifier": 0.35
},
"minecraft:use_animation": "eat",
"minecraft:tags": {
"tags": ["minecraft:is_food"]
}
}
}
}Новое здесь - последние четыре компонента. Разберём каждый.
Компонент еды
minecraft:food делает предмет съедобным.
nutrition- сколько очков голода он восстанавливает. Одна ножка на шкале голода - это 2 очка, так что6заполняет три ножки. Обычное яблоко даёт 4, стейк - 8.saturation_modifierуправляет скрытой "сытостью", которая не даёт шкале голода убывать. Игра добавляетnutrition x saturation_modifier x 2насыщения. Низкие значения (примерно от 0.1 до 0.3) ощущаются как перекус, 0.6 - обычная еда, а 0.8 и выше - сытный обед.can_always_eatпозволяет съесть еду даже при полной шкале голода. Для обычной еды не добавляй его (по умолчанию онfalse).
Есть ещё одно поле, которое может пригодиться: using_converts_to. Оно выдаёт игроку другой предмет после еды, как миску после супа:
"using_converts_to": "minecraft:bowl"Сколько длится поедание
Еде нужен minecraft:use_modifiers, иначе игрок не сможет удерживать кнопку использования, чтобы её съесть.
use_duration- время поедания в секундах. Ванильная еда съедается за 1.6 секунды. Сушёная ламинария - примерно вдвое быстрее.movement_modifierзамедляет игрока, пока он ест.0.35- ванильное значение, а1значит, что замедления нет совсем.
Анимация и теги
minecraft:use_animationсо значением"eat"показывает анимацию жевания и частицы крошек. Для зелья или смузи используй"drink".minecraft:tagsсminecraft:is_foodпомечает предмет как еду, так же как помечена ванильная еда.
Шаг 2: текстура и название
Здесь всё как в первом гайде. Добавь текстуру в свой item_texture.json (внутрь texture_data, рядом с остальными записями):
"myname_ruby_apple": {
"textures": "textures/items/ruby_apple"
}Сохрани PNG 16x16 в RP/textures/items/ruby_apple.png, а потом добавь название:
item.myname:ruby_apple.name=Ruby AppleТеперь введи /give @s myname:ruby_apple и откуси кусочек. Если нужно освежить память, загляни в /give.
Эффекты после еды
В старых аддонах эффекты еды задавались списком effects внутри minecraft:food. Этого поля больше нет в текущем формате предметов. Если добавить его в файл с современным format_version, игра его проигнорирует и покажет предупреждение в журнале контента.
Сейчас это делается через свой компонент: предмет указывает компонент, который ты придумал сам, а небольшой скрипт решает, что он делает. Звучит страшно, но это примерно 15 строк.
Шаг 1: добавляем компонент в предмет
Добавь это в components файла ruby_apple.json. Название выбираешь ты, а в объекте хранятся твои собственные настройки:
"myname:eat_effect": {
"effect": "speed",
"seconds": 10,
"amplifier": 1
}Шаг 2: пишем скрипт
Для этого в манифесте пакета поведения должен быть модуль скриптов. Как его добавить, рассказано в гайде Настройка проекта. Потом создай скрипт:
import { system } from "@minecraft/server";
system.beforeEvents.startup.subscribe(({ itemComponentRegistry }) => {
itemComponentRegistry.registerCustomComponent("myname:eat_effect", {
onConsume(event, { params }) {
event.source.addEffect(params.effect, params.seconds * 20, {
amplifier: params.amplifier,
});
},
});
});Как это работает:
- Когда мир запускается, скрипт сообщает игре, что означает
myname:eat_effect. onConsumeсрабатывает каждый раз, когда игрок доедает предмет с этим компонентом.params- это объект, который ты написал в файле предмета, поэтому один скрипт можно использовать для многих видов еды с разными эффектами.- Длительность эффектов в скриптах указывается в тиках, а в одной секунде 20 тиков. Поэтому
secondsумножается на 20. amplifier0 - это уровень I, 1 - уровень II и так далее.
Названия эффектов
Используй те же ID эффектов, что и в команде /effect, например speed, regeneration, night_vision, absorption или fire_resistance.
GodCraft делает всю эту часть за тебя: выбери эффекты в редакторе еды, и при экспорте приложение добавит компонент и скрипт.
Советы по балансу еды
- Ориентируйся на ваниль. Перекус - от 2 до 4 сытости, обед - от 6 до 8. Слишком большие числа делают всю остальную еду бесполезной.
- Эффекты должны чего-то стоить. Мощный эффект хорош на редкой еде, а не на той, что крафтится из земли. Привяжи её к сложному рецепту (смотри Рецепты крафта и печи).
- Используй
can_always_eatтолько для особой еды. В ванили так сделаны только вещи вроде золотых яблок, поэтому это ощущается как награда. - Размер стака важен. Маленькие стаки (16) не дают запасать сильную еду в больших количествах.
Если что-то не работает
| Что ты видишь | Скорее всего, причина |
|---|---|
| Съесть вообще не получается | Нет minecraft:use_modifiers или use_duration равен 0 |
| Съесть можно, но только когда голоден | Это нормально. Добавь can_always_eat, чтобы это изменить |
| После еды нет эффекта | Модуля скриптов нет в манифесте, или название компонента в предмете и в скрипте не совпадает |
Предупреждение про effects | Ты использовал старое поле: перейди на свой компонент, как описано выше |
Больше помощи в гайде Когда что-то сломалось. Дальше: Оружие и инструменты.