ProjectAres/PGM/src/main/java/tc/oc/pgm/countdowns/CountdownBossBarSource.java

53 lines
1.9 KiB
Java

package tc.oc.pgm.countdowns;
import java.util.Optional;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.entity.Player;
import java.time.Duration;
import tc.oc.commons.bukkit.chat.TemplateComponent;
import tc.oc.commons.bukkit.localization.MessageTemplate;
import tc.oc.commons.core.chat.Component;
import tc.oc.time.PeriodConverter;
import tc.oc.time.PeriodRenderer;
import tc.oc.commons.core.util.TimeUtils;
import tc.oc.pgm.bossbar.BossBarContent;
import tc.oc.pgm.bossbar.BossBarSource;
public abstract class CountdownBossBarSource implements BossBarSource {
private final ChatColor messageColor, timeColor;
private final Duration maxTime;
private final PeriodConverter periodConverter;
private final PeriodRenderer periodRenderer;
protected CountdownBossBarSource(Duration maxTime, ChatColor messageColor, ChatColor timeColor, PeriodConverter periodConverter, PeriodRenderer periodRenderer) {
this.messageColor = messageColor;
this.timeColor = timeColor;
this.maxTime = maxTime;
this.periodConverter = periodConverter;
this.periodRenderer = periodRenderer;
}
protected abstract MessageTemplate barMessage(Player viewer);
protected abstract Optional<Duration> barTime(Player viewer);
private BaseComponent renderTime(Duration time) {
return new Component(
// Round seconds up so we don't show "0" before the end
periodRenderer.renderPeriod(periodConverter.toPeriod(TimeUtils.ceilSeconds(time))),
timeColor
);
}
@Override
public Optional<BossBarContent> barContent(Player viewer) {
return barTime(viewer).map(time -> BossBarContent.of(
new Component(new TemplateComponent(barMessage(viewer), renderTime(time)), messageColor),
(float) time.toMillis() / (float) maxTime.toMillis()
));
}
}