package net.anxuiz.tourney.listener; import java.util.Optional; import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; import com.sk89q.minecraft.util.commands.ChatColor; import net.anxuiz.tourney.MatchManager; import net.anxuiz.tourney.ReadyManager; import net.anxuiz.tourney.Tourney; import net.anxuiz.tourney.TourneyState; import net.anxuiz.tourney.event.PartyReadyStatusChangeEvent; import org.bukkit.event.EventException; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import tc.oc.api.docs.Tournament; import tc.oc.pgm.countdowns.Countdown; import tc.oc.pgm.countdowns.CountdownContext; import tc.oc.pgm.events.MatchBeginEvent; import tc.oc.pgm.events.PartyRemoveEvent; import tc.oc.pgm.events.PlayerChangePartyEvent; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.Party; import tc.oc.pgm.start.StartCountdown; import tc.oc.pgm.start.StartMatchModule; @Singleton public class ReadyListener implements Listener { private final Tourney tourney; private final Provider<MatchManager> matchManagerProvider; private final Provider<Optional<ReadyManager>> readyManagerProvider; private final Provider<Tournament> tournamentProvider; @Inject ReadyListener(Tourney tourney, Provider<MatchManager> matchManagerProvider, Provider<Optional<ReadyManager>> readyManagerProvider, Provider<Tournament> tournamentProvider) { this.tourney = tourney; this.matchManagerProvider = matchManagerProvider; this.readyManagerProvider = readyManagerProvider; this.tournamentProvider = tournamentProvider; } @EventHandler(priority = EventPriority.LOWEST) public void onPlayerLeave(PlayerChangePartyEvent event) throws EventException { if(event.getNewParty() != null) return; event.yield(); ReadyManager readyManager = readyManagerProvider.get().orElse(null); if (readyManager == null) return; Tournament tournament = tournamentProvider.get(); Party party = event.getOldParty(); if (party != null && party.isParticipatingType() && party.getPlayers().size() < tournament.min_players_per_match()) { readyManager.markNotReady(party); } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPartyRemove(PartyRemoveEvent event) { ReadyManager readyManager = readyManagerProvider.get().orElse(null); if(readyManager == null) return; readyManager.remove(event.getParty()); checkMatchStart(event.getMatch()); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPartyReadyChange(PartyReadyStatusChangeEvent event) { ReadyManager readyManager = readyManagerProvider.get().orElse(null); if (readyManager == null) return; Party party = event.getParty(); boolean status = event.getNewStatus(); Match match = party.getMatch(); match.sendMessage(String.format("%s %s%sis %s", party.getColoredName(), ChatColor.RESET.toString(), ChatColor.YELLOW, status ? "now ready" : "no longer ready")); checkMatchStart(match); } void checkMatchStart(Match match) { ReadyManager readyManager = readyManagerProvider.get().get(); CountdownContext countdownContext = match.countdowns(); if(readyManager.readyToStart()) { match.needMatchModule(StartMatchModule.class).forceStartCountdown(); tourney.setState(TourneyState.ENABLED_STARTING); } else { tourney.setState(TourneyState.ENABLED_WAITING_FOR_READY); int canceled = 0; for (Countdown countdown : countdownContext.getAll(StartCountdown.class)) { countdownContext.cancel(countdown); canceled++; } if (canceled > 0) { match.sendMessage(ChatColor.RED + "Match start countdown cancelled because some teams are not ready"); } } } @EventHandler(priority = EventPriority.MONITOR) public void onMatchBegin(MatchBeginEvent event) { matchManagerProvider.get().clearReadyManager(); } }