Minecraft(我的世界)中文论坛

标题: 利用Forge API开发联机MOD【基础篇】【第六章】

作者: yuxuanchiadm    时间: 2012-8-1 19:52
标题: 利用Forge API开发联机MOD【基础篇】【第六章】
本帖最后由 yuxuanchiadm 于 2013-7-26 09:22 编辑

利用Forge API开发联机MOD【基础篇】【第六章】
给你的MOD添加一个方块
作者:yuxuanchiadm

索引贴地址:http://www.mcbbs.net/thread-38211-1-1.html

请确定你已经阅读完成第五章的内容:
http://www.mcbbs.net/thread-38387-1-1.html
否则不要阅读此贴!

序:
在上一章里,我们学会了如何创建一个物品,并应用于游戏中。现在我们将创建一个高级刷怪笼方块的基本Block对象,使你可以设置刷怪笼所刷的怪物。

添加一个新方块:
首先,我们要想好这个方块所能实现的功能。
1.可以被任何镐子直接挖掉。
2.可以设置刷怪笼所刷的怪物。
3.可以设置刷怪笼刷怪的时间间隔。
下面,开始行动!
首先,添加一个可以合成普通刷怪笼的合成表:
  1. ModLoader.addRecipe(new ItemStack(Block.mobSpawner,1), new Object[]
  2. {
  3.     "###","#*#","###",Character.valueOf('#'),Item.ingotIron,Character.valueOf('*'),Item.redstone
  4. });
复制代码
然后,在myFirstMod下新建一个包Block,再新建一个类,命名为BlockAdvancedMobSpawner,并更改内容为:
  1. package myFirstMod.Block;import java.util.Random;import net.minecraft.block.BlockContainer;
  2. import net.minecraft.block.material.Material;
  3. import net.minecraft.entity.player.EntityPlayer;
  4. import net.minecraft.tileentity.TileEntity;
  5. import net.minecraft.world.World;public class BlockAdvancedMobSpawner extends BlockContainer
  6. {
  7.     // 构造函数
  8.     public BlockAdvancedMobSpawner(int par1)
  9.     {
  10.         super(par1, Material.rock);
  11.         this.setHardness(5.0F);
  12.         this.setStepSound(soundMetalFootstep);
  13.         this.setBlockName("Advanced Mob Spawner");
  14.     }
  15.     // TileEntity对象
  16.     public TileEntity createNewTileEntity(World var1)
  17.     {
  18.         return new TileEntityAdvancedMobSpawner();
  19.     }
  20.     // 掉落的物品ID
  21.     public int idDropped(int par1, Random par2Random, int par3)
  22.     {
  23.         return this.blockID;
  24.     }
  25.     // 不是不透明方块
  26.     public boolean isOpaqueCube()
  27.     {
  28.         return false;
  29.     }
  30.     // 玩家右击方块
  31.     public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
  32.     {
  33.         if (par5EntityPlayer.isSneaking())
  34.         {
  35.             if(par1World.isRemote)
  36.             {
  37.                 //如果蹲下但是客户端,也跳出,但返回true使其挥舞手臂
  38.                 return true;
  39.             }
  40.         }
  41.         else
  42.         {
  43.             //如果没有蹲下则跳出
  44.             return false;
  45.         }
  46.         // 以后会在这里添加代码
  47.         return true;
  48.     }
  49. }
复制代码
这里Eclipse会报错,因为没有定义TileEntityAdvancedMobSpawner类,我们将在稍后将其补全。

/**知识点:在Minecraft里用什么表示一个方块?
Minecraft里所有的方块都表示为继承自Block类的一个类,在Block类里,定义了许多有用的方法,这些方法会在玩家执行右击、破坏、左击......等动作时调用,以实现相应的处理,Minecraft的方块时一个接一个的储存在存档文件里的,在读取的时候顺序读取,存储在存档文件里面的一个方块只包含基础信息,不包含其方块的坐标,方块的坐标是在载入时根据先后顺序依次计算的。

**/
在mod_myFirstMod里添加字段:


  1. public static int BlockAdvancedMobSpawnerID;
  2. public static Block AdvancedMobSpawner;
复制代码

在preInit函数唯一一个try语句块中添加
  1. BlockAdvancedMobSpawnerID = myFirstModConfig.GetBlockID("BlockAdvancedMobSpawner", 300);
复制代码
复制一个刷怪笼的纹理图片到myFirstMod\sprites\blocks.png,用PS打开,并乱涂一番。
得到高级刷怪笼的纹理:)

在myFirstModProxyClient中注册(预载入)这个纹理:
添加字段:
  1. public final static String BLOCKS_PNG_PATH = "/myFirstMod/sprites/blocks.png";
复制代码
在registerRenderers方法中添加:
  1. MinecraftForgeClient.preloadTexture(BLOCKS_PNG_PATH);
