ProjectAres/PGM/src/main/java/tc/oc/pgm/proximity/ProximityAlarmModule.java

69 lines
2.8 KiB
Java

package tc.oc.pgm.proximity;
import java.util.Set;
import java.util.logging.Logger;
import com.google.common.collect.Sets;
import org.bukkit.ChatColor;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import tc.oc.pgm.filters.operator.InverseFilter;
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.regions.RegionParser;
import tc.oc.pgm.utils.XMLUtils;
import tc.oc.pgm.xml.InvalidXMLException;
@ModuleDescription(name = "Proximity Alarm")
public class ProximityAlarmModule implements MapModule, MatchModuleFactory<ProximityAlarmMatchModule> {
private final Set<ProximityAlarmDefinition> definitions;
public ProximityAlarmModule(Set<ProximityAlarmDefinition> definitions) {
this.definitions = definitions;
}
@Override
public ProximityAlarmMatchModule createMatchModule(Match match) {
return new ProximityAlarmMatchModule(match, this.definitions);
}
public static ProximityAlarmModule parse(MapModuleContext context, Logger logger, Document doc) throws InvalidXMLException {
Set<ProximityAlarmDefinition> definitions = Sets.newHashSet();
for(Element elAlarm : XMLUtils.flattenElements(doc.getRootElement(), "proximity-alarms", "proximity-alarm")) {
definitions.add(parseDefinition(context, elAlarm));
}
if(definitions.isEmpty()) {
return null;
} else {
return new ProximityAlarmModule(definitions);
}
}
public static ProximityAlarmDefinition parseDefinition(MapModuleContext context, Element elAlarm) throws InvalidXMLException {
ProximityAlarmDefinition definition = new ProximityAlarmDefinition();
FilterParser filterParser = context.needModule(FilterParser.class);
definition.detectFilter = filterParser.parseProperty(elAlarm, "detect");
definition.alertFilter = filterParser.property(elAlarm, "notify").optionalGet(() -> new InverseFilter(definition.detectFilter));
definition.detectRegion = context.needModule(RegionParser.class).property(elAlarm, "region").required();
definition.alertMessage = elAlarm.getAttributeValue("message"); // null = no message
if(definition.alertMessage != null) {
definition.alertMessage = ChatColor.translateAlternateColorCodes('`', definition.alertMessage);
}
Attribute attrFlareRadius = elAlarm.getAttribute("flare-radius");
definition.flares = attrFlareRadius != null;
if(definition.flares) {
definition.flareRadius = XMLUtils.parseNumber(attrFlareRadius, Double.class);
}
return definition;
}
}