java - 按下按钮(从远处)

标签 java bukkit

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

相关文章:

java - Dagger 2 不初始化变量

java - 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

java - 无法将 ND4j 遮蔽到 jar 中

java - 如何反序列化玩家的库存?

java - 类似于非 EJB 的 Spring 中的 EJB 布线

java - 出现异常,:- java. lang.NullPointerException?

java - java中的散列json

java - 从 Bukkit 库存中移除元素

java - server.getWorld(String) 总是返回 null?武 git API

java - 有没有一种方法可以在 Eclipse 中为一个 Maven 项目使用多个 Maven 依赖项?