List of usage examples for net.minecraftforge.event ForgeEventFactory onPlayerDestroyItem
public static void onPlayerDestroyItem(PlayerEntity player, @Nonnull ItemStack stack, @Nullable Hand hand)
From source file:com.lothrazar.cyclicmagic.item.ItemMattock.java
License:Open Source License
/** * <<<< made with some help from Tinkers Construct and Spark's Hammers * https://github.com/thebrightspark/SparksHammers/blob/b84bd178fe2bbe47b13a89ef9435b20f09e429a4/src/main/java/com/brightspark/sparkshammers/util/CommonUtils.java and * https://github.com/SlimeKnights/TinkersConstruct *///from w w w . j a v a 2 s . co m @SuppressWarnings("deprecation") @Override public boolean onBlockStartBreak(ItemStack stack, BlockPos posHit, EntityPlayer player) { RayTraceResult ray = rayTrace(player.getEntityWorld(), player, false); if (ray == null) { return super.onBlockStartBreak(stack, posHit, player); } EnumFacing sideHit = ray.sideHit; World world = player.getEntityWorld(); //use the shape builder to get region List<BlockPos> shape; if (sideHit == EnumFacing.UP || sideHit == EnumFacing.DOWN) { shape = UtilShape.squareHorizontalHollow(posHit, RADIUS); } else if (sideHit == EnumFacing.EAST || sideHit == EnumFacing.WEST) { shape = UtilShape.squareVerticalZ(posHit, RADIUS); } else {//has to be NORTHSOUTH shape = UtilShape.squareVerticalX(posHit, RADIUS); } for (BlockPos posCurrent : shape) { //first we validate if (posHit.equals(posCurrent)) { continue; } if (super.onBlockStartBreak(stack, new BlockPos(posCurrent), player)) { continue; } IBlockState bsCurrent = world.getBlockState(posCurrent); if (world.isAirBlock(posCurrent)) { continue; } if (!materials.contains(bsCurrent.getMaterial())) { continue; } Block blockCurrent = bsCurrent.getBlock(); if (!ForgeHooks.canHarvestBlock(blockCurrent, player, world, posCurrent) || bsCurrent.getBlock().canEntityDestroy(bsCurrent, world, posCurrent, player) == false || bsCurrent.getBlock().getBlockHardness(bsCurrent, world, posCurrent) < 0) { continue; } //then we destroy stack.onBlockDestroyed(world, bsCurrent, posCurrent, player); if (world.isRemote) {//C world.playEvent(2001, posCurrent, Block.getStateId(bsCurrent)); if (blockCurrent.removedByPlayer(bsCurrent, world, posCurrent, player, true)) { blockCurrent.onPlayerDestroy(world, posCurrent, bsCurrent); } stack.onBlockDestroyed(world, bsCurrent, posCurrent, player);//update tool damage if (stack.getCount() == 0 && stack == player.getHeldItemMainhand()) { ForgeEventFactory.onPlayerDestroyItem(player, stack, EnumHand.MAIN_HAND); player.setHeldItem(EnumHand.MAIN_HAND, ItemStack.EMPTY); } Minecraft.getMinecraft().getConnection() .sendPacket(new CPacketPlayerDigging(CPacketPlayerDigging.Action.STOP_DESTROY_BLOCK, posCurrent, Minecraft.getMinecraft().objectMouseOver.sideHit)); } else if (player instanceof EntityPlayerMP) {//Server side, so this works EntityPlayerMP mp = (EntityPlayerMP) player; int xpGivenOnDrop = ForgeHooks.onBlockBreakEvent(world, ((EntityPlayerMP) player).interactionManager.getGameType(), (EntityPlayerMP) player, posCurrent); if (xpGivenOnDrop >= 0) { if (blockCurrent.removedByPlayer(bsCurrent, world, posCurrent, player, true)) { TileEntity tile = world.getTileEntity(posCurrent); blockCurrent.onPlayerDestroy(world, posCurrent, bsCurrent); blockCurrent.harvestBlock(world, player, posCurrent, bsCurrent, tile, stack); blockCurrent.dropXpOnBlockBreak(world, posCurrent, xpGivenOnDrop); } mp.connection.sendPacket(new SPacketBlockChange(world, posCurrent)); } } } return super.onBlockStartBreak(stack, posHit, player); }
From source file:de.ellpeck.actuallyadditions.mod.util.WorldUtil.java
public static boolean playerHarvestBlock(ItemStack stack, World world, EntityPlayer player, BlockPos pos) { if (world.isAirBlock(pos)) { return false; }// ww w . j av a 2 s . c o m IBlockState state = world.getBlockState(pos); Block block = state.getBlock(); if (!world.isRemote) { world.playEvent(player, 2001, pos, Block.getStateId(state)); } else { world.playEvent(2001, pos, Block.getStateId(state)); } if (player.capabilities.isCreativeMode) { block.onBlockHarvested(world, pos, state, player); if (block.removedByPlayer(state, world, pos, player, false)) { block.onBlockDestroyedByPlayer(world, pos, state); } if (!world.isRemote) { if (player instanceof EntityPlayerMP) { ((EntityPlayerMP) player).connection.sendPacket(new SPacketBlockChange(world, pos)); } } return true; } stack.onBlockDestroyed(world, state, pos, player); if (!world.isRemote) { if (player instanceof EntityPlayerMP) { EntityPlayerMP playerMp = (EntityPlayerMP) player; int xp = ForgeHooks.onBlockBreakEvent(world, playerMp.interactionManager.getGameType(), playerMp, pos); if (xp == -1) { return false; } TileEntity tileEntity = world.getTileEntity(pos); if (block.removedByPlayer(state, world, pos, player, true)) { block.onBlockDestroyedByPlayer(world, pos, state); block.harvestBlock(world, player, pos, state, tileEntity, stack); block.dropXpOnBlockBreak(world, pos, xp); } playerMp.connection.sendPacket(new SPacketBlockChange(world, pos)); return true; } } else { if (block.removedByPlayer(state, world, pos, player, true)) { block.onBlockDestroyedByPlayer(world, pos, state); } if (StackUtil.getStackSize(stack) <= 0 && stack == player.getHeldItemMainhand()) { ForgeEventFactory.onPlayerDestroyItem(player, stack, EnumHand.MAIN_HAND); player.setHeldItem(EnumHand.MAIN_HAND, null); } Minecraft mc = Minecraft.getMinecraft(); mc.getConnection().sendPacket(new CPacketPlayerDigging(CPacketPlayerDigging.Action.STOP_DESTROY_BLOCK, pos, mc.objectMouseOver.sideHit)); return true; } return false; }