Ranked #306
Keine Reviewer
Label
Kein Label
Bug
Codeverbesserung
Einsteiger Freundlich
Idee
In Arbeit
Neues Feature
Prio A
Security Breach
Überprüfung notwendig
Verbesserung
Zu Beobachten
Kein Meilenstein
Niemand zuständig
2 Beteiligte
Fällig am
Kein Fälligkeitsdatum gesetzt.
Abhängigkeiten
Keine Abhängigkeiten gesetzt.
Referenz: SteamWar/BungeeCore#306
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren
Keine Beschreibung angegeben.
Branch "Ranked" löschen
Das Löschen eines Branches ist permanent. Obwohl der Branch für eine kurze Zeit weiter existieren könnte, kann diese Aktion in den meisten Fällen NICHT rückgängig gemacht werden. Fortfahren?
@ -33,0 +41,4 @@
return;
}
double playerRatio = 1 - (Math.min(fightEndsPacket.getBluePlayers().size(), fightEndsPacket.getRedPlayers().size()) / (double )Math.max(fightEndsPacket.getBluePlayers().size(), fightEndsPacket.getRedPlayers().size()));
Diese Ratio-Berechnung finde ich komplexer als nötig, sollte sich einfacher formulieren lassen
Hast du eine Idee, ich wüsste nicht wie außer das ich das 1- rausnehmen kann
ratio = bluePlayerSize > redPlayerSize ? redPlayerSize / bluePlayerSize : bluePlayerSize / redPlayerSize
if ratio < 0.6 return;
@ -33,0 +46,4 @@
return;
}
int blueSchemOwner = SchemNode.getSchematicOwner(fightEndsPacket.getBlueSchem());
Statt schemOwner könntest du dir hier direkt bluePublic etc. speichern (weil das brauchst du dann ja mehrfach unten)
@ -33,0 +49,4 @@
int blueSchemOwner = SchemNode.getSchematicOwner(fightEndsPacket.getBlueSchem());
int redSchemOwner = SchemNode.getSchematicOwner(fightEndsPacket.getRedSchem());
if ((blueSchemOwner == 0 && redSchemOwner != 0) || (blueSchemOwner != 0 && redSchemOwner == 0)) {
Das müsste ein XOR ^ sein
@ -33,0 +76,4 @@
int playerElo = UserElo.getElo(bluePlayer, fightEndsPacket.getGameMode()).orElse(1000);
UserElo.setElo(bluePlayer, fightEndsPacket.getGameMode(), (int) Math.round(playerElo + K * (blueResult - blueWinExpectation)));
}
for (int redPlayer : fightEndsPacket.getRedPlayers()) {
Du hast hier sehr viel Codedopplung drin, würde mir eine teamunabhängige Abstrahierung wünschen.
@ -228,6 +227,35 @@ public class ChatListener extends BasicListener {
BungeeCore.log(sender.getServer().getInfo(), msg);
}
private static String getEmblem(SteamwarUser user) {
Das hier bei jeder einzelnen Chatnachricht durchzuführen ist sehr wahrscheinlich performanceproblematisch. Besser wäre hier ein Cache und ich würde die Emblemberechnung eher ungerne hier im ChatListener drin haben wollen, eher in UserElo.
Ich muss aber alle gecached embleme killen, wenn es einen neuen max gibt und für dich wenn du eine neue elo erhälst richtig?
Es reicht auch, wenn es nach einer Stunde angepasst wird...
Würde ich lieber nicht machen, ich würde gerne sie so schnell geupdated wie möglich haben.
Dann kannst du die Embleme dennoch cachen. Und ob sie so schnell geupdatet werden wie möglich oder nicht, dazwischen liegen bis zu 3 Kämpfe (in etwa).... Es ist also ziemlich egal und dafür ein heidenaufwand, das Echtzeit zu halten.
Ich sehe jetzt nicht unbedingt so viel aufwand darin, guck dir gleich einfach mal meine Lösung an und mecker dann gerne nochmal rum, dann schmeiße ich es gerne weiter raus.
@ -231,0 +247,4 @@
}
private static String getEmblem(int maxEloOfPlayer, int maxEloOfGameMode) {
if (maxEloOfPlayer > maxEloOfGameMode * 0.99) return "§5❂ ";
Würde ohne Space bevorzugen (Platz), muss man aber mal sehen, wie es aussieht
Ich würde persönlich gerne ein leerzeichen zwischen dem Emblem und dem Rang haben, ich glaube das entzerrt das ganze ein wenig, weil so ist es halt direkt daran, was auch nicht unbedingt perfekt ist.
@ -0,0 +24,4 @@
private static final Statement elo = new Statement("SELECT SchemElo FROM Elo WHERE SchemID = ? AND Season = ?");
private static final Statement setElo = new Statement("UPDATE SchemElo SET Elo = ? WHERE Season = ? AND SchemID = ?");
// private static final Statement place = new Statement("SELECT COUNT(*) AS Place FROM SchemElo WHERE Elo > ? AND Season = ?");
Wird vorrausichtlich Ingame nie benötigt (MC Chat ist nicht unbedingt praktisch zum Anzeigen von Bestenlisten)
@ -0,0 +19,4 @@
package de.steamwar.bungeecore.sql;
public class SchemNode {
Es gibt schon eine SchematicNode-Klasse
@ -32,1 +32,4 @@
public static String getSeasonStart() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) / 3 * 3 + 1) + "-1";
Das 2022-1-1 Formatting frisst die DB?
Scheint so.
@ -0,0 +31,4 @@
}
private static Integer cachedSeason = null;
private static final Map<Key, Optional<Integer>> userEloCache = new HashMap<>();
Da lieber eine Map<Map<>>, das bläst sich dann weniger auf.
Wie meinst du das genau?
HashMaps brauchen zur Kollisionsvermeidung immer Freiraum. Je kleiner die HashMaps bleiben, desto besser.
Würdest du dann GameMode UserId oder UserId GameMode als reihenfolge wählen?
Definitiv Map<GameMode, Map<User, >>
@ -0,0 +47,4 @@
private static final Statement maxElo = new Statement("SELECT MAX(Elo) AS MaxElo FROM UserElo WHERE Season = ? AND GameMode = ?");
private static final Statement fightsOfSeason = new Statement("SELECT COUNT(*) AS Fights FROM FightPlayer INNER JOIN Fight F on FightPlayer.FightID = F.FightID WHERE UserID = ? AND GameMode = ? AND UNIX_TIMESTAMP(StartTime) + Duration >= UNIX_TIMESTAMP(?)");
private static void clearCacheIfNeeded(int season) {
Du clearst den Cache eh schon stündlich, das ist häufig genug auch für Seasonänderungen.
@ -0,0 +58,4 @@
}
}
public static Optional<Integer> getElo(int userID, String gameMode) {
Wenn hier eh schon mit Integer gearbeitet wird, kann man das Optional auch weglassen...
Würde ich ungern, weil so kann man darauf mit
.orElse()
ziemlich gut einen default direkt auswählen.Und halt Optional.empty() als es gibt keinen wert in der db wählen, macht es für die emblem berechnung angenehmer, als mit einem spezial value zu arbeiten.
@ -0,0 +62,4 @@
return getElo(Season.getSeason(), userID, gameMode);
}
public static Optional<Integer> getElo(int season, int userID, String gameMode) {
Wie häufig/welche Ingame-Teile werden jemals NICHT die aktuelle Season abfragen?
gute Frage, glaube nichts also raus damit.
@ -0,0 +93,4 @@
return getMaxElo(Season.getSeason(), gameMode);
}
public static int getMaxElo(int season, String gameMode) {
Wann ist season hier != currentSeason?
@ -0,0 +115,4 @@
setElo(Season.getSeason(), userId, gameMode, elo);
}
public static void setElo(int season, int userId, String gameMode, int elo) {
Selbe Frage
@ -0,0 +133,4 @@
return getPlacement(Season.getSeason(), elo, gameMode);
}
public static int getPlacement(int season, int elo, String gameMode) {
.
@ -34,0 +28,4 @@
Developer("§3", "§f", "Dev", true, true, true, true),
Moderator("§c", "§f", "Mod", true, true, true, true),
Supporter("§9", "§f", "Sup", false, true, true, true),
Builder("§2", "§f", "Archi", false, true, false, true),
Über das Kürzel werden sich die Architekten aber freuen.
Hast du eine Bessere Idee?
Frag doch mal die Builder
Habe ich LordMainex meint Arch würde gehen.
Schaut jetzt schon mal ganz ok aus
@ -27,2 +35,4 @@
public class FightEndsHandler implements SpigotHandler {
private int K = 20;
Man könnte überlegen, ob man den K-Wert nicht vom Seasonstatus abhängig macht... Am Anfang der Season deutlich größer und dann kleiner werdend...
Klingt interessant. Jedoch weiß ich nicht ob wir das wirklich am Anfang machen wollen, ich würde es erstmal so lassen, aber vllt in einer Überarbeitung dann ändern ok?
@ -0,0 +41,4 @@
private static final Statement maxElo = new Statement("SELECT MAX(Elo) AS MaxElo FROM UserElo WHERE Season = ? AND GameMode = ?");
private static final Statement fightsOfSeason = new Statement("SELECT COUNT(*) AS Fights FROM FightPlayer INNER JOIN Fight F on FightPlayer.FightID = F.FightID WHERE UserID = ? AND GameMode = ? AND UNIX_TIMESTAMP(StartTime) + Duration >= UNIX_TIMESTAMP(?)");
public static Optional<Integer> getElo(int userID, String gameMode) {
Mach es doch wie in der SchemElo und gib die Default-Elo zurück, wenn es keine gibt... Falls du eine Funktion brauchst, wo es relevant ist, ob überhaupt eine exisitiert, dann habe das doch als 2 verschiedene Funktionen. Damit würde dann z.B. der FightEndsHandler nichts mehr von der Default-Elo wissen müssen
Ist das so in Ordnung wie ich das gemacht habe?
@ -26,1 +31,4 @@
import java.util.List;
import static de.steamwar.bungeecore.sql.UserElo.ELO_DEFAULT;
Bitte überall mal deine Imports aufräumen! (Warum hast du das nicht autoaktiviert?)
Keine ahnung
Wie ist das denn nun mit Emblem ein leerzeichen hinter dem zeichen und so.
Leerzeichen ist mir Wumpe! Bitte testen.
Also soll ich die noch einfügen, weil so sieht es nicht gut aus!
WIP: Ranked (wipisch)zu RankedIst soweit getestet, bin aber noch die nächste Zeit da, falls was schiefgeht.
Datenbankanpassung nötig (Fight, UserElo, SchemElo). Ankündigung empfohlen.