Minecraft Mod 开发:3-第一个物品

今天我们来添加一个物品。

3.1.基础部分

在主包com.rycb.etech下新建一个包items,然后再新建一个包,名为base,作为基础物品模板存放的包。
在上述包com.rycb.etech.items.base下新建一个类ItemBasicBase,并继承Item类,实现IHasModel接口,作为最基础的基础物品类:
src/main/java/com/rycb/etech/items/base/ItemBasicBase.java

package com.rycb.etech.items.base;

import com.rycb.etech.EasyTech;
import com.rycb.etech.init.ModItems;
import com.rycb.etech.util.IHasModel;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;

public class ItemBasicBase extends Item implements IHasModel {
    /**
     *
     * @param UnlocalizedName 未初始化名
     * @param RegistryName 注册名
     * @param tab 创造模式物品栏
     */
    public ItemBasicBase(String UnlocalizedName, String RegistryName, CreativeTabs tab) {
        setUnlocalizedName(UnlocalizedName);
        setCreativeTab(tab);
        setRegistryName(RegistryName);
        ModItems.ITEMS.add(this);
    }

    @Override
    public void registerModels() {
        EasyTech.proxy.registerItemRender(this, 0, "inventory");
    }
}

  • 这里的UnlocalizedName是物品的未本地化名称,在i18n中会有用
  • setCreativeTab是用来指定物品的创造模式物品栏
  • setRegistryName是用来指定物品的注册名

那么,创造模式物品栏有哪些呢?
Minecraft里内置的有

CreativeTabs.DECORATIONS //装饰性方块
CreativeTabs.BREWING //酿造
CreativeTabs.COMBAT //战斗
CreativeTabs.BUILDING_BLOCKS //建筑方块
CreativeTabs.FOOD //食物
CreativeTabs.MATERIALS //杂项
CreativeTabs.MISC //也是杂项
CreativeTabs.REDSTONE //红石
CreativeTabs.TOOLS //工具
CreativeTabs.TRANSPORTATION //交通

当然,我们还可以自制 创造模式物品栏

在这一步,读者可能会发现这里会有两个被IDEA标红的内容, IHasModelModItems。这些是什么呢?一个是Mod的重要元素,一个是Mod的重要元素。
util包中新建一个接口(注意,是接口)IHasModel
interface
interface

src/main/com/rycb/etech/util/IHasModel

package com.rycb.etech.util;


public interface IHasModel {
    void registerModels();
}

之后就不用管它了。
接下来,在com.rycb.etech包(根目录)下新建一个包,命名为init,在其中新建一个类ModItems,用于初始化Mod物品。
我们来做一个硫磺吧!
src/main/java/com/rycb/etech/init/ModItems.java

package com.rycb.etech.init;

import net.minecraft.item.Item;

import java.util.ArrayList;
import java.util.List;

/**
 * @author RYCBStudio/Java Department
 * <p>Create Time: 2022/8/5 16:21</p>
 * <p>Use the IntelliJ IDEA</p>
 * <p>Location: EasyTech/com.rycb.etech.init/ModItems.java</p>
 * <h1><center>ModItems</center></h1>
 */
public class ModItems{
    public static final List<Item> ITEMS = new ArrayList<Item>();
    /**
     * Ores
     */
    //硫
    public static final Item SULFUR = new ItemBasicBase("sulfur", "sulfur", EasyTech.ETECH_TAB);
}

新建一个类进行初始化的原因是当你的物品越来越多,如果所有的注册过程都直接在CommonProxy类中进行,随着注册的对象越来越多,这些注册的对象会越来越难以管理。换句话说,这体现了代码模块化的原则。
首先,我们要新建一个数组来存放这些物品:
src/main/java/com/rycb/etech/init/ModItems.java(部分):

public static final List<Item> ITEMS = new ArrayList<Item>();

其次,是初始化这个物品:
src/main/java/com/rycb/etech/init/ModItems.java(部分):

public static final Item SULFUR = new ItemBasicBase("sulfur", "sulfur", EasyTech.ETECH_TAB);

ItemBasicBase的这些在前面的代码中已说过,这里不多做赘述。
然后,就是来注册这些物品。

3.2.注册物品

在上一个部分中,我们已经实例化了物品。接下来,就是注册他们。
com.rycb.etech.util包下新建一个包,命名为handlers,在其中新建一个类RegistryHandler,用于注册Mod物品。
src/main/java/com/rycb/etech/util/handlers/RegistryHandler.java:

package com.rycb.etech.util.handlers;


import com.rycb.etech.init.ModItems;
import com.rycb.etech.util.IHasModel;
import net.minecraft.item.Item;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@EventBusSubscriber
public class RegistryHandler {


    @SubscribeEvent
    public static void onItemRegister(RegistryEvent.Register<Item> event) {
        event.getRegistry().registerAll(ModItems.ITEMS.toArray(new Item[0]));
    }

