minecraft-src/net/minecraft/world/item/HangingEntityItem.java
2025-07-04 03:45:38 +03:00

95 lines
3.7 KiB
Java

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.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.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<? extends HangingEntity> type;
public HangingEntityItem(EntityType<? extends HangingEntity> type, Item.Properties properties) {
super(properties);
this.type = type;
}
@Override
public InteractionResult useOn(UseOnContext context) {
BlockPos blockPos = context.getClickedPos();
Direction direction = context.getClickedFace();
BlockPos blockPos2 = blockPos.relative(direction);
Player player = context.getPlayer();
ItemStack itemStack = context.getItemInHand();
if (player != null && !this.mayPlace(player, direction, itemStack, blockPos2)) {
return InteractionResult.FAIL;
} else {
Level level = context.getLevel();
HangingEntity hangingEntity;
if (this.type == EntityType.PAINTING) {
Optional<Painting> optional = Painting.create(level, blockPos2, direction);
if (optional.isEmpty()) {
return InteractionResult.CONSUME;
}
hangingEntity = (HangingEntity)optional.get();
} else if (this.type == EntityType.ITEM_FRAME) {
hangingEntity = new ItemFrame(level, blockPos2, direction);
} else {
if (this.type != EntityType.GLOW_ITEM_FRAME) {
return InteractionResult.SUCCESS;
}
hangingEntity = new GlowItemFrame(level, blockPos2, direction);
}
EntityType.createDefaultStackConfig(level, itemStack, player).accept(hangingEntity);
if (hangingEntity.survives()) {
if (!level.isClientSide) {
hangingEntity.playPlacementSound();
level.gameEvent(player, GameEvent.ENTITY_PLACE, hangingEntity.position());
level.addFreshEntity(hangingEntity);
}
itemStack.shrink(1);
return InteractionResult.SUCCESS;
} else {
return InteractionResult.CONSUME;
}
}
}
protected boolean mayPlace(Player player, Direction direction, ItemStack hangingEntityStack, BlockPos pos) {
return !direction.getAxis().isVertical() && player.mayUseItemAt(pos, direction, hangingEntityStack);
}
@Override
public void appendHoverText(ItemStack stack, Item.TooltipContext context, TooltipDisplay tooltipDisplay, Consumer<Component> tooltipAdder, TooltipFlag flag) {
if (this.type == EntityType.PAINTING && tooltipDisplay.shows(DataComponents.PAINTING_VARIANT)) {
Holder<PaintingVariant> holder = stack.get(DataComponents.PAINTING_VARIANT);
if (holder != null) {
holder.value().title().ifPresent(tooltipAdder);
holder.value().author().ifPresent(tooltipAdder);
tooltipAdder.accept(Component.translatable("painting.dimensions", holder.value().width(), holder.value().height()));
} else if (flag.isCreative()) {
tooltipAdder.accept(TOOLTIP_RANDOM_VARIANT);
}
}
}
}