package com.GaoHY.handlers;
import com.GaoHY.Init.ItemInit;
import net.minecraft.core.BlockPos;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.phys.BlockHitResult;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MachineItem extends Item {
private static final Logger LOGGER = LogManager.getLogger();
public MachineItem(Properties properties) {
super(properties);
}
@Override
public InteractionResult useOn(UseOnContext context) {
Level level = context.getLevel();
Player player = context.getPlayer();
if (player == null) return InteractionResult.PASS;
BlockHitResult hitResult = getPreciseHitResult(player);
BlockPos pos = hitResult.getBlockPos();
BlockState state = level.getBlockState(pos);
if (!state.is(Blocks.WATER)) {
LOGGER.debug("点击的不是水方块: {}", state.getBlock());
return InteractionResult.PASS;
}
FluidState fluidState = state.getFluidState();
int waterLevel = state.getValue(LiquidBlock.LEVEL);
LOGGER.info("检测到水方块 - 位置: {} 水位: {} 流体状态: {}", pos, waterLevel, fluidState.getType());
if (isValidWaterSource(waterLevel, fluidState)) {
return handleWaterConversion(level, player, pos);
}
return InteractionResult.PASS;
}
private BlockHitResult getPreciseHitResult(Player player) {
return (BlockHitResult) player.pick(5.0, 0.0F, false);
}
private boolean isValidWaterSource(int waterLevel, FluidState fluidState) {
return waterLevel == 0 && fluidState.isSource();
}
private InteractionResult handleWaterConversion(Level level, Player player, BlockPos pos) {
ItemStack eyeStack = findEyeItem(player);
if (eyeStack.isEmpty()) {
LOGGER.warn("转换失败:缺少EYE物品");
return InteractionResult.FAIL;
}
if (!level.isClientSide) {
eyeStack.shrink(1);
player.addItem(new ItemStack(ItemInit.WATER_GOD_EYE.get()));
level.playSound(null, pos, SoundEvents.BOTTLE_FILL, SoundSource.PLAYERS, 1.0F, 1.0F);
LOGGER.info("成功转换 WATER_GOD_EYE");
}
return InteractionResult.sidedSuccess(level.isClientSide);
}
private ItemStack findEyeItem(Player player) {
for (ItemStack stack : player.getInventory().items) {
if (stack.is(ItemInit.EYE.get())) {
return stack;
}
}
return ItemStack.EMPTY;
}
}
我尝试使用物品machine右键水以将eye替换为water_god_eye,但始终无法识别水,而是识别到了水下的泥土,应该如何解决?
minecraft:1.19.2