Nukkit in Kotlin #2
NukkitをKotlinで書くシリーズになりました。#1はこちら
やること
#2では
- イベント
- コマンド
を解説していきます。基本的なbuild.gradle.ktsは#1で詳しく記載してあるので、そちらを参照してください。
イベント
package com.example.sample
import cn.nukkit.event.EventHandler
import cn.nukkit.event.Listener
import cn.nukkit.event.player.PlayerJoinEvent
class HogeListener() : Listener {
@EventHandler
fun onPlayerJoin(event: PlayerJoinEvent) {
event.player.sendMessage("Hoge")
}
}
なんてことはないです。Nukkit特有の@EventHandler
アノテーションを指定したうえで、メソッドをListenerインターフェースを継承したクラスで宣言すればイベントのハンドラとなります。引数は待機したいイベントの型を指定します。引数は初めからval
が適用されており、#1で解説した変数の宣言で必要なval
やvar
を使った宣言は必要ありません。
このイベントリスナをonEnbale()メソッドでPluginManager#registerEvent()を使って待機できるようにさせます。
package com.example.sample
import import cn.nukkit.plugin.PluginBase
class SamplePlugin() : PluginBase() {
override fun onEnable() {
server.pluginManger.registerEvents(HogeListener(), this)
}
}
インスタンスの生成
Kotlinではインスタンスの生成でnew
キーワードを使わず、メソッドと同じようにクラス名の後ろに(/* 引数 */)
を指定するだけでインスタンスが返されます。
コマンド
まず、パーミッションを設定するためにbuild.gradle.kts
の一部を以下のように変更してください。変更する個所は適宜変えてもらっても構いません。
nukkit {
main = "com.example.sample.SamplePlugin"
api = listOf("1.0.9")
authors = listOf("your name")
parmission {
"sample.*" {
children {
"sample.command" {
description = "Sample Commands"
default = NukkitPluginDescription.Permission.Default.TRUE
children {
"sample.command.hoge" {
description = "Hoge Command Permission"
default = NukkitPluginDescription.Permission.Default.TRUE
}
}
}
}
}
}
}
コマンドクラスを作成します。
import cn.nukkit.command.Command
import cn.nukkit.command.CommandSender
class HogeCommand() : Command("hoge") {
init {
permission = "sample.command.hoge"
permissionMessage = "権限(<permission>)を持っていません"
}
override fun execute(sender: CommandSender, commandLabel: String, args: Array<String>): Boolean {
if(!testPermission(sender)) return false
sender.sendMessage("Hoge")
return true;
}
}
コンストラクタはクラス名の後に宣言します。親のコンストラクタも同様にクラス名の後に続いて渡してください。
initはコンストラクタが呼ばれた際に初期化処理を行うブロックです。
package com.example.sample
import import cn.nukkit.plugin.PluginBase
class SamplePlugin() : PluginBase() {
override fun onEnable() {
server.commandMap.register("sample", HogeCommand())
}
}
こちらもイベントリスナと同じく作成したコマンドクラスをCommandMap#register()を使用して登録します。register()の第一引数はプラグインで一意となる文字列(プラグイン名でも可)、第二引数に作成したコマンドクラスのインスタンスを渡してください。
まとめ
想定していた内容が大きくなりそうだったので、半分くらい削ってイベント・クラスのみの解説と軽めにしました。
次回の記事をいつ書くかは未定ですが、#3では外部プラグインが提供するAPIの利用やAPIの作成の手順を解説します。