1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Spigot]Minecraftでモンスターハンターのスタミナのような機能を簡単に実装する

Last updated at Posted at 2021-03-11

##概要
タイトル通り、モンハンのスタミナ機能を実現できるPluginです
どこかのFPSゲームにもありますね
MHStamina.gif
Youtube: https://youtu.be/uuAmWKzlnUA
GitHub: https://github.com/FratikaK/MHStamina_Sample

##作成した経緯
PvPのゲームを作っていて、モンハンのようなゲージ減少を実装してみたいなと思っていました
BukkitRunnableで簡単に出来たので共有してみたいと思います

##どのように動いているか

EventListenerでプレイヤーがスプリントする動作を検知する

    @EventHandler
    public void onToggleSplint(PlayerToggleSprintEvent event) {
        //スプリントを切り替えたプレイヤーを取得
        Player player = event.getPlayer();

        if (event.isSprinting()) { //スプリントを始めた時
            new DecreaseTask(player).runTaskTimer(this, 0, 10);
        } else { //スプリントをやめた時
            new RecoveryTask(player).runTaskTimer(this, 0, 5);
        }
    }

PlayerToggleSplintEventでeventを取得してプレイヤーがスプリント、
または歩行の状態でそれぞれのTaskを実行します

DecreaseTaskは減少、RecoveryTaskは回復です
BukkitRunnableのrunTaskTimerで定期的に実行させて、プレイヤーの食糧ゲージを増減させます

####スプリントを始めた時

public class DecreaseTask extends BukkitRunnable {

    private final Player player;

    public DecreaseTask(Player player) {
        this.player = player;
    }

    @Override
    public void run() {

        //プレイヤーがスプリントをしていなければTaskをキャンセル
        if (!player.isSprinting()) {
            cancel();
            return;
        }

        //プレイヤーのFoodLevelを1減らす
        player.setFoodLevel(player.getFoodLevel() - 1);
    }
}

runTaskTimerのperiodを10tickにしてあるので0.5秒ほどずつゲージを減らします

####スプリントをやめた時(歩行、止まっている時)

public class RecoveryTask extends BukkitRunnable {

    private final Player player;

    //delayが0になったらFoodLevelを回復させる
    private int delay = 5;

    public RecoveryTask(Player player) {
        this.player = player;
    }

    @Override
    public void run() {

        //プレイヤーがスプリント状態か、FoodLevelが全快している時はTaskをキャンセル
        if (player.isSprinting() || player.getFoodLevel() == 20) {
            cancel();
            return;
        }

        if (delay <= 0) {
            player.setFoodLevel(player.getFoodLevel() + 1);
            return;
        }
        delay--;
    }
}

こちらはperiodを5tickにしてあります
(モンハンはスタミナ減少より回復の方が早かったと記憶している)

//delayが0になったらFoodLevelを回復させる
private int delay = 5;

スプリントをやめてすぐ回復するのを防ぐためにdelayを入れています

###問題点
一応食べ物を食べることで食糧ゲージ回復を無効化させるeventを入れています

    @EventHandler
    public void onChangeFoodLevel(FoodLevelChangeEvent event) {
        event.setCancelled(true);
    }

FPSみたいなゲームには食べ物を食べる動作はいらないのですが、
モンハンのゲームをマネしようとするとMinecraftの仕様上、食糧ゲージが満タンだと食事が出来ないです
金リンゴしか食べれません(モンハンには肉を食べたり、薬を飲んだりする動作がある)

RecoveryTaskで

      if (player.isSprinting() || player.getFoodLevel() >= 18) {
            cancel();
            return;
        }

Taskキャンセルする条件式をplayer.getFoodLevel() >= (19以下の数字)とすることで
食事の動作が出来るようになりますが...

食糧ゲージが満タンじゃないのはなんか違和感があります(個人の感想です)

###今後実装してみたいこと
このPluginを応用して、モンハンの強走薬みたいな効果や
プレイヤーアビリティの有無でスタミナ増減が違う処理を入れてみたいですね

1
0
1

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?