簡體   English   中英

按下按鈕(遠處)

[英]Pushing a button (from far away)

所以我正在做的是,我要檢查玩家是否使用PlayerInteractEvent右鍵單擊air,然后獲取玩家的目標塊並將其保存為名為“ block”的變量。

所有這些都工作正常,但是我要執行的操作是檢查該塊是否為按鈕,是否“按下”它,但它沒有正確地執行該操作。

在檢查其類型是否確實是按鈕之后,我嘗試將其轉換為org.bukkit.material.Button ,然后將其設置為Powered: ((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是一個塊。 其次,在按下按鈕之前調用了事件,因此,如果要在播放器單擊后更改按鈕的狀態,則應稍后運行任務以在事件通過后稍稍更改它。

另外,您無需將手項目類型點檢查為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 ,那么您實際上並不需要檢查面向塊,那么您可以直接從event獲取它。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM