# :-: 主類,代理和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": []
}
]
~~~