前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Minecraft Modding】创建第一个Item

【Minecraft Modding】创建第一个Item

作者头像
全栈程序员站长
发布2022-09-08 10:22:21
3700
发布2022-09-08 10:22:21
举报
文章被收录于专栏:全栈程序员必看

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

【Minecraft Modding】创建第一个Item

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

1. 编辑 mods.toml 文件

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

代码语言:javascript
复制
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

代码语言:javascript
复制
@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:非静态事件处理程序

代码语言:javascript
复制
//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:静态事件处理程序

代码语言:javascript
复制
///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

代码语言:javascript
复制
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 的构造方法中加入

代码语言:javascript
复制
ItemInit.ITEMS.register(modEventBus);

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

4. 定义物品的属性

如图所示在正确的位置创建 en_us.json, your_item_name.json, 其中的your_item_name.png一会儿再说。

代码语言:javascript
复制
//en_us.json
{ 
   
  "item.test.maple": "Maple"
}

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

代码语言:javascript
复制
//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.cn/157152.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【Minecraft Modding】创建第一个Item
  • 1. 编辑 mods.toml 文件
  • 2. 建立目录和包
  • 3. 编辑 Test.java
  • 3. 注册物品
  • 4. 定义物品的属性
  • 5. runClient
相关产品与服务
事件总线
腾讯云事件总线(EventBridge)是一款安全,稳定,高效的云上事件连接器,作为流数据和事件的自动收集、处理、分发管道,通过可视化的配置,实现事件源(例如:Kafka,审计,数据库等)和目标对象(例如:CLS,SCF等)的快速连接,当前 EventBridge 已接入 100+ 云上服务,助力分布式事件驱动架构的快速构建。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档