Minecraft(我的世界)中文论坛
标题: 利用Forge API开发联机MOD【基础篇】【第二章】
作者: yuxuanchiadm 时间: 2012-7-31 19:44
标题: 利用Forge API开发联机MOD【基础篇】【第二章】
本帖最后由 yuxuanchiadm 于 2013-5-30 03:45 编辑
利用Forge API开发联机MOD【基础篇】【第二章】
制作你的第一个基础MOD
作者:yuxuanchiadm
索引贴地址:http://www.mcbbs.net/thread-38211-1-1.html
请确定你已经阅读完成第一章的内容:
http://www.mcbbs.net/thread-38223-1-1.html
否则不要阅读此贴!
序:
(警告:前方高能量反应,非战斗人员请迅速撤离!)
在上一章里,你已经学会如何构建一个开发环境,以及成功构建了一个。现在,是时候制作你的第一个MOD了 :D。
首先,说明一下我写帖子的格式:
红色:章节和重要内容。
蓝色:知识点
灰色:作者的唠叨和闲话(可忽略)
绿色:容易出错的地方
使用Forge制作你的第一个小MOD:
现在,是时候制作你的第一个利用Forge API制作的MOD了,为自己欢呼吧:)。
首先找到Eclipse下的MinecraftForgeClient项目。
打开资源文件夹minecraft,你以后几乎所有的工作都要在此包下进行(不要在net.minecraft包下做任何事情,醒目)。
/**知识点:什么是包
如果你不知道什么是包,那么我真的没办法相信你会JAVA,当然我也佩服你的勇气,一直学到这里,只不过此贴并非零基础教学贴,是给能掌握JAVA语法的人的入门贴。JAVA的包和文件夹是紧密相连的,在WINDOWS下,项目文件夹下,一个文件夹就代表一个包,例如你可以在\MCPForgeMod\src\minecraft下找到一些包。
**/
右击这个资源文件夹选择:新建->包
打开如下界面:
在名称那一栏的后面加包:myFirstMod,输入后应该是这个样子:myFirstMod。
点击完成按钮,在顶级包下创建你的MOD包myFirstMod。
在资源文件夹找到这个包并右键选择:新建->类:
打开新建JAVA类后,修改名称为mod_myFirstMod,点击完成:
现在,看到你刚刚新建好的类,此时这个类应该在myFirstMod包中。
首先,用Annotation注解类型:Mod、NetworkMod修饰myFirstMod类。在public class mod_myFirstMod的前面添加:- import cpw.mods.fml.common.Mod;import cpw.mods.fml.common.network.NetworkMod; @Mod( modid = "myFirstMod", name="myFirstMod", version="1.0.0")
- @NetworkMod(clientSideRequired = true, serverSideRequired = false, channels={"myFirstMod"}, packetHandler=PacketHandler.class)
复制代码 在这里一定要注意了,channels的长度必须小于或等于16,大于16则MOD无法运行,注意+醒目
另外,我们目前尚未定义PacketHandler.class类,所以会报错,先不要管他,就像自上而下的编程方法所说的那样,先做框架,再做细节。
/**知识点:什么是Annotation注解类型
注解类型在JAVA里通常用于编译时对编译器的提示,使编译器可以根据某个对象的注解,提出警告、抛出错误、忽略警告等,在JDK5或以上版本中,你可以自定义注解类型,Forge4.x后用注解类型来描述某些信息,具体使用方法可以参考JAVA提供的相关帮助文档,Annotation通常具有实质性作用,不可以随意删除、修改及添加。
**/
然后,定义一个载入方法,并用@Init对其修饰,此方法会在MOD载入时调用。
- @Mod.Init
- public void load(FMLInitializationEvent evt)
- {
- System.out.println("我的第一个MOD");
- }
复制代码 /**知识点:既然需要用Init注解类型修饰,方法名称必须是load么?
方法名称不一定要是load。但是,这是提倡的,如果你用其他名字,其他开发此MOD的人员可能不会理解你的用意(如果有的话)。只要使用Init注解类型对其进行了修饰。
**/
这时,Eclipse会报错,是使用了未导入的类导致的,使用Eclipse自动修复这些错误。
以此类推,再分别添加MOD载入前和载入后调用的函数:
- @Mod.PreInit
- public void preInit(FMLPreInitializationEvent event)
- {
-
- }
- @Mod.PostInit
- public void postInit(FMLPostInitializationEvent event)
- {
-
- }
复制代码 /**知识点:3个MOD载入时调用的函数的参数是什么?
分别是3个Event(事件),这是Forge的新功能,这些事件中含有有用的信息,你可以在3个事件的类源码中了解有神马用处,此内容较为高级,暂时不做细节介绍
**/
最后,代码应该是这个样子:
- package myFirstMod; import cpw.mods.fml.common.Mod;
- import cpw.mods.fml.common.event.FMLInitializationEvent;
- import cpw.mods.fml.common.event.FMLPostInitializationEvent;
- import cpw.mods.fml.common.event.FMLPreInitializationEvent;
- import cpw.mods.fml.common.network.NetworkMod; @Mod( modid = "myFirstMod", name="myFirstMod", version="1.0.0")
- @NetworkMod(clientSideRequired = true, serverSideRequired = false, channels={"myFirstMod"}, packetHandler=PacketHandler.class)
- public class mod_myFirstMod
- {
- @Mod.Init
- public void load(FMLInitializationEvent evt)
- {
- System.out.println("我的第一个MOD");
- }
- @Mod.PreInit
- public void preInit(FMLPreInitializationEvent event)
- {
-
- }
- @Mod.PostInit
- public void postInit(FMLPostInitializationEvent event)
- {
-
- }
- }
复制代码 蛋疼的代码编辑 : (
运行你的第一个MOD:
按下Ctrl+S保存,现在测试你的第一个MOD吧!(大雾 :D)
如果你此时想要运行这个MOD是绝对不可能的,别忘了PacketHandler类还没定义呢。而且在这一章里就弄PacketHandler过早,所以现在有个临时解决方案:
替换:
- @NetworkMod(clientSideRequired = true, serverSideRequired = false, channels={"myFirstMod"}, packetHandler=PacketHandler.class)
复制代码 为:- @NetworkMod(clientSideRequired = true, serverSideRequired = false)
复制代码
OK,现在不会报错了,但是记住,我们删除了PacketHandler和channel,记得测试完要还原。
按下Ctrl+S保存。
1.首先打开recompile.bat批处理文件,并等待编译完成。然后打开startclient.bat批处理文件,启动游戏LOL。(普通青年)
2.轻轻点击你的F11键,选择JAVA应用程序,然后选择Start类。(文艺青年)
3.猛击你的reobfuscate.bat批处理文件,等运行完成后,打开"mcp725ForgeMOD\reobf"文件夹,把所有文件打包成ZIP,丢进一个装了Forge的客户端,开始游戏(2B青年)
4.以上方法全做一遍(火星人泥嚎)
你可以再控制台看到类似“我的第一个MOD”的字样,进入游戏后,点击MODS按钮,你可以看到你的MOD正在运行:)
这虽然看起来毫无用处,但是这是你的第一个MOD,恭喜你已经学会了制作ForgeMOD的第一步 :D!
总结:
恭喜你已经学会了制作ForgeMOD的最基础的知识,而且做出了第一个MOD :D!
作者: qaz13727245717 时间: 2012-7-31 19:54
不会弄了路过,路过加分
作者: qq1575550349 时间: 2012-7-31 20:55
看不懂得路过,加分
作者: daifei4321 时间: 2012-8-6 12:20
说一个重要的:
Class的名字有规定的,不能随便取。根据1.2.5对应的FORGE,在cpw.mods.fml.common.Loader前面定义的Pattern modClass,必须满足编译后的文件名是"(.+/|)(mod\\_[^\\s$]+).class$"基本上就是要以mod_这4个字母开头。不然加载不到的。
作者: micone 时间: 2012-8-13 15:00
基类NetworkMod是什么作用的?
作者: yuxuanchiadm 时间: 2012-8-13 16:24
micone 发表于 2012-8-13 15:00 
基类NetworkMod是什么作用的?
所有单机MOD可以继承自BaseMod和NetworkMod,所有联机MOD必须继承自NetworkMod,BaseMod是FML的一部分。NetworkMod是Forge的一部分,所以一般用安装了Forge源码的MCP来制作ModLoaderMOD一般用BaseMod,而制作ForgeMOD一般是用NetworkMod
作者: qw4wer 时间: 2012-9-1 11:11
1.31以上,modloader与Forge分手,各种代码大改动,现在都是去找原型方法,不想用其提供的方法了{:10_528:}
作者: xiaoxiami 时间: 2012-12-22 20:22
编译报错了,如何解决?
== MCP 7.25 (data: 7.25, client: 1.4.6, server: 1.4.6) ==
# found ff, ff patches, srgs, name csvs, doc csvs, param csvs, renumber csv, ast
yle, astyle config
== Recompiling client ==
> Cleaning bin
> Recompiling
'"C:\Program Files\Java\jdk1.7.0_05\bin\javac" -encoding UTF-8 -Xlint:-options -
deprecation -g -sourc...' failed : 1
== ERRORS FOUND ==
src\minecraft\net\minecraft\src\myFirstMod\mod_myFirstMod.java:20: 错误: 编码UTF
-8的不可映射字符
System.out.println("???????MOD");
^
作者: t789852 时间: 2012-12-23 21:17
无法解析cpw是怎们回事?
作者: katetem4 时间: 2012-12-23 22:07
xiaoxiami 发表于 2012-12-22 20:22
编译报错了,如何解决?
== MCP 7.25 (data: 7.25, client: 1.4.6, server: 1.4.6) ==
# found ff, ff pa ...
System.out.Println("???????MOD");
作者: xiaoxiami 时间: 2012-12-23 22:08
katetem4 发表于 2012-12-23 22:07 
System.out.Println("???????MOD");
编码问题,已解决
作者: katetem4 时间: 2012-12-23 22:10
xiaoxiami 发表于 2012-12-23 22:08 
编码问题,已解决
unicode 還是utf-8...
作者: xiaoxiami 时间: 2012-12-23 22:32
katetem4 发表于 2012-12-23 22:10 
unicode 還是utf-8...
把项目改成UTF-8就好了
作者: katetem4 时间: 2012-12-24 09:51
xiaoxiami 发表于 2012-12-23 22:32 
把项目改成UTF-8就好了
o.............
需要jenkin嗎?
作者: t789852 时间: 2012-12-24 09:57
can't not find server sources是什么情况
作者: wenjinghuan999 时间: 2013-1-13 01:39
t789852 发表于 2012-12-24 09:57 
can't not find server sources是什么情况
同求问
作者: wenjinghuan999 时间: 2013-1-13 01:43
wenjinghuan999 发表于 2013-1-13 01:39 
同求问
好像不管他就行了,直接运行start_client可以看到自己的mod
作者: wuyuanyi 时间: 2013-1-29 16:41
学习留名,感谢lz
作者: LAM878787 时间: 2013-1-30 15:32
不会弄了路过,路过加分
作者: wanglava 时间: 2013-6-18 23:18
* 第一种调试方法能够正常编译和运行程序。
*第二种debug模式下报如下的错误。请问楼主该怎么解决呢?
Source not found
The source attachement doest not contain the source for the file Sys.class
You can chang the source attachement by clicking Change Attached Source below:
// Compiled from Sys.java (version 1.4 : 48.0, super bit)
public final class org.lwjgl.Sys {
// Field descriptor #76 Ljava/lang/String;
private static final java.lang.String JNI_LIBRARY_NAME = "lwjgl";
// Field descriptor #76 Ljava/lang/String;
private static final java.lang.String VERSION = "2.4.2";
// Field descriptor #80 Lorg/lwjgl/SysImplementation;
private static final org.lwjgl.SysImplementation implementation;
// Field descriptor #76 Ljava/lang/String;
private static final java.lang.String POSTFIX64BIT = "64";
// Field descriptor #83 Ljava/lang/Class;
static synthetic java.lang.Class class$java$lang$String;
// Field descriptor #83 Ljava/lang/Class;
static synthetic java.lang.Class class$java$net$URL;
(下面还有三百多行内容,我就省略了。)
作者: zyl_ 时间: 2013-7-4 20:30
运行recompile.bat的时候它报java.lang.outofMemoryError:Java Heap space 这个错误。。。肿么办....
作者: 简单 时间: 2013-7-17 16:15
糟了=。=看完这贴我才发现我得去补习下注解。。。。还完全没有学过。。。。大神求鞭策。。。
作者: yuxuanchiadm 时间: 2013-7-20 00:10
简单 发表于 2013-7-17 16:15 
糟了=。=看完这贴我才发现我得去补习下注解。。。。还完全没有学过。。。。大神求鞭策。。。
注解又不是啥很难的东西,难的东西多了去了,注解说白了就是进击版的注释,不仅可以在编译期间,为编译器提供一些信息(比如该被注解的方法应该重载了父类的某方法,没有重载则无法通过编译),而且一旦注解类自身被注解成@Retention(RetentionPolicy.RUNTIME),那么还可以在运行时通过反射获取到注解,并获取其中的数据。
作者: 129124 时间: 2013-7-21 08:47
好复杂啊,看得要抓狂了
作者: kuafuzhuguang 时间: 2013-8-4 18:08
先顶后看。。。
作者: kuafuzhuguang 时间: 2013-8-6 22:12
1.首先打开recompile.bat批处理文件,并等待编译完成。然后打开startclient.bat批处理文件,启动游戏LOL。(普通青年)
2.轻轻点击你的F11键,选择JAVA应用程序,然后选择Start类。(文艺青年)
3.猛击你的reobfuscate.bat批处理文件,等运行完成后,打开"mcp725ForgeMOD\reobf"文件夹,把所有文件打包成ZIP,丢进一个装了Forge的客户端,开始游戏(2B青年)
4.以上方法全做一遍(火星人泥嚎)
做到第十章的时候发现贴图的文件夹不知道为啥得手动添加到压缩包,而且rar的格式居然不认识得用zip
果然是因为zip的算法简单么
作者: 瞎东西 时间: 2013-10-16 21:35
我没有找到net.minecraft怎么办
作者: tyhong 时间: 2013-10-28 19:59
本帖最后由 tyhong 于 2013-10-28 20:00 编辑
我看不懂啊
肿么打开介玩意
作者: lincong999 时间: 2013-11-17 13:09
kuafuzhuguang 发表于 2013-8-6 22:12 
做到第十章的时候发现贴图的文件夹不知道为啥得手动添加到压缩包,而且rar的格式居然不认识得用zip
果然 ...
因为rar是商业授权,不给钱就无权使用。
作者: jjxxz2 时间: 2013-12-4 19:10
实际上我还不会打开Eclipse。。。
作者: adaer 时间: 2013-12-9 13:40
daifei4321 发表于 2012-8-6 12:20 
说一个重要的:
Class的名字有规定的,不能随便取。根据1.2.5对应的FORGE,在cpw.mods.fml.common.Loader前 ...
和自己的命名习惯不符合好忧伤,还有就是反编译出来的函数很多par1这样的命名,重命名后也算是修改了源文件,好蛋疼
作者: hlrlqy 时间: 2013-12-26 07:20
大神,我想要一个空mod= =能在服务端运行,只挂个名字就ok
作者: hyb518 时间: 2014-6-2 23:16
正准备学习MC的插件和MOD开发技术,非常需要这些教程,赞!
作者: nlbbkb 时间: 2014-6-10 16:29
基础不是很好的大部分看不懂的说……另外哪里可以查到API,有哪些函数完全靠自己找= =简直给跪了
作者: zbw001 时间: 2014-8-8 17:37
有中文,要转码
作者: sycsky 时间: 2014-10-10 18:11
为什么我没找到net.minecraft.src这个包 ?
作者: codefans 时间: 2014-10-12 13:12
1.7.2 的有点不一样了
作者: 忆昨天 时间: 2015-5-15 20:29
那个net.minecraft.src到底在哪
作者: 忆昨天 时间: 2015-5-15 20:38
如果知道加我QQ1194916141告诉我
作者: hester_123 时间: 2015-8-9 19:21
请问楼主,我点了recompile.bat后,它最后提示!! Can not find server sources, try decompiling !!,这个改怎么办呀!!
作者: tpachinese 时间: 2016-2-11 20:37
我说为何用reobfuscate.bat到reobf文件夹里看了都是class
没有直接jar吗
源码是没问题的
求怎么导出mod