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
    评论
DZH/FXJ引用外部数据的DLL公式FMLDATA.DLL(DZH/FXJ引用外部数据的DLL公式)免费下载 一、DLL主要功能: 适用平台: 大智慧新一代V2.0(仅支持以分析家为内核的DZH版本,不支持DZH经典版本)、分析家(在V6.0上测试通过,在其它版本用应该也没问题) ,以下简称DZH。 主要功能: 1)在DZH公式中读取外部数据(这里称为FMLDATA文件数据,该数据文件格式见下文)。例如,要在DZH公式中读入第三方的数据并与DZH其它数据一起进行分析,我们可以首先将数据写入FMLDATA文件,然后在DZH公式中象引用DZH本身直接引用。 2)将DZH序列数据写入外部文件。例如,我们要将DZH现有数据或者自己编写的公式的计算结果导出来,在EXCEL等外部软件进一步处理。(与FinDataTools工具的区别是:FMLDATA.DLL导出的是DZH原始数据或公式计算结果,而FinDataTools直接从DZH/FXJ读取数据。) 适用对象:需要读取自己定制的外部数据而又不想自己用C/C++写接口的DZH/FXJ用户。 声明:本DLL不含任何恶意代码,但使用风险自担。 二、下载:点击这里下载(近100KB)。 三、安装方法: 1、下载后用WINRAR解压得到FMLDATA.DLL和FMLDATA.TXT两个文件。 2、将FMLDATA.DLL复制到DZH2安装目录,一般为c:\dzh2。如果是FXJ一般为c:\superstk等. 3、在DZH安装目录下建立一个名为FMLDATA的文件夹,如c:\dzh2\fmldata(这一步是必须的,否则无法使用)。DLL公式读取或写入的数据都在这个文件夹。 至此,安装完成,下面就是如何使用了。 四、使用方法: FMLDATA.DLL提供了两个公式/函数,一个用于写数据,一个用于读数据。 (一)写数据: 写数据的公式为: "FMLDATA@WRITE"(X,N) 第一个参数X是个序列(指标),可以是CLOSE、OPEN等,也可以是公式中的中间计算结果,要求序列值在浮点型值范围之内,一般在正负20亿之间,如果不在该范围之内,建议改变单位;第二个参数N是个数值,表示序列编号,例如我们把CLOSE保存为第4个序列,N为4。 将数据保存为外部文件时,根据当前股票代码、序列编号、分析周期这三个信息在fmldata文件夹生成形式为“XXXXXX.N.YYY”的文件。其中, XXXXXX为股票代码,如深发展为000001等,由于沪市指数代码与深市股票代码重复,所以沪市指数代码在原代码前加1,例如上证综指为000001,则这里的XXXXXX为1000001(7位);N是编号,由用户自己指定,应为大于0的整数;YYY为分析周期,如果是日线数据,则YYY=DAY,分笔、1分钟、5分钟、15分钟、30分钟、60分钟、周、月、多日、季度、半年、年的值分别为TICK、MIN1、MIN5、MIN15、MIN30、MIN60、WEEK、MONTH、NDAYS、QUARTER、SEMIYEAR、YEAR。 举例: 例1、将收盘价写入到外部文件 新建一公式,设名为TESTW,输入 V1:"FMLDATA@WRITE"(C,4); ,在深发展(000001)日K线状态下,键入TESTW,在指标区查看公式TESTW结果的同时,将在FMLDATA目录生成一个名为000001.4.DAY的二进制文件(这个文件如何在其它软件中使用见下文),如果同名文件已经存在,将覆盖。如果我们键入000002,切换到万科日K线,将生成名为000002.4.DAY的文件;如果切换到上证指数,则生成1000001.4.DAY文件。 注意:如果是DZH,写数据时请将光标移至最后一根K线,否则只保存光标之前的数据,FXJ好象没有这个问题。光标一动,数据就重新写入一次。 例2、将收益率保存到外部文件 建一公式: A:=C/REF(C,1)-1; B:"FMLDATA@WRITE"(A,101); 请在还权状态下使用该公式。如果处于000001的日K线图,则生成000001.101.DAY。 例3、将周收益率保存到外部文件在例2基础上,将“分析周期”改为“周线图”,则周收益率保存到000001.101.WEEK文件。 例4、将沪市A股所有股票的收盘价、成交量保存到外部文件 建一名为TESTCV公式: A:"FMLDATA@WRITE"(C,4); B:"FMLDATA@WRITE"(V/10000,5); 保存后。选择“条件选股”,选股指标选择“TESTCV”,分析周期选“日线”,选中“使用除权后数据”,指标线选“B”,条件选“大于0”,选股范围选择“上证A股”,执行选股,将生成600000.4.DAY、60

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值