SteamWar/BungeeCore
Archiviert
13
2

Ranked #333

Zusammengeführt
Lixfel hat 18 Commits von Ranked nach master 2022-04-11 08:23:14 +02:00 zusammengeführt
Nur Änderungen aus Commit 350ac8b66f werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -24,18 +24,16 @@ import de.steamwar.bungeecore.ArenaMode;
import de.steamwar.bungeecore.comms.SpigotHandler;
import de.steamwar.bungeecore.comms.packets.FightEndsPacket;
import de.steamwar.bungeecore.sql.*;
import lombok.RequiredArgsConstructor;
import net.md_5.bungee.api.config.ServerInfo;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
public class FightEndsHandler implements SpigotHandler {
private Map<String, List<Game>> gameModeGames = new HashMap<>();
private int K = 20;
private long defaultFightRange = 1000 /* Milliseconds */ * 60 /* Seconds */ * 15L /* Minutes */;
private Map<String, Long> fightRanges = new HashMap<>();
@ -82,8 +80,12 @@ public class FightEndsHandler implements SpigotHandler {
}
}
if (teamComboExistedAlready(fightEndsPacket.getBluePlayers(), fightEndsPacket.getRedPlayers(), fightEndsPacket.getGameMode())) {
return;
try {
if (teamComboExistedAlready(fightEndsPacket.getBluePlayers(), fightEndsPacket.getRedPlayers(), fightEndsPacket.getGameMode())) {
return;
}
} finally {
gameModeGames.computeIfAbsent(fightEndsPacket.getGameMode(), s -> new ArrayList<>()).add(new Game(fightEndsPacket.getBluePlayers(), fightEndsPacket.getRedPlayers()));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Da hier häufig Einträge zu Beginn der Liste entfernt werden, wäre eine LinkedList wahrscheinlich die bessere Datenstruktur

Da hier häufig Einträge zu Beginn der Liste entfernt werden, wäre eine LinkedList wahrscheinlich die bessere Datenstruktur
Veraltet
Review

Das removeIf sollte ich dann aber auch noch einmal optimieren, weil ich ja die Reihenfolge kenne. Und damit nur immer über den Anfang der List drüber gehen muss.

Das removeIf sollte ich dann aber auch noch einmal optimieren, weil ich ja die Reihenfolge kenne. Und damit nur immer über den Anfang der List drüber gehen muss.
}
int blueSchemElo = SchemElo.getElo(fightEndsPacket.getBlueSchem());
@ -118,28 +120,27 @@ public class FightEndsHandler implements SpigotHandler {
}
private boolean teamComboExistedAlready(List<Integer> bluePlayers, List<Integer> redPlayers, String gameMode) {
long time = Timestamp.from(Instant.now()).getTime() - fightRanges.getOrDefault(gameMode, defaultFightRange);
int page = 0;
do {
List<Fight> fightsPage = Fight.getPage(page, 32);
if (fightsPage.isEmpty()) {
return false;
}
for (Fight fight : fightsPage) {
if (!gameMode.equals(fight.getGameMode().getSchemType())) continue;
if (fight.getStartTime().getTime() < time) return false;
if (fight.getBluePlayers().stream()
.map(FightPlayer::getUserID)
.collect(Collectors.toList())
.containsAll(bluePlayers)
&& fight.getRedPlayers().stream()
.map(FightPlayer::getUserID)
.collect(Collectors.toList())
.containsAll(redPlayers)) {
return true;
}
}
page++;
} while (true);
if (!gameModeGames.containsKey(gameMode)) {
return false;
Lixfel markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Du dürftest hier möglicherweise (Concurrency) auch den eigenen Fight zurückbekommen...

Du dürftest hier möglicherweise (Concurrency) auch den eigenen Fight zurückbekommen...
Veraltet
Review

Wie kann ich das verhindern bzw rausfiltern?

Wie kann ich das verhindern bzw rausfiltern?
}
List<Game> games = gameModeGames.get(gameMode);
long lifetime = fightRanges.getOrDefault(gameMode, defaultFightRange);
games.removeIf(game -> game.livedMillis() > lifetime);
return games.stream().anyMatch(game -> game.isSame(bluePlayers, redPlayers));
}
@RequiredArgsConstructor
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Hier bitte stattdessen verunden.

Hier bitte stattdessen verunden.
private static class Game {
private long time = System.currentTimeMillis();
private final List<Integer> bluePlayers;
private final List<Integer> redPlayers;
public long livedMillis() {
return System.currentTimeMillis() - time;
}
public boolean isSame(List<Integer> bluePlayers, List<Integer> redPlayers) {
return bluePlayers.containsAll(this.bluePlayers) && redPlayers.containsAll(this.redPlayers);
}
}
}