Всем привет! Продолжаю переработку своих гайдов и сегодня сделаем еще пару предметов. Это будет две сосиски. Обе можно будет съесть, так же они будут пригодны для лечения волков, а золотая версия будет еще и различные эффекты выдавать. В этот раз я так же начну с пустого мода, но не буду подробно разбирать моменты, который уже были в прошлый раз.
Для полного понимания происходящего рекомендую сначала пройти урок о предметах:
Немного о еде
С момента введения голода в игру – еда получила особое место для выживания. От состояния голода зависит регенерация, возможность бегать, а также критический голод приведёт к потере здоровья.
Помимо видимого голода у нас есть еще и насыщение. Этот параметр определяет, как скоро мы снова захотим есть. В дорогих блюдах насыщение должно быть на уровне!
Так же еда может иметь свои особенности. К примеру, Золотое яблоко даст регенерацию, поглощение и что-то там ещё. И его можно есть даже когда наш персонаж не голоден, в отличии от той же баранины. Курица и мясо зомби могут дать голод, а подозрительные супы и вовсе целый рад эффектов, в зависимости от ингредиентов крафта. Уникальное применение так же имеет ведро молока. Оно снимает любые активные эффекты с игрока. А ещё некоторые виды еды пригодны для лечения питомцев!
И хотя да, можно сказать, что игра и так имеет достаточно широкий выбор пищи. Но лично мне иногда не хватает разнообразия, сложных рецептов еды и т.д. Салатиков там, борща… Лишь уточню, что стоит учитывать баланс. Ведь никто не будет делать ваш офигенный и сложный суп, если приготовленная курочка окажется лучше.
JAVA часть — подготовка
Аналогично обычному предмету нам нужно создать несколько файлов (желательно в папке item). Первый будет хранить статические переменные с нашими предметами (ModItems.java). Сразу же создадим пару обычных предметов как в прошлом уроке. Пока по функционалу они не круче палки, но скоро мы это изменим.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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, для своих вкладок.
1 2 3 4 5 6 7 |
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, класс для реализации вкладок.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 часть – Делаем еду
Чтобы предмет стал едой нам нужно лишь передать в свойствах предмета параметры еды (там, где мы указываем вкладку).
1 |
new Item.Properties().food(Foods.COOKED_BEEF).group(ModItemGroups.MOD_ITEMS_ITEM_GROUP) |
Тут я использовал уже готовые свойства приготовленной говядины, но нам такое не катит и пора сделать свой класс с едой. Если хотите посмотреть на всю еду из игры, то ищите класс Foods.java (net.minecraft.item). Так что аналогично игровой создадим MyFoods.java:
1 2 3 4 5 6 7 8 9 10 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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, а от нашего. Итоговый результат вот:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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))); } |
Получаем свего раненого волка:
И лечим его!
Теперь можно тестировать и голод
И вторую:
На этом у меня всё. Спасибо за внимание!
Пингбэк: Создание модов для Minecraft 1.15 – GeekStand