1. 类似空气的方块

如果要写一个类似空气那样的方块该做什么?

public class BlockWithoutHitbox extends Block {

    // TODO Actual meaning and necessity
    @Override
    public boolean isFullBlock(IBlockState state) {
        return false;
    }

    // TODO Actual meaning and necessity
    @Override
    public boolean isBlockNormalCube(IBlockState state) {
        return false;
    }

    // TODO Actual meaning and necessity
    @Override
    public boolean isNormalCube(IBlockState state) {
        return false;
    }

    // TODO Actual meaning and necessity
    @Override
    public boolean isCollidable()
    {
        return false;
    }

    // func_149686_d,返回 false 代表这个方块不是完整的 1x1x1 立方体。
    // 和 isOpaqueCube 不一样的地方在于,这个方法会影响窒息、碰撞等判定及光照计算。
    @Override
    public boolean isFullCube(IBlockState state) {
        return false;
    }

    // func_176205_b,返回 true 代表可以钻过这个方块,参考原版门的情况
    @Override
    public boolean isPassable(IBlockAccess worldIn, BlockPos pos) {
        return true;
    }

    // func_149662_c,返回 false 代表这个方块是完整的 1x1x1 的正方体,且没有透明材质
    // TODO According to MCP, this affects ambient occlusion & culling?
    @Override
    public boolean isOpaqueCube(IBlockState state) {
        return false;
    }

    // func_149645_b,返回 EnumBlockRenderType.INVISIBLE 代表不渲染这个方块
    @Override
    public EnumBlockRenderType getRenderType(IBlockState state) {
        return EnumBlockRenderType.INVISIBLE;
    }

}

1.1. 但是鼠标指过去还是有外面那一圈黑框啊。

// func_180646_a
// TODO Is this the correct method?
@Override
public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos) {
    return Block.NULL_AABB; // field_185506_k,代表一个从 (0,0,0) 到 (0,0,0) 的 AxisAlignedBB
}