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