Spigot プラグイン開発 8/定期実行

Spigotプラグイン開発

前回

今回は定期的にアクションを実行できるようにする方法を紹介。

例えば、5分に1回定期的に実行してほしいというタスクがあるときに使うことができると思います。

広告

やり方

基本は以下のような使い方となります。以下の例は5分毎に「5分」というメッセージをサーバー内チャットに送信します。

new BukkitRunnable(){
    @Override
    public void run() {
        Bukkit.broadcastMessage("5分");
    }
}.runTaskTimer(this, 0, 5*60*20L);

以下はわかりやすくしたものです。public void run() { }内に実行したい内容を書き、runTaskTimerの第一引数にプラグインインスタンス(メインクラスで使うときはthis)、第二引数は初回の実行は何ティック後に実行するか、第三引数は何ティックごとに実行するかを書きます。マインクラフトの世界では20ティックで1秒となるので30秒としたいときは30*20Lとします。20あとに付けてるLはLongの型という意味です。

new BukkitRunnable(){
    @Override
    public void run() {
        //ここに実行したい内容
    }
}.runTaskTimer(this, 初回は何ティック後に実行するか, 何ティックごとに実行するか);

runTaskTimerのところをrunTaskTimerAsynchronouslyやrunTaskLaterに変えることで動作を変えることもできます。

runTaskTimerAsynchronouslyはrunTaskTimerと機能は同じで、違うのは非同期であるところです。非同期とはサーバーのメインスレッドとは別のところで動作することを指します。非同期化することで重たい処理を裏で実行することができ、サーバーのプレーヤーにあまり影響を及ぼしません。ですが、ワールドの操作やテレポートなど非同期では使えないようになっているものもあります。なので基本は同期であるrunTaskTimerで問題ありません。

runTaskLaterは何ティック後に実行するかだけを指定し、1回実行するだけのものです。

活用

runTaskTimerで経過時間をチャットに出してみます。今回は初回実行は0ティック後、20ティック=1秒おきに実行とします。timeを定義しておきます。

public final class Kariproject extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        new BukkitRunnable(){
            int time = 0;
            @Override
            public void run() {
                Bukkit.broadcastMessage(time+"秒");
                time++;
            }
        }.runTaskTimer(this, 0, 1*20L);
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }
    
}

こんな感じにちゃんと1秒ごとにカウントしてくれます。

広告

Spigotプラグイン開発

Posted by mcspigot