本帖最后由 hao19891029 于 2013-10-10 16:37 编辑
注:下面文章基本转自Forge论坛里的教程(
原地址),游戏版本为1.6.2。缓慢更新。。。
索引贴地址:
点我
引
欢迎一起来制作minecraft mod!我们开发者可以控制Miencraft的很多东西,但是Minercaft的代码是非常多的,并且刚开始的时候可能困难是巨大的。但是制造你自己的方块并且给Minecraft增加新的玩法是一个好玩又自由的经历!如果你不喜欢游戏里的平面,改变它!如果你想要更多的游戏内容,你可以加进去!这个教程旨在通过基本的教学说明让你制作mod轻松一些。 |
目标
- 明白如何找到你关心的Minecraft的代码
- 如何在Eclipse里面建立包(packages)和类(classes)
- 拥有和理解一个Minecraft Mod的样本(基本结构)
|
提前准备
- 已经安装了Forge开发环境(教学)
- 知道怎么用Java编程。如果你不知道,就去学习Java。你可以边做Mod边学习Java。
|
Eclipse
教程假定你使用的是Eclipse。当你第一次运行Eclipse的时候,它会要求你指定一个工作空间,确保你将工作空间指定到\forge\mcp\eclipse下面。
当你这样做了以后,Eclipse会直接拥有一个项目叫“Minecraft”,伸展开这个项目,你会看到一个资源源文件夹叫“src”。把它神展开,你会看到很多的Minecraft和Minecraft Forge的包。当然你不会更改里面的任何包和类,自由地去看这些包里面的内容然后可以想想你可以干什么或者看看Minecraft是怎么用这些代码工作的。
工作空间的提示:
如果你指定了错误的工作空间到你的Eclipse,或者已经使用了另一个工作空间,你可以建立一个新的工作空间,步骤为:进入File -> Swith Workspace -> Other... |
建立包(Packages)和类(Classes)
用Forge制作Mod意味着所有的添加修改都是通过建立新的类来完成的。任何时候,除非你打算制作一个coremod或者有一个很好的理由,你最好都别修改游戏本身的任何类。你自己新增的类应该全都在你自己的包里面。
你自己的Mod
如果你正打算制造一个实用的mod,你应该使用一个自己的包名。对于包名下面是一个建议:
- 你的名字.你的mod的名字 或者 你的名字.minecraft.你的mod的名字
这样可以避免包名重复的冲突。
在Eclipse里面建立包和类的方法是,在左边的包浏览器(Package Explorer)里找到你想让你的mod在里面的包,点击右键。如果想新建包,最好直接在“src”文件夹下面新建包含你的mod的代码及资源的包。例如,一开始时,先在“src”文件夹右键,选择“New -> Package” 或者 “New -> Class”来新建包或类。
本文将教你如何新建一个叫Generic的mod,我们将会新建一个叫“tutorial.generic”的包。如果你完全跟着教程所说的去做,那请在项目名“Minecraft”下面的“src”直接点击右键,选中“New”,然后选择“Package“,确保你的项目的资源文件夹是“Minecraft\src” 并且你新建的包的名字为 “tutorial.generic”。完成以后,左边的包浏览器应该会显示出来你的空的名叫“tutorial.generic”的包。 接下来,我们来建立第一个类--基本类Base Mod,任何mod都需要建立一个基本类,这个类包含有一些信息,这些信息可以让forge将你的mod载入到minecraft里面。例如像教程里的话,基本类就是名叫“Generic mod”的类了。
在“tutorial.generic”包上点击右键,选择建立一个新的类(class)。这时候需要注意的几件事是:1、你的项目的资源文件夹应该是“Minecraft\src”;2、包应该叫“tutorial.generic”;3、类名叫“Generic”。
这时候你应该有一个叫“Generic”的类,它位于“Minecraft\src”资源文件夹里的“tutorial.generic”包里面。如果你不是这样,那请重新再来一遍。
文件路径
你可以在硬盘里找到你建的包和类,路径是:你解压出来的forge文件夹里的 \mcp\src\Minecraft 里面。 |
基本类的代码
Forge载入mod的时候首先是通过基本类来载入的,你的mod的其它所有类都需要通过基本类来注册到Forge里面以便Forge载入,正因为这样,建议你以你的mod的名称来命名你的基本类。就像教程的一样,教程所要做的mod叫“Generic Mod”,基本类的名称就叫“Generic”。
在上面一步,我们建立了一个空的类。接下来让我们看看怎么构建一个标准的基本类。把Eclipse自动生成的代码删除掉,我们来看看下面的代码怎么写的:
- package tutorial.generic;
- import cpw.mods.fml.common.Mod;
- import cpw.mods.fml.common.Mod.EventHandler; // 1.6.2版本用这个
- //import cpw.mods.fml.common.Mod.PreInit; // 1.5.2版本用这个
- //import cpw.mods.fml.common.Mod.Init; // 1.5.2版本用这个
- //import cpw.mods.fml.common.Mod.PostInit; // 1.5.2版本用这个
- 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;
- import cpw.mods.fml.common.network.NetworkMod;
- @Mod(modid="GenericModID", name="Generic", version="0.0.0")
- @NetworkMod(clientSideRequired=true)
- public class Generic {
- // Forge用到的你的mod的一个实例
- @Instance(value = "GenericModID")
- public static Generic instance;
-
- //告诉Forge你的客户端和服务端的“代理类”在哪里
- @SidedProxy(clientSide="tutorial.generic.client.ClientProxy", serverSide="tutorial.generic.CommonProxy")
- public static CommonProxy proxy;
-
- @EventHandler // 1.6.2版本用这个
- //@PreInit // 1.5.2版本用这个
- public void preInit(FMLPreInitializationEvent event) {
- // Stub Method
- }
-
- @EventHandler // 1.6.2版本用这个
- //@Init // 1.5.2版本用这个
- public void load(FMLInitializationEvent event) {
- proxy.registerRenderers();
- }
-
- @EventHandler // 1.6.2版本用这个
- //@PostInit // 1.5.2版本用这个
- public void postInit(FMLPostInitializationEvent event) {
- // Stub Method
- }
- }
复制代码 代理类
如果你写完了上述代码,但是没有代理类(即把@SidedProxy 注释掉),你的mod也许可以在单人游戏里运行,但在多人游戏里就不可以了。 | 这里面有很多的导入(imports)和注解(@),是吧?导入的列表会随着教程的进行而变得越来越长。通常,Eclipse会帮你自动导入所需的类以及添加导入,所以教程里就不详述导入的方面了。 当你写完这些代码以后你会遇到一个错误(error)。写有“CommonProxy”的地方应该会有红色下划线出现,这是正常的。在教你如何建立代理类的教程里会说到怎么建立“CommonProxy”,这里先不用管这个错误。
|
基本类里的注解
在上面的教程里大概你有很多想问的疑问,希望在这个注解说明里你可以找到答案。这个部分讲的是在基本类里用到的注解(@开头的)的列表以及它们的作用。
@Mod
告诉Forge这是你的mod的基本类,它带有三个参数。
你的mod的唯一名称。当你开始创建你的mod的时候你就不应该再修改它了。
人类能看懂的你的mod的名字。
你的mod的版本,可以随你心意设定。
@NetworkMod
告诉Forge当客户端安装了这个mod之后,服务端是否需要安装,这个注解包含两个参数。
设定你的mod是否一定要在客户端安装,这个一般都为true。
设定当客户端安装了这个mod以后,服务端是否也需要在安装了该mod之后客户端才能连接上服务端,这个一般为false,默认设定也为false。
例如,如果clientSideRequired设定为true,serverSideRequired设定为true,这样当你客户端安装了该mod而服务端没有安装的话,客户端就无法连接上服务端,如果serverSideRequired设定为false,这样即使服务端没有安装该mod,客户端也能连接上。
@Instance
基本类应该是使用单例模式的。这是你的mod给Forge引用的对象。确保里面填写的参数跟你在@Mod里的modid一样,否则它会默认为空字符串,这样会在安装了其它一样是空字符串的mod后引发错误。
@SidedProxy
这个代理类注解是告诉Forge当客户端运行的时候该使用那些类,当服务端运行的时候又该启动哪些其它的类,例如对于物品方块的材质渲染,客户端需要而服务端不需要,因为服务端不需要看到游戏的界面。你可以在任何地方用到这个注解。
包含客户端使用的代理类的名字的字符串。
包含服务端使用的代理类的名字的字符串。
@EvenHandler
有这个注解的方法会被所有方法调用。在1.6.1以前的版本并没有使用“@EvenHandler”,而是用“@PreInit”、“@Init”和“@PostInit”来代替。对于1.6.X版本来说,使用这个注解都需要导入“cpw.mods.fml.common.Mod.EventHandler;”。 |
代理类
Minecraft启动的时候是以启动服务端模式启动客户端,即使在单人游戏模式也会。当客户端在渲染世界里存在的所有东西的材质的时候,服务端的代码负责完成所有世界里的数据和状态等工作。而如果你的mod装在服务端里,那么客户端的代码就不会执行。让所有代码同时在指定的客户端和服务端工作是一项艰难的事情。因此,Forge给了两个注解让你可以指定那些代码是在服务端或客户端运行的。
当你想让服务端代码调用一个类的构造方法而客户端代码调用另一个类的构造方法的时候,你可以使用注解“@SidedProxy”。两个被调用的类都要是同样的类型或者同一类型的子类,并且类的名字需要用字符串(String)类型书写。在基本类里我们可以看到注解是这样写的:
- @SidedProxy(clientSide="tutorial.generic.client.ClientProxy", serverSide="tutorial.generic.CommonProxy")
- public static CommonProxy proxy;
复制代码 当然我不知道proxy的实例是在什么时候什么地方实例化的,如果mod是装在服务端里,那么“tutorial.generic.CommonProxy”类的默认构造方法会被调用,如果mod装在客户端,“tutorial.generic.ClientProxy”类的默认构造方法会被调用。
我们一般使用代理类来注册材质图片并且托管我们的游戏界面管理器(GUI handler)。
一开始Forge会从服务端的proxy代码开始,通过读取以上的代码,找到“tutorial.generic.CommonProxy”类。请你在“tutorial.generic”包里建立一个叫“CommonProxy”的类,然后照着下面的代码构建这个类的内容。
- package tutorial.generic;
- public class CommonProxy {
- // 客户端需要调用的方法
- public void registerRenderers() {
- //这个方法里不需要写任何内容,因为服务端不需要渲染材质或其它东西。
- }
- }
复制代码 对于客户端的代理类“proxy”,应该被放在“tutorial.generic.client”包里。请你在“tutorial.generic”包里建立一个新的叫“client”的包,然后在其中新建一个叫“ClientProxy”的类,然后照着下面的代码写:- package tutorial.generic.client;
- import net.minecraftforge.client.MinecraftForgeClient;
- import tutorial.generic.CommonProxy;
- public class ClientProxy extends CommonProxy {
-
- @Override
- public void registerRenderers() {
- // 这个方法是给客户端渲染材质的,在以后的教程里会讲到这个方面。
- }
-
- }
复制代码 上面的“registerRenderers”方法会在以后的“材质和图标”教程中讲到。
关于继承的提示:
任何在“ClientProxy”类里没有重写的方法都会像在父类(即“CommonProxy”类)里的方法一样执行。不要忘记了这点。 |
结束
这个时候,你在你的包浏览器里应该会有这样的结构了(“minecraft”和“minecraftforge”包的结构就不写出来了):
- Minecraft
- -^---------src
- -------------^- tutorial.generic
- -------------------------------^-- Generic
- -------------------------------^-- CommonProxy
- -------------^- tutorial.generic.client
- -------------------------------^-- ClientProxy
目前为止,你已经成功建立了一个Forge的Mod的模板了。
为了测试你的mod,你可以这样做:首先保存你的成果,然后点击绿色箭头图标的“Run”按钮,然后Minecraft就会启动并载入你的mod,你应该可以在刚进入游戏的菜单里的“Mod”里看到你的mod。 |
下一步做什么?
本帖最后由 丰盛的蝙蝠 于 2013-9-30 17:53 编辑
抢···················还好赶上了
来支持一下 是不是沙发啊
小杰丶lvoe 发表于 2013-9-30 17:53 
来支持一下 是不是沙发啊
不是,哈哈哈哈
地板。。。我来晚了
丰盛的蝙蝠 发表于 2013-9-30 17:53 
不是,哈哈哈哈
是个板凳 我要杀了你
顶一个吧.

