98 lines
3.0 KiB
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();
|
|
}
|