第0周:主类、代理和mod信息

接下来我们要制作第一个mod

主类

每个mod都需要一个主类,这个主类会在forge加载mod时被加载,他也是一个mod的开始。 以mdk给的初始mod为例,mod的主类要有一个@mod注解。

  • PS:@mod注解里面有很多字段,如modidnameversion.....但是只有一个modid是一定要写的。

此时我们的代码可能像是这样

package com.example.examplemod;

import net.minecraftforge.fml.common.Mod;

@Mod(modid = ExampleMod.MODID, name = ExampleMod.NAME, version = ExampleMod.VERSION)
public class ExampleMod
{
    public static final String MODID = "examplemod";
    public static final String NAME = "Example Mod";
    public static final String VERSION = "1.0";
}

mod信息

然后我们需要填写mcmod.info文件,这个文件描述了modmods一览处显示的信息。

此时我们的mcmod.info可能是这样的:

[
{
  "modid": "examplemod",
  "name": "Example Mod",
  "description": "this is a Example mod.",
  "version": "1.0",
  "mcversion": "1.12.2",
  "url": "",
  "updateUrl": "",
  "authorList": ["jihuayu"],
  "credits": "The Forge and FML guys, for making this example",
  "logoFile": "",
  "screenshots": [],
  "dependencies": []
}
]
  • PS:显然有些同学可能已经发现了,这就是一个JSON文档,而最外面居然是一个[],这代码一个jar里面可以放很多mod。(有待实验)
  • ps:此文档已经很显然了,我们不进行解释。

此时我们运行mod,可以看到mods列表里已经有了我们的mod

代理

这样我们就可以正式开始写mod了,首先我们需要给mod主类添加一个保存它的实例的地方。在主类添加如下代码。

    @Mod.Instance(ExampleMod.MODID)
    public static ExampleMod instance;
  • PS:添加代码时记得导入包依赖。

接着,我们需要创建一个代理类。创建Java文件com.example.examplemod.proxy.CommonProxycom.example.examplemod.proxy.ClientProxy

  • PS:ClientProxy继承于CommonProxy

然后,给主类添加代理。在主类添加如下代码。

    @SidedProxy(clientSide = "com.example.examplemod.proxy.ClientProxy",
        serverSide = "com.example.examplemod.proxy.CommonProxy")
    public static CommonProxy proxy;

这样在mod主类加载时proxy就会被自动实例化。

  • PS:ClientProxyCommonProxy并不是缺一不可的,像是有些模组比如X-ray就只有ClientProxy(可能是这样)

最后,我们需要给主类添加加载时调用的方法。在主类添加如下代码。

    public static Logger logger;
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        logger = event.getModLog();
        logger.info("pre");
    }
    @EventHandler
    public void init(FMLInitializationEvent event) {
        logger.info("init");
    }
    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
        logger.info("post");
    }
  • PS:此处的注解@EventHandler代表这是一个事件监听,而FMLPreInitializationEventFMLInitializationEvent代表被监听的事件,这个我们会在之后说到。(理论上这样的)

然后我们在ClientProxy和CommonProxy添加对应调用的方法。 在CommonProxy种添加如下代码。

    public void preInit(FMLPreInitializationEvent event){

    }

    public void init(FMLInitializationEvent event){

    }

    public void postInit(FMLPostInitializationEvent event){

    }

在ClientProxy种添加如下代码。

    @Override
    public void preInit(FMLPreInitializationEvent event){
        super.preInit(event);
    }

    @Override
    public void init(FMLInitializationEvent event){
        super.init(event);
    }

    @Override
    public void postInit(FMLPostInitializationEvent event){
        super.postInit(event);
    }

最后我们在主类的三个监听中加上对于CommonProxy的调用就可以了。代码如下:

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        logger = event.getModLog();
        proxy.preInit(event);
    }

    @EventHandler
    public void init(FMLInitializationEvent event) {
        proxy.init(event);
    }
    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
        proxy.postInit(event);
    }

然后我们就完成了主类的基本框架了。打开游戏测试一下。


果真输出了我们的加载信息。

  • PS:可以在输出栏按住Ctrl+F启动搜索功能。

当然我们也有到目前为止的代码点击此处

results matching ""

    No results matching ""