1. 方块掉落概论

修改方块的掉落可以说是非常常见的需求了。在 Forge patch 过原版的 Block 类后,你可以通过覆写 getDrops 来决定方块掉落:

@Override
public void getDrops(NonNullList<ItemStack> drops, IBlockAccess blockAccess, BlockPos pos, IBlockState state, int fortune) {
    // 把要掉落的物品塞进 drops 里即可。
}

1.1. 经验掉落

注意到原版煤矿石、红石矿石、钻石矿石、青金石矿石、绿宝石矿石和下界石英矿石都会在正常采集后掉经验球。在 Forge patch 过原版 Block 等类后,你可以决定正常挖掘某个方块时会掉多少经验。

@Override
public int getExpDrop(IBlockState state, IBlockAccess blockAccess, BlockPos pos, int fortune) {
    return 0;
}

1.2. 精准采集

@Override // Forge patch 的方法
public boolean canSilkHarvest(World world, BlockPos pos, IBlockState state, EntityPlayer player) {
    // 这个方法决定了精准采集有没有效果。
    return true;
}

@Override // func_180643_i
public ItemStack getSilkTouchDrop(IBlockState state) {
    // 而这个方法决定了精准采集会掉什么
    return ItemStack.EMPTY;
}

1.3. 事件

显然,我们时不时会遇到“需要修改原版方块或其他 Mod 的方块的掉落”的问题。Forge 追加的事件中,BlockEvent.HarvestDropsEvent 正好可以胜任。

@SubscribeEvent
public static void onHarvesting(BlockEvent.HarvestDropsEvent event) {
    // TODO Do something
}