2017-10-24 11 views
0

私がしていることは、プレーヤーがPlayerInteractEventを使用して空気を右クリックしているかどうかを確認しています。プレーヤーのターゲットブロックを取得して、それを「ブロック」という名前の変数として保存します。ボタンを押す(遠くから)

これはすべてうまくいきましたが、私はこのブロックがボタンであるかどうかをチェックし、そうであれば "プッシュ"しますが、それは正しいことではありません。

私は、私はそうのように電力を供給し、それを設定し、その種類は実にボタンだったかどうかのチェック後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

まず、ボタンがブロックであるため、RIGHT_CLICK_BLOCKアクションを開始しようとします。第2に、ボタンを押す前にイベントが呼び出されるため、プレーヤーがクリックした後にボタンの状態を変更したい場合は、後でタスクを実行してイベントが成功した後に少し後に変更する必要があります。

また、ハンドアイテムタイプのポイントをnullにチェックする必要はありません。 ItemStackがnullでない場合、Materialはnullにならず、ItemStackがnullになる場合は、NPEを捕捉してMaterialを取得しようとします。バージョン1.9以降では、PlayerInteractEventが2回(手とオフハンドとして)呼び出すため、EquipmentSlotにチェックすることもできます。

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 
} 

をブロックするために、すべてのライトバックと更新、 Buttonにキャスト、ブロック状態から MaterialDataを取得し、新しい方法でボタンの状態を変更する電源状態を変更するには:

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

ああ、そう、あなたは空気のイベントで右クリックを自動的にbukkitによりキャンセルしたため、キャンセルignoreは追加する必要があります。 '@EventHandler(ignoreCancelled = true)'を試してください。 – i0xHeX

+0

コメントボックスには、「コメントを使用して詳細情報を求めたり、改善を提案する」と表示されます。単に「これは機能しません」と言っても何が間違っているかを見つけるのに役立ちません。 – Moira

+0

さて、私はボタンをクリックする方法を考えましたが、今はプレイヤーが手元にアイテムを持っていないときに右クリックを検出している別の問題があります。 –

関連する問題