Posted October 18, 20222 yr So i have a BlockEntity that's has a container and stores items inside of it, when you click on it, item will render and stored inside of block. But there's a problem, when i click on it using item like swords or tridents, it doesn't save item tags like durability, enchantments, or names. I know there's a NBT tags, but i didn't saw vanilla code using this on Item Frame etc. And i think there's some other ways to do that. Here's some code -> @Override public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { if(!level.isClientSide){ if (level.getBlockEntity(pos) instanceof SpecialCauldronBlockEntity entity) { if (level.getBlockState(pos.below()).is(ModTags.Blocks.SPECIAL_CAULDRON_EXPLODES)) { level.explode(null, DamageSource.MAGIC, null, pos.getX(), pos.getY(), pos.getZ(), 3.5f, false, Explosion.BlockInteraction.DESTROY); } } } if (level.isClientSide) { if (level.getBlockEntity(pos) instanceof SpecialCauldronBlockEntity entity) { if (entity.getItem(0).is(ItemStack.EMPTY.getItem()) && !player.getMainHandItem().is(ItemStack.EMPTY.getItem())) { ItemStack item = player.getItemInHand(hand).copy(); level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.END_PORTAL_FRAME_FILL, SoundSource.BLOCKS, 1.0f, 1.0f, true); entity.setItem(0, item); player.getMainHandItem().shrink(1); } else { if (!entity.getItem(0).is(ItemStack.EMPTY.getItem())) { player.addItem(entity.getItem(0).getItem().getDefaultInstance()); level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ITEM_PICKUP, SoundSource.BLOCKS, 0.75f, 1f, true); entity.setItem(0, ItemStack.EMPTY); } } } } return InteractionResult.SUCCESS; }
October 18, 20222 yr Author (It started working by itself idk why). But i still interested how to do it properly. And i also got another problem, when i'm clicking my block with sword, it work's but when i'm trying to break it, it doesn't. Probably because of my block thinks that i have a sword in my hand (because you cant break block with hand) but it's not. Updated Code -> @Override public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { if(!level.isClientSide){ if (level.getBlockEntity(pos) instanceof SpecialCauldronBlockEntity entity) { if (level.getBlockState(pos.below()).is(ModTags.Blocks.SPECIAL_CAULDRON_EXPLODES)) { level.explode(null, DamageSource.MAGIC, null, pos.getX(), pos.getY(), pos.getZ(), 3.5f, false, Explosion.BlockInteraction.DESTROY); } } } if (level.isClientSide) { if (level.getBlockEntity(pos) instanceof SpecialCauldronBlockEntity entity) { if (entity.getItem(0).is(ItemStack.EMPTY.getItem()) && !player.getMainHandItem().is(ItemStack.EMPTY.getItem())) { ItemStack item = player.getItemInHand(hand).copy(); level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.END_PORTAL_FRAME_FILL, SoundSource.BLOCKS, 1.0f, 1.0f, true); entity.setItem(0, item); player.getMainHandItem().shrink(1); } else { if (!entity.getItem(0).is(ItemStack.EMPTY.getItem())) { player.addItem(entity.getItem(0)); level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ITEM_PICKUP, SoundSource.BLOCKS, 0.75f, 1f, true); entity.setItem(0, ItemStack.EMPTY); } } } } return InteractionResult.SUCCESS; } Edited October 18, 20222 yr by Sq3xd Change post
October 18, 20222 yr Author I got it, it happened because it was executed on wrong side, block container works fine, but how do i render items?
October 18, 20222 yr Author Nevermind, fixed this. Updated code -> @Override public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { // Explode if placed on not correct block if (!level.isClientSide){ if (level.getBlockEntity(pos) instanceof SpecialCauldronBlockEntity entity) { if (level.getBlockState(pos.below()).is(ModTags.Blocks.SPECIAL_CAULDRON_EXPLODES)) { level.explode(null, DamageSource.MAGIC, null, pos.getX(), pos.getY(), pos.getZ(), 3.5f, false, Explosion.BlockInteraction.DESTROY); } } } // Interaction - Server Side if (!level.isClientSide) { if (level.getBlockEntity(pos) instanceof SpecialCauldronBlockEntity entity) { if (entity.getItem(0).is(ItemStack.EMPTY.getItem()) && !player.getMainHandItem().is(ItemStack.EMPTY.getItem())) { ItemStack item = player.getItemInHand(hand).copy(); entity.setItem(0, item); player.getMainHandItem().shrink(1); // TODO Make normal shrink } else { if (!entity.getItem(0).is(ItemStack.EMPTY.getItem())) { player.addItem(entity.getItem(0)); entity.setItem(0, ItemStack.EMPTY); } } } } // Interaction - Client Side if (level.isClientSide) { if (level.getBlockEntity(pos) instanceof SpecialCauldronBlockEntity entity) { if (entity.getItem(0).is(ItemStack.EMPTY.getItem()) && !player.getMainHandItem().is(ItemStack.EMPTY.getItem())) { ItemStack item = player.getItemInHand(hand).copy(); level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.END_PORTAL_FRAME_FILL, SoundSource.BLOCKS, 1.0f, 1.0f, true); entity.setItem(0, item); } else { if (!entity.getItem(0).is(ItemStack.EMPTY.getItem())) { level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ITEM_PICKUP, SoundSource.BLOCKS, 0.75f, 1f, true); entity.setItem(0, ItemStack.EMPTY); } } } } return InteractionResult.SUCCESS; }
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.