Add ranked rework #336
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.fightsystem.utils;
|
package de.steamwar.fightsystem.utils;
|
||||||
|
|
||||||
|
import de.steamwar.comms.packets.FightEndsPacket;
|
||||||
import de.steamwar.fightsystem.ArenaMode;
|
import de.steamwar.fightsystem.ArenaMode;
|
||||||
import de.steamwar.fightsystem.Config;
|
import de.steamwar.fightsystem.Config;
|
||||||
import de.steamwar.fightsystem.FightSystem;
|
import de.steamwar.fightsystem.FightSystem;
|
||||||
@ -30,19 +31,17 @@ import de.steamwar.fightsystem.record.FileRecorder;
|
|||||||
import de.steamwar.fightsystem.states.FightState;
|
import de.steamwar.fightsystem.states.FightState;
|
||||||
import de.steamwar.fightsystem.states.OneShotStateDependent;
|
import de.steamwar.fightsystem.states.OneShotStateDependent;
|
||||||
import de.steamwar.fightsystem.winconditions.Wincondition;
|
import de.steamwar.fightsystem.winconditions.Wincondition;
|
||||||
import de.steamwar.sql.Elo;
|
|
||||||
import de.steamwar.sql.SchematicNode;
|
import de.steamwar.sql.SchematicNode;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.sql.SteamwarUser;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static de.steamwar.sql.Fight.create;
|
import static de.steamwar.sql.Fight.create;
|
||||||
import static de.steamwar.sql.Fight.setReplay;
|
import static de.steamwar.sql.Fight.setReplay;
|
||||||
@ -98,24 +97,16 @@ public class FightStatistics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Integer blueSchem;
|
Integer blueSchem;
|
||||||
Integer blueSchemRank;
|
|
||||||
Integer redSchem;
|
Integer redSchem;
|
||||||
Integer redSchemRank;
|
|
||||||
try {
|
try {
|
||||||
SchematicNode schematicNode = SchematicNode.getSchematicNode(Fight.getBlueTeam().getSchematic());
|
blueSchem = SchematicNode.getSchematicNode(Fight.getBlueTeam().getSchematic()).getId();
|
||||||
blueSchem = schematicNode.getId();
|
|
||||||
blueSchemRank = schematicNode.getRank();
|
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
blueSchem = null;
|
blueSchem = null;
|
||||||
blueSchemRank = null;
|
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
SchematicNode schematicNode = SchematicNode.getSchematicNode(Fight.getRedTeam().getSchematic());
|
redSchem = SchematicNode.getSchematicNode(Fight.getRedTeam().getSchematic()).getId();
|
||||||
redSchem = schematicNode.getId();
|
|
||||||
redSchemRank = schematicNode.getRank();
|
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
redSchem = null;
|
redSchem = null;
|
||||||
redSchemRank = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int remainingTime = 0;
|
int remainingTime = 0;
|
||||||
@ -147,58 +138,9 @@ public class FightStatistics {
|
|||||||
}
|
}
|
||||||
replayLock = false;
|
replayLock = false;
|
||||||
|
|
||||||
calculateEloIfNeeded(blueSchemRank, redSchemRank, blueResult, gameMode);
|
if (Bukkit.getOnlinePlayers().isEmpty()) {
|
||||||
}
|
Player p = Bukkit.getOnlinePlayers().iterator().next();
|
||||||
|
new FightEndsPacket((byte) win, blueSchem == null ? 0 : blueSchem, redSchem == null ? 0 : redSchem, Fight.getBlueTeam().getPlayers().stream().map(FightPlayer::getPlayer).map(SteamwarUser::get).map(SteamwarUser::getId).collect(Collectors.toList()), Fight.getRedTeam().getPlayers().stream().map(FightPlayer::getPlayer).map(SteamwarUser::get).map(SteamwarUser::getId).collect(Collectors.toList())).send(p);
|
||||||
private void calculateEloIfNeeded(Integer blueSchemRank, Integer redSchemRank, double blueResult, String gameMode) {
|
|
||||||
if (!Config.RankedEnabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blueSchemRank == null || redSchemRank == null) { // Schematics are not ranked
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blueSchemRank != redSchemRank) { // Different schematics ranks are not worth elo change
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Collection<FightPlayer> bluePlayers = Fight.getBlueTeam().getPlayers();
|
|
||||||
Collection<FightPlayer> redPlayers = Fight.getRedTeam().getPlayers();
|
|
||||||
double playerDiff = 1 - (Math.min(bluePlayers.size(), redPlayers.size()) / (double) Math.max(bluePlayers.size(), redPlayers.size()));
|
|
||||||
if (playerDiff >= 0.4) { // Too many players, not worth elo change
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int blueElo = 0;
|
|
||||||
int redElo = 0;
|
|
||||||
Map<FightPlayer, Integer> blueElos = new HashMap<>();
|
|
||||||
Map<FightPlayer, Integer> redElos = new HashMap<>();
|
|
||||||
for (FightPlayer fp : bluePlayers) {
|
|
||||||
int elo = Elo.getElo(SteamwarUser.get(fp.getPlayer()).getId(), gameMode);
|
|
||||||
blueElo += elo;
|
|
||||||
blueElos.put(fp, elo);
|
|
||||||
}
|
|
||||||
for (FightPlayer fp : redPlayers) {
|
|
||||||
int elo = Elo.getElo(SteamwarUser.get(fp.getPlayer()).getId(), gameMode);
|
|
||||||
redElo += elo;
|
|
||||||
redElos.put(fp, elo);
|
|
||||||
}
|
|
||||||
|
|
||||||
double redWinExpectation = 1 / (1 + Math.pow(10, (blueElo - redElo) / 600f));
|
|
||||||
double blueWinExpectation = 1 / (1 + Math.pow(10, (redElo - blueElo) / 600f));
|
|
||||||
double diffBlueElo = K * (blueResult - blueWinExpectation);
|
|
||||||
double diffRedElo = K * (1 - blueResult - redWinExpectation);
|
|
||||||
|
|
||||||
for (FightPlayer fp : bluePlayers) {
|
|
||||||
int nElo = (int) Math.round(blueElos.get(fp) + diffBlueElo / bluePlayers.size());
|
|
||||||
Elo.setElo(SteamwarUser.get(fp.getPlayer()).getId(), gameMode, nElo);
|
|
||||||
FightSystem.getMessage().send("UI_ELO_PLAYER", fp.getPlayer(), redElos.get(fp), nElo);
|
|
||||||
}
|
|
||||||
for (FightPlayer fp : redPlayers) {
|
|
||||||
int nElo = (int) Math.round(redElos.get(fp) + diffRedElo / redPlayers.size());
|
|
||||||
Elo.setElo(SteamwarUser.get(fp.getPlayer()).getId(), gameMode, nElo);
|
|
||||||
FightSystem.getMessage().send("UI_ELO_PLAYER", fp.getPlayer(), redElos.get(fp), nElo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren