【Minecraft Modding】创建第一个Item

【Minecraft Modding】创建第一个Item【MinecraftModding】创建第一个Item1.编辑mods.toml文件2.建立目录和包3.编辑Test.java3.注册物品4.定义物品的属性5.runClient在环境创建完成的基础上,就可以开始创建模组了!本文将叙述如何创建一个Item,即Minecraft中的掉落物。1.编辑mods.toml文件首先需要在IntelliJIDEA中载入项目,找到src\main\resources\META-INF\mods.toml文件。该文件包含了这个Mo

大家好,又见面了,我是你们的朋友全栈君。

在环境创建完成的基础上,就可以开始创建模组了!本文将叙述如何创建一个Item,即Minecraft 中的掉落物。

1. 编辑 mods.toml 文件

首先需要在IntelliJ IDEA 中载入项目,找到 src\main\resources\META-INF\mods.toml 文件。该文件包含了这个 Mod 的一些基本信息。
需要修改的以下的一些信息:

modId="test" #mandatory #modId只能由小写字母和数字组成,且必须由小写字母开头
version="1.15.2-1.0.0" #mandatory #自定义,一般写成Minecraft版本号-Mod版本号
displayName="Test Mod" #mandatory #在游戏开始界面展示给用户看的Mod的名称
updateJSONURL="http://vapour.csdn.com" #optional
displayURL="http://vapour.csdn.com/" #optional
logoFile="examplemod.png" #optional
credits="Thanks for bloggers upload Mincraft modding tutorials to YouTube." #optional
authors="Vapour" #optional
description= '''
In this mod, an Item is created.
'''

2. 建立目录和包

在这里插入图片描述
如图所示建立包和目录。
将原来的examplemod.example.com重命名为modId.yourname.com,这是一般的命名规则,不是很重要。将 ExampleMod.java 重命名为任意类名。
assets目录下的子目录则需要严格按照图中的名称命名,否则会出错。

3. 编辑 Test.java

@Mod(MOD_ID) //有了这个注释,这个类就会以Mod的形式被载入。

public class Test
{ 
   
    private static final Logger LOGGER = LogManager.getLogger();
    public static final String MOD_ID = "test"; \\将模组名称定义为一个公共的变量

    public Test() { 
   
        final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
        modEventBus.addListener(this::setup);
        modEventBus.addListener(this::enqueueIMC);
        modEventBus.addListener(this::processIMC);
        modEventBus.addListener(this::doClientStuff);

        ItemInit.ITEMS.register(modEventBus);

        MinecraftForge.EVENT_BUS.register(this);
    }

    private void setup(final FMLCommonSetupEvent event)
    { 
   
        LOGGER.info("HELLO FROM PREINIT");
        LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName());
    }

    private void doClientStuff(final FMLClientSetupEvent event) { 
   
        LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings);
    }

    private void enqueueIMC(final InterModEnqueueEvent event)
    { 
   
        InterModComms.sendTo("examplemod", "helloworld", () -> { 
    LOGGER.info("Hello world from the MDK"); return "Hello world";});
    }

    private void processIMC(final InterModProcessEvent event)
    { 
   
        LOGGER.info("Got IMC {}", event.getIMCStream().
                map(m->m.getMessageSupplier().get()).
                collect(Collectors.toList()));
    }
    @SubscribeEvent
    public void onServerStarting(FMLServerStartingEvent event) { 
   
        LOGGER.info("HELLO from server starting");
    }

    // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD
    // Event bus for receiving Registry Events)
    @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
    public static class RegistryEvents { 
   
        @SubscribeEvent
        public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) { 
   
            // register a new block here
            LOGGER.info("HELLO from Register Block");
        }
    }
}

这里一共有两条事件总线(EventBus),大多数事件的主事件总线位于 MinecraftForge.EVENT_BUS,还有另外一个事件总线,用于特定于mod的事件,位于FMLJavaModLoadingContext.get().getModEventBus()。

以事件作为传入变量的方法,即 【方法(某事件)】的意思是,当某事件发生的时候该方法被调用,也就是将该方法注册到某事件所在的总线。这样的方法前需要加上@SubscribeEvent 注释。

而包含事件处理方法的类称为 EventHandler(事件处理程序),EventHandler 需要注册。
EventHandler 分为非静态事件处理程序(Event Handler)和静态处理程序(Static Event Handler),两者的注册方法有所不同。

例1:非静态事件处理程序

//Event Handler
public class MyForgeEventHandler { 
   
    @SubscribeEvent
    public void pickupItem(EntityItemPickupEvent event) { 
   
        System.out.println("Item picked up!");
    }
}

这是一个非静态事件处理程序,表示当一个实体捡起一个物品的时候该程序被调用。
注册该 Event Handler 的方法是在构造方法中添加:MinecraftForge.EVENT_BUS.register(instance)
或者FMLJavaModLoadingContext.get().getModEventBus().register(instance)

例2:静态事件处理程序

///Static Event Handlers
public class MyStaticForgeEventHandler { 
   
    @SubscribeEvent
    public static void arrowNocked(ArrowNockEvent event) { 
   
        System.out.println("Arrow nocked!");
    }
}

