ProjectAres/PGM/src/main/java/tc/oc/pgm/goals/GoalCommands.java

86 lines
3.3 KiB
Java

package tc.oc.pgm.goals;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchPlayer;
import tc.oc.pgm.commands.CommandUtils;
import tc.oc.pgm.teams.Team;
import tc.oc.pgm.teams.TeamMatchModule;
import java.util.ArrayList;
import java.util.List;
import static tc.oc.commons.core.util.Nullables.castOrNull;
public class GoalCommands {
private GoalCommands() {}
@Command(
aliases = {"proximity"},
desc = "Show stats about how close each competitor has been to each objective",
min = 0,
max = 0
)
@CommandPermissions("pgm.proximity")
public static void proximity(CommandContext args, CommandSender sender) throws CommandException {
Match match = CommandUtils.getMatch(sender);
TeamMatchModule tmm = CommandUtils.getMatchModule(TeamMatchModule.class, sender);
MatchPlayer matchPlayer = sender instanceof Player ? match.getPlayer((Player) sender) : null;
if(matchPlayer != null && matchPlayer.isParticipating()) {
throw new CommandException("The /proximity command is only available to observers");
}
List<String> lines = new ArrayList<>();
for(Team team : tmm.getTeams()) {
boolean teamHeader = false;
final GoalMatchModule gmm = match.needMatchModule(GoalMatchModule.class);
for(Goal<?> goal : gmm.getGoals(team)) {
if(goal instanceof TouchableGoal && goal.isVisible()) {
TouchableGoal touchable = (TouchableGoal) goal;
ProximityGoal proximity = castOrNull(goal, ProximityGoal.class);
if(!teamHeader) {
lines.add(team.getColoredName());
teamHeader = true;
}
String line = ChatColor.WHITE + " " + touchable.getColoredName() + ChatColor.WHITE;
if(touchable.isCompleted(team)) {
line += ChatColor.GREEN + " COMPLETE";
} else if(touchable.hasTouched(team)) {
line += ChatColor.YELLOW + " TOUCHED";
} else {
line += ChatColor.RED + " UNTOUCHED";
}
if(proximity != null && proximity.isProximityRelevant(team)) {
ProximityMetric metric = proximity.getProximityMetric(team);
if(metric != null) {
line += ChatColor.GRAY + " " + metric.description() + ": " +
ChatColor.AQUA + String.format("%.2f", proximity.getMinimumDistance(team));
}
}
lines.add(line);
}
}
}
if(lines.isEmpty()) {
sender.sendMessage(ChatColor.RED + "There are no objectives that track proximity");
} else {
sender.sendMessage(lines.toArray(new String[lines.size()]));
}
}
}