所以我正在做的是,我使用PlayerInteractEvent
检查玩家是否右键单击空气,然后我获取玩家的目标 block 并将其保存为名为“block”的变量。
这一切都工作正常,但我想要做的是检查该 block 是否是一个按钮,如果是,则“插入”它,但它做得不对。
在检查其类型是否确实是按钮后,我尝试将 block 转换为org.bukkit.material.Button
,然后将其设置为通电状态,如下所示:
((Button) block.getState().getData()).setPowered(true);
,但这没有做任何事情,所以我然后尝试: block.setData((byte) (block.getData() | 0x8)));
,这确实将其打开,但它保持打开状态。
那么我该如何正确地做到这一点呢?
完整代码如下:
@SuppressWarnings("deprecation")
@EventHandler
public void onPlayerInteraction(PlayerInteractEvent e) {
if (e.getAction().equals(Action.RIGHT_CLICK_AIR)) {
Block block = e.getPlayer().getTargetBlock((Set<Material>) null, 200);
if (block.getType().equals(Material.STONE_BUTTON) || block.getType().equals(Material.WOOD_BUTTON)) {
block.setData((byte) (block.getData() | 0x8));
}
}
}
PS:我正在使用 Spigot 1.12.2 API
。
最佳答案
首先,尝试触发RIGHT_CLICK_BLOCK
操作,因为Button是一个 block 。其次,事件在按下按钮之前调用,因此如果您想在玩家点击后更改按钮的状态,您应该稍后运行任务以在事件通过后稍后更改它。
此外,您不需要检查手项类型是否指向空。如果 ItemStack
不为 null,Material
永远不会为 null,如果 ItemStack 为 null,您将捕获 NPE,试图获取 Material
>。在 1.9 及更高版本中,您还可以检查 EquipmentSlot
,因为 PlayerInteractEvent
调用两次(作为手动和副手)。
ItemStack item = e.getPlayer().getInventory().getItemInMainHand();
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK) && e.getHand() == EquipmentSlot.HAND
&& (item == null || item.getType() == Material.AIR)) {
// Your code
}
要以新方式更改按钮状态,请从 block 状态获取MaterialData
,将其转换为Button
,更改电源状态,将所有内容写回到 block 并更新:
Button button = (Button) block.getState().getData();
button.setPowered(true);
block.getState().setData(button);
block.getState().update();
此外,你并不需要检查block的朝向,如果Action
是RIGHT_CLICK_BLOCK
,那么你可以直接从事件中获取它。
Block block = e.getClickedBlock();
所以,我认为,最终的代码可能如下所示:
Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("YourPluginName");
ItemStack item = e.getPlayer().getInventory().getItemInMainHand();
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK) && e.getHand() == EquipmentSlot.HAND
&& (item == null || item.getType() == Material.AIR)) {
Block block = e.getClickedBlock();
Bukkit.getServer().getScheduler().runTaskLater(plugin, new Runnable() {
public void run() {
Button button = (Button) block.getState().getData();
button.setPowered(true);
block.getState().setData(button);
block.getState().update();
}
}, 2L);
}
关于java - 按下按钮(从远处),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46920058/