ProjectAres/PGM/src/main/java/tc/oc/pgm/worldborder/WorldBorderModule.java

72 lines
2.8 KiB
Java

package tc.oc.pgm.worldborder;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import com.google.common.collect.ImmutableList;
import org.jdom2.Document;
import org.jdom2.Element;
import java.time.Duration;
import tc.oc.pgm.filters.Filter;
import tc.oc.pgm.filters.matcher.StaticFilter;
import tc.oc.pgm.filters.matcher.match.MonostableFilter;
import tc.oc.pgm.filters.parser.FilterParser;
import tc.oc.pgm.map.MapModule;
import tc.oc.pgm.map.MapModuleContext;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchModuleFactory;
import tc.oc.pgm.module.ModuleDescription;
import tc.oc.pgm.utils.XMLUtils;
import tc.oc.pgm.xml.InvalidXMLException;
import tc.oc.pgm.xml.Node;
@ModuleDescription(name = "World Border")
public class WorldBorderModule implements MapModule, MatchModuleFactory<WorldBorderMatchModule> {
private final List<WorldBorder> borders;
public WorldBorderModule(List<WorldBorder> borders) {
this.borders = borders;
}
@Override
public WorldBorderMatchModule createMatchModule(Match match) {
return new WorldBorderMatchModule(match, borders);
}
public static WorldBorderModule parse(MapModuleContext context, Logger logger, Document doc) throws InvalidXMLException {
List<WorldBorder> borders = new ArrayList<>();
for(Element el : XMLUtils.flattenElements(doc.getRootElement(), "world-borders", "world-border")) {
Filter filter = context.needModule(FilterParser.class).property(el, "when").optional(StaticFilter.ALLOW);
Duration after = XMLUtils.parseDuration(Node.fromAttr(el, "after"));
if(after != null) {
if(!StaticFilter.ALLOW.equals(filter)) {
throw new InvalidXMLException("Cannot combine a filter and an explicit time for a world border", el);
}
filter = MonostableFilter.after(context.features(), after);
}
WorldBorder border = new WorldBorder(
filter,
XMLUtils.parse2DVector(Node.fromRequiredAttr(el, "center")),
XMLUtils.parseNumber(Node.fromRequiredAttr(el, "size"), Double.class),
XMLUtils.parseDuration(Node.fromAttr(el, "duration"), Duration.ZERO),
XMLUtils.parseNumber(Node.fromAttr(el, "damage"), Double.class, 0.2d),
XMLUtils.parseNumber(Node.fromAttr(el, "buffer"), Double.class, 5d),
XMLUtils.parseNumber(Node.fromAttr(el, "warning-distance"), Double.class, 5d),
XMLUtils.parseDuration(Node.fromAttr(el, "warning-time"), Duration.ofSeconds(15))
);
borders.add(border);
}
if(borders.isEmpty()) {
return null;
} else {
return new WorldBorderModule(ImmutableList.copyOf(borders));
}
}
}