本篇教程由作者设定使用 CC BY-NC 协议。

基岩矿石 是超越之中添加的一种方块,在构建器中设置了-1的硬度,6000000.0F的爆炸抗性,需要300000级的镐挖掘等级,以及-1的亮度,并且设置了生物破坏抗性

为了防止某些随意setblockstate的模组强行挖掉基岩矿石

设置了以下代码

public Item getItemDropped(IBlockState state, Random rand, int fortune) {
    return Items.AIR;
}

使得不能直接挖下来矿石本身


实际上基岩矿石的挖掘是在ToolPickaxe类触发的

逻辑代码如下

World world = player.world;
IBlockState state = world.getBlockState(pos);
BlockPos blockpos1 = pos.add(1,-1,0);
BlockPos blockpos2 = pos.add(0,-1,1);
BlockPos blockpos3 = pos.add(-1,-1,0);
BlockPos blockpos4 = pos.add(0,-1,-1);
BlockPos blockPos = pos.add(0, -1, 0);
int yi = 0;
if (!world.isRemote) {
    if (state.getBlock() == ModBlock.NETHER_STAR_BLOCK && player.getHeldItem(EnumHand.MAIN_HAND).getItem() == ModItems.BREAK_BEDROCK_TOOL) {
        if (world.getBlockState(blockpos1).getBlock() == Blocks.DRAGON_EGG) {
            world.setBlockToAir(blockpos1);
            yi++;
        }
        if (world.getBlockState(blockpos2).getBlock() == Blocks.PURPUR_PILLAR) {
            world.setBlockToAir(blockpos2);
            yi++;
        }
        if (world.getBlockState(blockpos3).getBlock() == Blocks.REDSTONE_BLOCK) {
            world.setBlockToAir(blockpos3);
            yi++;
        }
        if (world.getBlockState(blockpos4).getBlock() == Blocks.EMERALD_BLOCK) {
            world.setBlockToAir(blockpos4);
            yi++;
        }
        stack.setCount(stack.getCount() - 1);
    }

    if(yi>=2) {
        Random ran = world.rand;
        double wa = yi*0.25f;
        if(wa >= ran.nextDouble()) {
            world.spawnEntity(new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), new ItemStack(Item.getItemFromBlock(ModBlock.BEDROCK_ORE))));
            world.setBlockToAir(blockPos);
        } else {
            player.sendMessage(new TextComponentString(I18n.translateToLocal("message.bedrock_ore_failed")));
        }
    }
}

不难看出

当挖掘的方块是超越的下界之星块且手上是基岩破坏工具时,触发下面的判定

  1. 若x+1,y-1的地方存在一个龙蛋,则yi计数+1,且将龙蛋设置为空气

  2. 若y-1,z+1的位置存在一个紫珀块,则yi计数+1,且设置紫珀块为空气

  3. 若x-1,y-1的位置存在一个红石块,则yi计数+1,且设置红石块为空气

  4. 若y-1,z-1的位置存在一个绿宝石块,则yi+1,且设置绿宝石块为空气

然后进行后续判定

如果yi≥2的话

设置变量wa = yi*0.25

则获取世界种子,并且随机下一个RGB值,如果wa≥ran.nextDouble(),则生成一个物品实体并设置基岩矿石为空气

如果wa≤ran.nextDouble(),则对玩家发送信息"message.bedrock_ore_failed",表示挖掘失败

如果yi小于2的话,则不发生上述操作