本篇教程的视频

(待发布)

本篇教程的源代码

(待发布)

简介

燃料是Minecraft中用于燃烧物品的资源,比如熔炉、烟熏炉等,还有其他模组的各类工业设备

燃料

NeoForge中添加燃料和Forge类似,不过这里来讲两个方法

一个是自定义物品类重写getBurnTime方法,另一个是使用json数据文件来添加燃料

这里我们先讲自定义物品类的方法

自定义物品

首先我们创建一个自定义物品类ModFuelItem,继承自Item

1
2
3
4
5
6
public class ModFuelItem extends Item {

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

然后我们添加一个burnTime字段,并重写getBurnTime方法

1
2
3
4
5
6
private int burnTime = 0;

@Override
public int getBurnTime(ItemStack itemStack, @Nullable RecipeType<?> recipeType) {
return this.burnTime;
}

这里的burnTime字段用于存储燃料的燃烧时间,单位是ticks,20ticks等于1秒

构造函数也需要修改,添加一个burnTime参数

1
2
3
4
public ModFuelItem(Properties properties, int burnTime) {
super(properties);
this.burnTime = burnTime;
}

值得注意的是,getBurnTime方法同样也不是Item类中的方法,而是IItemExtension接口中的方法

IItemExtension接口是NeoForge为物品提供的一个扩展接口,允许我们为物品添加一些自定义的功能,它也让Item类实现了这个接口

前身是IForgeItem接口

注册燃料物品

接下来我们在ModItems类中注册一个燃料物品

1
2
public static final DeferredItem<Item> ANTHRACITE =
ITEMS.register("anthracite", () -> new ModFuelItem(new Item.Properties(), 1600));

这里我们注册了一个名为ANTHRACITE的燃料物品,燃烧时间为1600ticks,即80秒,也是一般燃料(比如煤炭)的燃烧时间

这样,我们就成功为模组添加了一个燃料物品,玩家可以使用它来燃烧物品了

添加到物品栏

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

1
output.accept(ModItems.ANTHRACITE);

使用json数据文件添加燃料

这里我们再讲讲另一种方法

先注册一个普通的物品

1
2
public static final DeferredItem<Item> ANTHRACITE2 =
ITEMS.register("anthracite2", () -> new Item(new Item.Properties()));

然后我们创建一个数据生成类ModDataMapProvider

1
2
3
4
5
public class ModDataMapProvider extends DataMapProvider {
public ModDataMapProvider(PackOutput packOutput, CompletableFuture<HolderLookup.Provider> lookupProvider) {
super(packOutput, lookupProvider);
}
}

然后重写gather方法,注意使用带参数的gather方法

1
2
3
4
5
@Override
protected void gather(HolderLookup.Provider provider) {
this.builder(NeoForgeDataMaps.FURNACE_FUELS)
.add(ModItems.ANTHRACITE2.getId(), new FurnaceFuel(1600), false);
}

这里我们使用builder方法来获取一个FURNACE_FUELS数据生成器
然后使用add方法来添加燃料数据,第一个参数是物品的ResourceLocation
第二个参数是一个FurnaceFuel对象,表示燃料数据,第三个参数表示是否覆盖已有数据

FurnaceFuel的构造函数接受一个整数参数,表示燃烧时间,单位是ticks

这个数据生成类需要在数据生成器注册类中调用

1
generator.addProvider(event.includeServer(), new ModDataMapProvider(packOutput, lookupProvider));

数据文件

另外的就是常规的数据文件了,同样也使用数据生成来写

语言文件

1
2
add(ModItems.ANTHRACITE.get(), "Anthracite");
add(ModItems.ANTHRACITE2.get(), "Anthracite 2");

模型文件

1
2
basicItem(ModItems.ANTHRACITE.get());
basicItem(ModItems.ANTHRACITE2.get());

贴图

还要将物品的贴图放到对应的文件夹中

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