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
hitY
和 hitZ
与执行操作的世界位置无关。它们是单击块中的部分值,用于根据单击块的 位置 执行操作(例如,数字键盘上的哪个按钮)。
如果我们查看 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
的实例),那么它用来做事的代码可能仍然是。
我正在尝试让我的自定义物品在使用时放水:
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
hitY
和 hitZ
与执行操作的世界位置无关。它们是单击块中的部分值,用于根据单击块的 位置 执行操作(例如,数字键盘上的哪个按钮)。
如果我们查看 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
的实例),那么它用来做事的代码可能仍然是。