🐺

【Minecraft】人狼プラグイン開発日記 #2 【Daka】

に公開

人狼プラグイン開発日記 #2

やること

  • タイマー機能の実装
  • ターン移動処理

作業開始

タイマーを実装するのはするのですが、それをどのように表示するかには以下のようにいくつかのアイディアがあります。

  • スコアボード
  • 経験値バー
  • アクションテキスト
  • ボスバー
  • and more...

今回はボスバーでタイマーの残り時間を示すことにしました。まずは1秒ごとにテキストを飛ばす処理を実装して、そこにボスバーのプログレスを操作する処理を実装します。
https://youtu.be/tdtsXV8BKdE
https://youtu.be/K1pq94Z97AE

ソースコード
GameTimer.java
public class GameTimer {

    private final Main main;
    private BukkitRunnable task;
    private int seconds;

    private final TimerBossBar timerBossBar;

    public GameTimer(Main main) {
        this.main = main;
        this.timerBossBar = new TimerBossBar();
    }

    public void start(TimeZone timeZone, Runnable onFinish) {
        if (task != null) task.cancel();

        this.seconds = timeZone.getTime();

        timerBossBar.setTitle("-§e"+timeZone.getName()+"§fのターン-");
        timerBossBar.setProgress(1.0);
        timerBossBar.setColor(timeZone.getBarColor());

        timerBossBar.addPlayers(main.getWerewolfGame().getParticipants());

        //タスクの指定
        task = new BukkitRunnable() {
            @Override
            public void run() {
                if (seconds <= 0) {
                    cancel();
                    onFinish.run();   // ← 次のフェーズへ移行
                    return;
                }

                seconds--;

                double progress = (double) seconds / (double) timeZone.getTime();
                timerBossBar.setProgress(progress);
            }
        };
        task.runTaskTimer(main, 20L, 20L);
    }

    public void stop() {
        if (task != null) {
            task.cancel();
            task = null;
            timerBossBar.hideBossBar(main.getWerewolfGame().getParticipants());
        }
    }
}

taskという変数に指定間隔ごとにどんな処理をしてほしいかを書いています。今回の場合は以下の処理を書いています。

  • 秒数を1減らす
  • BossBarのプログレスを計算する
  • BossBarにプログレスをセットする

指定間隔とはtask.runTaskTimer(main, 20L, 20L);の第三引数で指定されている20Lのことです。periodという名前で20Lはだいたい約1秒です。第二引数の20Lはdelayの値でありtaskを開始するまでにどれくらい待つかを指定します。

BossBarのプログレスは0から1.0のdouble型でセットできます。そのため現在のターンの時間(今回の場合はテスト用で10秒)に対する残り時間の割合をdouble型で計算しています。

また、残り時間が0秒になった場合の処理を先頭に書いています。具体的にはtask(上記の3つの処理)をキャンセル、第二引数で受け取った処理を実行するという処理です。

参考程度のクラス図

次回

次は投票機能を実装します。

参考

https://zenn.dev/tasada038/articles/94d6d312d73882
https://lecture.ecc.u-tokyo.ac.jp/hideo-t/references/uml/type-specifications/type-specifications.html

Discussion