方块
方块对于Minecraft显然是必不可缺的。它们构成了所有的地形、建筑和机械。如果你对制作一个模组感兴趣,你会有想要往里面加入一些方块的机会。这个页面将会引导你创建方块,以及你可以对它们做的一些事情。
创建一个方块
基本方块
对于不需要特殊功能(想想圆石、木板等)的简单方块并不需要一个自定义的类。只需要实例化Block
类并调用众多赋值器中的一些,你就可以创建许多不同种类的方块。例如:
setHardness
—— 控制破坏这个方块的时间。它可以是任意值。作为对照,石头的硬度(hardness)是1.5,泥土是0.5。如果这个方块应该被设为不可破坏,可以使用setBlockUnbreakable
这个方便的方法。setResistance
—— 控制方块的爆炸抗性。这个是与硬度分开的,但是如果setResistance
的值低于 setHardness 的5倍的话,setResistance 的值也会被替换为 setHardness 的5倍。setSoundType
—— 控制当方块被打击、被破坏或被放置时发出的声音。需要一个SoundType
类型的参数,相见声音页面(译者注:即本教程的效果-声音)以了解更多细节。setLightLevel
—— 控制方块发出的光线。注意:这个值的取值范围是0~1,不是0~15。要计算这个值,用你期望的光亮级别值除以16。例如一个光亮等级为5的方块应当传递一个5/16f
的值给这个方法。setLightOpacity
—— 控制透过该方块的光线会被抹除的量。不像setLightLevel
那样,这个值的范围是0~15。例如,将这项设置为3
将会在每次有光线透过这个方块时将透过的光降低3个亮度等级。setUnlocalizedName
—— 几乎不言而喻,设置方块的未本地化名称。名字的前缀会是“tile.”并且会出于本地化的目的以“.name”作为后缀。例如setUnlocalizedName("foo")
会使得方块的世纪本地化键变为“tile.foo.name”。关于更多高级的本地化控制则需要一个自定义物品。后续我们再来讲。setCreativeTab
—— 控制这个方块将会落在哪一个创造模式标签中。如果方块应该在创造模式菜单中出现的话,这一项必须被调用。标签选项可以在CreativeTabs
类中找到。
所有的这些方法都是支持责任链调用的(译者注:chainable,应该是指设计模式中的责任链模式),这意味着你可以链式调用它们。要查看这个的例子,参见 Block#registerBlocks
。
高级方块
当然,以上只适用于极度简单的方块。如果你需要添加功能,比如玩家互动,那就需要一个自定义类了。然而,Block
类有许多方法而且不幸的是并不是每一个方法都能够在这里一一文档化。阅读本节剩下的部分来了解你用方块能够做的事情。
注册方块
方块必须注册给函数。
重要: 世界中的一个方块和物品中的一个“方块”是有很大不同的。世界里的一个方块是由
IBlockState
表示的,它的行为是由Block
的一个实例定义的。同时,一个物品栏里的物品是一个ItemStack
,被Item
控制着。作为Block
和Item
世界之间的桥梁,ItemBlock
出现了。ItemBlock
是Item
的一个子类,它拥有一个block
字段,这个字段存储着它所代表的方块的Block
引用。ItemBlock
作为物品定义了“方块”的一些属性,比如右键如何放置方块。不需要ItemBlock
来创建一个Block
也是有可能的(例如:minecraft:water
存在一个方块,但是却没有对应的物品。因此它不可能像一个物品被手持。)
当一个方块被注册的时候,只有一个方块被注册。这个方块并不会自动拥有一个ItemBlock
。要为一个方块创建一个ItemBlock
,应当使用new ItemBlock(block).setRegistryName(block.getRegistryName())
。未本地化的名字也跟方块的一致。也可以用ItemBlock
的子类。只要一个ItemBlock
为一个 方块注册了,就可以使用Item.getItemFromBlock
来获取它。如果没有这个Block
类对应的ItemBlock
类,Item.getItemFromBlock
将会返回null
,所以当你不确定一个Block
类有没有对应的ItemBlock
类的时候,检查返回值是否是null即可。
进一步阅读
有关方块属性的信息,比如像木橱、围栏、墙以及更多,请参见方块状态(blockstates)一节。