铁砧/箱子漏洞

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

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

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


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


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


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


    碰撞箱俯视图比较

    Anvil-Chest collision box zh.png


    铁砧是 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 相同):

    BlockAnvil setBlockBoundsBasedOnState.png


    有以下操作可以触发碰撞箱改变:

    • 看向该方块(不一定需要使选择框显示)
    • 向该方块射箭(持续有效)。
    • 通过对周围环境的更新,使方块重新渲染。
    • 利用下雨(随机)更新方块。


    限制

    在单人游戏中,玩家通常可以穿过铁砧或箱子。

    在多人游戏中,反作弊通常会阻止玩家完全穿过铁砧或箱子。


    此机制已在 1.9 中被修复(每个变体现在都有自己的碰撞箱)。