package in.twizmwaz.cardinal.module.modules.filter;
import in.twizmwaz.cardinal.GameHandler;
import in.twizmwaz.cardinal.match.Match;
import in.twizmwaz.cardinal.module.LoadTime;
import in.twizmwaz.cardinal.module.ModuleBuilder;
import in.twizmwaz.cardinal.module.ModuleCollection;
import in.twizmwaz.cardinal.module.ModuleLoadTime;
import in.twizmwaz.cardinal.module.modules.filter.parsers.BlockFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.CauseFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.ChildFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.ChildrenFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.ClassFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.EntityFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.FlagFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.FlagFilterPostParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.GenericFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.ItemFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.KillstreakFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.MobFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.ObjectiveFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.RandomFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.SpawnFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.TeamFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.parsers.TimeFilterParser;
import in.twizmwaz.cardinal.module.modules.filter.type.BlockFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.CarryingFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.CauseFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.ClassFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.CrouchingFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.EntityFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.FlyingAbilityFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.FlyingFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.HoldingFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.KillStreakFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.MobFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.ObjectiveFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.RandomFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.SameTeamFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.SpawnFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.TeamFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.TimeFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.VoidFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.WearingFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.constant.AllBlockFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.constant.AllEntitiesFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.constant.AllEventFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.constant.AllMobFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.constant.AllPlayerFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.constant.AllSpawnFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.constant.AllWorldFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.flag.FlagCapturedFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.flag.FlagCarriedFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.flag.FlagCarryingFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.flag.FlagDroppedFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.flag.FlagReturnedFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.logic.AllFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.logic.AnyFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.logic.NotFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.logic.OneFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.old.AllowFilter;
import in.twizmwaz.cardinal.module.modules.filter.type.old.DenyFilter;
import in.twizmwaz.cardinal.util.Parser;
import org.jdom2.Document;
import org.jdom2.Element;
@LoadTime(ModuleLoadTime.EARLY)
public class FilterModuleBuilder implements ModuleBuilder {
/**
* @param element Element to parse
* @param document Document to find filter in case the given filter is a reference
* @return The filter based upon the given element
*/
public static FilterModule getFilter(Element element, Document document) {
String id = element.getAttributeValue("name") != null ? element.getAttributeValue("name") :
(element.getAttributeValue("id") != null ? element.getAttributeValue("id") : null);
switch (element.getName().toLowerCase()) {
case "block":
return new BlockFilter(new BlockFilterParser(element));
case "carrying":
return new CarryingFilter(new ItemFilterParser(element));
case "cause":
return new CauseFilter(new CauseFilterParser(element));
case "class":
return new ClassFilter(new ClassFilterParser(element));
case "crouching":
return new CrouchingFilter(new FilterParser(element));
case "entity":
return new EntityFilter(new EntityFilterParser(element));
case "can-fly":
return new FlyingAbilityFilter(new FilterParser(element));
case "flying":
return new FlyingFilter(new FilterParser(element));
case "holding":
return new HoldingFilter(new ItemFilterParser(element));
case "kill-streak":
return new KillStreakFilter(new KillstreakFilterParser(element));
case "material":
return new BlockFilter(new BlockFilterParser(element));
case "mob":
return new MobFilter(new MobFilterParser(element));
case "objective":
return new ObjectiveFilter(new ObjectiveFilterParser(element));
case "random":
return new RandomFilter(new RandomFilterParser(element));
case "spawn":
return new SpawnFilter(new SpawnFilterParser(element));
case "team":
return new TeamFilter((new TeamFilterParser(element)));
case "time":
return new TimeFilter(new TimeFilterParser(element));
case "void":
return new VoidFilter(new GenericFilterParser(element));
case "wearing":
return new WearingFilter(new ItemFilterParser(element));
case "flag-carried":
return new FlagCarriedFilter(new FlagFilterPostParser(element));
case "flag-dropped":
return new FlagDroppedFilter(new FlagFilterPostParser(element));
case "flag-returned":
return new FlagReturnedFilter(new FlagFilterPostParser(element));
case "flag-captured":
return new FlagCapturedFilter(new FlagFilterPostParser(element));
case "carrying-flag":
return new FlagCarryingFilter(new FlagFilterParser(element));
case "same-team":
return new SameTeamFilter(new ChildFilterParser(element));
case "all":
return new AllFilter(new ChildrenFilterParser(element));
case "any":
return new AnyFilter(new ChildrenFilterParser(element));
case "not":
return new NotFilter(new ChildrenFilterParser(element));
case "one":
return new OneFilter(new ChildrenFilterParser(element));
case "allow":
return new AllowFilter(new ChildrenFilterParser(element));
case "deny":
return new DenyFilter(new ChildrenFilterParser(element));
default:
if (element.getChildren().size() > 0) {
if (element.getChildren().size() > 1) {
return new AllFilter(new ChildrenFilterParser(element));
} else {
return getFilter(element.getChildren().get(0));
}
} else if (id != null) {
switch (id.toLowerCase()) {
case "always":
return new AllEventFilter("always", true);
case "never":
return new AllEventFilter("never", false);
case "allow-all":
return new AllEventFilter("allow-all", true);
case "deny-all":
return new AllEventFilter("deny-all", false);
case "allow-players":
return new AllPlayerFilter("allow-players", true);
case "deny-players":
return new AllPlayerFilter("deny-players", false);
case "allow-blocks":
return new AllBlockFilter("allow-blocks", true);
case "deny-blocks":
return new AllBlockFilter("deny-blocks", false);
case "allow-world":
return new AllWorldFilter("allow-world", true);
case "deny-world":
return new AllWorldFilter("deny-world", false);
case "allow-spawns":
return new AllSpawnFilter("allow-spawns", true);
case "deny-spawns":
return new AllSpawnFilter("deny-spawns", false);
case "allow-entities":
return new AllEntitiesFilter("allow-entities", true);
case "deny-entities":
return new AllEntitiesFilter("deny-entities", false);
case "allow-mobs":
return new AllMobFilter("allow-mobs", true);
case "deny-mobs":
return new AllMobFilter("deny-mobs", false);
case "allow":
return new AllowFilter(new ChildrenFilterParser(element));
case "deny":
return new DenyFilter(new ChildrenFilterParser(element));
default:
for (Element filterElement : document.getRootElement().getChildren("filters")) {
for (Element givenFilter : filterElement.getChildren()) {
if (givenFilter.getAttributeValue("name") != null && givenFilter.getAttributeValue("name").equalsIgnoreCase(id))
return getFilter(givenFilter);
if (givenFilter.getAttributeValue("id") != null && givenFilter.getAttributeValue("id").equalsIgnoreCase(id))
return getFilter(givenFilter);
}
}
}
} else {
return getFilter(element.getChildren().get(0));
}
}
return null;
}
/**
* This method will default the document to the document of the current match (possibly buggy)
*
* @param element Element to parse
* @return The filter based upon the given element
*/
public static FilterModule getFilter(Element element) {
return getFilter(element, GameHandler.getGameHandler().getMatch().getDocument());
}
/**
* Gets a loaded filter by the given name
*
* @param string
* @return
*/
public static FilterModule getFilter(String string) {
if (string == null) return null;
for (FilterModule filterModule : GameHandler.getGameHandler().getMatch().getModules().getModules(FilterModule.class)) {
if (string.equalsIgnoreCase(filterModule.getName())) return filterModule;
}
return null;
}
public static FilterModule getAttributeOrChild(String name, Element... elements) {
String attr = Parser.getOrderedAttribute(name, elements);
if (attr != null) return getFilter(attr);
else if (elements[0].getChild(name) != null) return getFilter(elements[0].getChild(name));
return null;
}
public static FilterModule getAttributeOrChild(String name, String fallback, Element... elements) {
FilterModule region = getAttributeOrChild(name, elements);
return region == null ? getFilter(fallback) : region;
}
public static FilterModule getAttributeOrChild(String name, FilterModule fallback, Element... elements) {
FilterModule region = getAttributeOrChild(name, elements);
return region == null ? fallback : region;
}
@Override
public ModuleCollection<FilterModule> load(Match match) {
match.getModules().add(new AllEventFilter("always", true));
match.getModules().add(new AllEventFilter("never", false));
match.getModules().add(new AllEventFilter("allow-all", true));
match.getModules().add(new AllEventFilter("deny-all", false));
match.getModules().add(new AllPlayerFilter("allow-players", true));
match.getModules().add(new AllPlayerFilter("deny-players", false));
match.getModules().add(new AllBlockFilter("allow-blocks", true));
match.getModules().add(new AllBlockFilter("deny-blocks", false));
match.getModules().add(new AllWorldFilter("allow-world", true));
match.getModules().add(new AllWorldFilter("deny-world", false));
match.getModules().add(new AllSpawnFilter("allow-spawns", true));
match.getModules().add(new AllSpawnFilter("deny-spawns", false));
match.getModules().add(new AllEntitiesFilter("allow-entities", true));
match.getModules().add(new AllEntitiesFilter("deny-entities", false));
match.getModules().add(new AllMobFilter("allow-mobs", true));
match.getModules().add(new AllMobFilter("deny-mobs", false));
for (Element element : match.getDocument().getRootElement().getChildren("filters")) {
for (Element filter : element.getChildren()) {
match.getModules().add(getFilter(filter));
}
}
return new ModuleCollection<>();
}
}