主类、Mod信息与代理

mcmod.info

你的Mod开发环境已经构建完成,接下来我们编辑mcmod.info。此时你看到的内容应该是这样的:
image.png(不知道为啥,用代码块不能换行,所以只能用图片了)

第3行"modid"是这篇介绍所链接的modid。如果这个Mod没有加载,那么这篇介绍将会被忽略(必填)(注意:在之后我们将统一用ExampleMod来作为modid)

第4行"name"是Mod显示的名字(必填)

第5行"description"是对Mod的简单介绍,一般一两句即可

第6行"version"是这个Mod的版本,通常以"MC版本-MOD主版本号.API主版本号.次版本号.修订号"来命名版本

第7行"url"是这个Mod主页的链接

第8行"updateUrl"有定义但没有实际用途,现在被updateJSON取代了

第9行"authorList"是Mod作者的列表

第10行"credits"可以包含任何你想感谢的东西

以上以及更多内容参考自Forge中文文档


Mod主类

现在mcmod.info已经编辑好了,接下来我们编辑主类。
打开com.example.examplemod.ExampleMod类,可以看到里面有许多东西,我们边编码边来分析。


什么是@Mod?

这是一个注解,它会告诉Forge Mod Loader(FML)这个类(Class)是一个Mod的入口点。它可以包含不同的关于这个mod的元数据(Metadata)。它也同样指示了这个类将会收到 @EventHandler 事件。

@Mod : 如果一个类被打上这个注解,那么这个类将会成为整个Mod的主类,所有代码都先从这个类开始执行。
(如果有学过Java肯定知道主类要有一个main方法,但是Forge Mod使你不需要这个方法也能直接启动,因为Forge Mod开发过程中真正的主类其实是GradleStartGradleStartServer))
下面是@Mod的属性表:
| 属性 | 类型 | 默认值 | 简介 | | ------- | ------ | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | modid | String | 必填 | 指定mod的唯一标识符。 它必须是小写的,并且将被截断为64个字符的长度。 | | name | String | "" | 指定mod的对用户友好的名称。 | | version | String | "" | 指定mod的版本. 它只能是被点分隔开的数字, 应该符合 语义化版本 标准。 即使useMetadata 设为 true, 也建议在这里设置版本 |


开始正式编写Mod

首先在private static Logger logger;这行代码前面打上@Instance注解,括号内填上ExampleMod.MODID
然后private static ExampleMod instance
这样就保存了ExampleMod的实例。

接着创建两个新类,分别是com.example.examplemod.proxy.ClientProxycom.example.examplemod.proxy.CommonProxy
CommonProxy中添加如下代码:

 public void preInit(FMLPreInitializationEvent event) {

 }
 public void init(FMLInitializationEvent event) {

 }

而在ClientProxy中添加如下代码:

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

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

注意:ClientProxy继承于CommonProxy


你以为做完了吗?No, 我们还有一些事情要做。
private static ExampleMod instance;的下面,
private static Logger logger;的上面打上@SidedProxy注解,并分别指定
clientSidecom.example.examplemod.proxy.ClientProxy
serverSidecom.example.examplemod.proxy.CommonProxy
你还需要在主类的preInitinit方法中分别写上proxy.preInit(event);proxy.init(event);
现在最基本的已经完成了,不过你还可以添加一些东西,比如在preInit方法中写上logger.info("preInit");,这样在Mod预加载阶段时,你可以在控制台里看到"preInit"。
每一次做完了一些东西,当你认为可以了之后,可以运行Minecraft Client以查看效果。


示例代码

ExampleMod.java

package com.example.examplemod;

import com.example.examplemod.proxy.CommonProxy;
import net.minecraft.init.Blocks;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger;

@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.Instance(ExampleMod.MODID)
private static ExampleMod instance;

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

@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
    logger = event.getModLog();
    logger.info("preInit");
    proxy.preInit(event);
}
@EventHandler
public void init(FMLInitializationEvent event)
{
        logger.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName());
        proxy.init(event);
}
}

CommonProxy.java

package com.example.examplemod.proxy;

import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

public class CommonProxy {
public void preInit(FMLPreInitializationEvent event) {
}
public void init(FMLInitializationEvent event) {
}
}

ClientProxy.java

package com.example.examplemod.proxy;

import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

public class CommonProxy {
public void preInit(FMLPreInitializationEvent event) {
}
public void init(FMLInitializationEvent event) {
}
}

下一期我们将添加物品并为其进行添加一些功能