铁砧/箱子漏洞

From Minecraft Parkour Wiki
This page is a translated version of the page Anvil/Chest Manipulation and the translation is 100% complete.

铁砧没有固定的碰撞箱。相反,所有变体(北、东、南、西)都有一个单独的碰撞框,每当玩家看向其中一个时(或通过执行后面列出的其他操作),碰撞箱都会更新。正常铁砧、轻微损坏的铁砧和严重损坏的铁砧是相同的。

这对箱子也有同样的的效果,但仅有大箱子(中的一半)拥有不同的碰撞箱变体。箱子和陷阱箱是相互独立的。


通过站在铁砧/箱子旁边,看向另一种铁砧/箱子,玩家就能更新碰撞箱从而“卡进方块内”。同样技巧还可以用来人为延长铁砧/箱子的长度,并比预期多站一到两个像素。


注意,如果看向原来的方块,则碰撞箱将恢复正常。


哔哩哔哩上搬运自 cyn 对箱子/铁砧漏洞的演示


碰撞箱俯视图比较


铁砧是 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 中被修复(每个变体现在都有自己的碰撞箱)。