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