铁砧/箱子漏洞
铁砧没有固定的碰撞箱。相反,所有变体(北、东、南、西)都有一个单独的碰撞框,每当玩家看向其中一个时(或通过执行后面列出的其他操作),碰撞箱都会更新。正常铁砧、轻微损坏的铁砧和严重损坏的铁砧是相同的。
这对箱子也有同样的的效果,但仅有大箱子(中的一半)拥有不同的碰撞箱变体。箱子和陷阱箱是相互独立的。
通过站在铁砧/箱子旁边,看向另一种铁砧/箱子,玩家就能更新碰撞箱从而“卡进方块内”。同样技巧还可以用来人为延长铁砧/箱子的长度,并比预期多站一到两个像素。
注意,如果看向原来的方块,则碰撞箱将恢复正常。
碰撞箱俯视图比较
铁砧是 1×0.75 边界箱(16×12 像素),可以沿 X 轴或 Z 轴定向。
单个箱子是 0.875×0.875 边界框(14×14 像素)。“大箱子”的一侧会延伸 1 个像素。
在图中,较深的颜色表示所有变体共有的碰撞区域:操作时应该站在那里以免在操作过程中掉落。
较浅的颜色表示特定于一种变体的碰撞区域:操作时应该站在那里以便在操作过程中卡进方块内。
说明
BlockAnvil 和 BlockChest 类规定了 setBlockBoundsBasedOnState 方法,如下所示:
/* 简化代码 */
/* 位于 BlockAnvil.java */
public void setBlockBoundsBasedOnState(BlockPos pos)
{
EnumFacing enumfacing = getBlockState(pos).getValue(FACING);
if (enumfacing.getAxis() == EnumFacing.Axis.X)
{
this.setBlockBounds(0.0, 0.0, 0.125, 1.0, 1.0, 0.875);
}
else
{
this.setBlockBounds(0.125, 0.0, 0.0, 0.875, 1.0, 1.0);
}
}
/* 位于 BlockChest.java */
public void setBlockBoundsBasedOnState(BlockPos pos)
{
if (getBlockState(pos.north()).getBlock() == this)
{
this.setBlockBounds(0.0625, 0.0, 0.0, 0.9375, 0.875, 0.9375);
}
else if (getBlockState(pos.south()).getBlock() == this)
{
this.setBlockBounds(0.0625, 0.0, 0.0625, 0.9375, 0.875, 1.0);
}
else if (getBlockState(pos.west()).getBlock() == this)
{
this.setBlockBounds(0.0, 0.0, 0.0625, 0.9375, 0.875, 0.9375);
}
else if (getBlockState(pos.east()).getBlock() == this)
{
this.setBlockBounds(0.0625, 0.0, 0.0625, 1.0, 0.875, 0.9375);
}
else //single chest
{
this.setBlockBounds(0.0625, 0.0, 0.0625, 0.9375, 0.875, 0.9375);
}
}
这个方法是从这些地方调用的(与 BlockChest 相同):
有以下操作可以触发碰撞箱改变:
- 看向该方块(不一定需要使选择框显示)
- 向该方块射箭(持续有效)。
- 通过对周围环境的更新,使方块重新渲染。
- 利用下雨(随机)更新方块。
限制
在单人游戏中,玩家通常可以穿过铁砧或箱子。
在多人游戏中,反作弊通常会阻止玩家完全穿过铁砧或箱子。
此机制已在 1.9 中被修复(每个变体现在都有自己的碰撞箱)。