所以我正在做的是,我正在检查玩家是否使用PlayerInteractEvent
右击空气,然后我获得了玩家的目标区块并将其保存为名为&#34的变量;块&#34 ;.
这一切都运行正常,但我想要做的是检查该块是否是一个按钮,如果是这样的话" push"它,但它没有做到这一点。
我在检查其类型是否确实是一个按钮之后尝试将块转换为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
。
答案 0 :(得分:1)
首先,尝试触发RIGHT_CLICK_BLOCK
操作,因为Button是一个块。其次,在按下按钮之前调用事件,所以如果你想在玩家点击之后改变按钮状态,你应该稍后运行任务,在事件通过后稍后改变它。
此外,您不需要检查手项类型指向null。如果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
}
要以新方式更改按钮状态,请从阻止状态获取MaterialData
,将其转换为Button
,更改电源状态,将所有内容写回阻止并更新:
Button button = (Button) block.getState().getData();
button.setPowered(true);
block.getState().setData(button);
block.getState().update();
此外,如果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);
}