Example usage for net.minecraftforge.event ForgeEventFactory onPlayerDestroyItem

List of usage examples for net.minecraftforge.event ForgeEventFactory onPlayerDestroyItem

Introduction

In this page you can find the example usage for net.minecraftforge.event ForgeEventFactory onPlayerDestroyItem.

Prototype

public static void onPlayerDestroyItem(PlayerEntity player, @Nonnull ItemStack stack, @Nullable Hand hand) 

Source Link

Usage

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;
}