package net.minecraft.world.item; import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.GlobalPos; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.component.LodestoneTracker; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; public class CompassItem extends Item { private static final Component LODESTONE_COMPASS_NAME = Component.translatable("item.minecraft.lodestone_compass"); public CompassItem(Item.Properties p_40718_) { super(p_40718_); } @Override public boolean isFoil(ItemStack p_40739_) { return p_40739_.has(DataComponents.LODESTONE_TRACKER) || super.isFoil(p_40739_); } @Override public void inventoryTick(ItemStack p_40720_, Level p_40721_, Entity p_40722_, int p_40723_, boolean p_40724_) { if (p_40721_ instanceof ServerLevel serverlevel) { LodestoneTracker lodestonetracker = p_40720_.get(DataComponents.LODESTONE_TRACKER); if (lodestonetracker != null) { LodestoneTracker lodestonetracker1 = lodestonetracker.tick(serverlevel); if (lodestonetracker1 != lodestonetracker) { p_40720_.set(DataComponents.LODESTONE_TRACKER, lodestonetracker1); } } } } @Override public InteractionResult useOn(UseOnContext p_40726_) { BlockPos blockpos = p_40726_.getClickedPos(); Level level = p_40726_.getLevel(); if (!level.getBlockState(blockpos).is(Blocks.LODESTONE)) { return super.useOn(p_40726_); } else { level.playSound(null, blockpos, SoundEvents.LODESTONE_COMPASS_LOCK, SoundSource.PLAYERS, 1.0F, 1.0F); Player player = p_40726_.getPlayer(); ItemStack itemstack = p_40726_.getItemInHand(); boolean flag = !player.hasInfiniteMaterials() && itemstack.getCount() == 1; LodestoneTracker lodestonetracker = new LodestoneTracker(Optional.of(GlobalPos.of(level.dimension(), blockpos)), true); if (flag) { itemstack.set(DataComponents.LODESTONE_TRACKER, lodestonetracker); } else { ItemStack itemstack1 = itemstack.transmuteCopy(Items.COMPASS, 1); itemstack.consume(1, player); itemstack1.set(DataComponents.LODESTONE_TRACKER, lodestonetracker); if (!player.getInventory().add(itemstack1)) { player.drop(itemstack1, false); } } return InteractionResult.SUCCESS; } } @Override public Component getName(ItemStack p_368976_) { return p_368976_.has(DataComponents.LODESTONE_TRACKER) ? LODESTONE_COMPASS_NAME : super.getName(p_368976_); } }