package in.twizmwaz.cardinal.module.modules.cores; import in.twizmwaz.cardinal.match.Match; import in.twizmwaz.cardinal.module.LoadTime; import in.twizmwaz.cardinal.module.Module; import in.twizmwaz.cardinal.module.ModuleBuilder; import in.twizmwaz.cardinal.module.ModuleCollection; import in.twizmwaz.cardinal.module.ModuleLoadTime; import in.twizmwaz.cardinal.module.modules.proximity.GameObjectiveProximityHandler; import in.twizmwaz.cardinal.module.modules.proximity.ProximityInfo; import in.twizmwaz.cardinal.module.modules.regions.RegionModule; import in.twizmwaz.cardinal.module.modules.regions.RegionModuleBuilder; import in.twizmwaz.cardinal.module.modules.regions.type.combinations.UnionRegion; import in.twizmwaz.cardinal.module.modules.team.TeamModule; import in.twizmwaz.cardinal.util.Numbers; import in.twizmwaz.cardinal.util.Parser; import in.twizmwaz.cardinal.util.Teams; import org.apache.commons.lang3.tuple.ImmutablePair; import org.bukkit.Material; import org.jdom2.Element; import java.util.HashMap; import java.util.Map; @LoadTime(ModuleLoadTime.EARLIER) public class CoreObjectiveBuilder implements ModuleBuilder { @Override public ModuleCollection<? extends Module> load(Match match) { ModuleCollection<Module> result = new ModuleCollection<>(); for (Element element : match.getDocument().getRootElement().getChildren("cores")) { for (Element subElement : element.getChildren("core")) { result.addAll(getCore(subElement, element)); } for (Element child : element.getChildren("cores")) { for (Element subChild : child.getChildren("core")) { result.addAll(getCore(subChild, child, element)); } } } return result; } private ModuleCollection<? extends Module> getCore(Element... elements) { TeamModule team = Teams.getTeamById(Parser.getOrderedAttribute("team", elements)).orNull(); String name = Parser.getOrderedAttribute("name", elements); if (name == null) { name = "Core"; } String id = Parser.getOrderedAttribute("id", elements); ModuleCollection<RegionModule> regions = new ModuleCollection<>(); if (elements[0].getAttributeValue("region") != null) { regions.add(RegionModuleBuilder.getRegion(elements[0].getAttributeValue("region"))); } else { for (Element region : elements[0].getChildren()) { regions.add(RegionModuleBuilder.getRegion(region)); } } RegionModule region = new UnionRegion(null, regions); int leak = Numbers.parseInt(Parser.getOrderedAttribute("leak", elements), 5); ImmutablePair<Material, Integer> material = new ImmutablePair<>(Material.OBSIDIAN, -1); String materialAttribute = Parser.getOrderedAttribute("material", elements); if (materialAttribute != null) { material = (ImmutablePair<Material, Integer>) Parser.parseMaterial(materialAttribute); } boolean show = Numbers.parseBoolean(Parser.getOrderedAttribute("show", elements), true); boolean required = Numbers.parseBoolean(Parser.getOrderedAttribute("required", elements), show); boolean modeChanges = Numbers.parseBoolean(Parser.getOrderedAttribute("mode-changes", elements), false); String proximityMetric = Parser.getOrderedAttribute("proximity-metric", elements); Boolean proximityHorizontal = Numbers.parseBoolean(Parser.getOrderedAttribute("proximity-horizontal", elements), false); ProximityInfo proximityInfo = new ProximityInfo(region.getCenterBlock().getVector(), proximityHorizontal, false, proximityMetric == null ? GameObjectiveProximityHandler.ProximityMetric.CLOSEST_PLAYER : GameObjectiveProximityHandler.ProximityMetric.getByName(proximityMetric)); Map<String, GameObjectiveProximityHandler> proximityHandlers = new HashMap<>(); ModuleCollection<Module> result = new ModuleCollection<>(); for (TeamModule offender : Teams.getTeams()) { if (offender.isObserver() || offender.equals(team)) continue; GameObjectiveProximityHandler proximityHandler = new GameObjectiveProximityHandler(offender, proximityInfo); proximityHandlers.put(offender.getId(), proximityHandler); result.add(proximityHandler); } result.add(new CoreObjective(team, name, id, region, leak, material, show, required, modeChanges, proximityHandlers)); return result; } }