package tc.oc.pgm.goals; import java.util.logging.Logger; import javax.annotation.Nullable; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.Color; import org.bukkit.DyeColor; import tc.oc.api.docs.AbstractModel; import tc.oc.api.docs.virtual.MatchDoc; import tc.oc.commons.core.logging.ClassLogger; import tc.oc.pgm.match.Competitor; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.Party; import tc.oc.pgm.map.ProtoVersions; import tc.oc.pgm.score.ScoreMatchModule; /** * Basic {@link Goal} implementation with fields for the definition and match */ public abstract class SimpleGoal<T extends GoalDefinition> implements Goal<T> { public static final ChatColor COLOR_INCOMPLETE = ChatColor.RED; public static final ChatColor COLOR_COMPLETE = ChatColor.GREEN; public static final String SYMBOL_INCOMPLETE = "\u2715"; // ✕ public static final String SYMBOL_COMPLETE = "\u2714"; // ✔ protected final Logger logger; protected final T definition; protected final Match match; public SimpleGoal(T definition, Match match) { this.logger = ClassLogger.get(match.getLogger(), getClass()); this.definition = definition; this.match = match; } @Override public String slug() { return match.featureDefinitions().slug(getDefinition()); } @Override public Match getMatch() { return this.match; } @Override public T getDefinition() { return this.definition; } @Override public String getName() { return this.definition.getName(); } @Override public String getColoredName() { return this.definition.getColoredName(); } @Override public BaseComponent getComponentName() { return this.definition.getComponentName(); } @Override public Color getColor() { return getDyeColor().getColor(); } @Override public DyeColor getDyeColor() { return DyeColor.WHITE; } @Override public boolean isVisible() { return this.definition.isVisible(); } @Override public boolean isRequired() { Boolean required = getDefinition().isRequired(); if(required != null) { return required; } else if(getMatch().getModuleContext().getProto().isNoOlderThan(ProtoVersions.GOAL_REQUIRED_OPTION)) { return true; } else { // Legacy behavior is to require no goals if score module is loaded return !getMatch().hasMatchModule(ScoreMatchModule.class); } } public ChatColor renderSidebarStatusColor(@Nullable Competitor competitor, Party viewer) { return isCompleted(competitor) ? COLOR_COMPLETE : COLOR_INCOMPLETE; } public String renderSidebarStatusText(@Nullable Competitor competitor, Party viewer) { return isCompleted(competitor) ? SYMBOL_COMPLETE : SYMBOL_INCOMPLETE; } public ChatColor renderSidebarLabelColor(@Nullable Competitor competitor, Party viewer) { return ChatColor.WHITE; } public String renderSidebarLabelText(@Nullable Competitor competitor, Party viewer) { return getName(); } public class Document extends AbstractModel implements MatchDoc.Goal { @Override public String _id() { return slug(); } @Override public String type() { return getDefinition().getFeatureName(); } @Override public String name() { return getName(); } } }