package openmods.fakeplayer; import com.google.common.collect.Lists; import java.util.List; import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.BlockEvent; import openmods.fakeplayer.FakePlayerPool.PlayerUserReturning; import openmods.world.DropCapture; import openmods.world.DropCapture.CaptureContext; public class BreakBlockAction implements PlayerUserReturning<List<EntityItem>> { private final World worldObj; private final int x; private final int y; private final int z; public BreakBlockAction(World worldObj, int x, int y, int z) { this.worldObj = worldObj; this.x = x; this.y = y; this.z = z; } @Override public List<EntityItem> usePlayer(OpenModsFakePlayer fakePlayer) { fakePlayer.inventory.currentItem = 0; fakePlayer.inventory.setInventorySlotContents(0, new ItemStack(Items.diamond_pickaxe, 0, 0)); if (!worldObj.canMineBlock(fakePlayer, x, y, z)) return Lists.newArrayList(); final Block block = worldObj.getBlock(x, y, z); final int metadata = worldObj.getBlockMetadata(x, y, z); CaptureContext dropsCapturer = DropCapture.instance.start(x, y, z); final List<EntityItem> drops; try { BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(x, y, z, worldObj, block, metadata, fakePlayer); if (MinecraftForge.EVENT_BUS.post(event)) return Lists.newArrayList(); boolean canHarvest = block.canHarvestBlock(fakePlayer, metadata); block.onBlockHarvested(worldObj, x, y, z, metadata, fakePlayer); boolean canRemove = block.removedByPlayer(worldObj, fakePlayer, x, y, z, canHarvest); if (canRemove) { block.onBlockDestroyedByPlayer(worldObj, x, y, z, metadata); if (canHarvest) block.harvestBlock(worldObj, fakePlayer, x, y, z, metadata); worldObj.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(block) + (metadata << 12)); } } finally { drops = dropsCapturer.stop(); } return drops; } }