fixed leaderboard with new PointsWinScore class

This commit is contained in:
Lars Neuhaus 2024-10-22 16:34:23 +02:00
parent 2799a40c58
commit 1b448e749e
8 changed files with 104 additions and 4 deletions

View File

@ -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<Player, TetrisGame> 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());
}
}

View File

@ -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;

View File

@ -8,11 +8,21 @@ import java.time.Duration;
import java.util.Set;
public class FirstWinsScore extends Score {
@Override
public void insertResultImplementation(Set<Player> p, int points) {
}
@Override
public void insertResultImplementation(Set<Player> 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");

View File

@ -8,9 +8,19 @@ import java.time.Duration;
import java.util.Set;
public class LastWinsScore extends Score {
@Override
public void insertResultImplementation(Set<Player> p, int points) {
}
@Override
public void insertResultImplementation(Set<Player> p) {
getScores().add(0, p);
getScores().addFirst(p);
}
@Override
public void insertResult(Player p, int points) {
}
@Override

View File

@ -10,11 +10,21 @@ public class NoScore extends Score {
protected void checkGameEnd() {
}
@Override
public void insertResultImplementation(Set<Player> p, int points) {
}
@Override
public void insertResultImplementation(Set<Player> p) {
}
@Override
public void insertResult(Player p, int points) {
}
@Override
protected TranslatableMessage scoreMessage() {
return null;

View File

@ -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<Set<Player>, Integer> scoreOrder = new HashMap<>();
@Override
public void insertResultImplementation(Set<Player> 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<Player> 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");
}
}

View File

@ -45,7 +45,13 @@ public abstract class Score {
setDone();
}
}
public abstract void insertResultImplementation(Set<Player> p, int points);
protected abstract void insertResultImplementation(Set<Player> p);
public abstract void insertResult(Player p, int points);
protected abstract TranslatableMessage scoreMessage();
public void insertResult(Player p) {

View File

@ -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 <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
list.sort(Map.Entry.comparingByValue());
Map<K, V> result = new LinkedHashMap<>();
for (Map.Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
}