这是一个静态事件处理程序,注册的方式有两种。
第一种和上述方法类似,唯一的不同是不能传入类的实例,而是应该传入类本身。即:
MinecraftForge.EVENT_BUS.register(MyStaticForgeEventHandler.class)
或者FMLJavaModLoadingContext.get().getModEventBus().register(MyStaticForgeEventHandler.class)
第二种方法是在类的前面添加注释, @Mod.EventBusSubscriber(bus=…)
当一个类被注释为 @Mod.EventBusSubscriber 时,该类在创建的时候就会自动注册到MinecraftForge.EVENT_BUS 事件总线。

3. 注册物品

在 mod 包下新建一个名为init的包,在init包下新建ItemiInit.java

public class ItemInit { 
   

    public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, Test.MOD_ID);

    public static final RegistryObject<Item> MAPLE_ITEM = ITEMS.register("maple",
            () -> new Item(new Item.Properties().group(ItemGroup.MATERIALS)));

}

然后再 Test.java 的构造方法中加入

ItemInit.ITEMS.register(modEventBus);

以上代码的大概意思就是,将 ITEMS 注册到modEventBus这条事件总线,这样当该mod加载的时候它就知道会有一些ITEM需要再这时候载入。
在 RegistryObject 方法分别定义载入的物品的性质。这里表示将该物品归类到Minrcraft中物品的MATERIALS这一类别中。

4. 定义物品的属性

在这里插入图片描述
如图所示在正确的位置创建 en_us.json, your_item_name.json, 其中的your_item_name.png一会儿再说。

//en_us.json
{ 
   
  "item.test.maple": "Maple"
}

这应该相当于是一个mapping。这里的”Maple”是在游戏中显示的名称,而前面的”maple”则是代码中的名称。

//your_item_name.json
{ 
   
  "parent": "item/generated",
  "textures": { 
   
    "layer0": "test:items/maple"
  }
}

这些代码格式都是规定的,只要修改 modId 就好了。

your_item_name.png是用来定义物品的纹理的图片,格式有严格的规定,必须是16像素*16像素的图片。制作的方法很简单,先找到一张图片,在ps中将它的大小改到规定的尺寸就好了。
在这里插入图片描述
有了图片之后,将它修改到规定的名称并且放到指定文件夹下。

5. runClient

Mod的基本信息:
在这里插入图片描述
我们创建的物品已经出现游戏中了,并且它的名称是在en_us.json 中定义的”Maple”:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157152.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 中级面试题_java中级面试题[通俗易懂]

    java 中级面试题_java中级面试题[通俗易懂]本帖最后由唯我独赞mo于2015-11-1222:47编辑1、java中wait和sleep有什么区别?多线程条件下如何保证数据安全?答:最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交互,sleep通常被用于暂停执行。2、java中volatile和synchronized有什么区别?1.volatile本质是在告诉jvm当前变量在寄存器(工作内存…

    2022年10月12日
    3
  • 外汇区块链内容平台_组建外汇交易工作室

    外汇区块链内容平台_组建外汇交易工作室在过去几年中,由区块链驱动的比特币对全球财务,特别是外汇行业产生了重大影响。这种创新的加密货币在全球范围内大肆挥霍,并成为头条新闻,很快就能感受到它的存在。虽然比特币很可能继续对外汇行业产生影响,但它实际上是锁定链,这种货币背后的技术,将对外汇行业产生更显着和不可逆转的影响。外汇产业的当前景观外汇市场是全球最大,最具流动性的市场。该行业每周五天,每天24小时开放,主要位于伦敦,而纽约市的每日营…

    2025年10月24日
    4
  • 安装GPU加速的tensorflow 卸载tensorflow

    安装GPU加速的tensorflow 卸载tensorflow安装GPU加速的tensorflow卸载tensorflow&amp;nbsp;一:本次安装实验环境Ubuntu16.04+cuda9.0+cudnn7.0或Ubuntu16.04+cuda8.0+cudnn5.1什么是CUDA呢?简单的来讲它是为了实现GPU运算的平台。我们的tensorflow会调用cuda的接口,利用显卡帮助我们运算程序而CUDNN…

    2022年6月22日
    36
  • mybatis generator配置独立sequence

    mybatis generator配置独立sequence

    2021年5月12日
    114
  • 【题解】PTA-Python题库 浙大版《Python 程序设计》题目集题解索引[通俗易懂]

    【题解】PTA-Python题库 浙大版《Python 程序设计》题目集题解索引[通俗易懂]编程题标号标题第1章-1从键盘输入两个数,求它们的和并输出第1章-2从键盘输入三个数到a,b,c中,按公式值输出第1章-3输出“Python语言简单易学”第2章-1计算11+12+13+…+m第2章-2计算分段函数[1]第2章-3阶梯电价第2章-4特殊a串数列求和第2章-5求奇数分之一序列前N项和第2章-6求…

    2025年7月3日
    2
  • Linux系统如何查看版本信息

    Linux系统如何查看版本信息

    2021年10月14日
    67

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号