From 6506371d0e19d51c9d2980fc7169d352067d588d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8F=E3=81=81=E3=83=BC=E3=82=8A=E3=81=83?= Date: Thu, 24 Nov 2022 10:43:37 +0900 Subject: [PATCH] add sidebar to track game progression --- .../unredstone/common/ProgressionSidebar.java | 55 +++++++++++++++++++ .../unredstone/common/data/URData.java | 5 ++ .../unredstone/common/logic/GameRunnable.java | 5 ++ .../unredstone/common/logic/URLogic.java | 3 + 4 files changed, 68 insertions(+) create mode 100644 src/main/java/quarri6343/unredstone/common/ProgressionSidebar.java diff --git a/src/main/java/quarri6343/unredstone/common/ProgressionSidebar.java b/src/main/java/quarri6343/unredstone/common/ProgressionSidebar.java new file mode 100644 index 0000000..c49663e --- /dev/null +++ b/src/main/java/quarri6343/unredstone/common/ProgressionSidebar.java @@ -0,0 +1,55 @@ +package quarri6343.unredstone.common; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import quarri6343.unredstone.UnRedstone; +import quarri6343.unredstone.common.data.URData; +import quarri6343.unredstone.common.data.URTeam; + +/** + * ゲームの進捗を表示するサイドバーを管理する + */ +public class ProgressionSidebar { + + private static final String objectiveName = "progression"; + private static Objective objective; + + public static void initialize(){ + objective = getBoard().getObjective(objectiveName); + if(objective == null) + objective = getBoard().registerNewObjective(objectiveName, "dummy", ChatColor.RED + "ゴールまでの距離"); + objective.setDisplaySlot(DisplaySlot.SIDEBAR); + update(); + } + + public static void update(){ + for (int i = 0; i < getData().teams.getTeamsLength(); i++) { + URTeam team = getData().teams.getTeam(i); + if(team.getEndLocation() == null || team.locomotive == null) + continue; + + Score score = objective.getScore(team.name); + int distance = (int)team.getEndLocation().distance(team.locomotive.entity.getLocation()); + score.setScore(distance); + } + } + + public static void destroy(){ + if(objective == null) + return; + + objective.unregister(); + } + + private static Scoreboard getBoard() { + return Bukkit.getScoreboardManager().getMainScoreboard(); + } + + private static URData getData() { + return UnRedstone.getInstance().getData(); + } +} diff --git a/src/main/java/quarri6343/unredstone/common/data/URData.java b/src/main/java/quarri6343/unredstone/common/data/URData.java index e961569..8ccc26d 100644 --- a/src/main/java/quarri6343/unredstone/common/data/URData.java +++ b/src/main/java/quarri6343/unredstone/common/data/URData.java @@ -73,4 +73,9 @@ public class URData { * リスポーン周辺にプラグインによる保護を適用する際の範囲 */ public static final int respawnProtectionRange = 5; + + /** + * サイドバーを更新する周期 + */ + public static final int updateSidebarInterval = 20; } diff --git a/src/main/java/quarri6343/unredstone/common/logic/GameRunnable.java b/src/main/java/quarri6343/unredstone/common/logic/GameRunnable.java index 869e304..e96472d 100644 --- a/src/main/java/quarri6343/unredstone/common/logic/GameRunnable.java +++ b/src/main/java/quarri6343/unredstone/common/logic/GameRunnable.java @@ -5,6 +5,7 @@ import org.bukkit.scheduler.BukkitRunnable; import quarri6343.unredstone.UnRedstone; import quarri6343.unredstone.common.GlobalTeamHandler; +import quarri6343.unredstone.common.ProgressionSidebar; import quarri6343.unredstone.common.data.URData; import quarri6343.unredstone.common.data.URTeam; import quarri6343.unredstone.utils.UnRedstoneUtils; @@ -76,6 +77,10 @@ public void run() { GlobalTeamHandler.giveEffectToPlayers(PotionEffectType.SPEED, giveBuffInterval * 2, getData().buffStrength.get()); GlobalTeamHandler.giveEffectToPlayers(PotionEffectType.FAST_DIGGING, giveBuffInterval * 2, getData().buffStrength.get()); } + + if (count % updateSidebarInterval == 0) { + ProgressionSidebar.update(); + } } private URData getData() { diff --git a/src/main/java/quarri6343/unredstone/common/logic/URLogic.java b/src/main/java/quarri6343/unredstone/common/logic/URLogic.java index 9aaf375..46be27d 100644 --- a/src/main/java/quarri6343/unredstone/common/logic/URLogic.java +++ b/src/main/java/quarri6343/unredstone/common/logic/URLogic.java @@ -17,6 +17,7 @@ import org.jetbrains.annotations.Nullable; import quarri6343.unredstone.UnRedstone; import quarri6343.unredstone.common.GlobalTeamHandler; +import quarri6343.unredstone.common.ProgressionSidebar; import quarri6343.unredstone.common.data.Locomotive; import quarri6343.unredstone.common.data.URData; import quarri6343.unredstone.common.data.URTeam; @@ -82,6 +83,7 @@ private void onGameBegin() { Bukkit.getOnlinePlayers().forEach(player -> player.showTitle(Title.title(Component.text("ゲームスタート"), Component.empty()))); gameStatus = GameStatus.ACTIVE; + ProgressionSidebar.initialize(); gameRunnable = new GameRunnable(urTeam -> endGame(null, urTeam, URLogic.GameResult.SUCCESS, true)).runTaskTimer(UnRedstone.getInstance(), 0, 1); } @@ -142,6 +144,7 @@ public void endGame(@Nullable Player sender, @Nullable URTeam victoryTeam, GameR } gameStatus = GameStatus.ENDING; + ProgressionSidebar.destroy(); if (hasResultScene) gameEndRunnable = new GameEndRunnable(() -> gameStatus = URLogic.GameStatus.INACTIVE, true).runTaskTimer(UnRedstone.getInstance(), gameResultSceneLength, 1); else