周边教程 Minecraft MOD制作从入门到精通DOC.docx
《周边教程 Minecraft MOD制作从入门到精通DOC.docx》由会员分享,可在线阅读,更多相关《周边教程 Minecraft MOD制作从入门到精通DOC.docx(27页珍藏版)》请在冰豆网上搜索。
![周边教程 Minecraft MOD制作从入门到精通DOC.docx](https://file1.bdocx.com/fileroot1/2023-6/11/d1944d73-66e7-42aa-abfd-1ea745f928f8/d1944d73-66e7-42aa-abfd-1ea745f928f81.gif)
周边教程MinecraftMOD制作从入门到精通DOC
第一章学习Java
java是什么?
java是一门计算机语言,我相信很多人都知道这一事实,这很可能是由于您曾经玩过由这一语言编译而成的游戏。
Java是一门面向对象的计算机语言,也就是说它由两主要部分组成:
字段和方法。
那什么是字段和方法呢?
我们以人为例:
我们可以把一个人比作一个工程(o(∩_∩)o好像有些类比不当~)。
在这个工程中会有许多包,比如“human.body.head”。
在每个包中会包含好多类(我们之后详细阐述),比如说"ear.java"就是一个类。
现在我们已经知道了字段和方法,那么什么是类呢?
我们以之前的ear.java为例,这个耳朵类可以诸如“耳垂高度”和“音量”等特征,所以一个解决方案是建立如“listenTo()”和"moveEars()"等函数。
您可能会问这到底是什么呀,也可能会问这些和Minecraft到底有神马关系?
好吧,以下就是一个例子:
方法/函数举例
1.publicintgetMaxHealth()
2.{
3. return20;
4.}
复制代码
这是minecraft中EntityCreeper.java中的一段代码。
这段代码非常基本,您只需关心的是如果把返回值20改为其它的什么东西会发生什么呢?
当然您有可能会猜测:
嗯,有可能会带来我砍苦力怕多少刀它会死呢?
其中的"public"表示其它的类也可以调用该函数,"int"表示该函数为整型函数(在+/-2,147,483,647之间的所有十进制整数)。
"getMaxHealth()"为函数名,"return20"表示返回值,比如如果有人问这个类:
“苦力怕的最大生命值是多少呀?
”,它将回答:
“是20~”。
由于我们在函数头声明了"int",所以我们的返回值必须为整数。
字段/变量举例
1.privatedoublevelocityY;
复制代码
这是在EntityMinecart类中所生命的一个字段。
其中"private"表示只有这个类才可以访问这个字段,"double"表示为一个十进制数,"velocityY"为这个变量的变量名(字段和变量有时表示同一个东西)。
以上就是关于Java的一些最基本的知识。
网络上还有许许多多更为优秀的Java教程,所以就不再花时间赘述了。
相关教程:
∙TheNewBoston'sJava(Beginner)ProgrammingTutorials
∙TheJavaTMTutorials
第二章计划与头脑风暴
再次强调,这一章非常重要,有许多准备制作MOD的人士“天赋异禀”,最后全都“楼主我要整合包”了。
您应该对于这个MOD最终能够实现什么功能、您能做到什么程度有一个明确的计划。
可以在脑中对MOD进行简单地规划,或者对于每一项您所要添加的项目列出一份长达10页的清单,这都可以,取决于您个人的习惯。
需要牢记的事情:
∙从简单之处做起!
我见过好多好多人再问楼主类似的问题:
“如何让NPC自动建筑、谈话、打猎、去杀末影之龙呀?
”。
MOD制作是一个长期的过程,您也不可能马上就成为高手。
正如我之前谈过的,您可以通过学习一些Java基础知识来了解一些知识,这样可以使您更快地成为高手。
所以说要从简单之处入手,先试着为Minecraft添加一个方块吧。
∙要有兴趣!
请注意,为您喜欢的游戏制作MOD并不应该成为您的一份工作,在MOD制作之时您应该能获得成就感与愉悦。
虽然当您不能修正错误,或者您的MOD的反响没有预想中高时难免会灰心丧气,但这只是一时之举。
如果您经常性地感到厌倦并没有从中获得乐趣,或许玩Minecraft更加适合您吧……
——第二章到此结束——
第三章:
设置工作环境
在这章开始之前呢,我们需要提一下forge。
我个人相比较modloader而言更倾向于forge。
您可以在安装之前阅读关于Forge与modloader之间的比较,但是记得总结。
有许多工具有助于提高您MOD的兼容性并使您的MOD制作之路更为轻松。
Forge可以通过更新支持不同的版本但是modloader只支持对应的版本。
所以不要犹豫通过安装FML和其他一些工具,您可以不需要安装那繁多的API。
如果您有任何问题,请移驾至并加入#MinecraftForge。
请参阅本文:
准备文件
在工作环境中,您需要一份纯净的.minecraft文件夹。
可以通过备份您当前.minecraft文件夹,并通过点击"forceupdate"来获得纯净的minecraft文件
下载
您在开始MOD制作之前还需要下载一下这三样东西:
∙最新版本的Eclipse:
http:
//www.eclipse.org/downloads/packages/eclipse-ide-java-developers/junor
∙最新版本的MinecraftForgeSRC:
∙最新版本的MCP:
http:
//mcp.ocean-labs.de/index.php/MCP_Releases
设置工作环境
首先将MCP解压缩至您所希望的位置,我个人的习惯是在桌面新建一个名为"Mods"的文件夹,并将MCP解压缩至那里。
ForgeSRC的下载文件应该会是一个单独的名为"forge"的文件夹,将其解压缩至MCP目录下的“jars”文件夹里(其实只需要Bin和resources文件夹……但是无妨)。
由于Forge不在依赖modloader,所以您不再需要安装modloader了。
如果您计划制作支持多人生存模式(SSP)的MOD,您必须要在
现在返回MCP目录下的“forge”文件夹,运行"install.cmd"文件,如果您操作系统不同文件名字也不同。
稍等片刻,安装结束后我们继续……
收尾工作
如果您在运行install.bat或者install.sh文件时没有任何错误,您现在应该可以开始您的大师之路了。
返回Mcp/eclipse文件夹中,复制文件夹的地址,如:
X:
UsersMitchDesktopModsNewModMCPeclipse。
现在您可以通过在您文件解压缩至您所希望的位置的方式安装eclipse。
安装结束之后通过双击eclipse.exe的方式运行eclipse,当系统问及您的工作环境时,粘贴之前您复制的Mcp/eclipse文件夹的位置。
当加载结束后,需要您找到“Client/src/net.minecraft.src/”的位置。
第四章:
您等待已久的一章
我希望您能多加阅读一些Minecraft的代码,虽然对于一个java造诣不精人来说,代码有可能显得凌乱,但是不要灰心丧气。
第一节:
您的第一个方块
通过在net.minecraft.src包内右击任意文件,点击New->Class。
将其命名为“mod_YOURMODNAME”,必须确保其以“mod_”开头,因为只有这样系统才会识别该文件为一个MOD并开始加载。
无需在底部选择任何的选项,点击"Finish"完成创建。
此时您会看见一段预先写好的类代码。
您的第一件事就是要扩展这个MOD使之成为一个基本类(BaseMod)。
您可以通过添加“extendsBaseMod”这样的代码完成类的声明,此时代码如下:
1.packagenet.minecraft.src;
2.
3.publicclassmod_YourModNameextendsBaseMod{
4.
5.}
复制代码
当然,此时会在“mod_YOURMODNAME”处显示错误,此时将鼠标移至该错误处,在弹出的对话框中单击“Addunimplementedmethods”。
此时会在当前的基本类里添加两个类函数:
“load”与“getVersion”。
您可以删除掉“//TODO”这种行,在“getVersion”类函数中,您需要将null替换为”1.0“或者其他您喜欢的版本号。
您需要保留引用,就如同需要返回一个字符串一样。
此时的代码如下所示:
1.packagenet.minecraft.src;
2.
3.publicclassmod_YourModNameextendsBaseMod{
4.
5. @Override
6. publicStringgetVersion(){
7. return"1.0";
8. }
9.
10. @Override
11. publicvoidload(){
12.
13. }
14.
15.}
复制代码
现在您终于可以开始创作您的第一份方块代码啦~
在类的顶端添加下列代码(在“{}”之内):
1.publicstaticBlockyourFirstBlock=newBlockTutorial(blockID,0).setHardness(2.5F).setStepSound(Block.soundWoodFootstep).setBlockName("blockName");
复制代码
其中:
名称_含义__public_表示所有类均可以访问。
__static_表示在类内不创建一个新的实例的条件下即可访问(详情请查阅java教程)__Block_该变量引用“Block.java”__yourfirstBLock_变量名,叫什么都行__=newBlockTutorial_此时在BlockTutorial类中创建了一个新的实例,由于我们之前没有声明,因此会出错。
您可以将其改为任何您喜欢的名字,只要之后的名字与其相同就可以了。
__(blockID,0) _您所传递给BlockTutorial类的信息,就是方块ID。
您可以在这里将其替换成您所希望的任何数值。
特别提醒您,在最新版本的Forge中,可以自动调整您的方块ID,并将其设置到137到4096中的一个未使用过的数值。
您可以在这里查看您的MOD与MOD的兼容性。
之后的0稍后会为您详细阐述,现在暂且放过它。
__.setHardness(2.5F)_设置该方块的硬度为2.5,您可以随意调整。
__.setStepSound(Block.soundWoodFootstep) _走在上面的声音,如果您喜欢的话,也可以将“soundWoodFootstep”改成“soundClothFootstep”或者任何你喜欢的声音。
__.setBlockName("blockName");_这个变量无关紧要,只是要保证每个的名字不同就可以了。
__
现在您已经掌握了如何新建一个BlockTutorial类了,当然有可能在之前您就把这个名字改掉了……
现在我们要扩展方块,我们首先需要执行ITextureProvider,当您将如下代码复制进其中时,可以使鼠标悬停在ITextureProvider处并单击导入(import)。
1.publicclassBlockTutorialextendsBlockimplementsITextureProvider{
复制代码
现在我们需要为我们之前跳过的那部分创建一个构造函数(可以在java教程中获得更为详实的信息)。
1.publicBlockTutorial(inti,intj)
2.{
3. super(i,j,Material.wood);
4.}
复制代码
名称_含义__BlockTutorial_由于是构造函数,此处需与类的名字相同。
__(inti,intj)_我们在之前使用(blockID,0)的声明。
更为详细的来说,表示该构造函数使用两个整数变量并将其命名为i和j。
__super_表示需要使用超类来传递方块信息,这也是问什么我们扩展这个类的缘故。
可能难以理解但是请参阅java教程o(∩_∩)o~~__(i,j,Material.wood);_这是由我们的MOD类中继承的将要传给方块的参数,我们同时也传递了Material.wood是因为我希望这个方块在被镐敲击时可以更为容易地被破坏。
__
好,现在您即将进行的步骤是添加一个Forge的类函数以便我们可以为这个方块设置材质。
1.publicStringgetTextureFile()
2.{
3. return"/Mic'sMods/CrossbowMod/gui/Crossbow.png";
4.}
复制代码
切记:
不要更改类函数的第一行!
乱修改可能覆盖或者替换类函数。
这是一个用于十字弓MOD的例子,其中的材质存储在minecraft.jar的相应位置中。
您可以很轻松地修改您所使用的材质,但是如果指向一个空位置则无法进行加载。
当然也要保证是双引号~
最后还需要一个Forge的类函数将该方块添加至创造模式的物品栏中。
1.publicvoidaddCreativeItems(ArrayListitemList)
2.{
3.if(blockID==mod_YourModName.yourFirstBlock.blockID)
4. {
5. itemList.add(newItemStack(this));
6. }
7.}
复制代码
当鼠标悬停至ArrayList时可以导入。
最后一个类函数可能有些复杂……
名称_含义__void_表示该函数没有返回值__addCreativeItems(ArrayListitemList)_类函数和构造函数的名字。
不要进行修改,否则会覆盖Forge的类函数。
__if(_根据真假不同返回值也不同,如果不懂请多看看教程__blockID==mod_YourModName.yourFirstBlock.blockID_逻辑表达式,如果该方块的方块ID与您创建的方块的方块ID则继续__itemList.add(newItemStack(this)); _在创造模式中可以创建和堆叠这一方块,这条语句不懂亦无妨。
__
之后,我们在load()类函数中添加如下语句:
1.ModLoader.registerBlock(yourFirstBlock);
2.ModLoader.addName(yourFirstBlock,"Woohoo!
MyfirstBlock:
D");
复制代码
其中:
名称_含义__ModLoader.registerBlock_您所调用的类函数__(yourFirstBlock)_您所使用的方块,确保之前声明过。
__ModLoader.addName_调用另一个类函数,用于添加名字__(yourFirstBlock,"Woohoo!
MyfirstBlock:
D");_这里是为您的方块实例赋予名字的地方,您可以在这里写“红石灯(RedstoneLamp)”,“楼主我要整合包~(LouzhuWoyaoZhengheBao)”等等。
_
现在要做一件最为重要的事请:
hx940525,如果您要查看本帖隐藏内容请回复
您已经为Minecraft制作了一个属于您的MOD,不再是MOD制作小白痴了!
无论这个MOD多么粗糙和简陋,但都是您在MOD制作大师之路的一个见证!
希望当您在成为大师之时蓦然回首还能记得您的第一份作品,无论如何,恭喜您!
!
!
第四章:
您等待已久的一章
我希望您能多加阅读一些Minecraft的代码,虽然对于一个java造诣不精人来说,代码有可能显得凌乱,但是不要灰心丧气。
第二节:
为您的方块添加材质
在这一部分教程中,将会为您讲述如何为您的方块添加材质。
首先您需要一份默认的“子图”。
所谓“子图”就是一份可以由程序在需要时可以随时加载的图片。
在Minecraft中,可以从terrain.png和items.png中加载材质。
实际上,依托于Forge,您所做的工作即为编辑一张属于您的terrain.png以及items.png并将您的MOD与这些子图之间建立联系。
再次特意为您精心准备了两张默认的子图(items.png、terrain.png)。
我们可以打开编辑软件(Photoshop、Gimp、Paint.NET(译者强力推荐~)),此时您可以看见256个紫色方块,现在需要做的就是按照您的喜好绘制图案。
请牢记您的材质是16×16的,并且按照如下方式排列。
您可能很好奇为什么是从0开始的呢?
好吧,还记得我们之前的“(blockID,0)”吗?
其中的“0”就是调用这个文件。
如果我们在之前的文档中保持“0”不变就会在加载子图之后您的方块将显示为蓝色的“0”方块,如果我们在代码中将“0”改为“1”,则在最后您的方块将变为红色“1”方块。
当您绘制完您的方块材质后,您需要以png格式保存这份子图,否则Minecraft不会正确加载。
还记得之前的“getTextureFile()”类函数么,Forge虽然会自动进行寻找,但还请将子图与代码放在一系列的文件夹内。
打开“YourMCPFolder/jars/bin/minecraft.jar”并将文件夹拖入其中,此时getTextureFile()就应该在minecraft.jar内找到您子图所在的位置。
这可能有些晦涩难懂,所以我们需要测试一下您是否真正搞懂了。
在我们运行客户端之前还有一件事需要进行:
——需要Forge预加载材质。
1.MinecraftForgeClient.preloadTexture("/New/Untitled-1.png");
复制代码
请确保您在类函数中所输入的文件地址与getTexture()所引用地址相同。
我使用Forge客户端而不是用普通的forge类的原因是材质只是在客户端加载,不需要服务器端提供支持。
现在您就应该看到您的那个大大的0方块啦~
P.S:
默认的子图文件下载地址在这里
第四章:
您等待已久的一章
我希望您能多加阅读一些Minecraft的代码,虽然对于一个java造诣不精人来说,代码有可能显得凌乱,但是不要灰心丧气。
第三节:
创建一份合成表
在这一节,我将为您讲述如何创建一份合成表,本章不会有任何下载内容O(∩_∩)O~
当您已经成功地掌握了前两节的内容,您就已经基本掌握了制作MOD的基本知识。
现在需要为那些奋斗在生存模式的人们考虑了~
本节内容十分简单,仅调用一个类函数。
所以您可以尝试一下能否自己一个人搞清楚代码,我会将释义附在后面。
当然,这些代码完全可以一行写完,但是写成这样子更为直观,就好像您在用工作台进行合成一样。
1.ModLoader.addRecipe(newItemStack(yourFirstBlock),newObject[]{
2. "BBB",
3. "BAB",
4. "BBB",
5. Character.valueOf('A'),Item.diamond,
6. Character.valueOf('B'),Block.obsidian
7.});
复制代码
您看懂了么?
➤
您当然也可以在合成中使用您自己创建的方块或物品,举例来说,"Character.valueOf('A'),yourFirstBlock"即代表之前所述的“A”为您所创建的方块。
如下图所示:
以下为一些在编写合成公式时的小技巧:
您可以使用空格代表工作台中的空位。
1. "DDD", "I", "I",
复制代码
您可以简化合成公式,这样子无论原材料在工作台内如何放置,只要形状正确即能合成(木板合成工作台就是一例)
1. "BB", "BB",
复制代码
您可以只使用单一原材料进行合成,也就是说放入一个该方块或物品即可合成您所希望的物品。
1."Z",
复制代码
第四章:
您等待已久的一章
我希望您能多加阅读一些Minecraft的代码,虽然对于一个java造诣不精人来说,代码有可能显得凌乱,但是不要灰心丧气。
第四节:
生成矿藏
现在您可以能会想如何制作一份矿藏呢?
如果您希望制作一份矿藏,请不要为其设置可以进行合成的要素,毕竟矿藏是不能合成出来的。
建议您重新为自己的矿物方块设计一套材质,毕竟在许多灰色的石头中间突然挖到一个蓝色大方块很是诡异。
您可以根据自己使用photoshop或Gimp的水平进行创作,甚至直接拷贝原版材质并加以修改其中的色调和饱和度也是一个不错的而选择.
还记得我们在教程之前提到的".setHardness(2.5F)"么?
在制作矿藏时这一参数也需要考虑在内:
0.1F意味着几乎可以瞬间摧毁该方块,而1000.0F则意味着您可以挖到天荒地老。
还有一点请注意,此处与您实际进行采矿无任何相关,我们稍后会进行讲解。
我们使用generateSurface()类函数对modloader类函数进行覆盖,当生成世界时就会调用这个类函数,并生成您所添加进类函数的语句。
以下代码将用于您的mod_file:
OverridingTheModLoaderMethod
➤
1.@Override
2.publicvoidgenerateSurface(Worldworld,Randomrandom,intchunkX,intchunkZ)
3.{
4.
5.}
复制代码
再次强调,不要做任何修改,因为您的任何改动都会带来不可知的结果。
现在需要再去中添加一个循环语句:
GenerationForLoop
➤
1.for(inti=0;i<20;i++){
2. intrandPosX=chunkX+random.nextInt(16);
3. intrandPosY=random.nextInt(20);
4. intrandPosZ=chunkZ+random.nextInt(16);
5. newWorldGenMinable(this.yourFirstOre.blockID,8).generate(world,random,randPosX,randPosY,randPosZ);
6.}
复制代码
名称]
含义
for(..)
表示循环,详情请参阅java教程
inti=0;i<20;i++
默认的循环语句,您只需要关心其中的“20”就可以了,如果您将其设置为1就代表该矿物如同钻石一样珍惜,而将其设置为20则代表如同煤那样广泛分布,您可以将其最大设置为50左右。
intrandPosX=chunkX+random.nextInt