Да. В планах было делать блок, но во время написания новой статейки — я осознал проблему. Мы сделали предмет, который выглядит как сосиска (а я настаиваю, что это именно сосиска!), назван сосиской, а съесть его нельзя. И какая же это тогда сосиска?? Непростительное упущение!
Список уроков
Урок седьмой. Локализация
Итак. Если вы прошли все предыдущие уроки — у вас есть предмет. Возможно это не сосиска, возможно это даже не еда, но не у меня. Как сделать еду в новой версии? Если честно, я и сам удивился насколько легко. Раньше, еще во времена моей молодости, когда я только познавал Java и пытался писать моды — еду делали не так. Но все идет и все меняется, так что погнали.
После шестого урока, регистрация нашего предмета (в файле ModEventSubscriber) должна иметь приблизительно такой вид:
1 2 3 4 5 6 |
@SubscribeEvent public static void onRegisterItem(RegistryEvent.Register<Item> event) { event.getRegistry().registerAll( setup(new Item(new Item.Properties().group(MyModItemGroups.MOD_ITEM_GROUP)), "sausage") ); } |
Делаем предмет едой при помощи вызова функции food, где параметром служит объект класса Food, который и содержит все данные для еды. Примером возьмем яблоко. Дописываем сразу после .group(MyModItemGroups.MOD_ITEM_GROUP) такой код: .food(Foods.APPLE).
Просто ведь? Можете тестировать! Предмет теперь еда и восстанавливает голод прям как яблоко.
Более подробно о еде
Для большего понимания — смотрим код для яблока в файле Foods.java:
1 |
public static final Food APPLE = (new Food.Builder()).hunger(4).saturation(0.3F).build(); |
Кстати, полезная интересность. Если посмотреть на код Builder в файле Food.java, то можно увидеть наглядное применение паттерна ООП Строитель (Builder).
Разберем код. После создания Builder-a для класса Food идет вызов функции hunger, где параметр 4. С английского hunger это голод и означает, что еда восстановит игрока 2 кусочка мяса (так как 1 это половина кусочка). А так же saturation с 0.3F. Насколько я помню, этот параметр отвечает за насыщение, т.е. как скоро игрок снова захочет есть. После идет вызов команды build (настройка конструктора завершена, и теперь нужно создать объект).
Косо криво, но с яблоком все ясно, думаю…
Разберем другие возможные настройки. Вызов meat сделает вашу еду пригодной для волков. Команда fastToEat увеличит скорость поедания еды. А при помощи effect можно добавить различные эффекты (как для гнилого мяса или золотого яблока). Пример эффекта взятого с сырой курицы вот: .effect(new EffectInstance(Effects.HUNGER, 600, 0), 0.3F).
Эффекты разбирать не будем, но для личных экспериментов уточним пару моментов. HUNGER — имя эффекта, 600 время действия, а 0.3F — шанс получения, где 1F будет 100%, т.е. тут 30.
Ладно. Разобрали еду, пора и свою делать. Рядом с папкой init создадим папку items, а в ней класс MyFoods.
Для теста я создал вот такой вот интересный набор:
1 2 3 4 5 6 7 8 9 |
package mod.astler.tutorial_mod_gs.items; import net.minecraft.item.Food; import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Effects; public class MyFoods { public static Food SAUSAGE = (new Food.Builder()).hunger(5).saturation(0.5F).fastToEat().effect(new EffectInstance(Effects.GLOWING, 600, 0), 1F).meat().build(); } |
Указываем нашему предмету MyFood.SAUSAGE вместо яблока и запускаем! (не забываем импортировать используемые классы)
Тест еды!
Проверяем. Еду есть? Ест.
Сравниваем эффект голода. Я указал 5, значит должно восстановить 2.5 кусочка мяса. Так оно и есть!
Можно ли кормить волка? Да!
Работает ли эффект? Конечно!
Работает даже слишком хорошо…
Конечный результат я немного поправлю. Уберу эффект, к примеру. Может быть уменьшу голод или насыщение, так же сделайте и вы. Изучите остальную еду в игре (Файл Foods.java) и найдете еще много чего интересного. А на этом пока все. Спасибо за внимание!