石橋を叩いて壊すブログ

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()で得られる。

この記事を評価

15 8

コメント

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

295,349

記事カテゴリー

最近の記事

  1. FF14を翻訳したら国によって結構特色が違った[12/11]
  2. ゼロから始めるFactorioの回路構築(実践例編)[7/24]
  3. ゼロから始めるFactorioの回路構築(条件回路・論理演算編)[7/24]
  4. ゼロから始めるFactorioの回路構築(定数回路・算術回路編)[7/24]
  5. ゼロから始めるFactorioの回路構築(入力・出力・混合編)[7/24]

RSS1.0 RSS2.0

最近のコメント

  1. おー、お役に立てたようでなによりです。再起…[9/11]
  2. この記事が非常の役立ちました。おかげさまで…[9/9]
  3. 1.14.2のAPIで試しましたが、MapInitializeEv…[9/9]
  4. 天晴れ!押したらポーションのモヤモヤでまし…[5/26]
  5. 習うより慣れろって感じで。この記事は記事冒…[4/7]

記事を検索


管理人

石橋

長いRPGは苦手