Posted June 21, 20214 yr Hi! I'm trying to make a custom Stick that would strip special custom blocks. I know how to add blocks to BLOCK_STRIPPING_MAP, but my goal is to strip my custom blocks only with my custom Stick, but not with vanilla Axes. I've tried to create StickItem extends ToolItem and copy everything from AxeItem, then change BLOCK_STRIPPING_MAP, but it doesn't help. Moreover, it seems that this stripping depends on ToolType in onItemUse function... so I don't know what to do. Do anyone have any ideas? Quote My code: public class StickItem extends ToolItem { private static final Set<Material> EFFECTIVE_ON_MATERIALS_1 = Sets.newHashSet(Material.WOOD, Material.NETHER_WOOD, Material.PLANTS, Material.TALL_PLANTS, Material.BAMBOO, Material.GOURD); private static final Set<Block> EFFECTIVE_ON_BLOCKS_1 = Sets.newHashSet(Blocks.LADDER, Blocks.SCAFFOLDING, Blocks.OAK_BUTTON, Blocks.SPRUCE_BUTTON, Blocks.BIRCH_BUTTON, Blocks.JUNGLE_BUTTON, Blocks.DARK_OAK_BUTTON, Blocks.ACACIA_BUTTON, Blocks.CRIMSON_BUTTON, Blocks.WARPED_BUTTON); protected static final Map<Block, Block> BLOCK_STRIPPING_MAP_1 = (new Builder<Block, Block>()).put(BlockInit.CUSTOM_BLOCK.get(), BlockInit.CUSTOM_BLOCK_STRIPPED.get()).build(); public StickItem(IItemTier tier, float attackDamageIn, float attackSpeedIn, Item.Properties builder) { super(attackDamageIn, attackSpeedIn, tier, EFFECTIVE_ON_BLOCKS_1, builder.addToolType(net.minecraftforge.common.ToolType.PICKAXE, tier.getHarvestLevel())); } public float getDestroySpeed(ItemStack stack, BlockState state) { Material material = state.getMaterial(); return EFFECTIVE_ON_MATERIALS_1.contains(material) ? this.efficiency : super.getDestroySpeed(stack, state); } /** * Called when this item is used when targetting a Block */ @Override public ActionResultType onItemUse(ItemUseContext context) { World world = context.getWorld(); BlockPos blockpos = context.getPos(); BlockState blockstate = world.getBlockState(blockpos); BlockState block = blockstate.getToolModifiedState(world, blockpos, context.getPlayer(), context.getItem(), net.minecraftforge.common.ToolType.AXE); if (block != null) { PlayerEntity playerentity = context.getPlayer(); world.playSound(playerentity, blockpos, SoundEvents.ITEM_AXE_STRIP, SoundCategory.BLOCKS, 1.0F, 1.0F); if (!world.isRemote) { world.setBlockState(blockpos, block, 11); if (playerentity != null) { context.getItem().damageItem(1, playerentity, (p_220040_1_) -> { p_220040_1_.sendBreakAnimation(context.getHand()); }); } } return ActionResultType.func_233537_a_(world.isRemote); } else { return ActionResultType.PASS; } } public static BlockState getAxeStrippingState(BlockState originalState) { Block block = BLOCK_STRIPPING_MAP_1.get(originalState.getBlock()); return block != null ? block.getDefaultState().with(RotatedPillarBlock.AXIS, originalState.get(RotatedPillarBlock.AXIS)) : null; } }
June 21, 20214 yr Learn basic java, and don't copy and paste code you don't understand. in the onItemUse method, you can get the block the item has been used on through the ItemUseContext. and you can change the block and/or blockstate in a position with World#setBlockState also, when you're posting code in the forums, use the proper code tool, not the quote tool, that way your code won't be a non-monospaced, non-syntax-highlighted hell to read oh, and also also, help with coding should go under the Modder Support forum, not ForgeGradle (Moderator: Thread Moved) Edited June 22, 20214 yr by DaemonUmbra
June 22, 20214 yr Author Thank you! Sorry, I really know java poorly, but I'm definitely going to learn it! Thank you once more!
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.