复制代码
在BlockAdvancedMobSpawner中绑定这个纹理:
  1. this.blockIndexInTexture = 0;
  2. this.setTextureFile(myFirstModProxyClient.BLOCKS_PNG_PATH);
复制代码
然后在load函数添加:
  1. AdvancedMobSpawner = new BlockAdvancedMobSpawner(BlockAdvancedMobSpawnerID);
  2. ModLoader.registerBlock(AdvancedMobSpawner);
  3. ModLoader.addName(AdvancedMobSpawner, "高级刷怪笼");
复制代码

添加合成表:
  1. ModLoader.addRecipe(new ItemStack(AdvancedMobSpawner,1), new Object[]
  2. {
  3.     "###","#*#","###",Character.valueOf('#'),Item.diamond,Character.valueOf('*'),Block.mobSpawner
  4. });
复制代码

现在,你可以把这个方块的createNewTileEntity()函数改成(记得改回来):
  1. public TileEntity createNewTileEntity(World var1)
  2. {
  3.     return null;
  4. }
复制代码


并测试游戏,你可以用8个钻石和1个刷怪笼得到一个类似刷怪笼的玩意(伪·钻石氪金刷怪笼),但是这玩意丝毫没有用处,在下一章里,我将教你如何让这玩意起作用。

总结:
在这一章里,我们学会了如何创建一个基本的方块,在下一章里,我们会让这个方块能够像刷怪笼一样刷各种生物。



作者: Condor    时间: 2012-8-1 19:54
目测这对一些人做MOD很有帮助,辛苦了。。。
作者: masson_ma    时间: 2013-4-29 04:33
1.5.1中MinecraftForgeClient.preloadTexture()方法过期了怎么破?好像改了写法了
作者: kuafuzhuguang    时间: 2013-8-5 20:13
完成。。。
作者: huanghongxun    时间: 2013-10-31 18:56
问一下new ResourceLocation("MyMod:textures/block/blocks.png")指的位置是哪里= =
作者: yuxuanchiadm    时间: 2013-10-31 21:48
huanghongxun 发表于 2013-10-31 18:56
问一下new ResourceLocation("MyMod:textures/block/blocks.png")指的位置是哪里= =

Nope如果你想给方块加材质的话,那么1.6.2不是这么写的。
重载Block的registerIcons方法然后注册材质,例如:
public void registerIcons(IconRegister iconRegister)
{
    blockIcon = iconRegister.registerIcon("AssemblyProgramCraft:BaseTexture");
}
然后把方块材质放到assets/assemblyprogramcraft/textures/blocks目录里并命名为BaseTexture.png,不需要加/textures/block/,物品也一样,并且其在代码里引用的资源包名可以有大写,但实际资源包名必须小写,另外1.6.4开始每个方块都有个单独的材质文件,不再是放一起了。
作者: yuxuanchiadm    时间: 2013-10-31 21:57
本帖最后由 yuxuanchiadm 于 2013-10-31 21:58 编辑
huanghongxun 发表于 2013-10-31 18:56
问一下new ResourceLocation("MyMod:textures/block/blocks.png")指的位置是哪里= =
另外如果直接使用ResourceLocation,那么
private static final ResourceLocation scrollTextures = new ResourceLocation("AssemblyProgramCraft:textures/gui/scroll.png");
对应:
assets/assemblyprogramcraft/textures/gui/scroll.png
绘制则用:
FMLClientHandler.instance().getClient().renderEngine.bindTexture(scrollTextures);
进行纹理绑定

作者: huanghongxun    时间: 2013-10-31 22:01
yuxuanchiadm 发表于 2013-10-31 21:57
另外如果直接使用ResourceLocation,那么
private static final ResourceLocation scrollTextures = new R ...

恩可以了!
做了一个高级水力发电机MOD。。
作者: huanghongxun    时间: 2013-11-2 13:30
如何在TileEntity里面获取Player。。。。
作者: huanghongxun    时间: 2013-11-2 19:16
yuxuanchiadm 发表于 2013-10-31 21:48
Nope如果你想给方块加材质的话,那么1.6.2不是这么写的。
重载Block的registerIcons方法然后注册材质,例 ...

这个assets/assemblyprogramcraft/textures/blocks目录
打包后的确可以
但是我想在调试的时候有材质应该放到哪里?
mcp/jars/assets/...不能加载
minecraft.jar里不能加载
mods/assets/...不能加载
作者: phpair    时间: 2014-7-17 07:46
huanghongxun 发表于 2013-11-2 19:16
这个assets/assemblyprogramcraft/textures/blocks目录
打包后的确可以
但是我想在调试的时候有材质应该 ...

eclipse编译在ec的bin里
作者: soil-sword    时间: 2019-12-8 03:08
看 看不懂。。。