package tc.oc.pgm.start;
import java.time.Duration;
import javax.annotation.Nullable;
import com.github.rmsy.channels.ChannelsPlugin;
import com.github.rmsy.channels.event.ChannelMessageEvent;
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.boss.BarColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import tc.oc.commons.core.chat.Component;
import tc.oc.commons.core.formatting.PeriodFormats;
import tc.oc.commons.core.util.Comparables;
import tc.oc.pgm.events.ListenerScope;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchPlayer;
import tc.oc.pgm.match.MatchScope;
import tc.oc.pgm.match.MatchState;
import tc.oc.pgm.teams.Team;
/**
* Optional countdown between teams being finalized and match starting
*/
@ListenerScope(MatchScope.LOADED)
public class HuddleCountdown extends PreMatchCountdown implements Listener {
public HuddleCountdown(Match match) {
super(match);
}
@Override
public BaseComponent barText(Player viewer) {
return new Component(new TranslatableComponent("countdown.huddle.message",
secondsRemaining(ChatColor.DARK_RED)),
ChatColor.YELLOW);
}
@Override
public BarColor barColor(Player viewer) {
return BarColor.YELLOW;
}
@Override
public @Nullable Duration timeUntilMatchStart() {
return remaining;
}
@Override
public void onStart(Duration remaining, Duration total) {
super.onStart(remaining, total);
match.ensureState(MatchState.Huddle);
match.registerEvents(this);
if(Comparables.greaterThan(total, Duration.ZERO)) {
getMatch().getCompetitors().stream().filter(competitor -> competitor instanceof Team).forEach(competitor -> {
competitor.audience().sendMessage(new Component(
new TranslatableComponent("huddle.instructions",
PeriodFormats.briefNaturalPrecise(total)),
ChatColor.YELLOW
));
});
}
}
@EventHandler
public void onChat(ChannelMessageEvent event) {
if(event.getChannel() == ChannelsPlugin.get().getGlobalChannel()) {
event.setCancelled(true);
MatchPlayer player = getMatch().getPlayer(event.getSender());
if(player != null) {
player.sendWarning(new TranslatableComponent("huddle.globalChatDisabled"));
}
}
}
protected void cleanup() {
HandlerList.unregisterAll(this);
}
@Override
public void onEnd(Duration total) {
super.onEnd(total);
cleanup();
match.transitionTo(MatchState.Running);
}
@Override
public void onCancel(Duration remaining, Duration total, boolean manual) {
super.onCancel(remaining, total, manual);
cleanup();
match.ensureState(MatchState.Idle);
}
}