126 lines
3.8 KiB
Java
126 lines
3.8 KiB
Java
package tc.oc.pgm.countdowns;
|
|
|
|
import java.util.Set;
|
|
import javax.annotation.Nullable;
|
|
|
|
import com.google.common.collect.ImmutableSet;
|
|
import net.md_5.bungee.api.ChatColor;
|
|
import net.md_5.bungee.api.chat.BaseComponent;
|
|
import net.md_5.bungee.api.chat.TranslatableComponent;
|
|
import org.bukkit.entity.Player;
|
|
import java.time.Duration;
|
|
import tc.oc.commons.core.chat.Component;
|
|
import tc.oc.commons.core.chat.Components;
|
|
import tc.oc.commons.core.formatting.PeriodFormats;
|
|
import tc.oc.commons.core.util.TimeUtils;
|
|
import tc.oc.pgm.bossbar.BossBarMatchModule;
|
|
import tc.oc.pgm.bossbar.BossBarSource;
|
|
import tc.oc.pgm.match.Match;
|
|
import tc.oc.pgm.match.MatchPlayer;
|
|
|
|
public abstract class MatchCountdown implements Countdown, BossBarSource {
|
|
|
|
protected final Match match;
|
|
protected final BossBarMatchModule bbmm;
|
|
protected final @Nullable Set<MatchPlayer> viewers;
|
|
|
|
protected @Nullable Duration remaining;
|
|
protected @Nullable Duration total;
|
|
|
|
public MatchCountdown(Match match) {
|
|
this(match, null);
|
|
}
|
|
|
|
public MatchCountdown(Match match, @Nullable Set<MatchPlayer> viewers) {
|
|
this.match = match;
|
|
this.bbmm = match.needMatchModule(BossBarMatchModule.class);
|
|
this.viewers = viewers == null ? null : ImmutableSet.copyOf(viewers);
|
|
}
|
|
|
|
public Match getMatch() {
|
|
return this.match;
|
|
}
|
|
|
|
protected Set<MatchPlayer> viewers() {
|
|
return viewers != null ? viewers : match.getPlayers();
|
|
}
|
|
|
|
@Override
|
|
public boolean isVisible(Player viewer) {
|
|
return remaining != null && (viewers == null || match.player(viewer)
|
|
.filter(viewers::contains)
|
|
.isPresent());
|
|
}
|
|
|
|
@Override
|
|
public float barProgress(Player viewer) {
|
|
if(total == null || remaining == null) return 0;
|
|
|
|
if(Duration.ZERO.equals(total)) {
|
|
return 0f;
|
|
} else if(TimeUtils.isInfPositive(total)) {
|
|
return 1f;
|
|
} else {
|
|
return barProgress(remaining, total);
|
|
}
|
|
}
|
|
|
|
protected float barProgress(Duration remaining, Duration total) {
|
|
return (float) remaining.getSeconds() / total.getSeconds();
|
|
}
|
|
|
|
protected boolean shouldShowTitle(MatchPlayer viewer) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void onStart(Duration remaining, Duration total) {
|
|
this.remaining = remaining;
|
|
this.total = total;
|
|
|
|
if(viewers == null) {
|
|
bbmm.add(this);
|
|
} else {
|
|
bbmm.add(this, viewers.stream().map(MatchPlayer::getBukkit));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onTick(Duration remaining, Duration total) {
|
|
this.remaining = remaining;
|
|
this.total = total;
|
|
|
|
bbmm.render(this);
|
|
|
|
final Component title = new Component(String.valueOf(remaining.getSeconds()), ChatColor.YELLOW);
|
|
for(MatchPlayer viewer : viewers()) {
|
|
if(shouldShowTitle(viewer)) {
|
|
viewer.showTitle(title, Components.blank(), 0, 5, 15);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onEnd(Duration total) {
|
|
bbmm.remove(this);
|
|
}
|
|
|
|
@Override
|
|
public void onCancel(Duration remaining, Duration total, boolean manual) {
|
|
bbmm.remove(this);
|
|
}
|
|
|
|
protected BaseComponent secondsRemaining(ChatColor color) {
|
|
long seconds = remaining.getSeconds();
|
|
if(seconds == 1) {
|
|
return new TranslatableComponent("countdown.singularCompound", new Component("1", color));
|
|
} else {
|
|
return new TranslatableComponent("countdown.pluralCompound", new Component(String.valueOf(seconds), color));
|
|
}
|
|
}
|
|
|
|
protected BaseComponent colonTime() {
|
|
return PeriodFormats.formatColons(remaining);
|
|
}
|
|
}
|