小杰丶lvoe 发表于 2013-9-30 17:53 
是个板凳 我要杀了你
来啊,随时恭候
丰盛的蝙蝠 发表于 2013-9-30 17:55 
来啊,随时恭候
你们打我来下注~~
zxyzzxxyy 发表于 2013-9-30 18:05 
你们打我来下注~~
我两先杀了你
这是干什么? 不太明白 制作MOD
wq57 发表于 2013-9-30 18:24 
这是干什么? 不太明白 制作MOD
本来是想翻译一下forge论坛的教程,翻到一半不小心按了Ctrl+回车了。。。不知道还能不能隐藏住这个帖子先
可以删除 也就是点击 编辑 然后再右边有个删除帖子!
wq57 发表于 2013-9-30 21:42 
可以删除 也就是点击 编辑 然后再右边有个删除帖子!
那我还是就这样放着吧。。。我是想编辑完了再发表,之前是还没写完就不小心点到发表了
在“Proxy类”中出现错误:
“@SideProxy”应为“@SidedProxy”
zhouyiran2 发表于 2013-10-4 11:56 
在“Proxy类”中出现错误:
“@SideProxy”应为“@SidedProxy”
多谢提醒{:10_512:}已经改过来了
hao19891029 发表于 2013-10-4 12:13 
多谢提醒已经改过来了
你好,我是一个初学者,很抱歉挖了坟,有一个困扰我很久的问题,希望能解答。就是按照方法配置开发环境后,我在Eclipse的包浏览器找到Mincraft包下的src包,但那里面只有我自己建的包,没有那些minecraft或minecraftforge的包。当我建立class输入类似“import cpw.mods.fml.comman.mods;”的代码后会显示一堆错误“The import cpw cannot be resolved”。是不是因为src中缺少这些包的原因?应该怎么做?十分感谢!
wpg1995 发表于 2013-10-12 01:12 
你好,我是一个初学者,很抱歉挖了坟,有一个困扰我很久的问题,希望能解答。就是按照方法配置开发环境后 ...
那可能是你配置环境时哪里出错了,正常的话应该可以在src包下的net包里看到minecraft和minecraftforge这两个包的应该
LZ,我是java新手 ,我按你的教程

走到这,

出现这两处错误
看不懂
---我 = =他就睁不开眼睛了QAQ