大家好,又见面了,我是你们的朋友全栈君。
在环境创建完成的基础上,就可以开始创建模组了!本文将叙述如何创建一个Item,即Minecraft 中的掉落物。
首先需要在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.
'''
如图所示建立包和目录。 将原来的examplemod.example.com重命名为modId.yourname.com,这是一般的命名规则,不是很重要。将 ExampleMod.java 重命名为任意类名。 assets目录下的子目录则需要严格按照图中的名称命名,否则会出错。
@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 事件总线。
在 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这一类别中。
如图所示在正确的位置创建 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中将它的大小改到规定的尺寸就好了。
有了图片之后,将它修改到规定的名称并且放到指定文件夹下。
Mod的基本信息:
我们创建的物品已经出现游戏中了,并且它的名称是在en_us.json 中定义的”Maple”:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157152.html原文链接:https://javaforall.cn