fixed scoreboard order
This commit is contained in:
@@ -58,7 +58,7 @@ public class Deathrun extends Appliance implements Event, Scorable {
|
||||
@Override
|
||||
public void start(long durationSeconds) {
|
||||
this.durationSeconds = durationSeconds;
|
||||
Title title = Title.title(Component.text("Start"), Component.text("Erreiche die höchste x-Koordinate!"));
|
||||
Title title = Title.title(Component.text("Start"), Component.text("Laufe Richtung Osten! (positiv x)"));
|
||||
Bukkit.getOnlinePlayers().forEach(player -> player.showTitle(title));
|
||||
|
||||
World world = Bukkit.getWorlds().getFirst();
|
||||
|
||||
@@ -5,6 +5,7 @@ import eu.mhsl.craftattack.spawn.event.appliances.eventController.Scorable;
|
||||
import io.papermc.paper.scoreboard.numbers.NumberFormat;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.util.Ticks;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -37,64 +38,73 @@ public class EventScoreboardBuilder {
|
||||
}
|
||||
|
||||
public Scoreboard buildFor(Player p) {
|
||||
List<EventScoreEntry> scoreMap = this.playerScores;
|
||||
Scoreboard newScoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||
List<EventScoreEntry> scoreList = new ArrayList<>(this.playerScores);
|
||||
|
||||
Objective objective = newScoreboard.registerNewObjective(
|
||||
Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||
Objective objective = scoreboard.registerNewObjective(
|
||||
"event", "dummy",
|
||||
Component.text("Scoreboard %s".formatted(this.scorable.getScoreboardName()), NamedTextColor.DARK_PURPLE)
|
||||
Component.text(
|
||||
"Scoreboard %s".formatted(this.scorable.getScoreboardName()),
|
||||
NamedTextColor.GOLD, TextDecoration.BOLD
|
||||
)
|
||||
);
|
||||
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||
objective.numberFormat(NumberFormat.blank());
|
||||
|
||||
if(scoreMap.isEmpty()) return newScoreboard;
|
||||
UUID uuid = p.getUniqueId();
|
||||
scoreList.removeIf(e -> e.playerUuid().equals(uuid));
|
||||
scoreList.add(new EventScoreEntry(uuid, p.getName(), this.scorable.getScore(p)));
|
||||
|
||||
scoreMap.sort(this.scoreComparator);
|
||||
System.out.print(scoreMap);
|
||||
scoreList.sort(this.scoreComparator);
|
||||
|
||||
EventScoreEntry playerScoreEntry = scoreMap.stream()
|
||||
.filter(entry -> entry.playerUuid().equals(p.getUniqueId()))
|
||||
int size = scoreList.size();
|
||||
int playerIndex = IntStream.range(0, size)
|
||||
.filter(i -> scoreList.get(i).playerUuid().equals(uuid))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if(playerScoreEntry == null) {
|
||||
playerScoreEntry = new EventScoreEntry(p.getUniqueId(), p.getName(), this.scorable.getScore(p));
|
||||
scoreMap.add(playerScoreEntry);
|
||||
.orElse(0);
|
||||
|
||||
IntStream top = IntStream.range(0, Math.min(this.topPlaces, size));
|
||||
|
||||
int aroundStart = Math.max(0, playerIndex - this.aroundPlaces);
|
||||
int aroundEnd = Math.min(size, playerIndex + this.aroundPlaces + 1);
|
||||
IntStream around = IntStream.range(aroundStart, aroundEnd);
|
||||
|
||||
IntStream bottom = IntStream.range(Math.max(0, size - this.bottomPlaces), size);
|
||||
|
||||
int threshold = this.topPlaces + this.bottomPlaces + this.aroundPlaces * 2 + 1;
|
||||
|
||||
IntStream indices;
|
||||
if (size <= threshold) {
|
||||
indices = IntStream.range(0, size);
|
||||
} else if (playerIndex <= this.topPlaces + this.aroundPlaces) {
|
||||
indices = IntStream.concat(
|
||||
IntStream.range(0, Math.min(size, playerIndex + this.aroundPlaces + 1)),
|
||||
bottom
|
||||
);
|
||||
} else if (playerIndex >= size - this.bottomPlaces - this.aroundPlaces - 1) {
|
||||
indices = IntStream.concat(
|
||||
top,
|
||||
IntStream.range(Math.max(0, playerIndex - this.aroundPlaces), size)
|
||||
);
|
||||
} else {
|
||||
indices = IntStream.concat(IntStream.concat(top, around), bottom);
|
||||
}
|
||||
|
||||
int playerIndex = scoreMap.indexOf(playerScoreEntry);
|
||||
int[] display = indices.distinct().sorted().toArray();
|
||||
|
||||
IntStream topStream = IntStream.range(0, this.topPlaces);
|
||||
IntStream aroundStream = IntStream.range(playerIndex - this.aroundPlaces, playerIndex + this.aroundPlaces);
|
||||
IntStream bottomStream = IntStream.range(scoreMap.size() - this.bottomPlaces, scoreMap.size());
|
||||
for (int i = 0; i < display.length; i++) {
|
||||
int idx = display[i];
|
||||
EventScoreEntry entry = scoreList.get(idx);
|
||||
|
||||
if(playerIndex <= this.topPlaces + this.aroundPlaces) {
|
||||
aroundStream = IntStream.empty();
|
||||
topStream = IntStream.range(0, playerIndex + this.aroundPlaces);
|
||||
}
|
||||
if(playerIndex >= scoreMap.size() - this.bottomPlaces - this.aroundPlaces) {
|
||||
aroundStream = IntStream.empty();
|
||||
bottomStream = IntStream.range(playerIndex - this.aroundPlaces, scoreMap.size());
|
||||
}
|
||||
if(scoreMap.size() <= this.topPlaces + this.aroundPlaces * 2 + this.bottomPlaces + 2) {
|
||||
topStream = IntStream.range(0, scoreMap.size());
|
||||
aroundStream = IntStream.empty();
|
||||
bottomStream = IntStream.empty();
|
||||
String line = this.formattedLine(idx, entry.name(), entry.score());
|
||||
|
||||
objective.getScore(line).setScore(display.length - i);
|
||||
}
|
||||
|
||||
IntStream indices = IntStream.concat(
|
||||
IntStream.concat(topStream, aroundStream),
|
||||
bottomStream
|
||||
).distinct().sorted();
|
||||
|
||||
indices.forEach(place -> {
|
||||
EventScoreEntry entry = scoreMap.get(place);
|
||||
String line = this.formattedLine(place, entry.name(), entry.score());
|
||||
objective.getScore(line).setScore(place);
|
||||
});
|
||||
|
||||
return newScoreboard;
|
||||
return scoreboard;
|
||||
}
|
||||
|
||||
|
||||
public void startAutomaticUpdates() {
|
||||
this.scoreboardUpdateTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(
|
||||
Main.instance(),
|
||||
|
||||
Reference in New Issue
Block a user