public static ItemStack getItemstackToUse(EntityLivingBase player, IBlockState blockState) { ItemStack mainhand = player.getHeldItemMainhand(); if(!mainhand.isEmpty() && shouldUseOffhand(player, blockState, mainhand)) { return player.getHeldItemOffhand(); } return mainhand; }
@SubscribeEvent public void blockDropEvent(BlockEvent.HarvestDropsEvent event) { if(event.getHarvester() == null) { return; } ItemStack tool = DualToolHarvestUtils.getItemstackToUse(event.getHarvester(), event.getState()); if(isTool(tool) && !ToolHelper.isBroken(tool)) { TinkerUtil.getTraitsOrdered(tool).forEach(trait -> trait.blockHarvestDrops(tool, event)); } }
RayTraceResult mop = renderEntity.rayTrace(distance, event.getPartialTicks()); if(mop != null) { tool = DualToolHarvestUtils.getItemstackToUse(player, world.getBlockState(mop.getBlockPos())); if(tool.getItem() instanceof IAoeTool) { ImmutableList<BlockPos> extraBlocks = ((IAoeTool) tool.getItem()).getAOEBlocks(tool, world, player, mop.getBlockPos()); tool = DualToolHarvestUtils.getItemstackToUse(player, world.getBlockState(controllerMP.currentBlock)); if(tool.getItem() instanceof IAoeTool && ((IAoeTool) tool.getItem()).isAoeHarvestTool()) { BlockPos pos = controllerMP.currentBlock;
public static boolean shouldUseOffhand(EntityLivingBase player, BlockPos pos, ItemStack tool) { return shouldUseOffhand(player, player.getEntityWorld().getBlockState(pos), tool); }
if(DualToolHarvestUtils.shouldUseOffhand(player, pos, stack)) { ItemStack offhand = player.getHeldItemOffhand(); return offhand.getItem().onBlockDestroyed(offhand, worldIn, state, pos, player);
@Override public int getHarvestLevel(ItemStack stack, String toolClass, @Nullable EntityPlayer player, @Nullable IBlockState blockState) { if(ToolHelper.isBroken(stack)) { return -1; } if(player != null && DualToolHarvestUtils.shouldUseOffhand(player, blockState, stack)) { ItemStack offhand = player.getHeldItemOffhand(); return offhand.getItem().getHarvestLevel(offhand, toolClass, player, blockState); } return super.getHarvestLevel(stack, toolClass, player, blockState); } }
@Override public boolean onBlockStartBreak(ItemStack itemstack, BlockPos pos, EntityPlayer player) { if(DualToolHarvestUtils.shouldUseOffhand(player, pos, itemstack)) { ItemStack offhand = player.getHeldItemOffhand(); return offhand.getItem().onBlockStartBreak(offhand, pos, player); } return super.onBlockStartBreak(itemstack, pos, player); }
@Override public boolean onBlockStartBreak(ItemStack itemstack, BlockPos pos, EntityPlayer player) { if(!ToolHelper.isBroken(itemstack) && this instanceof IAoeTool && ((IAoeTool) this).isAoeHarvestTool()) { for(BlockPos extraPos : ((IAoeTool) this).getAOEBlocks(itemstack, player.getEntityWorld(), player, pos)) { breakExtraBlock(itemstack, player.getEntityWorld(), player, extraPos, pos); } } // this is a really dumb hack. // Basically when something with silktouch harvests a block from the offhand // the game can't detect that. so we have to switch around the items in the hands for the break call // it's switched back in onBlockDestroyed if(DualToolHarvestUtils.shouldUseOffhand(player, pos, player.getHeldItemMainhand())) { ItemStack off = player.getHeldItemOffhand(); switchItemsInHands(player); // remember, off is in the mainhand now NBTTagCompound tag = TagUtil.getTagSafe(off); tag.setLong(TAG_SWITCHED_HAND_HAX, player.getEntityWorld().getTotalWorldTime()); off.setTagCompound(tag); } return breakBlock(itemstack, pos, player); }
@SubscribeEvent public void offhandBreakSpeed(PlayerEvent.BreakSpeed event) { EntityPlayer player = event.getEntityPlayer(); if(shouldUseOffhand(player, event.getState(), player.getHeldItemMainhand())) { ItemStack main = player.getHeldItemMainhand(); ItemStack offhand = player.getHeldItemOffhand(); // we use this instead of player.setItemStackToSlot because that one plays an equip sound ;_; player.inventory.mainInventory.set(player.inventory.currentItem, offhand); float speed = player.getDigSpeed(event.getState(), event.getPos()); player.inventory.mainInventory.set(player.inventory.currentItem, main); event.setNewSpeed(speed); } } }
&& rt != null && rt.typeOfHit == RayTraceResult.Type.BLOCK && DualToolHarvestUtils.shouldUseOffhand(player, rt.getBlockPos(), mainStack)) {