我的世界1.20.1forge开发教程(6)——自定义燃料,熔炼规则、配方

发布于:2025-02-22 ⋅ 阅读:(22) ⋅ 点赞:(0)

配方篇

在Minecraft中,配方代码是用于定义合成配方的一种数据格式。在开发者的角度,配方代码通常以JSON格式编写,包含了合成所需的原料、合成产物以及合成方式等信息。

在1.12版本之前,开发者需要通过修改游戏的源代码来添加自定义配方。这通常需要对游戏的Java代码进行修改,以及添加新的合成逻辑和图形界面。

而在1.12版本之后,Minecraft引入了更加灵活和易用的自定义配方系统。开发者可以通过JSON文件来定义新的合成配方,然后将这些文件放置在资源包中,游戏会自动加载这些配方文件并添加到合成表中。

Minecraft中的配方机制指的是玩家可以通过合成台使用玩家所拥有的原材料来合成新的物品。配方机制可以通过合成表来查看,玩家可以通过了解配方来制作各种物品和方块。自定义配方的添加则为玩家和开发者提供了更多的自定义和玩法扩展的可能性。

新建燃料

这里我们新建一个超级烈焰粉作为我们的自定义燃料,在物品类里写入如下代码:

    public static final RegistryObject<Item> SUPER_BLAZE_POWDER = ITEMS.register("super_blaze_powder",
            () -> new Item(new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON)));

新建熔炼规则 

@Mod.EventBusSubscriber(modid =MODID)
public class ModEvents {
    @SubscribeEvent
    public static void onFuelCheck(FurnaceFuelBurnTimeEvent event) {
        if (event.getItemStack().getItem() == items.SUPER_BLAZE_POWDER.get()) {
            event.setBurnTime(4000); // 设置自定义燃料的燃烧时间
        }
    }
}

这段代码是一个基于Minecraft Forge模组开发框架的事件处理器类。让我们逐行解释每部分的功能:

  1. @Mod.EventBusSubscriber(modid = MODID):这是一个注解,表示这个类是一个Mod事件总线订阅类,在该类中定义的方法将会自动注册到Mod的事件总线中。其中modid是一个指定Mod标识符的参数。

  2. public class ModEvents { :定义了一个名为ModEvents的Java类。

  3. @SubscribeEvent:这是一个注解,表示下面的方法将会订阅事件。

  4. public static void onFuelCheck(FurnaceFuelBurnTimeEvent event) { :定义了一个名为onFuelCheck的静态方法,接受一个FurnaceFuelBurnTimeEvent类型的参数event。当熔炉燃料烧尽时间事件发生时,该方法会被调用。

  5. if (event.getItemStack().getItem() == items.SUPER_BLAZE_POWDER.get()) { :通过判断事件中的物品堆栈(ItemStack)的物品是否为SUPER_BLAZE_POWDER来确定是否符合条件。

  6. event.setBurnTime(4000);:如果事件中的物品是SUPER_BLAZE_POWDER,则将该物品的燃烧时间设置为4000。

综上,这段代码的功能是在熔炉燃料烧尽时间事件发生时检查物品堆栈,如果堆栈中的物品是SUPER_BLAZE_POWDER,则将其燃烧时间设置为4000,以实现自定义燃料的燃烧时间。

配方文件生成器 

上述的SUPER_BLAZE_POWDER就是我们的自定义燃料,像往常那样注册即可,不会的看之前发的内容。基于data generator的配方生成器

public class RecipeGenerator extends RecipeProvider {
    public RecipeGenerator(DataGenerator generator) {
        super(generator.getPackOutput());
    }
    @Override
    protected void buildRecipes(Consumer<FinishedRecipe> consumer) {
        SimpleCookingRecipeBuilder.smelting(
                        Ingredient.of(Items.NETHERITE_SWORD),
                        RecipeCategory.COMBAT,
                        items.FLAME_SWORD.get(),
                        0.0f, // 原版经验设为0
                        600   // 需要3个燃料(600/200=3)