blob: 738cf1eb918fd665bcfc627fc57ba7ca8989ea7f [file] [log] [blame] [raw]
package net.glowstone.scoreboard;
import com.flowpowered.networking.Message;
import com.google.common.collect.ImmutableSet;
import net.glowstone.net.message.play.scoreboard.ScoreboardTeamMessage;
import org.apache.commons.lang3.Validate;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.scoreboard.NameTagVisibility;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Implementation for scoreboard teams.
*/
public final class GlowTeam implements Team {
private GlowScoreboard scoreboard;
private final String name;
private final HashSet<OfflinePlayer> players = new HashSet<>();
// properties
private String displayName;
private String prefix = "";
private String suffix = "";
private NameTagVisibility nameTagVisibility = NameTagVisibility.ALWAYS;
private NameTagVisibility deathMessageVisibility = NameTagVisibility.ALWAYS;
private ChatColor color = ChatColor.RESET;
private boolean friendlyFire = false;
private boolean seeInvisible = true;
public GlowTeam(GlowScoreboard scoreboard, String name) {
this.scoreboard = scoreboard;
this.name = name;
displayName = name;
}
public Scoreboard getScoreboard() {
return scoreboard;
}
public void unregister() throws IllegalStateException {
checkValid();
scoreboard.removeTeam(this);
scoreboard = null;
}
void checkValid() {
if (scoreboard == null) {
throw new IllegalStateException("Cannot manipulate unregistered team");
}
}
Message getCreateMessage() {
List<String> playerNames = new ArrayList<>(players.size());
playerNames.addAll(players.stream().map(OfflinePlayer::getName).collect(Collectors.toList()));
return ScoreboardTeamMessage.create(name, displayName, prefix, suffix, friendlyFire, seeInvisible, nameTagVisibility, color, playerNames);
}
private void update() {
scoreboard.broadcast(ScoreboardTeamMessage.update(name, displayName, prefix, suffix, friendlyFire, seeInvisible, nameTagVisibility, color));
}
////////////////////////////////////////////////////////////////////////////
// Properties
public String getName() throws IllegalStateException {
checkValid();
return name;
}
public String getDisplayName() throws IllegalStateException {
checkValid();
return displayName;
}
public void setDisplayName(String displayName) throws IllegalStateException, IllegalArgumentException {
Validate.notNull(displayName, "Display name cannot be null");
checkValid();
this.displayName = displayName;
update();
}
public String getPrefix() throws IllegalStateException {
checkValid();
return prefix;
}
public void setPrefix(String prefix) throws IllegalStateException, IllegalArgumentException {
Validate.notNull(prefix, "Prefix cannot be null");
checkValid();
this.prefix = prefix;
update();
}
public String getSuffix() throws IllegalStateException {
checkValid();
return suffix;
}
public void setSuffix(String suffix) throws IllegalStateException, IllegalArgumentException {
Validate.notNull(suffix, "Suffix cannot be null");
checkValid();
this.suffix = suffix;
update();
}
public boolean allowFriendlyFire() throws IllegalStateException {
checkValid();
return friendlyFire;
}
public void setAllowFriendlyFire(boolean enabled) throws IllegalStateException {
checkValid();
friendlyFire = enabled;
update();
}
public boolean canSeeFriendlyInvisibles() throws IllegalStateException {
checkValid();
return seeInvisible;
}
public void setCanSeeFriendlyInvisibles(boolean enabled) throws IllegalStateException {
checkValid();
seeInvisible = enabled;
update();
}
public NameTagVisibility getNameTagVisibility() throws IllegalStateException {
checkValid();
return nameTagVisibility;
}
public void setNameTagVisibility(NameTagVisibility visibility) throws IllegalStateException {
checkValid();
nameTagVisibility = visibility;
update();
}
public NameTagVisibility getDeathMessageVisibility() throws IllegalStateException {
return deathMessageVisibility;
}
@Override
public boolean hasEntry(String s) throws IllegalArgumentException, IllegalStateException {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
public void setDeathMessageVisibility(NameTagVisibility deathMessageVisibility) throws IllegalStateException, IllegalArgumentException {
Validate.notNull(deathMessageVisibility, "NameTagVisibility cannot be null!");
checkValid();
this.deathMessageVisibility = deathMessageVisibility;
}
////////////////////////////////////////////////////////////////////////////
// Player management
public Set<OfflinePlayer> getPlayers() throws IllegalStateException {
checkValid();
return ImmutableSet.copyOf(players);
}
@Override
public Set<String> getEntries() throws IllegalStateException {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public int getSize() throws IllegalStateException {
checkValid();
return players.size();
}
public void addPlayer(OfflinePlayer player) throws IllegalStateException, IllegalArgumentException {
Validate.notNull(player, "Player cannot be null");
checkValid();
players.add(player);
scoreboard.setPlayerTeam(player, this);
}
@Override
public void addEntry(String s) throws IllegalStateException, IllegalArgumentException {
//To change body of implemented methods use File | Settings | File Templates.
}
public ChatColor getColor() {
return color;
}
public void setColor(ChatColor color) throws IllegalArgumentException {
if (color.isFormat()) {
throw new IllegalArgumentException("Formatting codes cannot be used as a team color!");
}
this.color = color;
}
public boolean removePlayer(OfflinePlayer player) throws IllegalStateException, IllegalArgumentException {
Validate.notNull(player, "Player cannot be null");
checkValid();
if (players.remove(player)) {
scoreboard.setPlayerTeam(player, null);
return true;
}
return false;
}
@Override
public boolean removeEntry(String s) throws IllegalStateException, IllegalArgumentException {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
public boolean hasPlayer(OfflinePlayer player) throws IllegalArgumentException, IllegalStateException {
Validate.notNull(player, "Player cannot be null");
checkValid();
return players.contains(player);
}
public String getPlayerDisplayName(String name) {
return getPrefix() + name + getSuffix();
}
/**
* Remove a player without propagating the change to the scoreboard.
* @param player The player to remove.
*/
void rawRemovePlayer(OfflinePlayer player) {
players.remove(player);
}
}