Sq3xd Posted October 18, 2022 Share Posted October 18, 2022 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; } Quote Link to comment Share on other sites More sharing options...
Sq3xd Posted October 18, 2022 Author Share Posted October 18, 2022 (edited) (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, 2022 by Sq3xd Change post Quote Link to comment Share on other sites More sharing options...
Sq3xd Posted October 18, 2022 Author Share Posted October 18, 2022 I got it, it happened because it was executed on wrong side, block container works fine, but how do i render items? Quote Link to comment Share on other sites More sharing options...
Sq3xd Posted October 18, 2022 Author Share Posted October 18, 2022 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; } Quote Link to comment Share on other sites More sharing options...
Sq3xd Posted October 18, 2022 Author Share Posted October 18, 2022 Might be useful. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.