BungeeMain / src / main / java / com / lifeknight / relaymcbungeemain / queue / PlayerGroup.java
PlayerGroup.java
Raw
package com.lifeknight.relaymcbungeemain.queue;

import com.lifeknight.relaymcbungeemain.player.Party;
import com.lifeknight.relaymcbungeemain.player.SmartPlayer;
import com.lifeknight.relayutils.basic.Miscellaneous;
import com.lifeknight.relayutils.data.QueueData;
import com.lifeknight.relayutils.game.GameType;
import com.lifeknight.relayutils.player.Group;

import java.util.ArrayList;
import java.util.List;

public class PlayerGroup {
    protected final List<SmartPlayer> players = new ArrayList<>();
    protected final GameType gameType;
    protected final QueueData queueData;
    protected final SmartPlayer leader;

    public PlayerGroup(GameType gameType, QueueData queueData, SmartPlayer... players) {
        this(Miscellaneous.getList(players), gameType, queueData);
    }

    public PlayerGroup(List<SmartPlayer> players, GameType gameType, QueueData queueData) {
        this.leader = players.get(0);
        this.players.addAll(players);
        this.gameType = gameType;
        this.queueData = queueData;
    }

    public GameType getType() {
        return this.gameType;
    }

    public QueueData getQueueData() {
        return this.queueData;
    }

    public boolean isQueueDataCompatible(PlayerGroup... playerGroups) {
        for (PlayerGroup playerGroup : playerGroups) {
            if (!this.queueData.isCompatible(playerGroup.queueData)) {
                return false;
            }
        }
        return true;
    }

    public int getSize() {
        return this.players.size();
    }

    public synchronized boolean removePlayer(SmartPlayer smartPlayer) {
        return this.players.removeIf(smartPlayer1 -> smartPlayer1.getUUID().equals(smartPlayer.getUUID()));
    }

    public synchronized boolean removeParty(Party party) {
        return this.players.removeAll(party.getPlayers());
    }

    public synchronized GameType removePartyInadvertently(Party party) {
        if (this.removeParty(party)) {
            return this.gameType;
        }
        return null;
    }

    public synchronized GameType removePlayerInadvertently(SmartPlayer smartPlayer) {
        if (this.removePlayer(smartPlayer)) {
            return this.gameType;
        }
        return null;
    }

    public synchronized boolean hasPlayer(SmartPlayer smartPlayer) {
        if (this.players.isEmpty()) return false;

        for (SmartPlayer player : this.players) {
            if (player.getUUID().equals(smartPlayer.getUUID())) {
                return true;
            }
        }

        return false;
    }

    public List<SmartPlayer> getPlayers() {
        return this.players;
    }

    public synchronized boolean isEmpty() {
        return this.isEmpty(false);
    }

    public synchronized boolean isEmpty(boolean byQueue) {
        if (this.getSize() == 0) {
            return true;
        }

        for (SmartPlayer player : this.players) {
            if (!player.isOnline()) {
                for (SmartPlayer smartPlayer : this.players) {
                    smartPlayer.sendErrorMessage("You have been removed from the queue as one of your queue members is no longer online.");
                    smartPlayer.emptyQueue();
                }
                return true;
            }
        }

        if (this.gameType.isPartyType() && this.queueData.isParty()) {
            if (this.getSize() == 1 && !byQueue) {
                SmartPlayer player = this.players.get(0);
                player.sendErrorMessage("You have been removed from the queue; you cannot play party games by yourself!");
                player.emptyQueue();
                return true;
            }
        }

        return false;
    }

    public boolean isFastQueue(SmartPlayer smartPlayer) {
        return this.leader.isInGroupOrHigher(Group.CHAMPION);
    }

    public boolean isParty() {
        return this.queueData.isParty();
    }
}