本帖最后由 719823597 于 2014-1-16 15:04 编辑


                    转载请注明原帖地址



                                                         一.设置MCP
需要的东西:
MCP:http://mcp.ocean-labs.de/index.php/MCP_Releases
干净的MINECRAFT
官方服务端
JDK6


先把MCP解压了(我解压到了C盘 C:\MCP),复制BIN和RESOURCE和官方服务端到MCP目录里的jars文件夹(C:\MCP\JARS)然后点开decompile.bat,完成



                                                                               二.制作新的合成公式
打开mcp里的src文件夹(MCP\src\minecraft\net\minecraft\src)找到CraftingManage.java,打开(记事本都行的),可以看到类似于这个的代码
  1.         addRecipe(new ItemStack(Block.trapdoor, 1), new Object[] {
  2.             "###", "###", Character.valueOf('#'), Block.planks
  3.         });
复制代码
这是陷阱门的合成公式,Block.trapdoor的Block是判断是方块还是物品,trapdoor是方块的名称(要区分大小写),详细可以参考Block.java和Item.java,"XXX"是合成的方法,Character.valueOf('#'), Block.planks是让#的位置在游戏合成中等于木块的放置位置


假如我想做1个沙换1个TNT的公式,代码如下
  1.         addRecipe(new ItemStack(Block.TNT, 1), new Object[] {
  2.             "#", Character.valueOf('#'), Block.sand
  3.         });
复制代码


写好后就可以测试了,打开MCP目录下的recompile.bat,让它检查错误,检查完成后可以打开startclient.bat进入游戏测试,测试完成后打开mcp目录下的reobfuscate.bat,让它把刚刚修改的文件打包,打包完后的文件可以在reobf文件夹找到


                                         三.制作一个新方块

新建一个BlockExample.java(名字自己改),在里面写上
  1. package net.minecraft.src;

  2. import java.util.Random;

  3. public class BlockExample extends Block
  4. {
  5. public BlockExample(int i, int j)
  6. {
  7. super(i, j, Material.rock);
  8. }

  9. public int idDropped(int i, Random random)
  10. {
  11. return 0;
  12. }
  13. }
复制代码
rock是方块的特性(cloth是羊毛 易燃)可以参考Material.java,”return 0“ 是掉落的物品(0可以改成各种物品的ID)


新的方块就做好了,接下来是将其添加到游戏中,打开Block.java,大概720+行,找到
  1. public static final Block trapdoor;
复制代码

在这句代码下面添加上
  1.         public static final Block example;
复制代码

然后继续往下翻,找到
  1. trapdoor = (new BlockTrapDoor(96, Material.wood)).setHardness(3F).setStepSound(soundWoodFootstep).setBlockName("trapdoor").disableStats().disableNeighborNotifyOnMetadataChange();
复制代码

在下面添加上

  1. example = (new BlockExample(111, 49)).setHardness(1.5F).setResistance(5000000F).setStepSound(soundStoneFootstep);
复制代码

111为方块的ID(97-255为空方块ID),49为材质编号(可以参考别的方块),setHardness(1.5F)为挖时的速度(1.5F为手挖石头的速度),setResistance(5000000F)是方块的抗炸强度(也可以参考别的方块的数值),setStepSound(soundStoneFootstep)是踩在方块上的脚步声(这里是石头的)

最后,打开recompile检查吧




                                          四.添加一个新物品

新建一个ItemTest.java(名字还是自己改),在里面写上

  1. package net.minecraft.src;

  2. public class ItemTest extends Item
  3. {

  4.     public ItemExample(int i, int k)
  5.     {
  6.         super(i);
  7.         maxStackSize = 64;
  8.     }

  9. //这里可以自己添加代码

  10. }
