天赦吧 关注:2,119贴子:337,582

【MINECRAFT】模组简单教程『转』

只看楼主收藏回复

Minecraft MOD制作:从入门到精通
The Dummy's Guide to Modding - From Setup to Advanced!
第一章:学习Java
第二章:计划与头脑风暴
第三章:设置工作环境
第四章第一节:您的第一个方块
第四章第二节:为您的方块添加材质
第四章第三节:创建一份合成表
第四章第四节:生成矿藏
第四章第五节:添加烧炼与创建物品
第四章第六节:创建一组工具
第四章第七节:创建一套盔甲
第四章第八节:添加多材质方块


IP属地:福建来自Android客户端1楼2015-07-31 21:39回复
    二楼为原网址:http://www.mcbbs.net/thread-46190-1-1.html
    欢迎去为原作者捧场


    IP属地:福建来自Android客户端2楼2015-07-31 21:40
    回复
      第三章:设置工作环境
      在这章开始之前呢,我们需要提一下forge。我个人相比较modloader而言更倾向于forge。您可以在安装之前阅读关于Forge与modloader之间的比较,但是记得总结。有许多工具有助于提高您MOD的兼容性并使您的MOD制作之路更为轻松。Forge可以通过更新支持不同的版本但是modloader只支持对应的版本。所以不要犹豫通过安装FML和其他一些工具,您可以不需要安装那繁多的API。如果您有任何问题,请移驾至esper.net并加入#MinecraftForge。
      请参阅本文:http://www.mcbbs.net/thread-71071-1-1.html
      准备文件
      在工作环境中,您需要一份纯净的.minecraft 文件夹。可以通过备份您当前.minecraft文件夹,并通过点击"force update"来获得纯净的minecraft文件
      下载
      您在开始MOD制作之前还需要下载一下这三样东西:
      最新版本的Eclipse:http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/junor
      最新版本的Minecraft ForgeSRC:http://www.minecraftforge.net/
      最新版本的MCP:http://mcp.ocean-labs.de/index.php/MCP_Releases
      设置工作环境
      首先将MCP解压缩至您所希望的位置,我个人的习惯是在桌面新建一个名为"Mods"的文件夹,并将MCP解压缩至那里。Forge SRC的下载文件应该会是一个单独的名为"forge"的文件夹,将其解压缩至MCP目录下的“jars”文件夹里(其实只需要Bin和resources文件夹……但是无妨)。由于Forge不在依赖modloader,所以您不再需要安装modloader了。如果您计划制作支持多人生存模式(SSP)的MOD,您必须要在http://www.minecraft.net/download下载minecraft_server.jar文件,也放在前文所述的"jars"文件夹中,如下图所示:
      现在返回MCP目录下的“forge”文件夹,运行"install.cmd"文件,如果您操作系统不同文件名字也不同。稍等片刻,安装结束后我们继续……
      收尾工作
      如果您在运行install.bat或者install.sh文件时没有任何错误,您现在应该可以开始您的大师之路了。返回Mcp/eclipse文件夹中,复制文件夹的地址,如:X:UsersMitchDesktopModsNewModMCPeclipse。现在您可以通过在您文件解压缩至您所希望的位置的方式安装eclipse。安装结束之后通过双击eclipse.exe的方式运行eclipse,当系统问及您的工作环境时,粘贴之前您复制的Mcp/eclipse文件夹的位置。当加载结束后,需要您找到“Client/src/net.minecraft.src/”的位置。


      IP属地:福建来自Android客户端5楼2015-07-31 21:43
      回复
        第四章:您等待已久的一章
        我希望您能多加阅读一些Minecraft的代码,虽然对于一个java造诣不精人来说,代码有可能显得凌乱,但是不要灰心丧气。
        第一节:您的第一个方块
        通过在net.minecraft.src包内右击任意文件,点击New ->Class。
        将其命名为“mod_YOURMODNAME”,必须确保其以“mod_”开头,因为只有这样系统才会识别该文件为一个MOD并开始加载。无需在底部选择任何的选项,点击"Finish"完成创建。
        此时您会看见一段预先写好的类代码。您的第一件事就是要扩展这个MOD使之成为一个基本类(BaseMod)。您可以通过添加“extends BaseMod”这样的代码完成类的声明,此时代码如下:
        package net.minecraft.src;
        public class mod_YourModName extends BaseMod {
        }
        当然,此时会在“mod_YOURMODNAME”处显示错误,此时将鼠标移至该错误处,在弹出的对话框中单击“Add unimplemented methods”。此时会在当前的基本类里添加两个类函数:“load”与“getVersion”。您可以删除掉“//TODO”这种行,在“getVersion”类函数中,您需要将null替换为”1.0“或者其他您喜欢的版本号。您需要保留引用,就如同需要返回一个字符串一样。此时的代码如下所示:
        package net.minecraft.src;
        public class mod_YourModName extends BaseMod {
        @Override
        public String getVersion() {
        return "1.0";
        }
        @Override
        public void load() {
        }
        }
        现在您终于可以开始创作您的第一份方块代码啦~
        在类的顶端添加下列代码(在“{}”之内):
        public static Block yourFirstBlock = new BlockTutorial(blockID, 0).setHardness(2.5F).setStepSound(Block.soundWoodFootstep).setBlockName("blockName");
        其中:
        名称
        含义
        public 表示所有类均可以访问。
        static
        表示在类内不创建一个新的实例的条件下即可访问(详情请查阅java教程)
        Block 该变量引用“Block.java”
        yourfirstBLock 变量名,叫什么都行
        = new BlockTutorial 此时在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)。
        public class BlockTutorial extends Block implements ITextureProvider {
        现在我们需要为我们之前跳过的那部分创建一个构造函数(可以在java教程中获得更为详实的信息)。
        public BlockTutorial(int i, int j)
        {
        super(i, j, Material.wood);
        }
        名称
        含义
        BlockTutorial 由于是构造函数,此处需与类的名字相同。
        (int i, int j) 我们在之前使用(blockID, 0)的声明。更为详细的来说,表示该构造函数使用两个整数变量并将其命名为i和j。
        super
        表示需要使用超类来传递方块信息,这也是问什么我们扩展这个类的缘故。可能难以理解但是请参阅java教程o(∩_∩)o~~
        (i, j, Material.wood); 这是由我们的MOD类中继承的将要传给方块的参数,我们同时也传递了Material.wood是因为我希望这个方块在被镐敲击时可以更为容易地被破坏。
        好,现在您即将进行的步骤是添加一个Forge的类函数以便我们可以为这个方块设置材质。
        public String getTextureFile()
        {
        return "/Mic'sMods/CrossbowMod/gui/Crossbow.png";
        }
        切记:不要更改类函数的第一行!乱修改可能覆盖或者替换类函数。
        这是一个用于十字弓MOD的例子,其中的材质存储在minecraft.jar的相应位置中。您可以很轻松地修改您所使用的材质,但是如果指向一个空位置则无法进行加载。当然也要保证是双引号~
        最后还需要一个Forge的类函数将该方块添加至创造模式的物品栏中。
        public void addCreativeItems(ArrayList itemList)
        {
        if(blockID == mod_ YourModName. yourFirstBlock.blockID)
        {
        itemList.add(new ItemStack(this));
        }
        }
        当鼠标悬停至ArrayList时可以导入。
        最后一个类函数可能有些复杂……
        名称
        含义
        void 表示该函数没有返回值
        addCreativeItems(ArrayList itemList) 类函数和构造函数的名字。不要进行修改,否则会覆盖Forge的类函数。
        if(
        根据真假不同返回值也不同,如果不懂请多看看教程
        blockID == mod_ YourModName. yourFirstBlock.blockID 逻辑表达式,如果该方块的方块ID与您创建的方块的方块ID则继续
        itemList.add(new ItemStack(this));
        在创造模式中可以创建和堆叠这一方块,这条语句不懂亦无妨。
        之后,我们在load()类函数中添加如下语句:
        ModLoader.registerBlock(yourFirstBlock);
        ModLoader.addName(yourFirstBlock, "Woohoo! My first Block :D");
        其中:
        名称
        含义
        ModLoader.registerBlock 您所调用的类函数
        (yourFirstBlock) 您所使用的方块,确保之前声明过。
        ModLoader.addName 调用另一个类函数,用于添加名字
        (yourFirstBlock, "Woohoo! My first Block :D"); 这里是为您的方块实例赋予名字的地方,您可以在这里写“红石灯(Redstone Lamp)”,“楼主我要整合包~(LouzhuWoyaoZhengheBao)”等等。
        现在要做一件最为重要的事请:
        游客,如果您要查看本帖隐藏内容请回复
        您已经为Minecraft制作了一个属于您的MOD,不再是MOD制作小白痴了!无论这个MOD多么粗糙和简陋,但都是您在MOD制作大师之路的一个见证!希望当您在成为大师之时蓦然回首还能记得您的第一份作品,无论如何,恭喜您!!!
        [spoiler]
        Flash信息测试~
        [media]http://www.he.edu.cn/learn/flash/fanli/example_starwindlight.swf[/media][/spoiler]


        IP属地:福建来自Android客户端6楼2015-07-31 21:44
        收起回复
          第三节:创建一份合成表
          在这一节,我将为您讲述如何创建一份合成表,本章不会有任何下载内容O(∩_∩)O~
          当您已经成功地掌握了前两节的内容,您就已经基本掌握了制作MOD的基本知识。现在需要为那些奋斗在生存模式的人们考虑了~
          本节内容十分简单,仅调用一个类函数。所以您可以尝试一下能否自己一个人搞清楚代码,我会将释义附在后面。当然,这些代码完全可以一行写完,但是写成这样子更为直观,就好像您在用工作台进行合成一样。
          ModLoader.addRecipe(new ItemStack(yourFirstBlock), new Object[] {
          "BBB",
          "BAB",
          "BBB",
          Character.valueOf('A'), Item.diamond,
          Character.valueOf('B'), Block.obsidian
          });
          您看懂了么?
          [spoiler]
          名称 含义
          ModLoader.addRecipe 这个是您所调用的类函数,用于为Minecraft添加合成表。
          new ItemStack(yourFirstBlock) 新建一个ItemStack类函数,该类函数的作用是允许工作台合成该物品或方块。您可以将 "yourFirstBlock" 改为您之前创建的物品或方块
          new Object[] 这个无需关心,在大括号内添加的信息将会以对象的形式传入Modloader类函数中
          "BBB", "BAB", "BBB", 此处为工作台中将会显示的合成方式,请牢记为每一种不同的原料设置一个不同的字母。那么为什么我使用了两个字母呢?是因为我只需要两种不同的原材料……
          Character.valueOf('A') 在上文中的“A”代表了如下这种物品……
          Item.diamond, 咳咳,再合成公式中的每一个“A”均代表一块钻石
          为您每一种原材料均设置 Character.valueOf('letterHere') 和Item.whatever
          }); 结束
          [/spoiler]
          您当然也可以在合成中使用您自己创建的方块或物品,举例来说,"Character.valueOf('A'), yourFirstBlock"即代表之前所述的“A”为您所创建的方块。
          如下图所示:
          以下为一些在编写合成公式时的小技巧:
          您可以使用空格代表工作台中的空位。
          "DDD", " I ", " I ",
          您可以简化合成公式,这样子无论原材料在工作台内如何放置,只要形状正确即能合成(木板合成工作台就是一例)
          "BB", "BB",
          您可以只使用单一原材料进行合成,也就是说放入一个该方块或物品即可合成您所希望的物品。
          "Z",


          IP属地:福建来自Android客户端7楼2015-07-31 21:45
          回复
            第四节:生成矿藏
            现在您可以能会想如何制作一份矿藏呢?如果您希望制作一份矿藏,请不要为其设置可以进行合成的要素,毕竟矿藏是不能合成出来的。
            建议您重新为自己的矿物方块设计一套材质,毕竟在许多灰色的石头中间突然挖到一个蓝色大方块很是诡异。您可以根据自己使用photoshop或Gimp的水平进行创作,甚至直接拷贝原版材质并加以修改其中的色调和饱和度也是一个不错的而选择.
            还记得我们在教程之前提到的".setHardness(2.5F)"么?在制作矿藏时这一参数也需要考虑在内:0.1F意味着几乎可以瞬间摧毁该方块,而1000.0F则意味着您可以挖到天荒地老。还有一点请注意,此处与您实际进行采矿无任何相关,我们稍后会进行讲解。
            我们使用generateSurface()类函数对modloader类函数进行覆盖,当生成世界时就会调用这个类函数,并生成您所添加进类函数的语句。以下代码将用于您的mod_file:
            Overriding The ModLoader Method
            [spoiler]
            @Override
            public void generateSurface(World world, Random random, int chunkX, int chunkZ)
            {
            }
            [/spoiler]
            再次强调,不要做任何修改,因为您的任何改动都会带来不可知的结果。
            现在需要再去中添加一个循环语句:
            Generation For Loop
            [spoiler]
            for(int i = 0; i < 20; i++) {
            int randPosX = chunkX + random.nextInt(16);
            int randPosY = random.nextInt(20);
            int randPosZ = chunkZ + random.nextInt(16);
            new WorldGenMinable(this.yourFirstOre.blockID, 8).generate(world, random, randPosX, randPosY, randPosZ);
            }
            [/spoiler]
            名称]含义
            for(..)表示循环,详情请参阅java教程
            int i = 0; i < 20; i++默认的循环语句,您只需要关心其中的“20”就可以了,如果您将其设置为1就代表该矿物如同钻石一样珍惜,而将其设置为20则代表如同煤那样广泛分布,您可以将其最大设置为50左右。
            int randPosX = chunkX + random.nextInt(16);表示矿藏的确切位置其中变量randPosX用于存储矿藏的X坐标,而矿脉的实际位置则由1到16的一个随机数与区块位置共同决定。不要更改其中的16!
            int randPosY = random.nextInt(20);矿脉的y坐标由1到20的一个随机数决定,您可以将20改为任何一个正值,比如矿石就将其设置为16而煤则为128。
            int randPosZ = chunkZ + random.nextInt(16);矿脉的Z坐标由变量randPosZ确定,矿脉的实际位置则由1到16的一个随机数与区块位置共同决定。不要更改其中的16!
            new WorldGenMinable为WorldGenMinable类中添加一个新的实例,该实例主要用于控制生成
            (this.yourFirstOre.blockID, 8)控制您所生成矿脉的最大矿石数量,最小值为3亦即每个矿脉只生成1块矿石
            .generate在WorldGenMinable中调用generate类函数。
            (world, random, randPosX, randPosY, randPosZ)''world''为生成世界的名称,可以由delaration类函数提供;''Random''为java的随机场,也由delaration类函数提供;"Random'' X, Y, Z为三个整值变量,用于控制矿脉的位置。
            我们接下来设置矿藏的硬度等级,也就是说使用何种镐开采这一种矿藏,以下为典型矿石的硬度等级:黑曜石为3。钻石为2。铁矿石为1。
            在您的load()类函数中添加如下代码:
            Setting Harvest Level
            [spoiler]
            MinecraftForge.setBlockHarvestLevel(yourFirstOre, "pickaxe", 3);
            [/spoiler]
            此时您的矿藏创建之旅就临近尾声,大家请欣赏我创造的超级恶劣材质的矿藏~
            P.S:在您重新生成一个世界后(也就是您更改了控制世界生成的变量)如果出现错误,请先检查区块生成是否正确再行检查代码问题。~
            [spoiler]
            [/spoiler]


            IP属地:福建来自Android客户端8楼2015-07-31 21:46
            回复
              第五节:添加烧炼与创建物品
              在这一节,我们将要为您在上一节创建的矿藏添加烧炼物,以锭为例,因为其相对较为简单。
              创建物品与创建方块相比非常类似,事实上我们只需要在方块/物品的代码中修改一点点的地方即可。我们这次需要创建一个物品对象。
              New Item Object
              [spoiler]
              public static Item yourFirstItem = new ItemTutorial(280).setIconIndex(0).setItemName("itemName");
              [/spoiler]
              与方块相比,除去使用的对象和类不同外其余完全相同。我们此时并没有使用在结构体内添加子图的方法,而是使用.setlconindex(int)类函数,.setitemName与其相同,即使这些并没有在游戏中出现,但也应该与您的方块不同。
              现在我们创建ItemTutorial类,代码与前文所述BlockTutorial类的代码完全相同(您可以自行更改类的名称)。此时只需要扩展item类,注意并不需要覆盖addCreativeItems类函数。
              使用Modloader.addName()类函数、预加载子图(如果您方块和物品使用不同子图重新预加载的话需要)
              在load()函数中添加如下代码:
              Into load()
              [spoiler]
              ModLoader.addSmelting(yourFirstOre.blockID, new ItemStack(yourFirstItem));
              [/spoiler]
              其中的第一个参数是输入端,亦即我们之前制作的那个方块,第二个参数为itemStack亦即我们通过熔炉烧炼出的您创建的物品。
              好啦,您的第一份物品已经通过熔炉烧炼而成了(其实就是一个矿石锭~),这一章虽然简单,但是却对下一节的教程非常有用,下一节我们讲述如何制作工具。


              IP属地:福建来自Android客户端9楼2015-07-31 21:46
              回复
                第四章第六节:创建一组工具
                在接下来的教程中,我们主要集中于讲述如何创建一组工具。这一节要比其他各节都要复杂,所以各位同学打起精神来~~
                首先,我们需要为新的工具创建一个EnumToolMaterial。在您的类中添加如下代码,注意不是在任何的类函数中。
                New Tool Material
                [spoiler]
                static EnumToolMaterial BLUETOOLS = EnumHelper.addToolMaterial("BLUE", 2, 171, 5F, 1, 5);
                [/spoiler]
                名称含义
                EnumHelper.addToolMaterial我们所引用的Forge类函数。如果您在此处出现错误,请手动导入net.minecraft.forge.EnumHelper。
                以下变量可以进行更改
                ''BLUE''材料名称
                2您所设定的工具能够正常开采的硬度等级(如黑曜石矿为3、钻石矿为2、铁矿为1)
                171该工具的耐久度(木质工具为59、钻石工具为1561)
                5F使用该工具开采的速度,您可以根据如下数据进行大概地判断(木质工具:2.0F,钻石工具为8.0F)
                1该工具对实体所造成的伤害值,具体计算公式如下(该数值+4)÷2。(如此时每击伤害为2.5颗心。)
                5可附魔性,此处不确定(石头为5、钻石为10、金为22)
                第二步,我们需要创建一个新的物品对象:
                New Items
                [spoiler]
                public static Item blueStoneShovel = new BlueStoneSpade(ItemID1, BLUETOOLS).setIconIndex(0).setItemName("customShovel");
                public static Item blueStonePickaxe = new BlueStonePickaxe(ItemID2, BLUETOOLS).setIconIndex(1).setItemName("customPickaxe");
                public static Item blueStoneAxe = new BlueStoneAxe(ItemID3, BLUETOOLS).setIconIndex(2).setItemName("customAxe");
                public static Item blueStoneHoe = new BlueStoneHoe(ItemID5, BLUETOOLS).setIconIndex(4).setItemName("customHoe");
                public static Item blueStoneSword = new BlueStoneSword(ItemID4, BLUETOOLS).setIconIndex(3).setItemName("customSword");
                [/spoiler]
                此时会报错,这是由于还没有新建类。
                BlueStoneSpade我们接下来所要创建的类的名字
                (ItemID1, BLUETOOLS)为您的铲子所设置的物品ID。请记得为您每一个工具都设置一个不同的物品ID!BLUETOOLS是我们之前建立的EnumToolMaterial。
                .setIconIndex(int)与之前类似,用于设定物品的子图号
                .setItemName(String)与之前类似,设定物品的内部名称。每个物品都要不同!
                现在创建一个新的类,此时您应该需要5个类了。现在我们执行下一步,扩展工具类(不是扩展item类)。
                举例来说,我的蓝石铲(BlueStoneSpade)会扩展为ItemSpade。那么蓝石斧(BlueStoneAxe)就应该扩展为 ItemAxe,以此类推。
                Into load()
                [spoiler]
                MinecraftForge.setToolClass(blueStonePickaxe, "pickaxe", 2);
                MinecraftForge.setToolClass(blueStoneShovel, "shovel", 2);
                MinecraftForge.setToolClass(blueStoneAxe, "axe", 2);
                [/spoiler]
                MinecraftForge.setToolClass调用该类函数可以为我们的物品设置一个恰当的类
                blueStonePickaxe我们传递的镐的参数,也要记得为您的铲子、斧头进行相应的设置。
                "pickaxe"小写,工具类型
                2之前提到的硬度等级,您之前应该通过EnumToolMaterial进行了硬度等级的设置
                您只需要为斧、镐、铲进行相应的设置!
                现在使用Modloader.addName添加名字,以及参照之前的教程添加合成表~
                好啦,您的蓝石系列工具就出炉啦~我认为MOD制作中最为复杂的部分就是绘制一份好看的材质。。。。
                少年们,用你们手中自己创建的工具挖出个大坑吧~~~


                IP属地:福建来自Android客户端10楼2015-07-31 21:47
                回复
                  第四章第八节:添加多材质方块
                  什么是多材质方块?就是类似草地这样子的方块:绿色的顶部,低端是棕色的,而四周却与上下均不相同。
                  第一步需要为其创建材质。需要绘制至少两幅材质才可以实现多材质的功能,将其放在同一份子图文件下。确保使用渲染软件将不同的材质渲染在同一方块上使其看起来彼此拼接,毕竟您不希望一个带有紫色边的方块转过去一看编程绿色边了吧……
                  在您制作成功材质后实际上代码非常简单,您只需要一个类函数即可:
                  Magical Multi-texture Method
                  [spoiler]
                  @Override
                  public int getBlockTextureFromSide(int side)
                  {
                  if (side == 1)
                  {
                  return 5;
                  }
                  else if (side == 0)
                  {
                  return 6;
                  }
                  else
                  {
                  return 4;
                  }
                  }
                  [/spoiler]
                  在这一例程中展示了一份草方块的制作过程。通过使用getBlockTexture()类函数,我们可以调用不同位置的子图。
                  当您看到这一方块时:
                  顶部:0
                  底部:1
                  四周:2、3、4、5
                  请确认您所看到的方块是否与其吻合~~(据反馈此处有问题……)
                  好啦,看到这里您已经是MOD制作方面的大师了~~(至少在理论层面是这样~~~)恭喜您O(∩_∩)O~


                  IP属地:福建来自Android客户端12楼2015-07-31 21:48
                  回复
                    水完撒花~更期望有心之人能创建出自己的第一个MOD,更希望能在神奇的MC世界里看到属于酒馆的专属90MOD~~~~~~~


                    IP属地:福建来自Android客户端13楼2015-07-31 21:50
                    回复
                      水的一手好帖。可你要明白,我这智商为负值的做不到啊╮(╯▽╰)╭


                      IP属地:山东来自Android客户端14楼2015-07-31 21:53
                      收起回复
                        pe的就好了


                        IP属地:陕西来自Android客户端15楼2015-07-31 21:59
                        回复
                          要加恢复mod


                          IP属地:陕西来自Android客户端16楼2015-07-31 22:00
                          回复
                            竟每人留言


                            IP属地:福建来自Android客户端17楼2015-07-31 22:38
                            回复
                              我智商-1啊!


                              来自手机贴吧18楼2015-08-15 08:31
                              回复