    @SubscribeEvent
    public static void onModelRegister(ModelRegistryEvent event) {
        for (Item item : ModItems.ITEMS) {
            if (item instanceof IHasModel) {
                ((IHasModel) item).registerModels();
            }
        }
    }
}

这里用到了一个for循环,来全部注册ModItems类里面的物品。
好,现在运行游戏(不会吧,你居然还不知道怎么运行游戏?),就可以在你设置的创造模式物品栏里找到你的物品了~。

3.3. 紫…黑块

可以看到,你手上的物品,现在还什么都没有,只是一个紫黑块,这是因为你没有添加模型和材质。模型的作用是保证你手里的物品是一个长方体,而材质的作用,就是给这个长方体上色。
在资源文件夹resources中,新建一个目录assets/etech,作为Mod的资源文件夹:assets
resources
assets.etech目录中新建一个目录model,用于存放Mod各种东西的模型:
models
(建议先新建一个.keep文件,以避免出现这种情况:)(懂的都懂)
attention
models目录中新建一个目录item,在其中新建一个文件sulfur.json你注册的物品名.json)
json_1

json_2
或者你也可以像我一样直接写个模板文件。(这里不多做赘述)(传送门)
json_3
在其中写这样一些语句:
src/main/resources/assets/etech/models/item/sulfur.json

{
  "parent": "item/generated",
  "textures": {
    "layer0": "etech:items/sulfur"
  }
}

将其中的etech改为你的Mod id,sulfur改为你的物品注册名就可以了~
接着,放入材质:(材质文件夹是src/main/resources/assets/etech/textures,和上述一样操作就可以了)
物品材质是在textures/items目录下哦
比如,我写的是硫磺,就是这个材质:sulfur
⚠注意⚠:MC里面的物品材质绝大多数都是16x16或2nx2n的,请尽量使用16x16的!
大家还记得第二章中的ClientProxy中重写的CommonProxyregisterItemRender()方法吗?它就是来加载物品渲染的。

@Override
public void registerItemRender(Item item, int meta, String id) {
    ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(item.getRegistryName(), id));
}

运行游戏,你就能看到你上了材质的物品了!

3.4.item.sulfur.name?

可以看到,你手上的物品,虽说有了材质,可名字却怪怪的。这是什么呢?item.sulfur.name是你的物品的UnlocalizedName(未本地化名称),我们需要i18n来进行本地化。
下面内容来自来自Wikipedia

本地化则是指当移植软件时,加上与特定区域设置有关的信息和翻译文件的过程。国际化是指在设计软件,将软件与特定语言及地区脱钩的过程。当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正。

在你的资源文件夹assets.etech目录下,新建一个目录lang,作为Mod的语言文件。
英语是全球最广泛使用的语言,Minecraft的默认使用语言也是英语,所以很明显地,我们应该首先对英语提供支持。
So,在lang目录下新建文件en_us.lang,注意等号的两边没有空格:
src/main/resources/assets/etech/lang/en_us.lang:

item.sulfur.name=Sulfur

item.sulfur.name便是硫磺的名称,这个名称由该物品的setUnlocalizedName方法设置。
如果搞不清楚语言文件等号前面应该使用什么,可以先不写,在游戏中看一看,然后把不正常的部分写入语言文件。

当然,作为面向中国人制作的Mod,中文语言文件还是要有的。在同一个文件夹下新建文件zh_cn.lang

item.sulfur.name=硫磺

当然,你也可以添加其他语言文件,如繁体中文(zh_tw)等,语言文件的文件名通常按照“语言_国家(地区)”代码标准。

最后说一句,语言文件一定要使用UTF-8编码。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要编写一个Java语言的Minecraft mod,使得当玩家受伤时会自动打开创造模式,可以按照以下步骤进行: 1. 下载并安装Minecraft Mod开发工具,例如Eclipse或IntelliJ IDEA。 2. 创建一个新的Minecraft mod项目。 3. 在mod的代码中,使用Minecraft Forge提供的事件监听器来检测玩家受伤事件。 4. 在受伤事件发生时,通过Minecraft Forge提供的API将玩家的游戏模式切换到创造模式。 以下是一些示例代码来实现此功能: ```java import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventHandler; @Mod(modid = "mymod", version = "1.0") public class MyMod { @EventHandler public void init(FMLInitializationEvent event) { MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void onLivingHurt(LivingHurtEvent event) { if (event.getEntity() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntity(); if (player.getHealth() - event.getAmount() <= 0) { player.setGameType(GameType.CREATIVE); } } } } ``` 上述代码中,我们注册了一个事件监听器来监听实体受伤事件。在事件处理程序中,我们检查实体是否为玩家,并检查玩家是否会在此次伤害事件中死亡。如果是,则将玩家的游戏模式切换到创造模式。请注意,我们使用了Minecraft Forge提供的API来设置玩家的游戏模式。 完成上述步骤后,编译并打包你的mod,然后将它安装到Minecraft游戏中。当你在游戏中受伤时,你的游戏模式将会自动切换到创造模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值