方块互动
玩家可以与方块有很多种互动(Interaction),比如说右击、左击、碰撞、在方块上行走、还有挖掘等。
这一节将会覆盖与方块最常见的互动类型。
玩家右击
由于左击,或者说“击打”,一个方块一般并不会发生什么独特的行为,应该可以说右击,或者“激活”一个方块是最常用的一种互动方式。很幸运,这也是最简单的一种互动方式。
onBlockActivated
这个方法控制了右键的行为,它可能会有点复杂。下面是这个方法的定义:
public boolean onBlockActivated(World worldIn,
BlockPos pos,
IBlockState state,
EntityPlayer playerIn,
EnumHand hand,
@Nullable ItemStack heldItem,
EnumFacing side,
float hitX,
float hitY,
float hitZ)
下面是对这个方法的讨论。
参数
前面几个参数很明显,它们是方块的当前世界,位置,和状态。接下来是激活方块的玩家,以及激活时的左右手。
接下来的一个参数 heldItem
是玩家激活方块时拿着的 ItemStack
。注意这个参数为 @Nullable
,也就是说这个参数可以为null(即手里没拿东西)。
重要
如果你需要检测玩家手里的物品,请使用方法传进来的这个 ItemStack
。检测玩家当前握着的物品是不可靠的,因为它可能在激活方块以后已经变了。
最后四个参数都是相互联系的。side
很明显是方块被激活的面。 hitX
,hitY
,和 hitZ
可能没这么明显,他们是方块的碰撞箱上激活点的坐标。它们的范围为0-1,代表玩家点击方块上的确切位置。
返回值
返回的那个boolean到底是什么呢?简单来说,它代表了这个方法是否“做了”什么。如果任何执行了任何动作,那就返回true,这将防止之后更多的事情发生,比如说激活物品。
重要
在客户端返回 false
将会防止这个方法在服务端被调用。通常,我们会检查 worldIn.isRemote
并返回 true
,否则进入正常的激活逻辑。原版中有很多这样的例子,比如说箱子(Chest)
用处
激活的用处可以说是无穷的。然而我们仍将介绍一些常用的用处。
GUI
方块激活时最常见的用处就是打开一个GUI。许多原版的方块都是这样的,比如说箱子,漏斗,熔炉等。更多的GUI信息可以在这里(未完成)找到。
激活
激活的另一个用处,是激活。这里指的是打开一个开关或者是激活方块执行一个特定的行为。比如说,一个方块可以在激活时发光。原版中可以参考按钮或者拉杆的例子。
重要
onBlockActivated
在客户端和服务端都会被调用,所以一定要记住代码所处的端。许多东西,比如说打开GUI和变动世界,应该只在服务端调用。
玩家破坏
未完成
玩家高亮
未完成
实体碰撞
未完成
onBlockClicked
public void onBlockClicked(World worldIn, BlockPos pos, EntityPlayer playerIn)
当玩家点击一个方块时会被触发。
提示
这个方法是在玩家左击一个方块时调用的。
不要将它和onBlockActivated
弄混了,它是当玩家右击一个方块才会激活的。
参数
类型 | 名称 | 描述 |
---|---|---|
World |
worldIn |
被点击方块所处的世界 |
BlockPos |
pos |
被点击方块所处的位置 |
EntityPlayer |
playerIn |
点击的玩家 |
使用范例
这个方法可以很方便地在玩家点击一个方块时添加一些自定义的事件。
默认情况下这个方法不会做任何操作。
复写了这一方法的两个方块是音符盒(Note Block)和红石矿石(Redstone Ore)。
音符盒会在左击的时候播放一个音效。红石矿石方块会在左击的时候发光几秒钟。
onBlockDestroyedByPlayer
public void onBlockDestroyedByPlayer(World worldIn, BlockPos pos, IBlockState state)
当玩家摧毁一个方块时会被触发。
参数:
类型 | 名称 | 描述 |
---|---|---|
World |
worldIn |
被摧毁的方块所在的世界 |
BlockPos |
pos |
被摧毁方块的坐标 |
IBlockState |
state |
被摧毁的方块的状态 |
警告
参数pos
可能不保持指示的状态
使用范例
此方法非常适合添加自定义方块破坏事件。
该方法默认为空。
TNT 方块为了在摧毁时引发爆炸重写了该方法。
激活的活塞使用该方法因为激活的活塞由两部分(头部和基部)组成,
当移动的活塞块被破坏时,它利用这个方法来破坏基部。