猿でもできるマイクラ開発-イベント編①

2019年7月3日

1: はじめに

1,2か月前ぐらい?にコマンドの検知を教えましたが、
今度はイベントの検知についてです。
これを理解できるとできることは増えていきますよ!

2: イベントとは

Event(イベント)とは、マイクラサーバー内で起こった「何か」の
検知や、無効化などに使用されるものです。

この「何か」は例えば

  • プレイヤーが動いた
  • ブロックが壊れた
  • プレイヤーが右クリックした

などなど、沢山あります。こんなイベントあるかな?と思ったら
google先生で英語で調べましょう。
「spigot ○○event」 などで調べればかなりヒットします。

さて、本題に戻り、イベントが何かは理解できましたね?
何に使えるの?という話をしましょう。ざっくりいうと
「イベントを検知し、必要ならキャンセルできる(例外あり)」
という物です。
具体例を挙げると

  • ブロックを破壊したイベントを検知し、権限がなければキャンセル
  • ログインしたイベントを検知し、メッセージを表示

などなど、思いつく限り応用が利きます。

3: 実際のコード-準備

猿でもできるマイクラ開発-コマンド編 で使った
HelloWorld-spigot プロジェクトを開いてほしい。
恐らくこうなっているはずだ。

ではまず、7行目を見てほしい。恐らく

public final class HelloWorld extends JavaPlugin {

となっていると思う。これを

public final class HelloWorld extends JavaPlugin implements Listener {

に変更しよう。
これは、「このクラスでイベントを検知しますよ!」という
おまじないみたいなものだ。これをやっておかないと後でエラーが出る。

もし、Listenerに赤線が引かれて、importする場合、
必ずorg.bukkit.event.Listenerを選ぶこと。
そうしないと後でエラーが出る。
もし間違えて別のimportをしてしまった場合
2行目前後のimport文の中からListenerとついている行を
丸ごと消滅させていい。

次は17行あたりのonEnableを見てほしい。恐らく今はこうなっているはずだ。

この画像だと20行目にgetCommand(…と書いてあるが、この下の行に

getServer().getPluginManager().registerEvents(this,this);

を追加してほしい、うまくいっていればこうなっているはずだ。

これは、サーバーに
「このクラスでイベント検知を行いますよ」と教えているモノと考えてほしい。

次はいよいよイベント検知の実装だ。
だが今までのコマンド実装と全く違うので、ゆっくりついてきてほしい。

4: 実際のコード-検知

しょっぱなからコードを貼る。

    @EventHandler
    public void onLogin(PlayerJoinEvent e){
        e.getPlayer().sendMessage("ログインありがとうだウホ");
    }

まず「@EventHandler」だが、これはonCommandについている@Override
似て非なるものである。

この@EventHandlerが付いているメソッドは、
特定のイベントを指定していれば
そのイベントが起きたときに実行されるようになるのだ!

そのため、@Overrideとは少々扱いが異なる。ルールを書いておこう。

  • メソッド名は自由。(もちろんjavaで禁止されているワードは使えないが。)
  • 引数(上のコードだとPlayerJoinEvent e)で、イベントを指定する。
  • @EventHandlerを付けていないと検知できない

ちなみに上のコードは、
PlayerJoinEvent => ログインしたときのイベントを検知し、
e.getPlayer() => ログインしたプレイヤーに
sendMessage(); => メッセージを送っている。

という物だ。
イベントから取得できるデータは、イベントごとに違うので
そこは各自google先生に聞いたり先人のコードを見て学ぶのが一番だと思う。

上のコードをHelloWorld.javaに追記するとこうなるはずだ。

もし大丈夫そうなら、ビルドして、jarをサーバーに入れてreloadしてみよう。
エラーが出なかったら一度サーバーから抜けて、また入ってみてほしい。

こんな感じでメッセージが表示されたら成功だ。

ちなみに、今回は紹介していないが

e.setCanceled();

メソッドがある場合、

e.setCanceled(true); 

でそのイベントをキャンセルできる。
これは各自いろいろ試してみてほしい。

5: 終わりに&次回予告

結局はgoogle先生が一番なんですけどね、初見さん

次回ですが、猿でも分かるgithubの使い方 を予定しています。
お楽しみに!

前: 猿でも分かるマイクラ開発-Java攻略編②
次: 猿でも分かるマイクラ開発-Github編