Posted April 13, 20196 yr Hi, thanks for the help! I'm trying to make a block which if you mine it without silk touch or are not using a proper tool, it will leave a block of lava. I overridden the harvestBlock method in my block's class, and here is the code: @Override public void harvestBlock(World worldIn, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity te, ItemStack stack) { player.addStat(StatList.BLOCK_MINED.get(this)); player.addExhaustion(0.005F); if (this.canSilkHarvest(state, worldIn, pos, player) && EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0) { NonNullList<ItemStack> items = NonNullList.create(); ItemStack itemstack = this.getSilkTouchDrop(state); if (!itemstack.isEmpty()) items.add(itemstack); net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(items, worldIn, pos, state, 0, 1.0f, true, player); items.forEach(e -> spawnAsEntity(worldIn, pos, e)); } else { harvesters.set(player); int i = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack); state.dropBlockAsItem(worldIn, pos, i); harvesters.set(null); worldIn.setBlockState(pos, Blocks.LAVA.getDefaultState()); } if (!player.canHarvestBlock(state)) { worldIn.setBlockState(pos, Blocks.LAVA.getDefaultState()); } } Now the silk touch part is working fine (it probably should because I just copied them from Block class), but when I mine it with an iron pickaxe, nothing happens. I think I misused the method canHarvestBlock. By the way, this block's material is ROCK, and required harvestLevel 3 or higher. Edited April 14, 20196 yr by aquila_zyy Problem solved
April 13, 20196 yr Block#harvestBlock isn't called if the block isn't actually harvested(broken by the right tool). You need to use a different method.
April 14, 20196 yr Author Oh I see. Did not expect such a quick reply, thanks. I’m kinda busy right now, any suggestions on which method I should use? I’ll look into it later.
April 14, 20196 yr Author Just now, aquila_zyy said: Oh I see. Did not expect such a quick reply, thanks. I’m kinda busy right now, any suggestions on which method I should use? I’ll look into it later. 4 hours ago, V0idWa1k3r said: Block#harvestBlock isn't called if the block isn't actually harvested(broken by the right tool). You need to use a different method. And sorry for the slow reply. I had 502 problem for several hours connecting forge forum.
April 14, 20196 yr Author I get it now. Here's the working code: @Override public void onPlayerDestroy(IWorld worldIn, BlockPos pos, IBlockState state) { ((World)worldIn).setBlockState(pos, Blocks.LAVA.getDefaultState()); } @Override public void harvestBlock(World worldIn, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity te, ItemStack stack) { player.addStat(StatList.BLOCK_MINED.get(this)); player.addExhaustion(0.005F); if (this.canSilkHarvest(state, worldIn, pos, player) && EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0) { NonNullList<ItemStack> items = NonNullList.create(); ItemStack itemstack = this.getSilkTouchDrop(state); if (!itemstack.isEmpty()) items.add(itemstack); net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(items, worldIn, pos, state, 0, 1.0f, true, player); items.forEach(e -> spawnAsEntity(worldIn, pos, e)); worldIn.setBlockState(pos, Blocks.AIR.getDefaultState()); } else { harvesters.set(player); int i = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack); state.dropBlockAsItem(worldIn, pos, i); harvesters.set(null); } }
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.