package in.twizmwaz.cardinal.module.modules.regions; 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.regions.parsers.AboveParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.BelowParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.BlockParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.CircleParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.CuboidParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.CylinderParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.EmptyParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.EverywhereParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.HalfParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.PointParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.RectangleParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.SphereParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.modifiers.CombinationParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.modifiers.MirrorParser; import in.twizmwaz.cardinal.module.modules.regions.parsers.modifiers.TranslateParser; import in.twizmwaz.cardinal.module.modules.regions.type.AboveRegion; import in.twizmwaz.cardinal.module.modules.regions.type.BelowRegion; import in.twizmwaz.cardinal.module.modules.regions.type.BlockRegion; import in.twizmwaz.cardinal.module.modules.regions.type.CircleRegion; import in.twizmwaz.cardinal.module.modules.regions.type.CuboidRegion; import in.twizmwaz.cardinal.module.modules.regions.type.CylinderRegion; import in.twizmwaz.cardinal.module.modules.regions.type.EmptyRegion; import in.twizmwaz.cardinal.module.modules.regions.type.EverywhereRegion; import in.twizmwaz.cardinal.module.modules.regions.type.HalfRegion; import in.twizmwaz.cardinal.module.modules.regions.type.PointRegion; import in.twizmwaz.cardinal.module.modules.regions.type.RectangleRegion; import in.twizmwaz.cardinal.module.modules.regions.type.SphereRegion; import in.twizmwaz.cardinal.module.modules.regions.type.combinations.ComplementRegion; import in.twizmwaz.cardinal.module.modules.regions.type.combinations.IntersectRegion; import in.twizmwaz.cardinal.module.modules.regions.type.combinations.NegativeRegion; import in.twizmwaz.cardinal.module.modules.regions.type.combinations.UnionRegion; import in.twizmwaz.cardinal.module.modules.regions.type.modifications.MirroredRegion; import in.twizmwaz.cardinal.module.modules.regions.type.modifications.TranslatedRegion; import in.twizmwaz.cardinal.util.Parser; import org.jdom2.Document; import org.jdom2.Element; @LoadTime(ModuleLoadTime.EARLIEST) public class RegionModuleBuilder implements ModuleBuilder { public static RegionModule getRegion(Element element, Document document) { RegionModule region; switch (element.getName().toLowerCase()) { case "block": region = new BlockRegion(new BlockParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "point": region = new PointRegion(new PointParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "circle": region = new CircleRegion(new CircleParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "cuboid": region = new CuboidRegion(new CuboidParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "cylinder": region = new CylinderRegion(new CylinderParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "empty": region = new EmptyRegion(new EmptyParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "nowhere": region = new EmptyRegion(new EmptyParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "everywhere": region = new EverywhereRegion(new EverywhereParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "rectangle": region = new RectangleRegion(new RectangleParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "sphere": region = new SphereRegion(new SphereParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "above": region = new AboveRegion(new AboveParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "below": region = new BelowRegion(new BelowParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "half": region = new HalfRegion(new HalfParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "complement": region = new ComplementRegion(new CombinationParser(element, document)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "intersect": region = new IntersectRegion(new CombinationParser(element, document)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "negative": region = new NegativeRegion(new CombinationParser(element, document)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "union": case "regions": region = new UnionRegion(new CombinationParser(element, document)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "translate": region = new TranslatedRegion(new TranslateParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; case "mirror": region = new MirroredRegion(new MirrorParser(element)); if (region.getName() != null) GameHandler.getGameHandler().getMatch().getModules().add(region); return region; default: if (element.getAttributeValue("name") != null) { for (RegionModule regionModule : GameHandler.getGameHandler().getMatch().getModules().getModules(RegionModule.class)) { if (element.getAttributeValue("name").equalsIgnoreCase(regionModule.getName())) { return regionModule; } } } else if (element.getAttributeValue("id") != null) { for (RegionModule regionModule : GameHandler.getGameHandler().getMatch().getModules().getModules(RegionModule.class)) { if (element.getAttributeValue("id").equalsIgnoreCase(regionModule.getName())) { return regionModule; } } } else if (element.getAttributeValue("region") != null) { for (RegionModule regionModule : GameHandler.getGameHandler().getMatch().getModules().getModules(RegionModule.class)) { if (element.getAttributeValue("region").equalsIgnoreCase(regionModule.getName())) { return regionModule; } } } else if (element.getChildren().size() > 0) { return new UnionRegion(new CombinationParser(element, document)); } return null; } } public static RegionModule getRegion(Element element) { return getRegion(element, GameHandler.getGameHandler().getMatch().getDocument()); } public static RegionModule getRegion(String string) { for (RegionModule regionModule : GameHandler.getGameHandler().getMatch().getModules().getModules(RegionModule.class)) { if (string.equalsIgnoreCase(regionModule.getName())) return regionModule; } return null; } public static RegionModule getAttributeOrChild(String name, Element... elements) { String attr = Parser.getOrderedAttribute(name, elements); if (attr != null) return RegionModuleBuilder.getRegion(attr); else if (elements[0].getChild(name) != null) return RegionModuleBuilder.getRegion(elements[0].getChild(name)); return null; } public static RegionModule getAttributeOrChild(String name, String fallback, Element... elements) { RegionModule region = getAttributeOrChild(name, elements); return region == null ? RegionModuleBuilder.getRegion(fallback) : region; } public static RegionModule getAttributeOrChild(String name, RegionModule fallback, Element... elements) { RegionModule region = getAttributeOrChild(name, elements); return region == null ? fallback : region; } @Override public ModuleCollection<RegionModule> load(Match match) { match.getModules().add(new EverywhereRegion("everywhere")); match.getModules().add(new EmptyRegion("nowhere")); ModuleCollection<RegionModule> results = new ModuleCollection<>(); for (Element element : match.getDocument().getRootElement().getChildren("regions")) { for (Element givenRegion : element.getChildren()) { for (Element givenChild : givenRegion.getChildren()) { for (Element givenSubChild : givenChild.getChildren()) { for (Element givenChildRegion : givenSubChild.getChildren()) { getRegion(givenChildRegion); } getRegion(givenSubChild); } getRegion(givenChild); } if (!givenRegion.getName().equals("apply")) { getRegion(givenRegion); } } } return results; } }