【Minecraft Modding】创建第一个Item

【Minecraft Modding】创建第一个ItemMinecraft Modding 创建第一个 Item 1 编辑 mods toml 文件 2 建立目录和包 3 编辑 Test java 3 注册物品 4 定义物品的属性 5 runClient 在环境创建完成的基础上 就可以开始创建模组了 本文将叙述如何创建一个 Item 即 Minecraft 中的掉落物 1 编辑 mods toml 文件 首先需要在 IntelliJ

【Minecraft Modding】创建第一个Item

1. 编辑 mods.toml 文件

2. 建立目录和包

3. 编辑 Test.java

3. 注册物品

4. 定义物品的属性

5. runClient

在环境创建完成的基础上,就可以开始创建模组了!本文将叙述如何创建一个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 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 ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, Test.MOD_ID);

public static final RegistryObject 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”:

编程小号
上一篇 2025-09-04 17:01
下一篇 2025-04-10 17:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/141777.html