72 lines
2.8 KiB
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));
|
|
}
|
|
}
|
|
}
|