134 lines
4.5 KiB
Java
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(); }
|
|
}
|