本帖最后由 719823597 于 2012-7-31 13:44 编辑

第一篇教程


如果编译时出了错误,请把错误报告发上来




                                                                                                 一.如何在MCP里装modloader(只需改一下教程1的方法)
先把MCP解压了(我解压到了C盘 C:\MCP),复制BIN和RESOURCE和官方服务端到MCP目录里的jars文件夹(C:\MCP\JARS)然后点开decompile.bat,完成

注意!! 复制BIN之前先在MINECRAFT.JAR里装入modloader并删掉meta-inf文件夹

然后decompile

                                                                                                

                                                                                               二.如何用modloader添加一条合成公式
先在src文件夹里创建个名为mod_xxx.java的文件(xxx可以随便改),打开输入
  1. package net.minecraft.src;

  2. public class mod_xxx extends BaseMod
  3. {

  4. public String Version()
  5.     {
  6.         return "1.0 ";
  7.     }

  8.                 public mod_xxx ()
  9.     {
  10. ModLoader.AddRecipe(new ItemStack(tnt, 1), new Object[] {"s", "s", Character.valueOf('s'), Block.dirt});
  11.                    }
  12.                   
  13.                    }
复制代码


”public String Version()“为mod的版本号(不可以去掉 否则会崩溃),
ModLoader.AddRecipe(new ItemStack(tnt, 1), new Object[] {"s", "s", Character.valueOf('s'), Block.dirt});

这条就是合成公式啦,“new ItemStack(tnt, 1)”为合成后的物品,”"s", "s", Character.valueOf('s'), Block.dirt“为合成配方(打竖的两个土)

                                                                                                                          二.用modloader添加一个新方块

我们先新建一个名为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 this.blockID;
  12.     }
  13.     }
复制代码

其实这里是引用了教程1的代码= =,modloader比MCP方便的原因之一就是添加东东不用怎么修改游戏自带文件,减少冲突

然后我们打开mod_xxx.java,添加一条

public static final Block example = (new Blockexample (114,0)).setHardness(0.3F).setResistance(30F).setBlockName("example");;

“public static final Block example”算是给这方块一个名字,在编mod时和下文用得到,“(new Blockexample (114,0))”是引用blockexample.java文件(刚刚弄的),方块编号为114,之后的那些sethardness之类的在教程1已经讲过

然后再添加
  1.        example.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/xxx/example.png");
  2.        ModLoader.RegisterBlock(example );
  3.            ModLoader.AddRecipe(new ItemStack(example , 1), new Object[]{ "X", Character.valueOf('X'), Block.cobblestone});
  4.            ModLoader.AddName(example , "example");
复制代码
“example .blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/xxx/example.png");”是添加刚刚那个方块的材质的路径(现在的路径为minecraft.jar/xxx/example.png),|| “ModLoader.RegisterBlock(example );”这句是必要的,注册方块用的   “ModLoader.AddRecipe(new ItemStack(example , 1), new Object[]{ "X", Character.valueOf('X'), Block.cobblestone});”
这个不用说啦,合成公式   “ModLoader.AddName(example , "example");”这个是添加此方块在游戏中的名字(就叫example吧)



完整代码如下:
  1. package net.minecraft.src;

  2. public class mod_xxx extends BaseMod
  3. {

  4. public static final Block example = (new Blockexample (114,0)).setHardness(0.3F).setResistance(30F).setBlockName("example");;

  5. public String Version()
  6.     {
  7.         return "1.0 ";
  8.     }
  9.         
  10.                 public mod_xxx ()
  11.     {
  12.                   
  13.                  
  14.            example.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/xxx/example.png");
  15.        ModLoader.RegisterBlock(example );
  16.            ModLoader.AddRecipe(new ItemStack(example , 1), new Object[]{ "X", Character.valueOf('X'), Block.cobblestone});
  17.            ModLoader.AddName(example , "example");
  18.                   
  19.                   
  20.                    }
  21.                   
  22.                   
  23.                    }
复制代码

                                                                                                           三.用modloader制作一个新物品

直接引用教程1的代码吧,把教程1的代码放入src文件夹,打开mod_xxx.java 输入
  1. public static final Item test = (new ItemExample (3010)).setItemName("test");;
复制代码

其实与方块的差不多,那就略过吧= =,继续输入
  1. test.iconIndex = ModLoader.addOverride("/gui/items.png", "/xxx/test.png");
  2. ModLoader.AddName(test, "test");
  3. ModLoader.AddRecipe(new ItemStack(test, 1), new Object[] {"s", "s", Character.valueOf('s'), Block.stone});
