package tc.oc.pgm.join; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.inject.Inject; import net.md_5.bungee.api.ChatColor; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchPlayer; import tc.oc.pgm.match.inject.MatchScoped; import tc.oc.pgm.match.ObservingParty; /** * Observing party that holds players who have requested to join before * match start, when the server is configured to defer joins. * After the match starts, this party is empty. */ @MatchScoped public class QueuedParticipants extends ObservingParty { private final JoinConfiguration config; private List<MatchPlayer> shuffledPlayers; @Inject QueuedParticipants(Match match, JoinConfiguration config) { super(match); this.config = config; } private void invalidateShuffle() { shuffledPlayers = null; } @Override public boolean addPlayerInternal(MatchPlayer player) { if(super.addPlayerInternal(player)) { invalidateShuffle(); return true; } return false; } @Override public boolean removePlayerInternal(MatchPlayer player) { if(super.removePlayerInternal(player)) { invalidateShuffle(); return true; } return false; } public List<MatchPlayer> getOrderedPlayers() { if(shuffledPlayers == null) { shuffledPlayers = new ArrayList<>(getPlayers()); Collections.shuffle(shuffledPlayers); if(config.priorityKick()) { // If priority kicking is enabled, might as well join the high // priority players first so nobody actually gets kicked. final JoinMatchModule jmm = match.needMatchModule(JoinMatchModule.class); Collections.sort(shuffledPlayers, (a, b) -> Boolean.compare(jmm.canPriorityKick(b), jmm.canPriorityKick(a)) ); } } return shuffledPlayers; } @Override public String getDefaultName() { return "Participants"; } @Override public ChatColor getColor() { return ChatColor.YELLOW; } }