From dc60a4f6ba3b97f7debf22601142416af45297ba Mon Sep 17 00:00:00 2001 From: Pablo Herrera Date: Sat, 22 Apr 2023 01:34:22 +0200 Subject: [PATCH] Update team assigning logic to avoid re-creating teams (#41) --- pom.xml | 331 +++++++++--------- .../rip/bolt/ingame/pugs/PugTeamManager.java | 71 ++-- src/main/resources/plugin.yml | 2 +- 3 files changed, 215 insertions(+), 189 deletions(-) diff --git a/pom.xml b/pom.xml index 66c49eb..4cc0d98 100644 --- a/pom.xml +++ b/pom.xml @@ -1,163 +1,182 @@ - 4.0.0 - rip.bolt - ingame - 1.0.0-SNAPSHOT - ingame + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + rip.bolt + ingame + 1.0.0-SNAPSHOT + ingame - - scm:git:git://github.com/bolt-rip/ingame.git - scm:git:git@github.com:bolt-rip/ingame.git - https://github.com/bolt-rip/ingame - + + scm:git:git://github.com/bolt-rip/ingame.git + scm:git:git@github.com:bolt-rip/ingame.git + https://github.com/bolt-rip/ingame + - - - bolt-rip-public - https://repo.repsy.io/mvn/boltrip/public - - + + + bolt-rip-public + https://repo.repsy.io/mvn/boltrip/public + + - - - ashcon-repo - https://repo.ashcon.app/content/repositories/snapshots - - - aikar - https://repo.aikar.co/content/groups/aikar/ - - - pgm.fyi - https://repo.pgm.fyi/snapshots - - + + + aikar + https://repo.aikar.co/content/groups/aikar/ + + + pgm.fyi + https://repo.pgm.fyi/snapshots + + + ashcon-repo + https://repo.ashcon.app/content/repositories/snapshots + + - - - app.ashcon - sportpaper - 1.8.8-R0.1-SNAPSHOT - provided - - - tc.oc.pgm - core - 0.16-SNAPSHOT - provided - - - dev.pgm - Events - 1.0.0-SNAPSHOT - provided - - - tc.oc.occ - Dispense - 1.0.0-SNAPSHOT - - - com.squareup.retrofit2 - retrofit - 2.9.0 - - - com.squareup.retrofit2 - converter-jackson - 2.9.0 - - - com.squareup.retrofit2 - converter-gson - 2.9.0 - - - co.aikar - taskchain-bukkit - 3.7.2 - - - org.java-websocket - Java-WebSocket - 1.5.1 - - + + + app.ashcon + sportpaper + 1.8.8-R0.1-SNAPSHOT + provided + + + tc.oc.pgm + core + 0.16-SNAPSHOT + provided + + + dev.pgm + Events + 1.0.0-SNAPSHOT + provided + + + tc.oc.occ + Dispense + 1.0.0-SNAPSHOT + + + com.squareup.retrofit2 + retrofit + 2.9.0 + + + com.squareup.retrofit2 + converter-jackson + 2.9.0 + + + com.squareup.retrofit2 + converter-gson + 2.9.0 + + + co.aikar + taskchain-bukkit + 3.7.2 + + + org.java-websocket + Java-WebSocket + 1.5.1 + + - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-shade-plugin - 3.1.1 - - true - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - co.aikar.taskchain - rip.bolt.ingame.taskchain - - - - - - package - - shade - - - - - *:* - - - - - - - - - com.coveo - fmt-maven-plugin - 2.9 - - - - - - - check - - - - - - - - true - src/main/resources - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + + pl.project13.maven + git-commit-id-plugin + 4.9.10 + + + + revision + + + + + false + false + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.1.1 + + true + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + co.aikar.taskchain + rip.bolt.ingame.taskchain + + + + + + package + + shade + + + + + *:* + + + + + + + + + com.coveo + fmt-maven-plugin + 2.9 + + + + + + + check + + + + + + + + true + src/main/resources + + + diff --git a/src/main/java/rip/bolt/ingame/pugs/PugTeamManager.java b/src/main/java/rip/bolt/ingame/pugs/PugTeamManager.java index 42fb635..48f78d8 100644 --- a/src/main/java/rip/bolt/ingame/pugs/PugTeamManager.java +++ b/src/main/java/rip/bolt/ingame/pugs/PugTeamManager.java @@ -2,13 +2,11 @@ import dev.pgm.events.EventsPlugin; import dev.pgm.events.team.TournamentTeamManager; -import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.Function; import java.util.stream.Collectors; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -38,7 +36,7 @@ public PugTeamManager(MatchManager matchManager, PugManager pugManager) { this.pugManager = pugManager; this.teamManager = EventsPlugin.get().getTeamManager(); - this.pugTeams = new HashMap<>(); + this.pugTeams = new LinkedHashMap<>(); } private PugLobby getLobby() { @@ -54,14 +52,10 @@ public ManagedTeam getTeam(String pugTeamId) { } public ManagedTeam getTeam(Integer boltTeamId) { - for (ManagedTeam managedTeam : pugTeams.values()) { - if (managedTeam.getBoltTeam() == null) continue; - - if (managedTeam.getBoltTeam().getId().equals(boltTeamId)) { - return managedTeam; - } + for (ManagedTeam team : pugTeams.values()) { + Team boltTeam = team.getBoltTeam(); + if (boltTeam != null && boltTeam.getId().equals(boltTeamId)) return team; } - return null; } @@ -77,30 +71,43 @@ public ManagedTeam getTeam(@Nullable Party team) { * unregister or register teams from events. */ public void setupTeams(BoltMatch match) { - Map teams = - getTeams().stream().collect(Collectors.toMap(PugTeam::getId, Function.identity())); - - List toRemoveIds = new ArrayList<>(pugTeams.keySet()); - toRemoveIds.retainAll(teams.keySet()); - - // Pain. EventsPlugin doesn't allow removing just one team, gotta remove them all and re-add. - if (!toRemoveIds.isEmpty()) { - teamManager.clear(); - for (String toRemoveId : toRemoveIds) { - ManagedTeam mt = pugTeams.remove(toRemoveId); - mt.clean(); + if (attemptDirectSetup(match)) return; + + pugTeams.values().forEach(ManagedTeam::clean); + pugTeams.clear(); + teamManager.clear(); + + Iterator boltTeamsIt = match.getTeams().iterator(); + for (PugTeam team : getTeams()) { + if (!boltTeamsIt.hasNext()) { + System.out.println("[Ingame] No more teams are available to assign"); + break; } + + ManagedTeam mt = pugTeams.computeIfAbsent(team.getId(), ManagedTeam::new); + mt.clean(); + mt.setPugTeam(team); + mt.setBoltTeam(boltTeamsIt.next()); + teamManager.addTeam(mt); + } + if (boltTeamsIt.hasNext()) { + System.out.println("[Ingame] Leftover match teams were not assigned"); } + } - Iterator boltTeamsIt = match.getTeams().iterator(); - teams.forEach( - (id, team) -> { - ManagedTeam mt = pugTeams.computeIfAbsent(id, ManagedTeam::new); - mt.clean(); - mt.setPugTeam(team); - mt.setBoltTeam(boltTeamsIt.next()); - teamManager.addTeam(mt); - }); + private boolean attemptDirectSetup(BoltMatch match) { + if (pugTeams.size() != getTeams().size()) return false; + + Iterator matchTeamsIt = match.getTeams().iterator(); + for (PugTeam lobbyTeam : getTeams()) { + ManagedTeam mt = pugTeams.get(lobbyTeam.getId()); + if (mt == null || !matchTeamsIt.hasNext()) return false; + mt.clean(); + mt.setPugTeam(lobbyTeam); + mt.setBoltTeam(matchTeamsIt.next()); + } + // True if it has been fully consumed + return !matchTeamsIt.hasNext(); } public void syncMatchTeams() { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 334b720..1a512ed 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Ingame main: rip.bolt.ingame.Ingame -version: 1.0.0-SNAPSHOT +version: ${project.version} (git-${git.commit.id.abbrev}) depend: [PGM, Events] softdepend: [Dispense]