##概要
タイトル通り、モンハンのスタミナ機能を実現できるPluginです
どこかのFPSゲームにもありますね
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を応用して、モンハンの強走薬みたいな効果や
プレイヤーアビリティの有無でスタミナ増減が違う処理を入れてみたいですね