Привет! Еда – важная часть любой выживалки. И майн не исключение. Есть очень много модов на еду, среди которых есть реально удивительные. Но это не мешает нам добавить ещё и своё что-то. Чем мы сегодня и займёмся!
Я уже как-то писал о еде, даже не раз. И, если честно, выходило довольно просто и быстро. Так что для разнообразия я решил немного расширить урок о еде. Теперь мы не только добавим съедобный предмет, но и сделаем свой аналог миски. Так что нечего время терять, погнали!
Добавляем новые предметы
Для начала добавим три новых предмета:
1 2 3 |
public static final RegistryObject<Item> CAN = ITEMS.register("can", () -> new Item(new Item.Properties().tab(ModCreativeTabs.GS_MOD_TAB))); public static final RegistryObject<Item> CANDY = ITEMS.register("candy", () -> new Item(new Item.Properties().tab(ModCreativeTabs.GS_MOD_TAB))); public static final RegistryObject<Item> CAN_WITH_FOOD = ITEMS.register("can_with_food", () -> new Item(new Item.Properties().tab(ModCreativeTabs.GS_MOD_TAB))); |
Как вы могли заметить, пока что эти предметы не функциональнее палки. Но скоро мы это исправим.
Из названий понятно, что у нас: банка, конфета и банка с едой. Банка останется простым предметом, т.к. есть или как-то использовать в мире её не выйдет. Часто именно конфетки дают в играх какой-то эффект, так что и наша будет не совсем обычной, а с эффектом. Банка с едой — банка, в которой какая-то еда. Какая еда я не знаю, но она будет неплохо насыщать и оставлять банку после употребления.
План очертили, теперь добавим параметры еды.
Добавляем свойства еды
Для этого можно создать отдельный файлик рядом с предметами. Назовём его ModFood.java, и запишем туда следующее.
1 2 3 4 5 6 7 8 9 10 |
package dev.astler.gsmod.items; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.food.FoodProperties; public class ModFood { public static final FoodProperties CANDY = (new FoodProperties.Builder()).nutrition(2).saturationMod(0.1F).effect(new MobEffectInstance(MobEffects.DIG_SPEED, 100, 1), 1f).build(); public static final FoodProperties CAN_WITH_FOOD = (new FoodProperties.Builder()).nutrition(8).saturationMod(0.8F).meat().build(); } |
Для еды есть отдельный класс, FoodProperties. Он и определяет свойства еды. Насыщение, утоление голода, эффекты, мясо ли это (можно ли лечить волка), даст ли сьедение какой-то эффект и т.д. Разберем внимательнее.
Конфета. Восстанавливать она будет две единицы голода, и давать 0.1 насыщения. После съедения игрок 100% получит эффект увеличения скорости добычи второго уровня на 5 секунд. Есть ещё интересная часть: alwaysEat() и fast(). Первое определяет, можно ли есть нашу еду когда игрок не голоден. Т.к. это конфета, то можно, конечно. А fast, это скорость поедания еды. В игре есть два варианта: стандартный (едим мясо, супы) и быстрый (ягоды).
Банка еды не будет давать никаких эффектов, да и вообще будет практически обычной едой, которая восстановит голод на уровне приготовленной свинины. А ещё мы указали, что банка с едой — это мясо. Но не сама банка. А только содержимое.
Добавить предмету свойства еды очень просто. Подобно вкладке в творческом мы добавляем к Item.Properties() и еду: food(ModFood.CANDY), например.
1 2 |
public static final RegistryObject<Item> CANDY = ITEMS.register("candy", () -> new Item(new Item.Properties().tab(ModCreativeTabs.GS_MOD_TAB).food(ModFood.CANDY))); public static final RegistryObject<Item> CAN_WITH_FOOD = ITEMS.register("can_with_food", () -> new Item(new Item.Properties().tab(ModCreativeTabs.GS_MOD_TAB).food(ModFood.CAN_WITH_FOOD))); |
Теперь докидываем текстуры и модели, как это делать я писал тут, а используемые мной спрайты ищите тут. Дописываем локализацию и запускаем.
![](https://geekstand.top/wp-content/uploads/2021/10/image-6.png)
Как и ожидалось, конфету кушать можно, эффект тоже есть:
![](https://geekstand.top/wp-content/uploads/2021/10/image-7.png)
Пустую банку кушать нельзя, а вот полную можно. Но после еды банку мы не получаем. Так что займёмся этим и напишем класс по аналогии с тарелкой.
Получаем посуду после еды
Повторить трюк с миской нам поможет класс BowlFoodItem.java.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package net.minecraft.world.item; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; public class BowlFoodItem extends Item { public BowlFoodItem(Item.Properties p_40682_) { super(p_40682_); } public ItemStack finishUsingItem(ItemStack p_40684_, Level p_40685_, LivingEntity p_40686_) { ItemStack itemstack = super.finishUsingItem(p_40684_, p_40685_, p_40686_); return p_40686_ instanceof Player && ((Player)p_40686_).getAbilities().instabuild ? itemstack : new ItemStack(Items.BOWL); } } |
Как видите, тут есть функция, которая срабатывает по завершению использования предмета. Т.е. когда мы съедаем еду, например. Теперь создадим свой класс CanFoodItem.java и напишем там всё то же самое, но заменив миску банкой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package dev.astler.gsmod.items; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; public class CanFoodItem extends Item { public CanFoodItem(Item.Properties pProperties) { super(pProperties); } @Override public ItemStack finishUsingItem(ItemStack pItemStack, Level pLevel, LivingEntity pEntity) { ItemStack itemstack = super.finishUsingItem(pItemStack, pLevel, pEntity); return pEntity instanceof Player && ((Player)pEntity).getAbilities().instabuild ? itemstack : new ItemStack(ModItems.CAN.get()); } } |
И теперь создаём банку с едой не от обычного Item, а от нашего. И да. Обязательно ставим ограничение на количество предметов в стаке до 1 (.stacksTo(1)), как любой еды в тарелке. Иначе игра будет удалять весь стак еды и заменять его «тарелкой» банкой.
Вообще это можно починить, но оставим на второй гайд с едой, а пока запишем так:
1 |
public static final RegistryObject<Item> CAN_WITH_FOOD = ITEMS.register("can_with_food", () -> new CanFoodItem(new Item.Properties().tab(ModCreativeTabs.GS_MOD_TAB).food(ModFood.CAN_WITH_FOOD).stacksTo(1))); |
Проверяем результат:
На этом пока всё, спасибо за внимание!
Список всех уроков: Создание модов для Minecraft 1.15-1.17 [Forge/Fabric]
Исходный код проекта на Github