package tc.oc.pgm.ffa; import java.util.Collections; import java.util.Set; import java.util.logging.Logger; import javax.annotation.Nullable; import com.google.common.collect.Range; import com.google.inject.Provides; import com.google.inject.assistedinject.FactoryModuleBuilder; import org.bukkit.Bukkit; import org.jdom2.Document; import org.jdom2.Element; import tc.oc.api.docs.virtual.MapDoc; import tc.oc.pgm.Config; import tc.oc.pgm.map.MapModule; import tc.oc.pgm.map.MapModuleContext; import tc.oc.pgm.map.MapModuleFactory; import tc.oc.pgm.map.inject.MapScoped; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchModuleFactory; import tc.oc.pgm.module.ModuleDescription; import tc.oc.pgm.module.ModuleLoadException; import tc.oc.pgm.teams.TeamModule; import tc.oc.pgm.utils.XMLUtils; import tc.oc.pgm.xml.InvalidXMLException; @ModuleDescription(name = "free-for-all", follows = { TeamModule.class }) public class FreeForAllModule implements MapModule, MatchModuleFactory<FreeForAllMatchModule> { private final FreeForAllOptions options; public FreeForAllModule(FreeForAllOptions options) { this.options = options; } @Override public Set<MapDoc.Gamemode> getGamemodes(MapModuleContext context) { return Collections.singleton(MapDoc.Gamemode.ffa); } public FreeForAllOptions getOptions() { return options; } @Override public Range<Integer> getPlayerLimits() { return Range.closed(options.minPlayers, options.maxPlayers); } @Override public FreeForAllMatchModule createMatchModule(Match match) throws ModuleLoadException { return new FreeForAllMatchModule(match); } public static class Factory extends MapModuleFactory<FreeForAllModule> { @Override protected void configure() { super.configure(); install(new FactoryModuleBuilder().build(Tribute.Factory.class)); } @Provides @MapScoped FreeForAllOptions options(FreeForAllModule module) { return module.getOptions(); } @Override public @Nullable FreeForAllModule parse(MapModuleContext context, Logger logger, Document doc) throws InvalidXMLException { Element elPlayers = doc.getRootElement().getChild("players"); if(context.hasModule(TeamModule.class)) { if(elPlayers != null) throw new InvalidXMLException("Cannot combine <players> and <teams>", elPlayers); return null; } else { int minPlayers = Config.minimumPlayers(); int maxPlayers = Bukkit.getMaxPlayers(); int maxOverfill = maxPlayers; org.bukkit.scoreboard.Team.OptionStatus nameTagVisibility = org.bukkit.scoreboard.Team.OptionStatus.ALWAYS; boolean colors = false; if(elPlayers != null) { minPlayers = XMLUtils.parseNumber(elPlayers.getAttribute("min"), Integer.class, minPlayers); maxPlayers = XMLUtils.parseNumber(elPlayers.getAttribute("max"), Integer.class, maxPlayers); maxOverfill = XMLUtils.parseNumber(elPlayers.getAttribute("max-overfill"), Integer.class, maxOverfill); nameTagVisibility = XMLUtils.parseNameTagVisibility(elPlayers, "show-name-tags").optional(nameTagVisibility); colors = XMLUtils.parseBoolean(elPlayers.getAttribute("colors"), colors); } if(minPlayers > maxPlayers) { throw new InvalidXMLException("min players (" + minPlayers + ") cannot be greater than max players (" + maxPlayers + ")", elPlayers); } return new FreeForAllModule(new FreeForAllOptions(minPlayers, maxPlayers, maxOverfill, nameTagVisibility, colors)); } } } }