【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)
上一篇 2022年7月8日 下午4:46
下一篇 2022年7月8日 下午4:46


相关推荐

  • Redis 存取 JSON 数据

    Redis 存取 JSON 数据Redis 存取 JSON 数据本文来自网络 本人稍加修改关于下面 rejson 安装的修正 rejson 安装我的按照下面的不行我是下载 rejson 后 直接 make 然后在 src 下发现有一个 rejson so 我直接用的这个另外我启动的时候也不显示 rejson 信息 但是启动 redis 后可以存取 json 格式 1 简介 2 示例 2 1 基础操作 2 2json

    2026年3月19日
    2
  • https的原理「建议收藏」

    https的原理「建议收藏」看完这篇文章,我奶奶都懂了https的原理|一起编程网 …

    2025年9月25日
    7
  • 在Linux上恢复误删除的文件或目录

    在Linux上恢复误删除的文件或目录误删除 Linux 系统文件了 不用急 本文将给你一个恢复 Linux 文件的方法 让你轻松应对运维中的各风险问题 方法总比问题多 说在前面的话针对日常维护操作 难免会出现文件误删除的操作 大家熟知 Linux 文件系统不同 win 有回收站 删除后的文件可以到垃圾箱寻回 要知道 Linux 文件修复比较费劲 网络上面的文档也是五花八门 所以本次研究一种比较靠谱的文件和目录恢复方法 也给维护人员留一条后路 分析对比 debugfs testdisk6 14 extundelete 对比各自官网介绍和操作说明本次决定研

    2026年3月18日
    2
  • 内核置顶[置顶] Linux 内核定时器

    内核置顶[置顶] Linux 内核定时器

    2021年8月24日
    62
  • 少儿编程mta证书_少儿编程项目计划书

    少儿编程项目计划书未来30年是人工智能的伟大时代,学编程会让孩子的未来充满更多可能性。此项目是针对小学生,主要是以培养学习兴趣,接受最基本的编程概念,并能够通过学到的知识完成一些小的课题,激发和培养学生的编程思维。在学习的过程中,主要通过实体的编程玩具,学会构建自己的作品,比如学习编程语言,机器人等课程。本项目提供多维度的少儿编程培训服务,包括编辑机器人研发、在线编程教育培训、线下培训等。一、线下…

    2022年4月8日
    43
  • stata15无法识别调用plus外部命令,报错:command XXX is unrecognized如何解决?

    stata15无法识别调用plus外部命令,报错:command XXX is unrecognized如何解决?stata15无法识别调用plus外部命令,报错:commandXXXisunrecognized如何解决?解决办法:查看stata文件夹下是否有profile.do文件;如果没有,新建profile.do文件;新建的方法可以打开stata,打开do-file编辑器;内容写为(参考连玉君老师Stata:外部命令的搜索、安装与使用):adopath+“D:\应用软件\Stata15\ado\plus”sysdirsetPLUS“D:\应用软件\Stata15\

    2022年10月20日
    10

发表回复

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

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