package tc.oc.pgm.pickup; import java.util.logging.Logger; import org.bukkit.entity.EntityType; 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.parser.FilterParser; import tc.oc.pgm.kits.Kit; import tc.oc.pgm.kits.KitNode; import tc.oc.pgm.kits.KitParser; import tc.oc.pgm.map.MapModule; import tc.oc.pgm.map.MapModuleContext; import tc.oc.pgm.map.MapModuleFactory; import tc.oc.pgm.module.ModuleDescription; import tc.oc.pgm.regions.RandomPointsValidation; import tc.oc.pgm.regions.Region; import tc.oc.pgm.regions.RegionParser; import tc.oc.pgm.utils.XMLUtils; import tc.oc.pgm.xml.InvalidXMLException; import tc.oc.pgm.xml.Node; @ModuleDescription(name = "Pickup") public abstract class PickupModule implements MapModule { /** * HACK: This module is never instantiated, we just need it to register the parser */ private PickupModule() { throw new IllegalStateException(); } public static class Factory extends MapModuleFactory<PickupModule> { @Override public PickupModule parse(MapModuleContext context, Logger logger, Document doc) throws InvalidXMLException { KitParser kitParser = context.needModule(KitParser.class); FilterParser filterParser = context.needModule(FilterParser.class); RegionParser regionParser = context.needModule(RegionParser.class); for(Element el : XMLUtils.flattenElements(doc.getRootElement(), "pickups", "pickup")) { String name = el.getAttributeValue("name"); EntityType appearance = XMLUtils.parseEnum(Node.fromAttr(el, "appearance"), EntityType.class, "entity type", EntityType.ENDER_CRYSTAL); if(appearance != EntityType.ENDER_CRYSTAL) { throw new InvalidXMLException("Only ender crystal appearances are supported right now", el); } Filter visible = filterParser.property(el, "spawn-filter").optional(StaticFilter.ALLOW); Filter pickup = filterParser.property(el, "pickup-filter").optional(StaticFilter.ALLOW); Region region = regionParser.property(el, "region").validate(RandomPointsValidation.INSTANCE).required(); Kit kit = kitParser.property(el, "kit").optional(KitNode.EMPTY); Duration refresh = XMLUtils.parseDuration(Node.fromAttr(el, "respawn-time"), Duration.ofSeconds(3)); Duration cooldown = XMLUtils.parseDuration(Node.fromAttr(el, "pickup-time"), Duration.ofSeconds(3)); boolean effects = XMLUtils.parseBoolean(Node.fromAttr(el, "effects"), true); boolean sounds = XMLUtils.parseBoolean(Node.fromAttr(el, "sounds"), true); context.features().define(el, new PickupDefinitionImpl(name, appearance, visible, pickup, region, kit, refresh, cooldown, effects, sounds)); } return null; } } }