上一期我们学习了如何让系统发送文字,这一期,我们就要实现每一个mod开发者最想实现的东西之一------物品(我猜mod开发者们东西应该就是物品,方块,实体,机器方块,维度和新的游戏机制了)
那我们不多BB直接步入正题
首先,先建立一个新包item,然后再键入以下代码:
package fenge.fmltutor.item;
//包声明
import fenge.fmltutor.ExampleMod;
//ExampleMod是mod的主类,主类就是加了@MOD注解的类
import net.minecraft.item.Item;
public class ItemDirBall extends Item {
//所有的物品都继承自Item类
public ItemDirBall(){
this.setUnlocalizedName(ExampleMod.MODID + ".dirBall");
//设置UnlocalizedName,用于语言国际化
this.setRegistryName("dirt_ball");
//设置物品id
this.setMaxStackSize(16);
//设置最大堆叠数
}
}
然后再新建一个类,名为ItemRegistryHandler.java
然后键入以下代码:
package fenge.fmltutor.item;
//包声明
import fenge.fmltutor.ExampleMod;
//主类
import fenge.fmltutor.block.BlockRegistryHandler;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.init.SoundEvents;
import net.minecraft.inventory.EntityEquipmentSlot;
//还是有很多的无用import原因是这是我从我的代码中复制出来的,请把那些无法导入的import删除
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemBlock;
import net.minecraft.world.World;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.util.EnumHelper;
import net.minecraftforge.event.RegistryEvent.Register;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.registries.IForgeRegistry;
@EventBusSubscriber
public class ItemRegistryHandler
{
public static final ItemDirBall DIRT_BALL= new ItemDirBall();
//我们的物品示例
@SubscribeEvent
public static void onRegistry(Register<Item> event)
{
IForgeRegistry<Item> registry= event.getRegistry();
registry.register(DIRT_BALL);
//注册物品
}
@SideOnly(Side.CLIENT)
private static void registerModel(Item item)
{
//给我们的物品添加贴图的方法
ModelResourceLocation modelResourceLocation = new ModelResourceLocation(item.getRegistryName(), "inventory");
ModelLoader.setCustomModelResourceLocation(item, 0, modelResourceLocation);
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public static void onModelRegistry(ModelRegistryEvent event)
{
//为我们的物品添加贴图
registerModel(DIRT_BALL);
}
}
然后看向我们的目录resources,在这个目录中依次建立assets.你的ModID.blockstates.你的物品ID.json
在json文件里键入以下代码:
{ "forge_marker": 1, "defaults": { "model": "minecraft:builtin/generated", "textures": { "layer0": "fmltutor:items/dirt_ball" } //fmltutor:items/dirt_ball是你的贴图目录 }, "variants": { "inventory": [{ "transform": "forge:default-item" }] } }
当然,还有一种添加贴图的方法
在目录assets.你的ModID下建立一个名为model的目录,再在这个目录里建立item目录,再在这个目录里建立"你的物品ID.json"
然后在这个文件里键入以下代码
{ "parent": "item/generated", "textures": { "layer0": "fmltutor:items/dirt_ball" //fmltutor是modid,dirt_ball是物品id } }
这两种方式推荐第二个,因为以后可以自己制作物品模型(以后我会出教程) 。
最后,在assets目录中建立textures/items/你的物品id.png
贴图一定要是png格式,贴图一定要是png格式,贴图一定要是png格式
贴图一定要是16*16或者32*32的,贴图一定要是16*16或者32*32的,贴图一定要是16*16或者32*32的
最后,打开游戏,输入:
/give @p fmltutor:dirt_ball
你就会发现,你的手里多了一个物品!
但是名字却是item.fmltutor.dirtBall.name
这个时候,在assets目录里新建lang目录,在再新建zh_cn.lang,和en_us.lang键入以下代码:
#en_us英文语言文件
item.fmltutor.dirtBall.name=Dirt Ball //等号两边不要有空格,此注释不要复制
#zh_cn中文语言文件
item.fmltutor.dirtBall.name=粪之精华 //等号两边不要有空格,此注释不要复制
然后再打开游戏,发现你手里拿的东西的名字变成了“粪之精华”
耶!
成功了!
没有成功的也不用灰心,当时作者就是因为“:”写成了“:”导致贴图加载失败,当时找了好半天才找出问题。
本文有任何问题或读者的困惑,欢迎评论区留言,我们不见不散,拜拜!!!