/* * Decompiled with CFR 0.152. */ package net.minecraft.world.item; import java.util.Optional; import java.util.function.Consumer; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.decoration.GlowItemFrame; import net.minecraft.world.entity.decoration.HangingEntity; import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.entity.decoration.Painting; import net.minecraft.world.entity.decoration.PaintingVariant; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.TooltipDisplay; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.gameevent.GameEvent; public class HangingEntityItem extends Item { private static final Component TOOLTIP_RANDOM_VARIANT = Component.translatable("painting.random").withStyle(ChatFormatting.GRAY); private final EntityType type; public HangingEntityItem(EntityType type, Item.Properties properties) { super(properties); this.type = type; } @Override public InteractionResult useOn(UseOnContext context) { HangingEntity entity; BlockPos pos = context.getClickedPos(); Direction clickedFace = context.getClickedFace(); BlockPos blockPos = pos.relative(clickedFace); Player player = context.getPlayer(); ItemStack itemInHand = context.getItemInHand(); if (player != null && !this.mayPlace(player, clickedFace, itemInHand, blockPos)) { return InteractionResult.FAIL; } Level level = context.getLevel(); if (this.type == EntityType.PAINTING) { Optional painting = Painting.create(level, blockPos, clickedFace); if (painting.isEmpty()) { return InteractionResult.CONSUME; } entity = painting.get(); } else if (this.type == EntityType.ITEM_FRAME) { entity = new ItemFrame(level, blockPos, clickedFace); } else if (this.type == EntityType.GLOW_ITEM_FRAME) { entity = new GlowItemFrame(level, blockPos, clickedFace); } else { return InteractionResult.SUCCESS; } EntityType.createDefaultStackConfig(level, itemInHand, player).accept(entity); if (entity.survives()) { if (!level.isClientSide()) { entity.playPlacementSound(); level.gameEvent((Entity)player, GameEvent.ENTITY_PLACE, entity.position()); level.addFreshEntity(entity); } itemInHand.shrink(1); return InteractionResult.SUCCESS; } return InteractionResult.CONSUME; } protected boolean mayPlace(Player player, Direction direction, ItemStack itemStack, BlockPos blockPos) { return !direction.getAxis().isVertical() && player.mayUseItemAt(blockPos, direction, itemStack); } @Override public void appendHoverText(ItemStack itemStack, Item.TooltipContext context, TooltipDisplay display, Consumer builder, TooltipFlag tooltipFlag) { if (this.type == EntityType.PAINTING && display.shows(DataComponents.PAINTING_VARIANT)) { Holder variant = itemStack.get(DataComponents.PAINTING_VARIANT); if (variant != null) { variant.value().title().ifPresent(builder); variant.value().author().ifPresent(builder); builder.accept(Component.translatable("painting.dimensions", variant.value().width(), variant.value().height())); } else if (tooltipFlag.isCreative()) { builder.accept(TOOLTIP_RANDOM_VARIANT); } } } }