石橋を叩いて壊すページ

bukkitでPlayerInteractEventが飛んでこない

先日から、bukkitのプラグインを作る勉強をしている。
なぜなら、これまでにいくつか参加したサーバーは、鯖主が3ヶ月くらいで飽きてサーバーが閉鎖してしまうからだ。
どうせなら長く楽しみたい。ただ、自分はバニラにminiMapと木こりだけを入れた状態が一番好きなので、
多くのサーバーで導入されている資源ワールドという概念がどうにもなじまない。
なら、自前でサーバーを立ててしまえばいいんじゃね?ってわけだ。

で、プラグイン作るに当たりいろいろ疑問が出たり解決することが多々あった。
どうせなら誰かの役に立つよう解決方法を記録すべく、ブログを立ち上げた。

さて早速最初の話題。
PlayerInteractEventは、プレイヤーが殴る操作をしたときに良く飛んでくる。
以下のようなプログラムを書いてみた。

@EventHandler(ignoreCancelled=true)
public void onPlayerInteract(PlayerInteractEvent e) {
    e.getPlayer().sendMessage(e.getAction().toString());
}

ブロックを殴れば、LEFT_CLICK_BLOCKやRIGHT_CLICK_BLOCKといった文字列がプレイヤーの画面に表示される。
空気を殴れば、同RIGHT_CLICK_AIRやRIGHT_CLICK_BLOCKのはずである。

が、空気を殴ったときはイベントがこないことに気づいた。なんでだ?
どうも、1行目の(ignoreCancelled=true)がついていると、空気を殴ったときはイベントがこないらしい。
削ったらうまくいった。

@EventHandler
public void onPlayerInteract(PlayerInteractEvent e) {
    e.getPlayer().sendMessage(e.getAction().toString());
}

ちなみに、絵画とか額縁とかエンティティを殴った場合は、
*_CLICK_BLOCKではなく*_CLICK_AIRである。
また、e.getClickedBlock()では殴った絵画のオブジェクトは得られない。
その必要がある場合はHangingBreakByEntityEventを使ったほうがいいようだ。
このとき、絵画を壊した犯人(Player)は、e.getRemover()で得られる。

この記事を評価

この記事にコメント

  1. ...

【この記事にコメント】
お名前:
コメント:

Menu