diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBarSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBarSetting.java index 23214ad..e264c09 100644 --- a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBarSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBarSetting.java @@ -19,7 +19,8 @@ public class InfoBarSetting extends MultiBoolSetting infoBars = List.of( new TpsBar(), new MsptBar(), - new PlayerCounterBar() + new PlayerCounterBar(), + new TpsMsptPlayerCounterBar() ); public void showAllEnabled(Player player) { @@ -24,6 +26,7 @@ public class InfoBars extends Appliance { this.setVisible(player, MsptBar.name, config.mspt()); this.setVisible(player, PlayerCounterBar.name, config.playerCounter()); this.setVisible(player, TpsBar.name, config.tps()); + this.setVisible(player, TpsMsptPlayerCounterBar.name, config.tpsMsptPlayerCounter()); } public void setVisible(Player player, String bar, boolean visible) { diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/TpsMsptPlayerCounterBar.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/TpsMsptPlayerCounterBar.java new file mode 100644 index 0000000..962a066 --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/TpsMsptPlayerCounterBar.java @@ -0,0 +1,103 @@ +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.bars; + +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.Bar; +import eu.mhsl.craftattack.spawn.common.appliances.tooling.playerlimit.PlayerLimit; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.util.statistics.ServerMonitor; +import eu.mhsl.craftattack.spawn.core.util.text.ColorUtil; +import net.kyori.adventure.bossbar.BossBar; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Bukkit; + +import java.time.Duration; + +public class TpsMsptPlayerCounterBar extends Bar { + public static String name = "serverStats"; + + @Override + protected Duration refresh() { + return Duration.ofSeconds(3); + } + + @Override + protected String name() { + return name; + } + + @Override + protected Component title() { + float tps = this.currentTps(); + float mspt = this.currentMspt(); + int players = this.currentPlayerCount(); + + Component separator = Component.text(" | ", NamedTextColor.DARK_GRAY); + TextColor color = ColorUtil.mapGreenToRed(players, 0, this.getMaxPlayerCount(), true); + + return Component.text() + .append(Component.text("TPS: ", NamedTextColor.GRAY)) + .append(Component.text(String.format("%.2f", tps), ColorUtil.tpsColor(tps))) + .append(separator) + .append(Component.text("MSPT: ", NamedTextColor.GRAY)) + .append(Component.text(String.format("%.2f", mspt), ColorUtil.msptColor(mspt))) + .append(separator) + .append(Component.text("Spieler: ", NamedTextColor.GRAY)) + .append(Component.text(players, color)) + .build(); + } + + @Override + protected float progress() { + return Math.clamp(this.currentTps() / 20f, 0f, 1f); + } + + @Override + protected BossBar.Color color() { + int severity = Math.max( + this.tpsSeverity(), + Math.max(this.msptSeverity(), this.playerSeverity()) + ); + + return switch (severity) { + case 2 -> BossBar.Color.RED; + case 1 -> BossBar.Color.YELLOW; + default -> BossBar.Color.GREEN; + }; + } + + @Override + protected BossBar.Overlay overlay() { + return BossBar.Overlay.PROGRESS; + } + + private int tpsSeverity() { + float tps = this.currentTps(); + return tps >= 18 ? 0 : tps >= 15 ? 1 : 2; + } + + private int msptSeverity() { + return this.currentMspt() <= 50 ? 0 : 2; + } + + private int playerSeverity() { + int freeSlots = this.getMaxPlayerCount() - this.currentPlayerCount(); + return freeSlots <= 0 ? 2 : freeSlots < 5 ? 1 : 0; + } + + private float currentTps() { + return (float) Bukkit.getTPS()[0]; + } + + private float currentMspt() { + return ServerMonitor.getServerMSPT(); + } + + private int currentPlayerCount() { + return Bukkit.getOnlinePlayers().size(); + } + + private int getMaxPlayerCount() { + return Main.instance().getAppliance(PlayerLimit.class).getLimit(); + } +}