这节我们来在Minecraft日志中输出“Hello, Minecraft Mod World!”
2.1.新建一个主类
新建一个包(这里是com.rycb.etech
),并在其中新建一个类(强烈建议这个类的类名与你的Mod名称相同),这就是Mod的主类了。
src/main/java/com/rycb/etech/EasyTech.java
:
package com.rycb.etech;import com.rycb.etech.init.ModRecipes;import com.rycb.monProxy;import com.rycb.etech.tabs.ETechTab;import com.rycb.etech.util.Reference;import com.rycb.etech.world.ModWorldGen;import net.minecraft.creativetab.CreativeTabs;import net.mon.Mod;import net.mon.SidedProxy;import net.mon.event.FMLInitializationEvent;import net.mon.event.FMLPostInitializationEvent;import net.mon.event.FMLPreInitializationEvent;import net.mon.registry.GameRegistry;/*** @author RYCBStudio*/@Mod(modid = Reference.MOD_ID, name = Reference.NAME, version = Reference.VERSION, acceptedMinecraftVersions = Reference.MC_VERSION)public class EasyTech {@Mod.Instance(Reference.MOD_ID)public static EasyTech instance;@Mod.EventHandlerpublic void preInit(FMLPreInitializationEvent event) {proxy.preInit(event);}@Mod.EventHandlerpublic void Init(FMLInitializationEvent event) {proxy.Init(event);}@Mod.EventHandlerpublic void postInit(FMLPostInitializationEvent event) {proxy.postInit(event);}@SidedProxy(clientSide = Reference.PROXY_CLIENT, serverSide = Reference.PROXY_SERVER)public static CommonProxy proxy;}
package
,import
显而易见,这里就不多赘述。
(其实package
,import
都不用打,IDEA会自动导入的)
读到这里,你可能会发现,在这些代码中,出现了Reference
。这个是什么,后面会慢慢讲述。
modid
指的是该Mod的唯一标识符name
指的是该Mod的名称version
指的是该Mod的版本号acceptedMinecraftVersions
指的是Mod接受的Minecraft版本,当版本不对时,FML会优雅地抛出一个错误而不是继续加载这个Mod
@instance
注解的作用是将生成的该Mod的实例,注册到对应的Mod的id,同时,也可以访问其他Mod的id对应的实例,当然,这里的id要和本Mod的id相同。
2.2.来点代理!
众所周知,Minecraft Mod有客户端(Client)和服务端(Server)两种使用方式,而两种方式的差异足够大得使Mod需要采用两种初始化方式,而两种方式的差异又足够小得使Mod没有必要制作客户端和服务端两个版本。这时代理便起到了区别两种初始化方式的作用。在单机运行时,Minecraft也会生成一个本地服务端。服务端和客户端之间的差异十分复杂,甚至很多都只是经验之谈,然而有一点往往是通用的,服务端的代码,往往客户端都会执行。
这时,主类中的
@SidedProxy(clientSide = "com.rycb.etech.proxy.ClientProxy", serverSide = "com.rycb.monProxy")public static CommonProxy proxy;
就有用了。
Forge会在加载Mod的时候自动使用上面的类名对这个代理进行实例化。(⚠注意⚠:因为这里用到的类不是引用的,而是以字符串形式存在,故若你要修改代理的位置,请不要忘记修改这个!)(有一次我就是因为这个Debug了半天)
新建包proxy
,并新建一个类CommonProxy
:
src/main/java/com/rycb/etech/proxy/CommonProxy.java
:
package com.rycb.etech.proxy;import net.minecraft.item.Item;import net.mon.event.FMLInitializationEvent;import net.mon.event.FMLPostInitializationEvent;import net.mon.event.FMLPreInitializationEvent;/*** @author RYCBStudio* Create Time: /1/28* Location:Easy-Tech/com.rycb.etech.proxy/CommonProxy.java* Use the IntelliJ IDEA*/public class CommonProxy {public void preInit(FMLPreInitializationEvent event) {//TODO}public void Init(FMLInitializationEvent event) {//TODO}public void postInit(FMLPostInitializationEvent event) {//TODO}public void registerItemRender(Item item, int meta, String id) {//TODO}}
也是在这个包下,再新建一个类ClientProxy
,并继承类CommonProxy
:
package com.rycb.etech.proxy;import net.minecraft.client.renderer.block.model.ModelResourceLocation;import net.minecraft.item.Item;import net.minecraftforge.client.model.ModelLoader;import net.mon.event.FMLInitializationEvent;import net.mon.event.FMLPostInitializationEvent;import net.mon.event.FMLPreInitializationEvent;/*** @author RYCBStudio* Create Time: /1/28* Location:Easy-Tech/com.rycb.etech.proxy/ClientProxy.java* Use the IntelliJ IDEA*/public class ClientProxy extends CommonProxy{/*@Overridepublic void preInit(FMLPreInitializationEvent event){super.preInit(event);}@Overridepublic void Init(FMLInitializationEvent event){super.Init(event);}@Overridepublic void postInit(FMLPostInitializationEvent event){super.postInit(event);}*/@Overridepublic void registerItemRender(Item item, int meta, String id) {ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(item.getRegistryName(), id));}}
(这里用块注释(/*
和*/
之间的部分)注释掉了的代码是可用可不用的,可以根据需要酌情添加)
2.3.Mod索引文件(Reference.java
)
看了这么久,你是否还记得主类中的Reference
呢?别急,我们马上实现它。
在com.rycb.etech
包(即根目录)下新建包,名为util
,并继续新建一个类Reference
:
src/main/java/com/rycb/etech/util/Reference.java
:
package com.rycb.etech.util;/*** @author RYCBStudio/Java Department* <p>Create Time: /7/29 16:14</p>* <p>Use the IntelliJ IDEA</p>* <p>Location: EasyTech/com.rycb.etech.util/Reference.java</p>* <h1><center>Reference</center></h1>*/public class Reference {public static final String MOD_ID = "etech";public static final String NAME = "Easy Tech";public static final String VERSION = "0.0.1";public static final String MC_VERSION = "[1.12.2]";public static final String PROXY_CLIENT = "com.rycb.etech.proxy.ClientProxy";public static final String PROXY_SERVER = "com.rycb.monProxy";}
这下再回到EasyTech.java
(主类),导入标红的地方就可以啦~
2.4.完善你的Mod信息
一个Mod的信息在src/main/resources/mcmod.info
中,填写一些信息即可。
比如,本教程的mcmod.info
是这样的:
src/main/resources/mcmod.info
:
[{"modid": "etech","name": "Easy Tech","description": "A simple, convenient, useful and surrealistic industrial mod","version": "${version}","mcversion": "${mcversion}","url": "/RYCBStudio/EasyTech","updateUrl": "","authorList": ["RYCBStudio"],"logoFile": "Etech_logo.png","screenshots": [],"dependencies": []}]
modid
前面已说过,这里就不多赘述。name
是Mod的名称,比如这里就是Easy Tech
(简单科技)description
是Mod的描述,比如这里就是A simple, convenient, useful and surrealistic industrial mod
(一个简单、方便、有用且超现实的工业Mod)version
是你Mod的版本,不建议填写,但若出现以下这种情况,还是建议填写:mcversion
是你的Mod所适用的Minecraft版本,这个不应修改,因为Gradle在构建时会自动注入url
是你的Mod的网站,一般设置为源码存放站点(适用于开源Mod,比如Github链接)或官方网站(适用于闭源Mod和比较大型的Mod)updateUrl
是你的Mod检查更新的网址,若是开源Mod又将源码存放于Github上,就可以填写成/你的名字或组织名字/你自定义的项目名称/tags
authorList
是你的Mod的作者,比如这里就是RYCBStudio一般未被修改的mcmod.info
里面还会有credits
的键,这是荣誉(自己去翻译吧),这其实没什么用,删掉也不会报错logoFile
是你的Mod的Logo文件存放地址,比如这里就是Etech_logo.png
,若你想把它放在不同的文件夹,请使用[相对路径]screenshots
是你的Mod的截图dependencies
是你的Mod的依赖,若是独立Mod,不写即可。
2.5.Hello, Minecraft Mod World!
最后,为了验证我们的Mod是否真的配置好了,我们就在Minecraft控制台中输出“Hello, Minecraft Mod World!”这句话吧!
在你的主类中添加这样一条语句即可:
src/main/java/com/rycb/etech/EasyTech.java(节选)
:
@Mod.EventHandlerpublic void Init(FMLInitializationEvent event) {System.out.println("Hello, Minecraft Mod World!");proxy.Init(event);}
IDEA中直接打sout
即可。
那么,代码写好了,怎么运行呢?
很简单,在IDEA的界面左上角有一个绿色的锤子,旁边就是运行游戏。
结果如下:(找不到的可以在日志中按Ctrl+F查找)