1、项目结构简述

根据项目结构图归类如下三个主要核心功能区:

  1. 核心代码编写目录区域,用来实现具体的业务功能;
  2. 配置定义目录区域,用来定义一些配置文件和与模组相关的配置项;
  3. 依赖管理文件,用于管理项目中引用的依赖;

2、在模组中定义并注册饺子

  1. Constants中定义了模组的modId,在后续的FoodRegister类中会有用到;
  2. Dumplings类对应的就是实体对象饺子;
  3. FoodRegister是用来向模组中注册物品的类,这里注册的是食物,也可以用来注册其他物品;

Dumplings类定义

import net.minecraft.item.Food;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;

public class Dumplings extends Item {

    public Dumplings() {
        super(new Item.Properties()
                .tab(ItemGroup.TAB_FOOD)
                .food(new Food.Builder().nutrition(5).saturationMod(0.6F).build()));
    }

}

注意.tab表示的就是在物品栏的哪一项,这里选的是TAB_FOOD,即食物;

FoodRegister类定义

import com.example.examplemod.constants.Constants;
import com.example.examplemod.food.Dumplings;
import net.minecraft.item.Item;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber(modid = Constants.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class FoodRegister {

    @SubscribeEvent
    public static void onItemsRegistry(final RegistryEvent.Register<Item> event) {
        event.getRegistry().registerAll(
                new Dumplings().setRegistryName(Constants.MODID, "dumplings")
        );
    }
}

4、效果展示

运行模组后可以在食物物品栏中找到我们自定义的饺子食物;

5、食物的扩展玩法

5.1、为饺子设置中文名

在resources目录下新建如下图目录及文件

新建规则为assets.<modId>.lang.en_us.json/zh_cn.json

其中en_us.json和zh_cn.json中的文件依次内容分别如下:

{
  "item.examplemod.dumplings": "dumplings"
}
{
  "item.examplemod.dumplings": "饺子"
}

        如上两个Json串所示,其key为<4、效果展示​>​​​​​​中所呈现出来的名字,value是我们自定义所展示出来的。以下是配置后的效果。

        注意,游戏启动默认是英文,所以启动后会展示成dumplings,通过切换游戏的语言可以看到饺子。切换游戏语言可以通过ESC(按键)->Options->Language操作切换。

5.2、为饺子设置图标

 在resources目录下新建如下图目录及文件

新建规则类似5.1

其中dumplings.json的文件如下:

{
  "parent": "item/generated",
  "textures": {
    "layer0": "examplemod:item/dumplings"
  }
}

图片这里是使用的.png格式,有条件的可以根据自己的需要自定义一些比较优质的图像,这里图像来源于网络。

5.3、作为食物的饺子具备的属性及其他属性

查看项目中内置的Food类(net.minecraft.item.Food),通过其基本属性如下:

public class Food {
   private final int nutrition;
   private final float saturationModifier;
   private final boolean isMeat;
   private final boolean canAlwaysEat;
   private final boolean fastFood;
   private final List<Pair<java.util.function.Supplier<EffectInstance>, Float>> effects;

}
  • nutrition:营养,奇怪的东西,好像是用来定义某一类食物的,有兴趣可以自己探究

  • saturationModifier:食用后恢复的饱食度数量

  • isMeat:是否是肉

  • canAlwaysEat:在饱食度满的时候依然可以使用,如附魔金苹果

  • fastFood:似乎让我们吃的更快了

  • effects:参考net.minecraft.potion.Effects

以上信息不一定准确,可以自己探究

5.4、食用饺子可触发的事件玩法

以下只是一个例子,例如在饺子被消耗后可以触发的事件

public class Dumplings extends Item {

    public Dumplings() {
        super(new Item.Properties()
                .tab(ItemGroup.TAB_FOOD)
                .food(new Food.Builder().fast().build()));
    }

    @Override
    public ItemStack finishUsingItem(ItemStack itemStack, World world, LivingEntity livingEntity) {
        return super.finishUsingItem(itemStack, world, livingEntity);
    }
}

        这里通过重写finishUsingItem来实现,其中itemStack是消耗后的物品,World是当前世界,LivingEntity是食用的玩家,这里可以做一些简单的逻辑比如玩家物品翻倍,给玩家一些自定义的效果之类的。

        当然也可以通过监听其他的事件来进行与饺子的交互。其他的一些监听事件会在后续补充,也可以自行探索。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