[英]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();
此外,如果Action
是RIGHT_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.