マインクラフト非公式フォーラム

本フォーラムでは多彩なサービスを提供しています。

利用方法は「Wiki」より確認できます。

ぜひご登録をお願いいたします!

Spigot 独自のイベントについて

たとえばあなたは何かしらのゲームサーバーを開発しているとします。
そのときPlayerInteractEventにあらゆる処理をぶち込むと、まぁ糞みたいなコードになります。
自作のイベントで楽にきれいに書きましょう。
やっぱり処理は見やすく書くに限ります。




:mc_166-0: 免責事項 :mc_166-0:

基本的に解説は Kotlin をもちいておこなっています。
IDEによっては Kotlin とJavaのコンバートを行えることがあると思うので、利用の際は変換してからご利用ください。
私はプログラミング歴が浅すぎます。ですので間違えや至らない個所が多くなるかもしれません。:(




:mc_2-0: はじめに :mc_2-0:

今回は例として過去記事のWrapperPlayerでのイベントを作ってみます。
ダイヤモンドを手に入れた時に発火するイベントを作ります。




:mc_137-0: コード概要 :mc_137-0:

:mc_144-0: WrapperPlayerEvent.kt :mc_144-0:

Kotlin:
package your.package.name.event

import org.bukkit.event.Event
import org.bukkit.event.HandlerList
import your.package.name.WrapperPlayer

abstract class WrapperPlayerEvent(val wrapperPlayer: WrapperPlayer) : Event() {

    override fun getHandlers(): HandlerList {
        return wrapperPlayerHandlers
    }

    companion object {
        private val wrapperPlayerHandlers = HandlerList()

        @JvmStatic
        fun getHandlerList(): HandlerList {
            return wrapperPlayerHandlers
        }
    }
}
上記のコードがBukkitのAPIでいうところのPlayerEventのクラスです。​
PlayerEventを継承すればいい話でしょうが、今回はそこから作るパターンで書いています。​
基本的にPlayerEventなどを模倣した形なのでHandlerListの概念など、私は詳しく理解できていません。:eek:
分かる方いれば教えてもらいたいです...​

:mc_264-0: GetDiamondEvent.kt :mc_264-0:

Kotlin:
package your.package.name.event

import your.package.name.WrapperPlayer

class GetDiamondEvent(wrapperPlayer: WrapperPlayer) : WrapperPlayerEvent(wrapperPlayer) {
}
次いでこちらがイベントの本体です。​
コンストラクタに任意でいろいろぶち込んで使えます。​
もちろん独自に関数を加えてもいいですね。​

:mc_51-0: イベントの発火 :mc_51-0:

Kotlin:
// import文は省略

@EventHandler
fun onPickUp(event: EntityPickupItemEvent) {
    val entity = event.entity
    val item = event.item
    if (entity is Player && item.itemStack.type == Material.DIAMOND) {
        val wrapperPlayer = WrapperPlayer.get(entity) ?: return
        val event = GetDiamondEvent(wrapperPlayer)
        Bukkit.getPluginManager().callEvent(event)
    }
}
イベントの発火はPluginManagerから行います。​
特にいうことはなさそう。​

:mc_257-0: 使用方法とか :mc_257-0:

あとは普通のイベントのように扱うだけです。​




:mc_397-5: おわり :mc_397-5:

参考になればうれしいです
間違えとかあれば指摘してください!:giggle:
 
Last edited:
Top