Minecraft Forge - 在 ItemUse 上放置方块

Minecraft Forge - Place block onItemUse

我正在尝试让我的自定义物品在使用时放水:

public class Beaker extends Item implements IHasModel {
  public Beaker(String name, CreativeTabs tab, int maxStackSize) {
    setUnlocalizedName(name);
    setRegistryName(name);
    setCreativeTab(tab);
    setMaxStackSize(maxStackSize);

    ItemInit.ITEMS.add(this);
  }

  @Override
  public void registerModels() {
    Main.proxy.registerItemRenderer(this, 0, "inventory");
  }

  @Override
  public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
    BlockPos clickedBlock = new BlockPos(hitX, hitY, hitZ);
    worldIn.setBlockState(clickedBlock, Blocks.WATER.getDefaultState());
    return EnumActionResult.SUCCESS;
  }
}

但是,当我右键单击时,该项目被使用(动画播放)但水没有放置,我使用的是 Minecraft 1.12.2 和 Forge 14.23.2.2613。

hitX hitYhitZ 与执行操作的世界位置无关。它们是单击块中的部分值,用于根据单击块的 位置 执行操作(例如,数字键盘上的哪个按钮)。

如果我们查看 ItemBlockSpecial(处理蛋糕、中继器、酿造台和大锅等物品),我们会发现以下代码:

public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
{
    IBlockState iblockstate = worldIn.getBlockState(pos);
    Block block = iblockstate.getBlock();

    // snow layer stuff we don't care about
    if (!block.isReplaceable(worldIn, pos))
    {
        pos = pos.offset(facing);
    }
    // placement code
}

这里要注意的重要一点是直接使用pos参数,而在单击的方块不可替换的情况下由facing参数修改(例如Tall Grass是可更换,石头不是)。

如果 ItemBlockSpecial 对你来说还不够(即你不能让你的项目成为 ItemBlockSpecial 的实例),那么它用来做事的代码可能仍然是。