develop-fairScoreboard #4

Open
Pupsi wants to merge 3 commits from develop-fairScoreboard into develop
4 changed files with 57 additions and 21 deletions

View File

@@ -3,12 +3,25 @@ package eu.mhsl.minenet.minigames.score;
import eu.mhsl.minenet.minigames.util.MapUtil; import eu.mhsl.minenet.minigames.util.MapUtil;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
public class LowestPointsWinScore extends PointsWinScore { public class LowestPointsWinScore extends PointsWinScore {
@Override @Override
protected void insertResultImplementation(Set<Player> p, int currentPoints) { protected void insertResultImplementation(Set<Player> p, int currentPoints) {
this.scoreOrder.put(p, currentPoints); Set<Player> combined = scoreOrder.entrySet().stream()
.filter(entrySet -> Objects.equals(entrySet.getValue(), currentPoints))
.map(Map.Entry::getKey)
.findFirst()
.orElseGet(() -> {
Set<Player> s = new HashSet<>();
scoreOrder.put(s, currentPoints);
return s;
});
combined.addAll(p);
this.scoreOrder = MapUtil.sortReversedByValue(this.scoreOrder); this.scoreOrder = MapUtil.sortReversedByValue(this.scoreOrder);
getScores().clear(); getScores().clear();
this.scoreOrder.forEach((player, integer) -> getScores().addFirst(player)); this.scoreOrder.forEach((player, integer) -> getScores().addFirst(player));

View File

@@ -16,7 +16,17 @@ public class PointsWinScore extends Score {
@Override @Override
protected void insertResultImplementation(Set<Player> p, int currentPoints) { protected void insertResultImplementation(Set<Player> p, int currentPoints) {
this.scoreOrder.put(p, currentPoints); Set<Player> combined = scoreOrder.entrySet().stream()
.filter(entrySet -> Objects.equals(entrySet.getValue(), currentPoints))
.map(Map.Entry::getKey)
.findFirst()
.orElseGet(() -> {
Set<Player> s = new HashSet<>();
scoreOrder.put(s, currentPoints);
return s;
});
combined.addAll(p);
this.scoreOrder = MapUtil.sortByValue(this.scoreOrder); this.scoreOrder = MapUtil.sortByValue(this.scoreOrder);
getScores().clear(); getScores().clear();
this.scoreOrder.forEach((player, integer) -> getScores().addFirst(player)); this.scoreOrder.forEach((player, integer) -> getScores().addFirst(player));
@@ -42,13 +52,12 @@ public class PointsWinScore extends Score {
.filter(player -> !player.getUsername().isBlank()) .filter(player -> !player.getUsername().isBlank())
.toList() .toList()
.isEmpty()) .isEmpty())
.map(players -> players .map(players -> players.stream()
.stream() .map(Player::getUsername)
.filter(player -> scoreOrder.get(Set.of(player)) != null) .sorted()
.map(player -> player.getUsername()+" : "+scoreOrder.get(Set.of(player)).toString()) .collect(Collectors.joining(", "))
.collect(Collectors.joining(", ")) + " : " + scoreOrder.get(players)
) ).toList()
.toList()
) )
.undent() .undent()
.newLine() .newLine()

View File

@@ -4,6 +4,7 @@ import eu.mhsl.minenet.minigames.score.Score;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
public class Tournament { public class Tournament {
private final List<Score> gameScores = new ArrayList<>(); private final List<Score> gameScores = new ArrayList<>();
@@ -43,9 +44,11 @@ public class Tournament {
public Rewards getRewards() { public Rewards getRewards() {
Map<UUID, Integer> itemCount = new HashMap<>(); Map<UUID, Integer> itemCount = new HashMap<>();
int count = 0; int count = 0;
for (Player player : getPlaces()) { for (Set<Player> players : getPlaces()) {
if(count >= this.rewardConfiguration.rewardCount().size()) break; if(count >= this.rewardConfiguration.rewardCount().size()) break;
itemCount.put(player.getUuid(), this.rewardConfiguration.rewardCount().get(count)); for(Player player : players) {
Pupsi marked this conversation as resolved
Review

warum kein lambda foreach?

warum kein lambda foreach?
Review

Weil count keine effectively final temp variable (oder so) ist

Weil count keine effectively final temp variable (oder so) ist
itemCount.put(player.getUuid(), this.rewardConfiguration.rewardCount().get(count));
}
count++; count++;
} }
@@ -53,18 +56,21 @@ public class Tournament {
this.memorialConfiguration.memorialMaterial().namespace().value(), this.memorialConfiguration.memorialMaterial().namespace().value(),
this.memorialConfiguration.memorialTitle(), this.memorialConfiguration.memorialTitle(),
this.memorialConfiguration.memorialLore(), this.memorialConfiguration.memorialLore(),
getPlaces().stream().map(Player::getUuid).toList(), getGameScores().keySet().stream().map(Player::getUuid).toList(),
this.rewardConfiguration.item().namespace().value(), this.rewardConfiguration.item().namespace().value(),
itemCount itemCount
); );
} }
public List<Player> getPlaces() { public List<Set<Player>> getPlaces() {
List<Player> players = new ArrayList<>( List<Set<Player>> players = new ArrayList<>(
getGameScores().entrySet().stream() getGameScores().entrySet().stream()
.sorted(Map.Entry.comparingByValue()) .collect(
.map(Map.Entry::getKey) Collectors.groupingBy(
.toList() Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, Collectors.toSet())
)
).values()
); );
Collections.reverse(players); Collections.reverse(players);

View File

@@ -12,10 +12,12 @@ import net.minestom.server.entity.*;
import net.minestom.server.event.player.PlayerMoveEvent; import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.instance.anvil.AnvilLoader; import net.minestom.server.instance.anvil.AnvilLoader;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Set;
public class TournamentDisplay extends MineNetInstance implements Spawnable { public class TournamentDisplay extends MineNetInstance implements Spawnable {
private final List<Player> places; private final List<Set<Player>> places;
private final Tournament tournament; private final Tournament tournament;
private final Pos[] placePositions = new Pos[] { private final Pos[] placePositions = new Pos[] {
@@ -30,7 +32,7 @@ public class TournamentDisplay extends MineNetInstance implements Spawnable {
this.places = tournament.getPlaces(); this.places = tournament.getPlaces();
this.tournament = tournament; this.tournament = tournament;
this.places.forEach(player -> player.setGameMode(GameMode.ADVENTURE)); this.places.forEach(players -> players.forEach(player -> player.setGameMode(GameMode.ADVENTURE)));
eventNode().addListener(PlayerMoveEvent.class, playerMoveEvent -> { eventNode().addListener(PlayerMoveEvent.class, playerMoveEvent -> {
if(isOnDisplay(playerMoveEvent.getPlayer()) && !playerMoveEvent.getNewPosition().sameBlock(placePositions[getRankPosition(playerMoveEvent.getPlayer())])) { if(isOnDisplay(playerMoveEvent.getPlayer()) && !playerMoveEvent.getNewPosition().sameBlock(placePositions[getRankPosition(playerMoveEvent.getPlayer())])) {
@@ -45,7 +47,10 @@ public class TournamentDisplay extends MineNetInstance implements Spawnable {
} }
private int getRankPosition(Player player) { private int getRankPosition(Player player) {
return this.places.indexOf(player); for (int i = 0; i < places.size(); i++) {
if (places.get(i).contains(player)) return i;
}
return -1;
} }
@Override @Override
@@ -56,8 +61,11 @@ public class TournamentDisplay extends MineNetInstance implements Spawnable {
p.teleport(placePositions[getRankPosition(p)]); p.teleport(placePositions[getRankPosition(p)]);
} }
}); });
List<Player> players = this.places.stream()
.flatMap(s -> s.stream().sorted(Comparator.comparing(Player::getUsername)))
.toList();
new ChatMessage(Icon.STAR) new ChatMessage(Icon.STAR)
.numberedList(this.places.stream().map(player -> String.format("%s - %s Punkte", player.getUsername(), tournament.getGameScores().get(player))).toList()) .list(players.stream().map(player -> String.format("%d. %s - %s Punkte", this.getRankPosition(player)+1, player.getUsername(), tournament.getGameScores().get(player))).toList())
Pupsi marked this conversation as resolved Outdated

korrekte verwendung von datentypen im format (%d)

korrekte verwendung von datentypen im format (%d)
.send(p); .send(p);
return false; return false;
} }