package tc.oc.pgm.filters.parser; import org.bukkit.entity.LivingEntity; import org.jdom2.Element; import tc.oc.pgm.filters.Filter; import tc.oc.pgm.filters.matcher.QueryTypeFilter; import tc.oc.pgm.filters.matcher.StaticFilter; import tc.oc.pgm.filters.matcher.entity.EntityTypeFilter; import tc.oc.pgm.filters.matcher.entity.LegacyWorldFilter; import tc.oc.pgm.filters.operator.FallthroughFilter; import tc.oc.pgm.filters.query.IBlockQuery; import tc.oc.pgm.filters.query.IEntitySpawnQuery; import tc.oc.pgm.filters.query.IEntityTypeQuery; import tc.oc.pgm.filters.query.IPlayerQuery; import tc.oc.pgm.xml.InvalidXMLException; /** * For proto < 1.4 */ public class LegacyFilterParser extends FilterParser { @Override protected void defineBuiltInFilters() throws InvalidXMLException { addDefault("allow-all", new StaticFilter(Filter.QueryResponse.ALLOW)); addDefault("deny-all", new StaticFilter(Filter.QueryResponse.DENY)); addDefaultPair("players", new QueryTypeFilter(IPlayerQuery.class)); addDefaultPair("blocks", new QueryTypeFilter(IBlockQuery.class)); addDefaultPair("world", new LegacyWorldFilter()); addDefaultPair("spawns", new QueryTypeFilter(IEntitySpawnQuery.class)); addDefaultPair("entities", new QueryTypeFilter(IEntityTypeQuery.class)); addDefaultPair("mobs", new EntityTypeFilter(LivingEntity.class)); } private void addDefaultPair(String name, Filter filter) throws InvalidXMLException { addDefault("allow-" + name, new FallthroughFilter(Filter.QueryResponse.ALLOW, filter)); addDefault("deny-" + name, new FallthroughFilter(Filter.QueryResponse.DENY, filter)); } private void addDefault(String name, Filter filter) throws InvalidXMLException { features.define(mangleId(name), filter); } @Override protected void parseTopLevelFilters() throws InvalidXMLException { // Legacy proto seperates filters and regions. The only reason // this matters is that <block> is ambiguous - it's both a region, // and a deprecated alias for <material>. for(Element el : xml.getRootElement().getChildren("filters")) { parseChildren(el).count(); } for(Element el : xml.getRootElement().getChildren("regions")) { regionParser.parseChildren(el).count(); } } @Override public boolean isReference(Element el) { // References look different, and are a lot harder to distinguish from other things return el.getName().equalsIgnoreCase("filter") && el.getChildren().isEmpty() && el.getAttribute("parents") == null && el.getAttribute("name") != null; } }