Урок восемь. Делаем из сосиски еду

Да. В планах было делать блок, но во время написания новой статейки — я осознал проблему. Мы сделали предмет, который выглядит как сосиска (а я настаиваю, что это именно сосиска!), назван сосиской, а съесть его нельзя. И какая же это тогда сосиска?? Непростительное упущение!

Список уроков
Урок седьмой. Локализация

Итак. Если вы прошли все предыдущие уроки — у вас есть предмет. Возможно это не сосиска, возможно это даже не еда, но не у меня. Как сделать еду в новой версии? Если честно, я и сам удивился насколько легко. Раньше, еще во времена моей молодости, когда я только познавал Java и пытался писать моды — еду делали не так. Но все идет и все меняется, так что погнали.

После шестого урока, регистрация нашего предмета (в файле ModEventSubscriber) должна иметь приблизительно такой вид:

Делаем предмет едой при помощи вызова функции food, где параметром служит объект класса Food, который и содержит все данные для еды. Примером возьмем яблоко. Дописываем сразу после .group(MyModItemGroups.MOD_ITEM_GROUP) такой код: .food(Foods.APPLE).

Просто ведь? Можете тестировать! Предмет теперь еда и восстанавливает голод прям как яблоко.

Более подробно о еде

Для большего понимания — смотрим код для яблока в файле Foods.java:

Кстати, полезная интересность. Если посмотреть на код 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.

Для теста я создал вот такой вот интересный набор:

Указываем нашему предмету MyFood.SAUSAGE вместо яблока и запускаем! (не забываем импортировать используемые классы)

Тест еды!

Проверяем. Еду есть? Ест.

Едааааа…

Сравниваем эффект голода. Я указал 5, значит должно восстановить 2.5 кусочка мяса. Так оно и есть!

Можно ли кормить волка? Да!

Ути мой маленький!

Работает ли эффект? Конечно!

Как вы могли заметить, для теста я выбрал эффект свечения

Работает даже слишком хорошо…

За секунду до…

Конечный результат я немного поправлю. Уберу эффект, к примеру. Может быть уменьшу голод или насыщение, так же сделайте и вы. Изучите остальную еду в игре (Файл Foods.java) и найдете еще много чего интересного. А на этом пока все. Спасибо за внимание!

Добавить комментарий