From 70e3883e62a61938352f00813f0424b348c5e478 Mon Sep 17 00:00:00 2001 From: gabl Date: Tue, 9 Jan 2024 17:58:48 +0100 Subject: [PATCH 1/3] rework BossBarFeature --- .../def/AbstractCounterProgressFeature.java | 27 ++++--- .../feature/def/BossBarCounterFeature.java | 44 +++--------- .../api/feature/def/BossBarFeature.java | 71 ++++++++++--------- .../api/feature/def/LevelCounterFeature.java | 4 +- .../gamecore/api/player/GamePlayer.java | 5 ++ .../gamecore/api/player/GamePlayerImpl.java | 62 ++++++++++++++-- .../api/player/PreGamePlayerImpl.java | 11 +++ .../java/de/drolpi/skywars/SkyWarsGame.java | 4 +- .../src/main/resources/SkyWarsGame_de.json | 1 + 9 files changed, 139 insertions(+), 90 deletions(-) diff --git a/core/src/main/java/de/drolpi/gamecore/api/feature/def/AbstractCounterProgressFeature.java b/core/src/main/java/de/drolpi/gamecore/api/feature/def/AbstractCounterProgressFeature.java index 291ebe1..60a9b68 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/feature/def/AbstractCounterProgressFeature.java +++ b/core/src/main/java/de/drolpi/gamecore/api/feature/def/AbstractCounterProgressFeature.java @@ -2,23 +2,17 @@ import com.google.inject.Inject; import de.drolpi.gamecore.api.counter.Counter; -import de.drolpi.gamecore.api.counter.HandlerType; import de.drolpi.gamecore.api.player.GamePlayer; import de.drolpi.gamecore.api.event.GameJoinEvent; -import de.drolpi.gamecore.api.feature.AbstractFeature; import de.drolpi.gamecore.api.game.Game; import de.drolpi.gamecore.api.phase.Phase; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import java.util.function.Consumer; - public abstract class AbstractCounterProgressFeature extends AbstractCounterHandlerFeature { private final Game game; - private boolean countUp; - @Inject public AbstractCounterProgressFeature(Game game, Phase phase) { super(phase); @@ -28,7 +22,6 @@ public AbstractCounterProgressFeature(Game game, Phase phase) { @Override public void enable() { super.enable(); - this.countUp = this.counterFeature.stopCount() > this.counterFeature.startCount(); } @EventHandler @@ -39,7 +32,7 @@ public void handle(GameJoinEvent event) { return; } - this.setStart(player, counter); + this.reset(player, counter); } @Override @@ -57,7 +50,7 @@ protected void tick(Counter counter) { @Override protected void cancel(Counter counter) { for (final GamePlayer player : this.game.allPlayers()) { - this.setStart(player.player(), counter); + this.reset(player.player(), counter); } } @@ -67,16 +60,20 @@ protected void finish(Counter counter) { } protected float progress(Counter counter) { - return counter.currentCount() / (this.startCount(counter) + 0.0F); + return (float) (counter.currentCount() - this.lowerBound(counter)) / (this.upperBound(counter) - this.lowerBound(counter)); + } + + protected long upperBound(Counter counter) { + return Math.max(counter.startCount(), counter.stopCount()); } - protected long startCount(Counter counter) { - return this.countUp ? counter.stopCount() : counter.startCount(); + protected long lowerBound(Counter counter) { + return Math.min(counter.startCount(), counter.stopCount()); } - protected void setStart(Player player, Counter counter) { - this.set(player, (int) this.startCount(counter), this.countUp ? 0 : 1); + protected void reset(Player player, Counter counter) { + this.set(player, counter.startCount(), counter.startCount() > counter.stopCount() ? 1F : 0F); } - protected abstract void set(Player player, int count, float progress); + protected abstract void set(Player player, long count, float progress); } diff --git a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java index af491d7..acaede2 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java +++ b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java @@ -1,18 +1,18 @@ package de.drolpi.gamecore.api.feature.def; import com.google.inject.Inject; -import de.drolpi.gamecore.api.counter.Counter; import de.drolpi.gamecore.api.game.Game; import de.drolpi.gamecore.api.phase.Phase; -import org.bukkit.boss.BossBar; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.resolver.Formatter; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.entity.Player; public class BossBarCounterFeature extends AbstractCounterProgressFeature { private final BossBarFeature bossBarFeature; - private BossBar bossBar; - @Inject public BossBarCounterFeature(Game game, Phase phase) { super(game, phase); @@ -20,36 +20,10 @@ public BossBarCounterFeature(Game game, Phase phase) { } @Override - public void enable() { - super.enable(); - this.bossBar = this.bossBarFeature.bossBar(); - } - - @Override - public void disable() { - super.disable(); - this.bossBar = null; - } - - @Override - protected void start(Counter counter) { - this.bossBar.setVisible(true); - } - - @Override - protected void cancel(Counter counter) { - super.cancel(counter); - this.bossBar.setTitle(this.bossBarFeature.message()); - if (!this.bossBarFeature.message().isBlank()) { - return; - } - this.bossBar.setVisible(false); - } - - @Override - protected void set(Player player, int count, float progress) { - //TODO: Lang - this.bossBar.setTitle("" + count); - this.bossBar.setProgress(progress); + protected void set(Player player, long count, float progress) { + this.bossBarFeature.setProgress(progress); + this.bossBarFeature.setResolvers(new TagResolver[]{ + Placeholder.component("count", Component.text(count)) + }); } } diff --git a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java index ca21c0c..47c4cc7 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java +++ b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java @@ -2,90 +2,97 @@ import com.google.gson.annotations.Expose; import com.google.inject.Inject; +import de.drolpi.gamecore.api.phase.Phase; import de.drolpi.gamecore.api.player.GamePlayer; import de.drolpi.gamecore.GamePlugin; import de.drolpi.gamecore.api.event.GameJoinEvent; import de.drolpi.gamecore.api.event.GamePostLeaveEvent; import de.drolpi.gamecore.api.feature.AbstractFeature; import de.drolpi.gamecore.api.game.Game; -import org.bukkit.boss.BarColor; -import org.bukkit.boss.BarStyle; -import org.bukkit.boss.BossBar; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.bossbar.BossBar; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.event.EventHandler; public class BossBarFeature extends AbstractFeature { - private final GamePlugin plugin; private final Game game; - //TODO: Lang @Expose - private String message = ""; + private BossBar.Color color = BossBar.Color.BLUE; @Expose - private BarColor color = BarColor.BLUE; - @Expose - private BarStyle style = BarStyle.SEGMENTED_20; + private BossBar.Overlay overlay = BossBar.Overlay.PROGRESS; - private BossBar bossBar; + private final BossBar bossBar; + private final Component defaultName; + private TagResolver[] resolvers; @Inject - public BossBarFeature(GamePlugin plugin, Game game) { - this.plugin = plugin; + public BossBarFeature(Game game, Phase phase) { this.game = game; + this.defaultName = Component.translatable(phase.key() + "bossbar_name"); + this.bossBar = BossBar.bossBar(this.defaultName, 1.0f, this.color, this.overlay); + this.resolvers = new TagResolver[]{}; } @Override public void enable() { - this.bossBar = this.plugin.getServer().createBossBar(this.message, this.color, this.style); - if (this.message.isBlank()) { - this.bossBar.setVisible(false); - } for (GamePlayer gamePlayer : this.game.players()) { - this.bossBar.addPlayer(gamePlayer.player()); + gamePlayer.showBossBar(this.bossBar, resolvers); } } @Override public void disable() { - this.bossBar.removeAll(); + for (GamePlayer gamePlayer : this.game.players()) { + gamePlayer.hideBossBar(this.bossBar); + } } @EventHandler public void handle(GameJoinEvent event) { - this.bossBar.addPlayer(event.gamePlayer().player()); + event.gamePlayer().showBossBar(this.bossBar); } @EventHandler public void handle(GamePostLeaveEvent event) { - this.bossBar.removePlayer(event.gamePlayer().player()); + event.gamePlayer().hideBossBar(this.bossBar); } public BossBar bossBar() { return this.bossBar; } - public String message() { - return this.message; + public BossBar.Color color() { + return this.color; + } + + public BossBar.Overlay overlay() { + return this.overlay; } - public BarColor color() { - return this.color; + public void setProgress(float progress) { + this.bossBar.progress(progress); + } + + public void setName(Component name) { + this.bossBar.name(name); } - public BarStyle style() { - return this.style; + public void resetName() { + this.setName(this.defaultName); } - public void setMessage(String message) { - this.message = message; + public void setColor(BossBar.Color color) { + this.bossBar.color(color); } - public void setColor(BarColor color) { - this.color = color; + public void setResolvers(TagResolver[] resolvers) { + this.resolvers = resolvers; } - public void setStyle(BarStyle style) { - this.style = style; + public void setOverlay(BossBar.Overlay overlay) { + this.overlay = overlay; } } diff --git a/core/src/main/java/de/drolpi/gamecore/api/feature/def/LevelCounterFeature.java b/core/src/main/java/de/drolpi/gamecore/api/feature/def/LevelCounterFeature.java index 19e89f1..06fdbe2 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/feature/def/LevelCounterFeature.java +++ b/core/src/main/java/de/drolpi/gamecore/api/feature/def/LevelCounterFeature.java @@ -18,8 +18,8 @@ public LevelCounterFeature(Game game, Phase phase) { } @Override - protected void set(Player player, int count, float progress) { - player.setLevel(count); + protected void set(Player player, long count, float progress) { + player.setLevel((int) count); if (!this.levelProgress) return; diff --git a/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayer.java b/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayer.java index a603fdb..c6a2fb8 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayer.java +++ b/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayer.java @@ -1,5 +1,6 @@ package de.drolpi.gamecore.api.player; +import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; @@ -18,5 +19,9 @@ public interface GamePlayer { void showTitle(Title title, TagResolver... resolvers); + void showBossBar(BossBar bossBar, TagResolver... resolvers); + + void hideBossBar(BossBar bossBar); + void playSound(Sound sound); } diff --git a/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayerImpl.java b/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayerImpl.java index 8a68ff6..4fdc026 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayerImpl.java +++ b/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayerImpl.java @@ -1,18 +1,18 @@ package de.drolpi.gamecore.api.player; +import de.drolpi.gamecore.api.feature.def.BossBarFeature; import de.drolpi.gamecore.api.game.AbstractGame; import de.drolpi.gamecore.api.game.GameControllerImpl; import de.drolpi.gamecore.components.localization.adventure.MiniMessageComponentRenderer; +import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; import net.kyori.adventure.title.Title; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; -import java.util.Locale; -import java.util.Optional; -import java.util.Set; +import java.util.*; final class GamePlayerImpl extends PreGamePlayerImpl implements GamePlayer { @@ -20,16 +20,20 @@ final class GamePlayerImpl extends PreGamePlayerImpl implements GamePlayer { private final Locale locale = Locale.GERMAN; private final GameControllerImpl gameController; + private final Map shownBossBars; + GamePlayerImpl(Player player, GameControllerImpl gameController) { super(player.getUniqueId()); this.player = player; this.gameController = gameController; + this.shownBossBars = new HashMap<>(); } GamePlayerImpl(PreGamePlayerImpl gamePlayer, Player player, GameControllerImpl gameController) { super(gamePlayer.uniqueId); this.player = player; this.gameController = gameController; + this.shownBossBars = new HashMap<>(); } @Override @@ -64,8 +68,58 @@ public void showTitle(Title title, TagResolver... resolvers) { this.player.showTitle(result); } + @Override + public void showBossBar(BossBar bossBar, TagResolver... resolvers) { + Set game = this.gameController.abstractGames(this, true); + Optional optional = game.stream().findFirst(); + if (optional.isEmpty()) { + throw new RuntimeException(); + } + + MiniMessageComponentRenderer renderer = optional.get().renderer(); + Component name = renderer.render(bossBar.name(), this.locale, resolvers); + BossBar result = BossBar.bossBar(name, bossBar.progress(), bossBar.color(), bossBar.overlay()); + BossBarCopyListener copyListener = new BossBarCopyListener(result, renderer, locale, resolvers); + bossBar.addListener(copyListener); + this.shownBossBars.put(bossBar, copyListener); + this.player.showBossBar(result); + } + + @Override + public void hideBossBar(BossBar bossBar) { + BossBarCopyListener listener = this.shownBossBars.get(bossBar); + if (listener == null) return; + bossBar.removeListener(listener); + this.shownBossBars.remove(bossBar); + this.player.hideBossBar(listener.copy()); + } + @Override public void playSound(Sound sound) { this.player.playSound(sound); } + + private record BossBarCopyListener(BossBar copy, MiniMessageComponentRenderer renderer, Locale locale, + TagResolver... resolvers) implements BossBar.Listener { + + @Override + public void bossBarNameChanged(@NotNull BossBar bossBar, @NotNull Component oldName, @NotNull Component newName) { + this.copy.name(this.renderer.render(newName, this.locale, this.resolvers)); + } + + @Override + public void bossBarProgressChanged(@NotNull BossBar bossBar, float oldProgress, float newProgress) { + this.copy.progress(newProgress); + } + + @Override + public void bossBarColorChanged(@NotNull BossBar bossBar, BossBar.@NotNull Color oldColor, BossBar.@NotNull Color newColor) { + this.copy.color(newColor); + } + + @Override + public void bossBarOverlayChanged(@NotNull BossBar bossBar, BossBar.@NotNull Overlay oldOverlay, BossBar.@NotNull Overlay newOverlay) { + this.copy.overlay(newOverlay); + } + } } diff --git a/core/src/main/java/de/drolpi/gamecore/api/player/PreGamePlayerImpl.java b/core/src/main/java/de/drolpi/gamecore/api/player/PreGamePlayerImpl.java index ff9abb7..8ba22ca 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/player/PreGamePlayerImpl.java +++ b/core/src/main/java/de/drolpi/gamecore/api/player/PreGamePlayerImpl.java @@ -1,5 +1,6 @@ package de.drolpi.gamecore.api.player; +import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; @@ -36,6 +37,16 @@ public void showTitle(Title title, TagResolver... resolvers) { throw new RuntimeException(); } + @Override + public void showBossBar(BossBar bossBar, TagResolver... resolvers) { + throw new RuntimeException(); + } + + @Override + public void hideBossBar(BossBar bossBar) { + throw new RuntimeException(); + } + @Override public void playSound(Sound sound) { throw new RuntimeException(); diff --git a/game-skywars/src/main/java/de/drolpi/skywars/SkyWarsGame.java b/game-skywars/src/main/java/de/drolpi/skywars/SkyWarsGame.java index 9939ef3..a5941b7 100644 --- a/game-skywars/src/main/java/de/drolpi/skywars/SkyWarsGame.java +++ b/game-skywars/src/main/java/de/drolpi/skywars/SkyWarsGame.java @@ -21,7 +21,7 @@ import de.drolpi.gamecore.api.phase.def.StartingPhase; import de.drolpi.gamecore.components.team.config.Team; import de.drolpi.gamecore.components.team.config.TeamColor; -import org.bukkit.boss.BarColor; +import net.kyori.adventure.bossbar.BossBar; @GameInfo(name = "SkyWarsGame", description = "The SkyWars game", version = "1.0.0-SNAPSHOT", authors = {"dasdrolpi"}) public final class SkyWarsGame extends AbstractGame { @@ -70,7 +70,7 @@ public void create() { //TODO: fix BossBarFeature bossBarFeature = protectionPhase.createFeature(BossBarFeature.class); - bossBarFeature.setColor(BarColor.GREEN); + bossBarFeature.setColor(BossBar.Color.GREEN); protectionPhase.createFeature(BossBarCounterFeature.class); WinDetectionFeature protectionWinDetectionFeature = protectionPhase.createFeature(WinDetectionFeature.class); diff --git a/game-skywars/src/main/resources/SkyWarsGame_de.json b/game-skywars/src/main/resources/SkyWarsGame_de.json index c9020d5..a274b7b 100644 --- a/game-skywars/src/main/resources/SkyWarsGame_de.json +++ b/game-skywars/src/main/resources/SkyWarsGame_de.json @@ -16,6 +16,7 @@ "starting.counter_finish_subtitle": "", "protection.counter_tick_message": "Die Schutzzeit endet in ", "protection.counter_finish_message": "Die Schutzzeit ist nun vorbei", + "protection.bossbar_name": "Schutzzeit", "ingame.counter_tick_message": "Das Spiel endet in ", "ingame.counter_finish_message": "Das Spiel endet nun", "ingame.death_private": "Du bist gestorben", From 83b8f330672772fb038023876f3644d2710508a2 Mon Sep 17 00:00:00 2001 From: gabl Date: Tue, 9 Jan 2024 19:20:07 +0100 Subject: [PATCH 2/3] feat multiple bossbars in BossBarFeature --- .../feature/def/BossBarCounterFeature.java | 23 ++- .../api/feature/def/BossBarFeature.java | 131 +++++++++++++----- .../java/de/drolpi/skywars/SkyWarsGame.java | 4 +- .../src/main/resources/SkyWarsGame_de.json | 2 +- 4 files changed, 117 insertions(+), 43 deletions(-) diff --git a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java index acaede2..b816759 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java +++ b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java @@ -1,29 +1,40 @@ package de.drolpi.gamecore.api.feature.def; +import com.google.gson.annotations.Expose; import com.google.inject.Inject; import de.drolpi.gamecore.api.game.Game; import de.drolpi.gamecore.api.phase.Phase; +import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.tag.resolver.Formatter; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.entity.Player; public class BossBarCounterFeature extends AbstractCounterProgressFeature { private final BossBarFeature bossBarFeature; + private final BossBar bossBar; + + @Expose + private BossBar.Color color = BossBar.Color.RED; + @Expose + private BossBar.Overlay overlay = BossBar.Overlay.PROGRESS; @Inject public BossBarCounterFeature(Game game, Phase phase) { super(game, phase); this.bossBarFeature = phase.feature(BossBarFeature.class); + this.bossBar = BossBar.bossBar(Component.translatable(phase.key() + "counterbossbar_name"), 0.0F, color, overlay); + this.bossBarFeature.addBossBar(this.bossBar); + } + + @Override + public void enable() { + super.enable(); } @Override protected void set(Player player, long count, float progress) { - this.bossBarFeature.setProgress(progress); - this.bossBarFeature.setResolvers(new TagResolver[]{ - Placeholder.component("count", Component.text(count)) - }); + this.bossBarFeature.setProgress(this.bossBar, progress); + this.bossBarFeature.setResolvers(this.bossBar, Placeholder.component("count", Component.text(count))); } } diff --git a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java index 47c4cc7..0bb4bf5 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java +++ b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java @@ -4,7 +4,6 @@ import com.google.inject.Inject; import de.drolpi.gamecore.api.phase.Phase; import de.drolpi.gamecore.api.player.GamePlayer; -import de.drolpi.gamecore.GamePlugin; import de.drolpi.gamecore.api.event.GameJoinEvent; import de.drolpi.gamecore.api.event.GamePostLeaveEvent; import de.drolpi.gamecore.api.feature.AbstractFeature; @@ -14,85 +13,151 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.event.EventHandler; +import java.util.HashMap; +import java.util.Map; + public class BossBarFeature extends AbstractFeature { private final Game game; - @Expose - private BossBar.Color color = BossBar.Color.BLUE; - @Expose - private BossBar.Overlay overlay = BossBar.Overlay.PROGRESS; - - private final BossBar bossBar; + private final Map bossBars; private final Component defaultName; - private TagResolver[] resolvers; @Inject public BossBarFeature(Game game, Phase phase) { this.game = game; this.defaultName = Component.translatable(phase.key() + "bossbar_name"); - this.bossBar = BossBar.bossBar(this.defaultName, 1.0f, this.color, this.overlay); - this.resolvers = new TagResolver[]{}; + this.bossBars = new HashMap<>(); } @Override public void enable() { - for (GamePlayer gamePlayer : this.game.players()) { - gamePlayer.showBossBar(this.bossBar, resolvers); + for (BossBarInfo info : bossBars.values()) { + gamePlayer.showBossBar(info.bossbar, info.resolvers); + } } } @Override public void disable() { for (GamePlayer gamePlayer : this.game.players()) { - gamePlayer.hideBossBar(this.bossBar); + for (BossBar bossBar : bossBars.keySet()) { + gamePlayer.hideBossBar(bossBar); + } } } @EventHandler public void handle(GameJoinEvent event) { - event.gamePlayer().showBossBar(this.bossBar); + for (BossBarInfo info : bossBars.values()) { + event.gamePlayer().showBossBar(info.bossbar, info.resolvers); + } } @EventHandler public void handle(GamePostLeaveEvent event) { - event.gamePlayer().hideBossBar(this.bossBar); + for (BossBar bossBar : bossBars.keySet()) { + event.gamePlayer().hideBossBar(bossBar); + } + } + + public BossBar.Color color(BossBar bossBar) { + return this.bossBars.get(bossBar).color; + } + + public BossBar.Overlay overlay(BossBar bossBar) { + return this.bossBars.get(bossBar).overlay; } - public BossBar bossBar() { - return this.bossBar; + public void setProgress(BossBar bossBar, float progress) { + this.bossBars.get(bossBar).progress(progress); } - public BossBar.Color color() { - return this.color; + public void setName(BossBar bossBar, Component name) { + this.bossBars.get(bossBar).name(name); } - public BossBar.Overlay overlay() { - return this.overlay; + public void resetName(BossBar bossBar) { + this.bossBars.get(bossBar).name(this.defaultName); } - public void setProgress(float progress) { - this.bossBar.progress(progress); + public void setColor(BossBar bossBar, BossBar.Color color) { + this.bossBars.get(bossBar).color(color); } - public void setName(Component name) { - this.bossBar.name(name); + public void setResolvers(BossBar bossbar, TagResolver... resolvers) { + this.bossBars.get(bossbar).resolvers = resolvers; } - public void resetName() { - this.setName(this.defaultName); + public void setOverlay(BossBar bossBar, BossBar.Overlay overlay) { + this.bossBars.get(bossBar).overlay(overlay); } - public void setColor(BossBar.Color color) { - this.bossBar.color(color); + public void addBossBar(BossBar bossBar) { + this.bossBars.put(bossBar, new BossBarInfo(bossBar.color(), bossBar.overlay(), bossBar)); } - public void setResolvers(TagResolver[] resolvers) { - this.resolvers = resolvers; + public void removeBossBar(BossBar bossBar) { + this.bossBars.remove(bossBar); } - public void setOverlay(BossBar.Overlay overlay) { - this.overlay = overlay; + public static class BossBarInfo { + + @Expose + private BossBar.Color color; + @Expose + private BossBar.Overlay overlay; + @Expose + private TagResolver[] resolvers; + + private final BossBar bossbar; + + public BossBarInfo(BossBar.Color color, BossBar.Overlay overlay, BossBar bossbar) { + this.color = color; + this.overlay = overlay; + this.bossbar = bossbar; + this.resolvers = new TagResolver[]{}; + } + + public BossBar.Color color() { + return this.color; + } + + public BossBar.Overlay overlay() { + return this.overlay; + } + + public BossBar bossbar() { + return this.bossbar; + } + + public TagResolver[] resolvers() { + return this.resolvers; + } + + public Component name() { + return this.bossbar.name(); + } + + public void progress(float progress) { + this.bossbar.progress(progress); + } + + public void name(Component name) { + this.bossbar.name(name); + } + + public void color(BossBar.Color color) { + this.color = color; + } + + public void overlay(BossBar.Overlay overlay) { + this.overlay = overlay; + } + + public void resolvers(TagResolver[] resolvers) { + this.resolvers = resolvers; + } } } diff --git a/game-skywars/src/main/java/de/drolpi/skywars/SkyWarsGame.java b/game-skywars/src/main/java/de/drolpi/skywars/SkyWarsGame.java index a5941b7..0f8432d 100644 --- a/game-skywars/src/main/java/de/drolpi/skywars/SkyWarsGame.java +++ b/game-skywars/src/main/java/de/drolpi/skywars/SkyWarsGame.java @@ -68,9 +68,7 @@ public void create() { protectionPhase.createFeature(SpectatorFeature.class); protectionPhase.createFeature(SpectatorSpawnFeature.class); - //TODO: fix - BossBarFeature bossBarFeature = protectionPhase.createFeature(BossBarFeature.class); - bossBarFeature.setColor(BossBar.Color.GREEN); + protectionPhase.createFeature(BossBarFeature.class); protectionPhase.createFeature(BossBarCounterFeature.class); WinDetectionFeature protectionWinDetectionFeature = protectionPhase.createFeature(WinDetectionFeature.class); diff --git a/game-skywars/src/main/resources/SkyWarsGame_de.json b/game-skywars/src/main/resources/SkyWarsGame_de.json index a274b7b..3bbb06a 100644 --- a/game-skywars/src/main/resources/SkyWarsGame_de.json +++ b/game-skywars/src/main/resources/SkyWarsGame_de.json @@ -16,7 +16,7 @@ "starting.counter_finish_subtitle": "", "protection.counter_tick_message": "Die Schutzzeit endet in ", "protection.counter_finish_message": "Die Schutzzeit ist nun vorbei", - "protection.bossbar_name": "Schutzzeit", + "protection.counterbossbar_name": "Schutzzeit", "ingame.counter_tick_message": "Das Spiel endet in ", "ingame.counter_finish_message": "Das Spiel endet nun", "ingame.death_private": "Du bist gestorben", From 5ba67c7ae970c369a078f6cb819244fcb987ca73 Mon Sep 17 00:00:00 2001 From: gabl Date: Fri, 12 Jan 2024 16:08:58 +0100 Subject: [PATCH 3/3] fix bossbars, add bossbar-ids --- .../feature/def/BossBarCounterFeature.java | 47 ++++- .../api/feature/def/BossBarFeature.java | 188 ++++++++++-------- .../gamecore/api/player/GamePlayer.java | 4 +- .../gamecore/api/player/GamePlayerImpl.java | 21 +- .../api/player/PreGamePlayerImpl.java | 4 +- .../src/main/resources/SkyWarsGame_de.json | 3 +- 6 files changed, 167 insertions(+), 100 deletions(-) diff --git a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java index b816759..b2f4912 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java +++ b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarCounterFeature.java @@ -2,6 +2,7 @@ import com.google.gson.annotations.Expose; import com.google.inject.Inject; +import de.drolpi.gamecore.api.counter.Counter; import de.drolpi.gamecore.api.game.Game; import de.drolpi.gamecore.api.phase.Phase; import net.kyori.adventure.bossbar.BossBar; @@ -12,8 +13,10 @@ public class BossBarCounterFeature extends AbstractCounterProgressFeature { private final BossBarFeature bossBarFeature; - private final BossBar bossBar; + @Expose + private final String replaceBossBarId = "counter"; + private final Component component; @Expose private BossBar.Color color = BossBar.Color.RED; @Expose @@ -23,8 +26,7 @@ public class BossBarCounterFeature extends AbstractCounterProgressFeature { public BossBarCounterFeature(Game game, Phase phase) { super(game, phase); this.bossBarFeature = phase.feature(BossBarFeature.class); - this.bossBar = BossBar.bossBar(Component.translatable(phase.key() + "counterbossbar_name"), 0.0F, color, overlay); - this.bossBarFeature.addBossBar(this.bossBar); + this.component = Component.translatable(phase.key() + "counter_bossbar"); } @Override @@ -32,9 +34,44 @@ public void enable() { super.enable(); } + @Override + protected void start(Counter counter) { + super.start(counter); + if (!this.bossBarFeature.isRegistered(replaceBossBarId)) { + this.bossBarFeature.register(this.replaceBossBarId, this.color, this.overlay); + } + this.bossBarFeature.setColor(this.replaceBossBarId, this.color); + this.bossBarFeature.setOverlay(this.replaceBossBarId, this.overlay); + } + + @Override + protected void cancel(Counter counter) { + this.resetName(); + } + + @Override + protected void finish(Counter counter) { + this.resetName(); + } + + private void resetName() { + this.bossBarFeature.resetName(this.replaceBossBarId); + } + + @Override + protected void tick(Counter counter) { + this.set(null, counter.currentCount(), super.progress(counter)); + } + @Override protected void set(Player player, long count, float progress) { - this.bossBarFeature.setProgress(this.bossBar, progress); - this.bossBarFeature.setResolvers(this.bossBar, Placeholder.component("count", Component.text(count))); + if (!this.bossBarFeature.isRegistered(replaceBossBarId)) { + this.bossBarFeature.register(this.replaceBossBarId, this.color, this.overlay); + this.bossBarFeature.setColor(this.replaceBossBarId, this.color); + this.bossBarFeature.setOverlay(this.replaceBossBarId, this.overlay); + } + this.bossBarFeature.setName(this.replaceBossBarId, component); + this.bossBarFeature.setResolvers(this.replaceBossBarId, Placeholder.component("count", Component.text(count))); + this.bossBarFeature.setProgress(this.replaceBossBarId, progress); } } diff --git a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java index 0bb4bf5..7f95059 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java +++ b/core/src/main/java/de/drolpi/gamecore/api/feature/def/BossBarFeature.java @@ -13,151 +13,181 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.event.EventHandler; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class BossBarFeature extends AbstractFeature { private final Game game; - private final Map bossBars; - private final Component defaultName; + @Expose + private final List bossBarInfos; + + private final Map bossBars; + + private final Phase phase; + @Inject public BossBarFeature(Game game, Phase phase) { this.game = game; - this.defaultName = Component.translatable(phase.key() + "bossbar_name"); this.bossBars = new HashMap<>(); + this.bossBarInfos = new ArrayList<>(); + this.phase = phase; } @Override public void enable() { - for (GamePlayer gamePlayer : this.game.players()) { - for (BossBarInfo info : bossBars.values()) { - gamePlayer.showBossBar(info.bossbar, info.resolvers); - } + for (BossBarInfo info : this.bossBarInfos) { + this.showForAll(info.id); } } @Override public void disable() { - for (GamePlayer gamePlayer : this.game.players()) { - for (BossBar bossBar : bossBars.keySet()) { - gamePlayer.hideBossBar(bossBar); - } + for (BossBarInfo info : this.bossBarInfos) { + this.hideForAll(info.id); } } + public void register(String id, BossBar.Color color, BossBar.Overlay overlay) { + this.bossBarInfos.add(new BossBarInfo(id, color, overlay)); + this.generateContainer(id); + this.showForAll(id); + } + @EventHandler public void handle(GameJoinEvent event) { - for (BossBarInfo info : bossBars.values()) { - event.gamePlayer().showBossBar(info.bossbar, info.resolvers); + for (BossBarInfo info : this.bossBarInfos) { + BossBarContainer container = this.getContainer(info.id); + if (container.hidden) + continue; + event.gamePlayer().showBossBar(info.id, container.bossBar, container.resolvers); } } @EventHandler public void handle(GamePostLeaveEvent event) { - for (BossBar bossBar : bossBars.keySet()) { - event.gamePlayer().hideBossBar(bossBar); - } - } - public BossBar.Color color(BossBar bossBar) { - return this.bossBars.get(bossBar).color; } - public BossBar.Overlay overlay(BossBar bossBar) { - return this.bossBars.get(bossBar).overlay; + private void showForAll(String id) { + BossBarContainer container = this.getContainer(id); + for (GamePlayer gamePlayer : this.game.players()) { + gamePlayer.showBossBar(id, container.bossBar); + } } - public void setProgress(BossBar bossBar, float progress) { - this.bossBars.get(bossBar).progress(progress); + private void hideForAll(String id) { + BossBarContainer container = this.getContainer(id); + for (GamePlayer gamePlayer : this.game.players()) { + gamePlayer.hideBossBar(id, container.bossBar); + } } - public void setName(BossBar bossBar, Component name) { - this.bossBars.get(bossBar).name(name); + public boolean hidden(String id) { + return this.getContainer(id).hidden; } - public void resetName(BossBar bossBar) { - this.bossBars.get(bossBar).name(this.defaultName); + public void setHidden(String id, boolean hidden) { + this.getContainer(id).hidden = hidden; + if (hidden) { + hideForAll(id); + return; + } + showForAll(id); } - public void setColor(BossBar bossBar, BossBar.Color color) { - this.bossBars.get(bossBar).color(color); + public boolean isRegistered(String id) { + return this.getInfo(id) != null; } - public void setResolvers(BossBar bossbar, TagResolver... resolvers) { - this.bossBars.get(bossbar).resolvers = resolvers; + public BossBar.Color color(String id) { + return this.getInfo(id).color; } - public void setOverlay(BossBar bossBar, BossBar.Overlay overlay) { - this.bossBars.get(bossBar).overlay(overlay); + public BossBar.Overlay overlay(String id) { + return this.getInfo(id).overlay; } - public void addBossBar(BossBar bossBar) { - this.bossBars.put(bossBar, new BossBarInfo(bossBar.color(), bossBar.overlay(), bossBar)); + public float progress(String id) { + return this.getContainer(id).bossBar.progress(); } - public void removeBossBar(BossBar bossBar) { - this.bossBars.remove(bossBar); + public void setProgress(String id, float progress) { + this.getContainer(id).bossBar.progress(progress); } - public static class BossBarInfo { + public void setColor(String id, BossBar.Color color) { + this.getInfo(id).color = color; + this.getContainer(id).bossBar.color(color); + } - @Expose - private BossBar.Color color; - @Expose - private BossBar.Overlay overlay; - @Expose - private TagResolver[] resolvers; + public void setOverlay(String id, BossBar.Overlay overlay) { + this.getInfo(id).overlay = overlay; + this.getContainer(id).bossBar.overlay(overlay); + } - private final BossBar bossbar; + public void setName(String id, Component name) { + this.getContainer(id).bossBar.name(name); + } - public BossBarInfo(BossBar.Color color, BossBar.Overlay overlay, BossBar bossbar) { - this.color = color; - this.overlay = overlay; - this.bossbar = bossbar; - this.resolvers = new TagResolver[]{}; - } + public void setResolvers(String id, TagResolver... resolvers) { + this.getContainer(id).resolvers = resolvers; + } - public BossBar.Color color() { - return this.color; - } + public void resetName(String id) { + this.getContainer(id).bossBar.name(BossBarContainer.name(this.phase.key(), id)); + } - public BossBar.Overlay overlay() { - return this.overlay; - } + public BossBarInfo getInfo(String id) { + Optional bossBarInfo = this.bossBarInfos.stream().filter((info) -> info.id.equals(id)).findFirst(); + return bossBarInfo.orElse(null); + } - public BossBar bossbar() { - return this.bossbar; - } + private BossBarContainer getContainer(String id) { + BossBarContainer container = this.bossBars.get(id); + if (container != null) return container; + return this.generateContainer(id); - public TagResolver[] resolvers() { - return this.resolvers; - } + } - public Component name() { - return this.bossbar.name(); - } + private BossBarContainer generateContainer(String id) { + System.out.println("Generating container"); + BossBarInfo info = this.getInfo(id); + System.out.println("for info: "+info); + BossBarContainer container = new BossBarContainer(info, this.phase.key()); + this.bossBars.put(id, container); + return container; + } - public void progress(float progress) { - this.bossbar.progress(progress); - } + private static class BossBarInfo { - public void name(Component name) { - this.bossbar.name(name); - } + @Expose + private final String id; + @Expose + private BossBar.Color color; + @Expose + private BossBar.Overlay overlay; - public void color(BossBar.Color color) { + private BossBarInfo(String id, BossBar.Color color, BossBar.Overlay overlay) { + this.id = id; this.color = color; + this.overlay = overlay; } + } + + private static class BossBarContainer { + + private final BossBar bossBar; + private TagResolver[] resolvers; + private boolean hidden = false; - public void overlay(BossBar.Overlay overlay) { - this.overlay = overlay; + private BossBarContainer(BossBarInfo info, String phaseId) { + this.bossBar = BossBar.bossBar(BossBarContainer.name(phaseId, info.id), 1.0F, info.color, info.overlay); } - public void resolvers(TagResolver[] resolvers) { - this.resolvers = resolvers; + private static Component name(String phaseId, String bossBarId) { + return Component.translatable(phaseId + "bossbar." + bossBarId); } } } diff --git a/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayer.java b/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayer.java index c6a2fb8..0b7d9bc 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayer.java +++ b/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayer.java @@ -19,9 +19,9 @@ public interface GamePlayer { void showTitle(Title title, TagResolver... resolvers); - void showBossBar(BossBar bossBar, TagResolver... resolvers); + void showBossBar(String bossBarId, BossBar headBossBar, TagResolver... resolvers); - void hideBossBar(BossBar bossBar); + void hideBossBar(String bossBarId, BossBar headBossBar); void playSound(Sound sound); } diff --git a/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayerImpl.java b/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayerImpl.java index 4fdc026..f677bcc 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayerImpl.java +++ b/core/src/main/java/de/drolpi/gamecore/api/player/GamePlayerImpl.java @@ -1,6 +1,5 @@ package de.drolpi.gamecore.api.player; -import de.drolpi.gamecore.api.feature.def.BossBarFeature; import de.drolpi.gamecore.api.game.AbstractGame; import de.drolpi.gamecore.api.game.GameControllerImpl; import de.drolpi.gamecore.components.localization.adventure.MiniMessageComponentRenderer; @@ -20,7 +19,7 @@ final class GamePlayerImpl extends PreGamePlayerImpl implements GamePlayer { private final Locale locale = Locale.GERMAN; private final GameControllerImpl gameController; - private final Map shownBossBars; + private final Map shownBossBars; GamePlayerImpl(Player player, GameControllerImpl gameController) { super(player.getUniqueId()); @@ -69,7 +68,7 @@ public void showTitle(Title title, TagResolver... resolvers) { } @Override - public void showBossBar(BossBar bossBar, TagResolver... resolvers) { + public void showBossBar(String bossBarId, BossBar headBossBar, TagResolver... resolvers) { Set game = this.gameController.abstractGames(this, true); Optional optional = game.stream().findFirst(); if (optional.isEmpty()) { @@ -77,20 +76,20 @@ public void showBossBar(BossBar bossBar, TagResolver... resolvers) { } MiniMessageComponentRenderer renderer = optional.get().renderer(); - Component name = renderer.render(bossBar.name(), this.locale, resolvers); - BossBar result = BossBar.bossBar(name, bossBar.progress(), bossBar.color(), bossBar.overlay()); + Component name = renderer.render(headBossBar.name(), this.locale, resolvers); + BossBar result = BossBar.bossBar(name, headBossBar.progress(), headBossBar.color(), headBossBar.overlay()); BossBarCopyListener copyListener = new BossBarCopyListener(result, renderer, locale, resolvers); - bossBar.addListener(copyListener); - this.shownBossBars.put(bossBar, copyListener); + headBossBar.addListener(copyListener); + this.shownBossBars.put(bossBarId, copyListener); this.player.showBossBar(result); } @Override - public void hideBossBar(BossBar bossBar) { - BossBarCopyListener listener = this.shownBossBars.get(bossBar); + public void hideBossBar(String bossBarId, BossBar headBossBar) { + BossBarCopyListener listener = this.shownBossBars.get(bossBarId); if (listener == null) return; - bossBar.removeListener(listener); - this.shownBossBars.remove(bossBar); + headBossBar.removeListener(listener); + this.shownBossBars.remove(bossBarId); this.player.hideBossBar(listener.copy()); } diff --git a/core/src/main/java/de/drolpi/gamecore/api/player/PreGamePlayerImpl.java b/core/src/main/java/de/drolpi/gamecore/api/player/PreGamePlayerImpl.java index 8ba22ca..e1c8cf0 100644 --- a/core/src/main/java/de/drolpi/gamecore/api/player/PreGamePlayerImpl.java +++ b/core/src/main/java/de/drolpi/gamecore/api/player/PreGamePlayerImpl.java @@ -38,12 +38,12 @@ public void showTitle(Title title, TagResolver... resolvers) { } @Override - public void showBossBar(BossBar bossBar, TagResolver... resolvers) { + public void showBossBar(String bossBarId, BossBar headBossBar, TagResolver... resolvers) { throw new RuntimeException(); } @Override - public void hideBossBar(BossBar bossBar) { + public void hideBossBar(String bossBarId, BossBar headBossBar) { throw new RuntimeException(); } diff --git a/game-skywars/src/main/resources/SkyWarsGame_de.json b/game-skywars/src/main/resources/SkyWarsGame_de.json index 3bbb06a..2a5119a 100644 --- a/game-skywars/src/main/resources/SkyWarsGame_de.json +++ b/game-skywars/src/main/resources/SkyWarsGame_de.json @@ -16,7 +16,8 @@ "starting.counter_finish_subtitle": "", "protection.counter_tick_message": "Die Schutzzeit endet in ", "protection.counter_finish_message": "Die Schutzzeit ist nun vorbei", - "protection.counterbossbar_name": "Schutzzeit", + "protection.bossbar.counter": "Der Schutzzeit-Countdown läuft noch nicht.", + "protection.counter_bossbar": "Die Schutzzeit dauert noch Sekunden", "ingame.counter_tick_message": "Das Spiel endet in ", "ingame.counter_finish_message": "Das Spiel endet nun", "ingame.death_private": "Du bist gestorben",