gpt4 book ai didi

java - 按下按钮(从远处)

转载 作者:行者123 更新时间:2023-12-02 12:05:44 25 4
gpt4 key购买 nike

所以我正在做的是,我使用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的朝向,如果ActionRIGHT_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com