按下按钮(从远处)

时间:2017-10-24 21:10:26

标签: java bukkit

所以我正在做的是,我正在检查玩家是否使用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

1 个答案:

答案 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();

此外,如果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);
}