ProjectAres/PGM/src/main/java/tc/oc/pgm/api/MatchPublishingMatchModule....

134 lines
4.5 KiB
Java

package tc.oc.pgm.api;
import javax.inject.Inject;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import tc.oc.api.docs.virtual.MapDoc;
import tc.oc.api.docs.virtual.MatchDoc;
import tc.oc.api.docs.virtual.ServerDoc;
import tc.oc.api.minecraft.MinecraftService;
import tc.oc.api.model.UpdateService;
import tc.oc.pgm.blitz.BlitzMatchModule;
import tc.oc.pgm.events.ListenerScope;
import tc.oc.pgm.events.PartyRenameEvent;
import tc.oc.pgm.events.PlayerPartyChangeEvent;
import tc.oc.pgm.events.SetNextMapEvent;
import tc.oc.pgm.ffa.events.MatchResizeEvent;
import tc.oc.pgm.goals.events.GoalCompleteEvent;
import tc.oc.pgm.goals.events.GoalTouchEvent;
import tc.oc.pgm.blitz.BlitzEvent;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchManager;
import tc.oc.pgm.match.MatchModule;
import tc.oc.pgm.match.MatchScope;
import tc.oc.pgm.teams.events.TeamResizeEvent;
@ListenerScope(MatchScope.LOADED)
public class MatchPublishingMatchModule extends MatchModule implements Listener {
class Update implements ServerDoc.MatchStatusUpdate {
@Override
public int num_observing() {
return isBlitz() ? getMatch().getPlayers().size() - initialParticipants : getMatch().getObservingPlayers().size();
}
@Override
public int num_participating() {
return isBlitz() ? initialParticipants : getMatch().getParticipatingPlayers().size();
}
@Override
public int min_players() {
return match.getPlayerLimits().lowerEndpoint();
}
@Override
public int max_players() {
return match.getPlayerLimits().upperEndpoint();
}
@Override
public MatchDoc current_match() {
return matchDocument;
}
@Override
public MapDoc next_map() {
return mm.getNextMap().getDocument();
}
}
private final MatchManager mm;
private final MinecraftService minecraftService;
private final UpdateService<MatchDoc> matchService;
private final MatchDoc matchDocument;
private final BlitzMatchModule blitz;
private int initialParticipants; // Number of participants at match start (for blitz)
@Inject MatchPublishingMatchModule(Match match, MatchManager mm, MinecraftService minecraftService, UpdateService<MatchDoc> matchService, MatchDoc matchDocument, BlitzMatchModule blitz) {
super(match);
this.mm = mm;
this.minecraftService = minecraftService;
this.matchService = matchService;
this.matchDocument = matchDocument;
this.blitz = blitz;
}
public boolean isBlitz() {
return blitz.activated();
}
private void countPlayers() {
this.initialParticipants = getMatch().getParticipatingPlayers().size();
}
private void update() {
getMatch().getScheduler(MatchScope.LOADED).debounceTask(() -> minecraftService.updateLocalServer(new Update()));
}
@Override
public void load() {
super.load();
update();
}
@Override
public void enable() {
super.enable();
countPlayers();
update();
}
@Override
public void disable() {
update();
super.disable();
}
@Override
public void unload() {
// Next match will have already loaded and changed Server.current_match,
// so we have to update the match directly to set the unload time.
matchService.update(matchDocument);
super.unload();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPartyChange(final PlayerPartyChangeEvent event) {
if(!event.getMatch().hasStarted()) {
countPlayers();
}
update();
}
@EventHandler(priority = EventPriority.MONITOR) public void onSetNext(SetNextMapEvent event) { update(); }
@EventHandler(priority = EventPriority.MONITOR) public void onPartyRename(PartyRenameEvent event) { update(); }
@EventHandler(priority = EventPriority.MONITOR) public void onMatchResize(MatchResizeEvent event) { update(); }
@EventHandler(priority = EventPriority.MONITOR) public void onTeamResize(TeamResizeEvent event) { update(); }
@EventHandler(priority = EventPriority.MONITOR) public void onGoalComplete(GoalCompleteEvent event) { update(); }
@EventHandler(priority = EventPriority.MONITOR) public void onGoalTouch(GoalTouchEvent event) { update(); }
@EventHandler(priority = EventPriority.MONITOR) public void onBlitzEnable(BlitzEvent event) { countPlayers(); update(); }
}