LoginSignup
2
1

More than 3 years have passed since last update.

Nukkit in Kotlin #2

Last updated at Posted at 2020-03-02

Nukkit in Kotlin #2

NukkitをKotlinで書くシリーズになりました。#1はこちら

やること

#2では

  • イベント
  • コマンド

を解説していきます。基本的なbuild.gradle.ktsは#1で詳しく記載してあるので、そちらを参照してください。

イベント

HogeListener.kt
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で解説した変数の宣言で必要なvalvarを使った宣言は必要ありません。
このイベントリスナをonEnbale()メソッドでPluginManager#registerEvent()を使って待機できるようにさせます。

SamplePlugin.kt
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の一部を以下のように変更してください。変更する個所は適宜変えてもらっても構いません。

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
                        }
                    }
                }
            }
        }
    }
}

コマンドクラスを作成します。

HogeCommand.kt
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はコンストラクタが呼ばれた際に初期化処理を行うブロックです。

SamplePlugin.kt
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の作成の手順を解説します。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1