Добавляем еду, еду с эффектами и корм

Всем привет! Продолжаю переработку своих гайдов и сегодня сделаем еще пару предметов. Это будет две сосиски. Обе можно будет съесть, так же они будут пригодны для лечения волков, а золотая версия будет еще и различные эффекты выдавать. В этот раз я так же начну с пустого мода, но не буду подробно разбирать моменты, который уже были в прошлый раз.

Список уроков

Для полного понимания происходящего рекомендую сначала пройти урок о предметах:

Немного о еде

С момента введения голода в игру – еда получила особое место для выживания. От состояния голода зависит регенерация, возможность бегать, а также критический голод приведёт к потере здоровья.

Помимо видимого голода у нас есть еще и насыщение. Этот параметр определяет, как скоро мы снова захотим есть. В дорогих блюдах насыщение должно быть на уровне!

Так же еда может иметь свои особенности. К примеру, Золотое яблоко даст регенерацию, поглощение и что-то там ещё. И его можно есть даже когда наш персонаж не голоден, в отличии от той же баранины. Курица и мясо зомби могут дать голод, а подозрительные супы и вовсе целый рад эффектов, в зависимости от ингредиентов крафта. Уникальное применение так же имеет ведро молока. Оно снимает любые активные эффекты с игрока. А ещё некоторые виды еды пригодны для лечения питомцев!

И хотя да, можно сказать, что игра и так имеет достаточно широкий выбор пищи. Но лично мне иногда не хватает разнообразия, сложных рецептов еды и т.д. Салатиков там, борща… Лишь уточню, что стоит учитывать баланс. Ведь никто не будет делать ваш офигенный и сложный суп, если приготовленная курочка окажется лучше.

JAVA часть — подготовка

Аналогично обычному предмету нам нужно создать несколько файлов (желательно в папке item). Первый будет хранить статические переменные с нашими предметами (ModItems.java). Сразу же создадим пару обычных предметов как в прошлом уроке. Пока по функционалу они не круче палки, но скоро мы это изменим.

package mod.astler.tutorial_mod_gs.item;

import mod.astler.tutorial_mod_gs.TutorialGSMod;
import net.minecraft.item.Item;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

public class ModItems {
    public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, TutorialGSMod.MODID);

    public static final RegistryObject<Item> SAUSAGE = ITEMS.register("sausage", () -> new Item(new Item.Properties().group(ModItemGroups.MOD_ITEMS_ITEM_GROUP)));
    public static final RegistryObject<Item> ENCHANTED_SAUSAGE = ITEMS.register("enchanted_sausage", () -> new Item(new Item.Properties().group(ModItemGroups.MOD_ITEMS_ITEM_GROUP)));
}

Так же ModItemGroups.java, для своих вкладок.

package mod.astler.tutorial_mod_gs.item;

import net.minecraft.item.ItemGroup;

public class ModItemGroups {
    public static final ItemGroup MOD_ITEMS_ITEM_GROUP = new ModItemGroup("tutorial_mod_gs_items", ModItems.ENCHANTED_SAUSAGE);
}

И, конечно же, сам ModItemGroup.java, класс для реализации вкладок.

package mod.astler.tutorial_mod_gs.item;

import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.RegistryObject;

public class ModItemGroup extends ItemGroup {

    private final RegistryObject<Item> iconSupplier;

    public ModItemGroup(final String name, final RegistryObject<Item> iconSupplier) {
        super(name);
        this.iconSupplier = iconSupplier;
    }

    @Override
    public ItemStack createIcon() {
        return new ItemStack(iconSupplier.get());
    }
}

Не забываем о моделях и текстурах. Для этого урока я нарисовал такое вот чудо:

Золотая сосиска
Просто сосиска

Еще добавьте Локализацию! Не обязательный шаг, но хуже не сделает)

Готово?

Отлично. У нас теперь есть своя вкладка и пара готовых к бою предметов!

Java часть – Делаем еду

Чтобы предмет стал едой нам нужно лишь передать в свойствах предмета параметры еды (там, где мы указываем вкладку).

new Item.Properties().food(Foods.COOKED_BEEF).group(ModItemGroups.MOD_ITEMS_ITEM_GROUP)

Тут я использовал уже готовые свойства приготовленной говядины, но нам такое не катит и пора сделать свой класс с едой. Если хотите посмотреть на всю еду из игры, то ищите класс Foods.java (net.minecraft.item). Так что аналогично игровой создадим MyFoods.java:

package mod.astler.tutorial_mod_gs.item;

import net.minecraft.item.Food;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;

public class ModFoods {
    public static Food SAUSAGE = (new Food.Builder()).hunger(5).saturation(0.5F).meat().build();
    public static Food ENCHANTED_SAUSAGE = (new Food.Builder()).hunger(8).saturation(0.7F).meat().setAlwaysEdible().fastToEat().effect(new EffectInstance(Effects.HEALTH_BOOST, 600, 0), 1F).effect(new EffectInstance(Effects.INSTANT_HEALTH, 600, 0), 1F).build();
}

Разберём что я тут натворил. Создание свойств для еды происходит при помощи паттерна строителя (builder).  Hunger – сколько голода будет восстановлено, saturation – насыщение, meat – делает предмет мясом, пригодным для лечения волков, setAlwaysEdible – позволяет есть еду даже когда нет голода, fastToEat – увеличивает скорость применения еды. Отдельное внимание уделим effect. Эта функция принимает два значения: объект EffectInstance и шанс получения. 1F – 100%. При создании EffectInstance мы указываем сам эффект (в файле Effects.java можете посмотреть все), его длительность и уровень эффекта.

Вроде всё понятно…должно быть…

Но, прежде чем бежать править предметы нам нужно разобрать ещё один момент. Эффект зачарования.

Для зачарованной сосиски нужно создать свой дочерний класс от Item:

package mod.astler.tutorial_mod_gs.item;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;

public class EnchantedSausage extends Item {

    public EnchantedSausage(Properties properties) {
        super(properties);
    }

    @Override
    public boolean hasEffect(ItemStack stack) {
        return true;
    }
}

Всё, что мы тут изменяем, так это значение функции hasEffect на true. Логично, что именно это действие и подарит предмету характерный блеск.

Чтобы применить все эти изменения, создавать зачарованную сосиску нужно теперь не от обычного Item, а от нашего. Итоговый результат вот:

package mod.astler.tutorial_mod_gs.item;

import mod.astler.tutorial_mod_gs.TutorialGSMod;
import net.minecraft.item.Foods;
import net.minecraft.item.Item;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

public class ModItems {
    public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, TutorialGSMod.MODID);

    public static final RegistryObject<Item> SAUSAGE = ITEMS.register("sausage", () -> new Item(new Item.Properties().food(ModFoods.SAUSAGE).group(ModItemGroups.MOD_ITEMS_ITEM_GROUP)));
    public static final RegistryObject<Item> ENCHANTED_SAUSAGE = ITEMS.register("enchanted_sausage", () -> new EnchantedSausage(new Item.Properties().food(ModFoods.ENCHANTED_SAUSAGE).group(ModItemGroups.MOD_ITEMS_ITEM_GROUP)));
}

Он явно заинтересован!

Получаем свего раненого волка:

Как я его ранил думайте сами 😀

И лечим его!

И никаких обид!

Теперь можно тестировать и голод

И вторую:

На этом у меня всё. Спасибо за внимание!

Ссылка на исходники

One thought on “Добавляем еду, еду с эффектами и корм

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