【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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vdbench(一)

    vdbench(一)vdbench是一个I/O工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试和基准测试。1.安装需要安装jdk到oracel下载vdbench504;不需要安装,直接以绝对路径执行就可以建议解压到/var/www/html/vdbench#unzipvdbench504-d/var/www/html/vdb…

    2022年5月19日
    96
  • GridView出现不完整–GridView删除滚动条

    GridView出现不完整–GridView删除滚动条

    2021年9月9日
    72
  • 【媒体热点资讯】2013eoe移动开发者大会圆满落幕

    【媒体热点资讯】2013eoe移动开发者大会圆满落幕

    2021年8月26日
    74
  • 基于Android点餐APP系统的设计与实现[通俗易懂]

    基于Android点餐APP系统的设计与实现[通俗易懂]假如您对此内容感兴趣,你可以加QQ群:868378707(毕业设计online);搜索微信小程序“毕设编程Online”,免费获取源码;基于Android的点餐系统由服务器端和安卓客户端两部分组成。服务器端供餐厅工作人员使用,主要实现菜品信息管理;安卓客户端由餐厅客户使用,主要实现浏览菜品,点餐等功能。主要内容如下:服务器端:1:用户登录:用户在使用系统前先进行登录功能。2:菜品信息管理:包括菜品名称,菜品类别,菜品价格,菜品图片,菜品介绍,菜品发布等信息等增删改查功能3:…

    2022年6月19日
    28
  • python浮雕图片_python图片处理PIL

    python浮雕图片_python图片处理PIL一、PIL介绍PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinatesystem)、调色板(palette)、信息(info)和滤波器(filters)1、通道每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对…

    2022年6月20日
    28
  • idea2021.8.2 激活码【永久激活】[通俗易懂]

    (idea2021.8.2 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~BI7JCUH1TG-eyJsaWNlb…

    2022年3月22日
    63

发表回复

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

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