From 1b448e749e4f410cb2a8c850472c9a6578541117 Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 22 Oct 2024 16:34:23 +0200 Subject: [PATCH] fixed leaderboard with new PointsWinScore class --- .../game/stateless/types/tetris/Tetris.java | 6 +-- .../types/tetris/game/TetrisGame.java | 4 ++ .../minigames/score/FirstWinsScore.java | 10 +++++ .../minigames/score/LastWinsScore.java | 12 +++++- .../mhsl/minenet/minigames/score/NoScore.java | 10 +++++ .../minigames/score/PointsWinScore.java | 40 +++++++++++++++++++ .../mhsl/minenet/minigames/score/Score.java | 6 +++ .../mhsl/minenet/minigames/util/MapUtil.java | 20 ++++++++++ 8 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 src/main/java/eu/mhsl/minenet/minigames/score/PointsWinScore.java create mode 100644 src/main/java/eu/mhsl/minenet/minigames/util/MapUtil.java diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java index 5ccef02..adfab17 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java @@ -4,7 +4,7 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; import eu.mhsl.minenet.minigames.instance.game.stateless.types.tetris.game.TetrisGame; import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.game.stateless.types.tetris.game.Tetromino; -import eu.mhsl.minenet.minigames.score.LastWinsScore; +import eu.mhsl.minenet.minigames.score.PointsWinScore; import eu.mhsl.minenet.minigames.world.generator.terrain.CircularPlateTerrainGenerator; import net.kyori.adventure.text.Component; import net.minestom.server.coordinate.Pos; @@ -24,7 +24,7 @@ class Tetris extends StatelessGame { private final Map tetrisGames = new HashMap<>(); public Tetris() { - super(Dimension.THE_END.key, "Tetris", new LastWinsScore()); + super(Dimension.THE_END.key, "Tetris", new PointsWinScore()); this.setGenerator(new CircularPlateTerrainGenerator(30).setPlateHeight(0)); eventNode() @@ -108,7 +108,7 @@ class Tetris extends StatelessGame { if(tetrisGame == null) return; if(tetrisGame.lost && event.getPlayer().getGameMode() != GameMode.SPECTATOR) { event.getPlayer().setGameMode(GameMode.SPECTATOR); - getScore().insertResult(event.getPlayer()); + getScore().insertResult(event.getPlayer(), tetrisGame.getScore()); tetrisGame.sidebar.removeViewer(event.getPlayer()); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java index 6fecba9..c32c4d4 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java @@ -103,6 +103,10 @@ public class TetrisGame { } } + public int getScore() { + return this.score; + } + private boolean rotate(boolean clockwise) { if(this.lost || this.paused) return false; diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java index bc505dd..9595e6f 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java @@ -8,11 +8,21 @@ import java.time.Duration; import java.util.Set; public class FirstWinsScore extends Score { + @Override + public void insertResultImplementation(Set p, int points) { + + } + @Override public void insertResultImplementation(Set p) { getScores().add(p); } + @Override + public void insertResult(Player p, int points) { + + } + @Override protected TranslatableMessage scoreMessage() { return new TitleMessage(Duration.ofMillis(1000), Duration.ofSeconds(1)).appendTranslated("score#finish"); diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java index c2bae16..c4a40b3 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java @@ -8,9 +8,19 @@ import java.time.Duration; import java.util.Set; public class LastWinsScore extends Score { + @Override + public void insertResultImplementation(Set p, int points) { + + } + @Override public void insertResultImplementation(Set p) { - getScores().add(0, p); + getScores().addFirst(p); + } + + @Override + public void insertResult(Player p, int points) { + } @Override diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java index 91478d5..232d874 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java @@ -10,11 +10,21 @@ public class NoScore extends Score { protected void checkGameEnd() { } + @Override + public void insertResultImplementation(Set p, int points) { + + } + @Override public void insertResultImplementation(Set p) { } + @Override + public void insertResult(Player p, int points) { + + } + @Override protected TranslatableMessage scoreMessage() { return null; diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/PointsWinScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/PointsWinScore.java new file mode 100644 index 0000000..5164e65 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/score/PointsWinScore.java @@ -0,0 +1,40 @@ +package eu.mhsl.minenet.minigames.score; + +import eu.mhsl.minenet.minigames.message.TranslatableMessage; +import eu.mhsl.minenet.minigames.message.type.TitleMessage; +import eu.mhsl.minenet.minigames.util.MapUtil; +import net.minestom.server.entity.Player; +import org.apache.commons.lang3.NotImplementedException; + +import java.time.Duration; +import java.util.*; + +public class PointsWinScore extends Score { + private Map, Integer> scoreOrder = new HashMap<>(); + + @Override + public void insertResultImplementation(Set p, int points) { + this.scoreOrder.put(p, points); + this.scoreOrder = MapUtil.sortByValue(this.scoreOrder); + getScores().clear(); + this.scoreOrder.forEach((player, integer) -> getScores().addFirst(player)); + } + + @Override + protected void insertResultImplementation(Set p) { + throw new NotImplementedException("PointsWinScore does not support adding entries without points"); + } + + @Override + public void insertResult(Player p, int points) { + if(hasResult(p)) return; + this.scoreMessage().send(p); + this.insertResultImplementation(Set.of(p), points); + this.checkGameEnd(); + } + + @Override + protected TranslatableMessage scoreMessage() { + return new TitleMessage(Duration.ofMillis(1000), Duration.ofSeconds(1)).appendTranslated("score#death"); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/Score.java b/src/main/java/eu/mhsl/minenet/minigames/score/Score.java index 92d7385..38b54ae 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/Score.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/Score.java @@ -45,7 +45,13 @@ public abstract class Score { setDone(); } } + + public abstract void insertResultImplementation(Set p, int points); + protected abstract void insertResultImplementation(Set p); + + public abstract void insertResult(Player p, int points); + protected abstract TranslatableMessage scoreMessage(); public void insertResult(Player p) { diff --git a/src/main/java/eu/mhsl/minenet/minigames/util/MapUtil.java b/src/main/java/eu/mhsl/minenet/minigames/util/MapUtil.java new file mode 100644 index 0000000..ac5506b --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/util/MapUtil.java @@ -0,0 +1,20 @@ +package eu.mhsl.minenet.minigames.util; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class MapUtil { + public static > Map sortByValue(Map map) { + List> list = new ArrayList<>(map.entrySet()); + list.sort(Map.Entry.comparingByValue()); + + Map result = new LinkedHashMap<>(); + for (Map.Entry entry : list) { + result.put(entry.getKey(), entry.getValue()); + } + + return result; + } +} \ No newline at end of file