我的世界fabric-1-21-1mod制作心得四——食物和燃料(mixin)


前面我们为模组添加了物品,当时我们没有深入到物品的不同类别。

本期我们就来为模组添加食物和燃料,一个可以通过API添加,一个不能。让我们了解食物组件和mixin。

另外推荐B站的一位mod教程up主——北山_Besson,我写的这些心得也可以说是看教程的课堂笔记。


AModFoodComponents.java

要添加食物就需要写一个食物组件。在注册物品的时候给物品添加这个组件就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class AModFoodComponents {
public static final FoodComponent 组件名 =

// 这里hunger()代表回复的饥饿值。
// saturationModifer()表示回复的饱和度的影响参数。计算公式:饥饿值*参数*2。
new FoodComponent.Builder().hunger(4).saturationModifier(0.7F)

// 这里为食物添加食用后的状态效果,此处举例速度提升。
// 参数是分别是 状态名 持续时间 效果等级 获得概率。
.statusEffect(new StatusEffectInstance(StatusEffects.SPEED, 100, 1), 1.0F)

// 这句代表次食物可以在饥饿条满的情况下依旧能继续吃。
.alwaysEdible()

// 这句代表食物的进食速度比较快。
.snack()
.build();
}

AModItems.java

1
2
3
4
5
6
7
8
9
public class CelestialModItems {
public static final Item STAR_GEL =
registerItem("star_gel",
new Item(new Item.Settings()
// 这里添加刚才写的食物组件。
.food(CelestialModFoodComponents.组件名)));

......
}

AbstractFurnaceBlockEntityMixin.java

现在写燃料的代码,因为原版这里是硬编码,所以只能使用mixin。拦截原版返回的map然后添加我们的物品再返回回去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 这里注意mixin类需要一个注解,把需要拦截的类导进来。
@Mixin(AbstractFurnaceBlockEntity.class)
public class AbstractFurnaceBlockEntityMixin {

// 这里method后面添加的是需要拦截的函数。
// @At的参数意思是添加的位置,这里意思是添加到尾部。
@Inject(method = "createFuelTimeMap", at = @At("TAIL"))


private static void addFuelItem(CallbackInfoReturnable<Map<Item, Integer>> cir){
// 这里用put吧物品添加进去就行了。
// 注意这里put的第二个参数是时间,单位是tick(1/20秒),最大值是32767。
cir.getReturnValue().put(AModItems.物品, 30000);
}
}