本篇教程的视频

(待发布)

本篇教程的源代码

(待发布)

简介

食物在模组中也是非常重要的一个部分,玩家需要通过食物来恢复饥饿值

一些食物也可以为玩家提供正面或者负面的状态效果

食物

注册食物组件

在高版本中,食物是以组件的形式注册到物品上的

所以注册之前还要注册一个食物组件Food Component),原版的可参见Foods

在这里,我们先创建一个ModFoods类,用于注册食物组件

1
2
3
public class ModFoods {

}

然后,我们参考原版的Foods类,注册一个食物组件

1
public static final FoodProperties CORN = new FoodProperties.Builder().nutrition(3).saturationModifier(0.7f).build();

这里我们创建了一个名为CORN的食物组件,类型是FoodProperties

然后我们使用FoodProperties.Builder来创建食物组件

nutrition方法用于设置食物的饥饿值恢复量,这里设置为3

saturationModifier方法用于设置食物的饱和度修正值,这里设置为0.7f

build方法用于构建食物组件对象

饱和度系数并不是直接增加饱和度值,而是通过一个计算公式来计算最终的饱和度增加量,具体可以在FoodConstants类中查看

其方法如下:

1
2
3
public static float saturationByModifier(int foodLevel, float saturationModifier) {
return (float)foodLevel * saturationModifier * 2.0F;
}

其中,foodLevel是饥饿值增加量,saturationModifier是饱和度修正值

拿Wiki上的金胡萝卜为例,金胡萝卜的饥饿值增加量为6,饱和度修正值为1.2f,那么最终的饱和度增加量为:

1
6 * 1.2f * 2.0F = 14.4f

另外我们也可以来举一反三

1
2
3
4
5
public static final FoodProperties STRAWBERRY = new FoodProperties.Builder().nutrition(1).saturationModifier(0.3f)
.effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 200), 0.2F).build();
public static final FoodProperties CHEESE = new FoodProperties.Builder().nutrition(4).saturationModifier(0.6f)
.effect(() -> new MobEffectInstance(MobEffects.JUMP, 200), 0.3F)
.effect(() -> new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 200), 0.4F).build();

这里我们注册了两个食物组件,分别是STRAWBERRYCHEESE

要为食物添加状态效果,我们使用effect方法,第一个参数是一个Supplier<MobEffectInstance>,用于提供状态效果实例,
第二个参数是效果的概率

多个效果可以多次调用effect方法来添加

注册食物

接下来,我们在ModItems类中注册食物物品,并使用food方法将食物组件绑定到物品上

1
2
3
4
5
6
public static final DeferredItem<Item> CORN =
ITEMS.register("corn", () -> new Item(new Item.Properties().food(ModFoods.CORN)));
public static final DeferredItem<Item> STRAWBERRY =
ITEMS.register("strawberry", () -> new Item(new Item.Properties().food(ModFoods.STRAWBERRY)));
public static final DeferredItem<Item> CHEESE =
ITEMS.register("cheese", () -> new Item(new Item.Properties().food(ModFoods.CHEESE)));

物品注册的方法和之前讲过的一样,只是这里我们在物品属性中使用了food方法,将之前注册的食物组件绑定到物品上

添加到物品栏

最后,我们还需要将食物物品添加到物品栏中,方便玩家获取

1
2
3
output.accept(ModItems.CORN);
output.accept(ModItems.STRAWBERRY);
output.accept(ModItems.CHEESE);

数据文件

常规的,我们还需要为食物物品添加数据文件

前面既然讲了数据生成,那么就直接用数据生成来生成这些数据文件

语言文件

1
2
3
add(ModItems.CORN.get(), "Corn");
add(ModItems.STRAWBERRY.get(), "Strawberry");
add(ModItems.CHEESE.get(), "Cheese");

物品模型

1
2
3
basicItem(ModItems.CORN.get());
basicItem(ModItems.STRAWBERRY.get());
basicItem(ModItems.CHEESE.get());

贴图

贴图就放到对应的文件夹下,命名为物品的注册名

之后就可以启动游戏进行测试了