复制代码
maxStackSize = 64是设定最大叠加数量,如果嫌物品太无趣了还可以自己添加代码

  1. public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
  2.     {
  3.         itemstack.stackSize--;
  4.         world.playSoundAtEntity(entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
  5.         if(!world.multiplayerWorld)
  6.         {
  7.             world.entityJoinedWorld(new EntityArrow(world, entityplayer));
  8.         }
  9.         return itemstack;
  10.     }
复制代码

这条代码使手持此物品时右键可以扔出箭

好了 接下来就要把新物品添加进游戏了 打开Item.java 找到这条代码
  1. public static Item recordCat = (new ItemRecord(2001, "cat")).setIconCoord(1, 15).setItemName("record");
复制代码

在这条代码下面添加一句
  1. public static Item test = (new ItemTest(120, 0)).setIconCoord(5, 5).setItemName("example");
复制代码

注意! 120不是物品的真正ID,物品的真正ID为120+256 , (5, 5)是物品的材质(可以参考前面的物品)

现在可以打开recompile.bat检查代码了



                                                                                    五.削弱enderman

首先,我们打开EntityEnderman.java ,然后从第326行开始,你可以看到如下代码
  1.         field_35186_b = new boolean[256];
  2.         field_35186_b[Block.stone.blockID] = true;
  3.         field_35186_b[Block.grass.blockID] = true;
  4.         field_35186_b[Block.dirt.blockID] = true;
  5.         field_35186_b[Block.cobblestone.blockID] = true;
  6.         field_35186_b[Block.planks.blockID] = true;
  7.         field_35186_b[Block.sand.blockID] = true;
  8.         field_35186_b[Block.gravel.blockID] = true;
  9.         field_35186_b[Block.oreGold.blockID] = true;
  10.         field_35186_b[Block.oreIron.blockID] = true;
  11.         field_35186_b[Block.oreCoal.blockID] = true;
  12.         field_35186_b[Block.wood.blockID] = true;
  13.         field_35186_b[Block.leaves.blockID] = true;
  14.         field_35186_b[Block.sponge.blockID] = true;
  15.         field_35186_b[Block.glass.blockID] = true;
  16.         field_35186_b[Block.oreLapis.blockID] = true;
  17.         field_35186_b[Block.blockLapis.blockID] = true;
  18.         field_35186_b[Block.sandStone.blockID] = true;
  19.         field_35186_b[Block.cloth.blockID] = true;
  20.         field_35186_b[Block.plantYellow.blockID] = true;
  21.         field_35186_b[Block.plantRed.blockID] = true;
  22.         field_35186_b[Block.mushroomBrown.blockID] = true;
  23.         field_35186_b[Block.mushroomRed.blockID] = true;
  24.         field_35186_b[Block.blockGold.blockID] = true;
  25.         field_35186_b[Block.blockSteel.blockID] = true;
  26.         field_35186_b[Block.brick.blockID] = true;
  27.         field_35186_b[Block.tnt.blockID] = true;
  28.         field_35186_b[Block.bookShelf.blockID] = true;
  29.         field_35186_b[Block.cobblestoneMossy.blockID] = true;
  30.         field_35186_b[Block.oreDiamond.blockID] = true;
  31.         field_35186_b[Block.blockDiamond.blockID] = true;
  32.         field_35186_b[Block.workbench.blockID] = true;
  33.         field_35186_b[Block.oreRedstone.blockID] = true;
  34.         field_35186_b[Block.oreRedstoneGlowing.blockID] = true;
  35.         field_35186_b[Block.ice.blockID] = true;
  36.         field_35186_b[Block.cactus.blockID] = true;
  37.         field_35186_b[Block.blockClay.blockID] = true;
  38.         field_35186_b[Block.pumpkin.blockID] = true;
  39.         field_35186_b[Block.netherrack.blockID] = true;
  40.         field_35186_b[Block.slowSand.blockID] = true;
  41.         field_35186_b[Block.glowStone.blockID] = true;
  42.         field_35186_b[Block.pumpkinLantern.blockID] = true;
  43.         field_35186_b[Block.field_35285_bn.blockID] = true;
  44.         field_35186_b[Block.field_35286_bo.blockID] = true;
  45.         field_35186_b[Block.field_35287_bp.blockID] = true;
  46.         field_35186_b[Block.field_35281_bs.blockID] = true;
复制代码

这些就是enderman可以拿起的方块, 根据谷歌翻译,我们可以知道true的意思是行的而false的意思是不行的。所以 如果我想要让enderman拿不起什么的石头的话,可以这样改:

  1. field_35186_b[Block.stone.blockID] = false;
复制代码
第一部分结束。




我们还可以修改它的一些基础数值来玩
  1.         field_35187_a = false;
  2.         field_35184_d = 0;
  3.         field_35185_e = 0;
  4.         texture = "/mob/enderman.png";
  5.         moveSpeed = 0.2F;
  6.         attackStrength = 5;
  7.         setSize(0.6F, 2.9F);
  8.         stepHeight = 1.0F;
复制代码

前三个我暂时没看明白,texture是皮肤的路径,moveSpeed为移动速度,attackStrength为攻击威力(试试改成负数),setSize是改大小(皮肤不会改变 占地变了而已),stepHeight为它的身高(貌似0.5F等于1格)



放个挺好玩的代码

         public boolean interact(EntityPlayer entityplayer)
    {
        
        
        
        this.motionY += 1;
        return true;
    }

在entityenderman.java里加入这条即可,功能为右键enderman后他的y坐标+1  也就是飞起来