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

98 lines
3.0 KiB
Java

package tc.oc.pgm.goals;
import java.util.Optional;
import java.util.stream.Stream;
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.virtual.MatchDoc;
import tc.oc.pgm.bossbar.BossBarSource;
import tc.oc.pgm.features.SluggedFeature;
import tc.oc.pgm.match.Competitor;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.Party;
/**
* TODO: Extract CompletableGoal which flags and CPs don't implement
*/
public interface Goal<T extends GoalDefinition> extends SluggedFeature<T> {
/**
* @return the {@link Match} this goal is part of
*/
Match getMatch();
/**
* Test if the given team is allowed to complete this goal.
*/
boolean canComplete(Competitor team);
default Stream<Competitor> completers() {
return getMatch().getCompetitors().stream().filter(this::canComplete);
}
/**
* Test if this goal is completed by any team
*/
boolean isCompleted();
/**
* Test if this goal is completed for the given team. If the goal's completion state is not
* team-specific (e.g. a destroyable) then this will return true for any team that is allowed to
* complete the goal, if it is complete.
*/
boolean isCompleted(Competitor team);
default boolean isCompleted(Optional<? extends Competitor> competitor) {
return competitor.isPresent() ? isCompleted(competitor.get())
: isCompleted();
}
/**
* Returns true if this goal can be completed by multiple teams (e.g. a capture point).
*
* Currently, this affects how the goal is displayed on the scoreboard.
*/
default boolean isShared() {
return getDefinition().isShared();
}
/**
* Returns true if the goal acts "normally". Normal behavior is defined when the goal is visible
* via mediums such as the {@link BossBarSource}, the Scoreboard, and chat. If a call
* to this method returns false, this goal will not show up anywhere.
*
* In most cases, this should simply delegate to {@link GoalDefinition#isVisible()}
*/
boolean isVisible();
boolean isRequired();
/**
* The name of the goal, as displayed to players on scoreboards and such. Usually delegates to
* {@link GoalDefinition#getName()} but it's possible to implement a goal that can be renamed.
*/
String getName();
String getColoredName();
BaseComponent getComponentName();
/**
* A color used for fireworks displays
*/
Color getColor();
DyeColor getDyeColor();
ChatColor renderSidebarStatusColor(@Nullable Competitor competitor, Party viewer);
String renderSidebarStatusText(@Nullable Competitor competitor, Party viewer);
ChatColor renderSidebarLabelColor(@Nullable Competitor competitor, Party viewer);
String renderSidebarLabelText(@Nullable Competitor competitor, Party viewer);
MatchDoc.Goal getDocument();
}