# :-: 主类,代理和Mod信息
*****
在src.main.java里面创建一个包net.你的名称.Mod名称如net.xiaobang.bm或者com.你的名称.Mod名称如com.xiaobang.bm,并在其中新建一个类(强烈建议类名称与mod名称相符,当然其他也好),那么这就是你Mod的主类了。
把以下代码抄进mod的主类,下列代码中的//代表注释,有解释说明的作用,;符合代表一条语句的结束
`src/main/java/net/xiaobang/bm/bm.java`(这个不要抄,这是文件位置)
~~~java
package net.xiaobang.bm;//package是导入包,这个你们应该都知道把(汗颜.jpg),后面是包的位置,自己写你自己包的位置啊
import net.xiaobang.bm.common.CommonProxy;//这个类暂时不存在先不要管它
import cpw.mods.fml.common.Mod;//import是导入类或导入整个包,这个也该都知道把,后面也是位置
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
@Mod(modid = "bm",name = "bm",version="1.0")//modid是Mod的唯一标识符(ID),name是Mod的名称,version是Mod的版本
public class bm{//主类
@Instance//前面有加@的是注解,这个作用是将生成该mod的实例注册到对应mod的id里面,也可以访问其他mod的,要注意这里的id和此mod的id相同
public static bm instance = new bm();
@EventHandler//在Forge找到主类后,会检查主类含有这个注解的函数,并通过函数的参数类型判断应该何时调用这些函数
public void preInit(FMLPreInitializationEvent event){//在所有mod初始化之前调用此函数,这里应该加载配置文件,实例化方块和物品,并注册它们
}
@EventHandler
public void Init(FMLInitializationEvent event){//在此mod初始化时调用此函数,这里应该注册合成表和烧练系统,并向其他mod发送交互信息,注意不要在这里注册方块和物品等等操作,forge支持在preInit函数执行
}
@EventHandler
public void postInit(FMLPostInitializationEvent event){//在所有mod初始化后调用此函数,这里应该接收其他mod发送的交互信息,并完成设置mod
}
}
~~~
代理?我们知道,Minecraft(我的世界)有客户端和服务端两种使用方式,两种方式既足够大又足够小,使得Mod需要采取两种初始化方式,两种方式又使得Mod没必要制作客户端和服务端两种版本。这时候代理便起到了很大的作用,它会区别两种初始化方式。在单机客户端中,Minecraft也会生成一个本地服务端。客户端和服务端之间的差异十分复杂,其中服务端的代码,客户端往往会执行。
接下来在主类添加以下代码:
`src/main/java/net/xiaobang/bm/bm.java`
~~~java
@SidedProxy(clientSide = "net.xiaobang.bm.client.ClientProxy", //ClientProxy待会创建在src/main/java/net/xiaobang/bm/client目录下
serverSide = "net.xiaobang.bm.common.CommonProxy")//CommonProxy待会创建在src/main/java/net/xiaobang/bm/common目录下
public static CommonProxy proxy;
~~~
当Forge在加载Mod的时候会自动使用上面的类名对这个代理进行实例化。
接下来我们要创建ClientProxy和CommonProxy
新建包net.xiaobang.bm.common,并在里面新建类CommonProxy:
`src/main/java/net/xiaobang/bm/common/CommonProxy.java`
~~~
package net.xiaobang.bm.common;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
public class CommonProxy
{
public void preInit(FMLPreInitializationEvent event)
{
}
public void init(FMLInitializationEvent event)
{
}
public void postInit(FMLPostInitializationEvent event)
{
}
}
~~~
再新建包net.xiaobang.bm.client,并在里面新建类ClientProxy,并继承类CommonProxy:
`src/main/java/net/xiaobang/bm/client/ClientProxy.java`
~~~
package net.xiaobang.bm.client;
import net.xiaobang.bm.common.CommonProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
public class ClientProxy extends CommonProxy
{
@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);
}
}
~~~
主类的调整(不要直接复制粘贴把主类的代码搞没了):
`src/main/java/net/xiaobang/bm/bm.java`
~~~
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
proxy.preInit(event);
}
@EventHandler
public void init(FMLInitializationEvent event)
{
proxy.init(event);
}
@EventHandler
public void postInit(FMLPostInitializationEvent event)
{
proxy.postInit(event);
}
~~~
写到这里(复制粘贴),你现在应该知道当服务端运行时,CommonProxy类的函数会被调用,如果是客户端,ClientProxy的函数会被调用,这样我们就可以实现服务端和客户端之间的差异。
最后就是完善Mod信息了(啊激动终于可以偷懒了)
Mod的信息一般都是在一个叫mcmod.info的文件夹里面,它通常保存在src/main/resources/里面,现在以文本的形式打开它来完善你的mod信息。(注意version和mcversion不应该去修改,它们会在Gradle构建mod的时候自动替换掉,如果真的要改应该更改build.gradle)
如本教程的mcmod.info是酱紫的:
~~~
[
{
"modid": "bm",
"name": "Bang's First Mod",
"description": "Mod for DBC",
"version": "${version}",
"mcversion": "${mcversion}",
"url": "",
"updateUrl": "",
"authorList": ["xiaobang"],
"credits": "Notch, Cpw, etc.",
"logoFile": "",
"screenshots": [],
"dependencies": []
}
]
~~~