1、项目结构简述
根据项目结构图归类如下三个主要核心功能区:
- 核心代码编写目录区域,用来实现具体的业务功能;
- 配置定义目录区域,用来定义一些配置文件和与模组相关的配置项;
- 依赖管理文件,用于管理项目中引用的依赖;
2、在模组中定义并注册饺子
- Constants中定义了模组的modId,在后续的FoodRegister类中会有用到;
- Dumplings类对应的就是实体对象饺子;
- 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是食用的玩家,这里可以做一些简单的逻辑比如玩家物品翻倍,给玩家一些自定义的效果之类的。
当然也可以通过监听其他的事件来进行与饺子的交互。其他的一些监听事件会在后续补充,也可以自行探索。