package in.twizmwaz.cardinal.module.modules.filter;
import in.twizmwaz.cardinal.GameHandler;
import in.twizmwaz.cardinal.match.Match;
import in.twizmwaz.cardinal.module.BuilderData;
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.*;
import in.twizmwaz.cardinal.module.modules.filter.type.*;
import in.twizmwaz.cardinal.module.modules.filter.type.constant.*;
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 org.jdom2.Document;
import org.jdom2.Element;
@BuilderData(load = ModuleLoadTime.EARLY)
public class FilterModuleBuilder implements ModuleBuilder {
@Override
public ModuleCollection load(Match match) {
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("filter")) {
match.getModules().add(getFilter(filter.getChildren().get(0)));
}
}
return new ModuleCollection<>();
}
/**
* @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) {
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 "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 "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));
case "filter":
switch (element.getAttributeValue("name").toLowerCase()) {
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:
if (element.getAttributeValue("name") != null) {
for (Element filterElement : document.getRootElement().getChildren("filters")) {
for (Element givenFilter : filterElement.getChildren()) {
if (givenFilter.getAttributeValue("name").equalsIgnoreCase(element.getAttributeValue("name")))
return getFilter(givenFilter.getChildren().get(0));
}
}
} else {
return getFilter(element.getChildren().get(0));
}
}
default:
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) {
for (FilterModule filterModule : GameHandler.getGameHandler().getMatch().getModules().getModules(FilterModule.class)) {
if (string.equalsIgnoreCase(filterModule.getName())) return filterModule;
}
return null;
}
}