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


相关推荐

  • 关于gsync 和 freesync[通俗易懂]

    关于gsync 和 freesync[通俗易懂]最近我的很多朋友都在问我怎么开启gsync以及gsync的作用还有些小伙伴的台式机有freesync我就随便说下要是有不对的希望各位大佬指正首先我们先了解下垂直同步:1、什么是垂直同步?普通情况下显卡是逐行扫描到显示器,这就导致前面一帧还没扫完下一帧就上去了,因此会产生撕裂,垂直同步则是让显卡去适应显示器,即显示器每次刷新的时候显卡再把算好的图像传给显示器。…

    2022年5月1日
    407
  • macbookpro双系统分区_macbook双系统分区调整

    macbookpro双系统分区_macbook双系统分区调整一些前序知识:1、Mac系统不是Intel的i386架构,没有Bios,但是有EFI,通过EFI管理系统的引导。2、Mac系统的分区表采用GUID,不是MBR。因此如果硬盘完全交给windows控制,会导致Mac系统无法启动。3、任何对MBR的强行操作,会导致已经装好的双系统引导失效。4、Mac的EFI分区会用GPT锁定,不要尝试去操作这个分区。我们…

    2022年10月5日
    3
  • Java工程师要求_工程师到高级工程师要几年

    Java工程师要求_工程师到高级工程师要几年从事java后端开发4年及以上,具有根据业务需求进行独立设计的能力 熟练使用Spring及SpringMVC开发 熟练使用常用持久层框架Mybatis\Hibernate 熟悉java多线程及并发线程池使用 熟练使用Mysql基本操作,有一定sql优化经验 有使用Memcached/redis框架其中之一进行缓存开发的经验 会简单使用js/jquery等常用功能进行前端页面开发  、本科及以上学历…

    2022年4月20日
    58
  • word文档页码不连续编号怎么办_怎样给论文加页码

    word文档页码不连续编号怎么办_怎样给论文加页码论文页码设置大家好!今天和大家分享两个和页码有关的技巧:大家好!今天和大家分享两个和页码有关的技巧:为分栏页面分别设置页码对纵向文档中的横向表格设置页码page域及域代码操作基础技巧01分栏页面像下面这个文档,对页面分成了两栏,如果现在想给每一栏都添加一个页码序号,也就是在第1页的左右两栏分别显示第1页和第2页,在第2页的左右两栏分别显示第3页和第4页,这样的效果该如何设置呢?我们先在页脚中设置好…

    2025年7月29日
    4
  • python读取图片文件名_python 获取图片并自动命名保存

    python读取图片文件名_python 获取图片并自动命名保存#-*-coding:UTF-8-*-#导入第三方库importurllibfrombs4importBeautifulSoupimportrequestsimportosimporttimeimportrandom#获取文件夹,如果文件夹不存在则创建新文件夹ifos.path.isdir(‘E://biaoqing//’):passelse:os.mkdir(‘E…

    2025年9月5日
    19
  • int对应的jdbctype_jdbctype null combination

    int对应的jdbctype_jdbctype null combinationjava.sql.Types值Java类型IBMDB2OracleSybaseSQLInformixIBMContentManagerBIGINTjava.lang.longBIGINTNUMBER(38,0)BIGINTBIGINTINT8DK_CM_BIGINTBINARYbyte[]

    2022年10月20日
    4

发表回复

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

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