复制代码
这里的第一条是材质的路径(和刚才的一样,就是文件名为test.png),“ModLoader.AddName(test, "test");”是游戏中显示的的物品名字,”ModLoader.AddRecipe(new ItemStack(test, 1), new Object[] {"s", "s", Character.valueOf('s'), Block.stone});“是合成公式(打竖的两个石头), 与方块不同的是 这里并不需要注册道具


完整代码如下

  1. package net.minecraft.src;

  2. public class mod_xxx extends BaseMod
  3. {

  4. public static final Item test = (new ItemExample (3010)).setItemName("test");;

  5. public String Version()
  6.     {
  7.         return "1.0 ";
  8.     }
  9.         
  10.                 public mod_xxx ()
  11.     {
  12.                   
  13. test.iconIndex = ModLoader.addOverride("/gui/items.png", "/xxx/test.png");
  14. ModLoader.AddName(test, "test");
  15. ModLoader.AddRecipe(new ItemStack(test, 1), new Object[] {"s", "s", Character.valueOf('s'), Block.stone});

  16.                    }
  17.                   
  18.                    }
复制代码

                                                



                                                                                                                四.如何制做一个新的NPC(动物类)
先新建一个EntityXXX.java文件,写上

  1. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
  2. // Jad home page: http://www.kpdus.com/jad.html
  3. // Decompiler options: packimports(3) braces deadcode

  4. package net.minecraft.src;

  5. import java.util.Random;

  6. // Referenced classes of package net.minecraft.src:
  7. //            EntityAnimal, Item, EntityPlayer, InventoryPlayer,
  8. //            ItemStack, World, NBTTagCompound

  9. public class EntityXXX extends EntityAnimal
  10. {

  11.     public EntityXXX(World world)
  12.     {
  13.         super(world);
  14.         texture = "/mob/xxx.png";
  15.         setSize(0.9F, 1.3F);
  16.     }

  17.     public void writeEntityToNBT(NBTTagCompound nbttagcompound)
  18.     {
  19.         super.writeEntityToNBT(nbttagcompound);
  20.     }

  21.     public void readEntityFromNBT(NBTTagCompound nbttagcompound)
  22.     {
  23.         super.readEntityFromNBT(nbttagcompound);
  24.     }

  25.     protected String getLivingSound()
  26.     {
  27.         return "mob.cow";
  28.     }

  29.     protected String getHurtSound()
  30.     {
  31.         return "mob.cowhurt";
  32.     }

  33.     protected String getDeathSound()
  34.     {
  35.         return "mob.cowhurt";
  36.     }

  37.     protected float getSoundVolume()
  38.     {
  39.         return 0.4F;
  40.     }

  41.     protected int getDropItemId()
  42.     {
  43.         return Block.stone.shiftedIndex;
  44.     }

  45. }
复制代码

        texture = "/mob/xxx.png";  是NPC的皮肤的路径,setSize(0.9F, 1.3F);是NPC的大小(这是改NPC的实际大小 改显示的大小在render文件里)


        然后我们需要模型和render文件,我们需要用到Techne ,可以自己制作模型和render文件

制作完后将render和模型文件放入src文件夹,然后打开mod_xxx.java

加上这句



  1.                 ModLoader.RegisterEntityID(EntityXXX.class, "XXX", ModLoader.getUniqueEntityId());
  2.                 ModLoader.AddSpawn(EntityXXX.class, 10, EnumCreatureType.creature);
复制代码

  1.   public void AddRenderer(Map map)
  2.     {   
  3.         map.put(EntityXXX.class, new RenderXXX(new ModelXXX(), 0.5F));
  4.     }
复制代码

完整代码如下


  1. package net.minecraft.src;

  2. public class mod_xxxextends BaseMod
  3. {

  4. public void AddRenderer(Map map)
  5. {
  6. map.put(EntityXXX.class, new RenderXXX(new ModelXXX(), 0.5F));
  7. }

  8. public String Version()
  9.     {
  10.         return "1.0 ";
  11.     }
  12.         
  13.         
  14.                 public mod_xxx ()
  15.     {
  16.                   

  17.                    ModLoader.RegisterEntityID(EntityXXX.class, "XXX", ModLoader.getUniqueEntityId());
  18. ModLoader.AddSpawn(EntityXXX.class, 10, EnumCreatureType.creature);
  19.                   
  20.                    }
  21.                    }
复制代码












剩下的晚上再更新