package tc.oc.pgm.tnt; import javax.inject.Inject; import org.jdom2.Element; import java.time.Duration; import tc.oc.pgm.eventrules.EventRule; import tc.oc.pgm.eventrules.EventRuleModule; import tc.oc.pgm.eventrules.EventRuleScope; import tc.oc.pgm.filters.matcher.CauseFilter; import tc.oc.pgm.filters.operator.FallthroughFilter; import tc.oc.pgm.regions.EverywhereRegion; import tc.oc.pgm.utils.XMLUtils; import tc.oc.pgm.xml.InvalidXMLException; import tc.oc.pgm.xml.parser.ElementParser; public class TNTParser implements ElementParser<TNTProperties> { private static final int DEFAULT_DISPENSER_NUKE_LIMIT = 16; private static final float DEFAULT_DISPENSER_NUKE_MULTIPLIER = 0.25f; private final CauseFilter.Factory causeFilters; private final EventRuleModule eventRules; @Inject private TNTParser(CauseFilter.Factory causeFilters, EventRuleModule eventRules) { this.causeFilters = causeFilters; this.eventRules = eventRules; } @Override public TNTProperties parseElement(Element element) throws InvalidXMLException { Float yield = null; Float power = null; boolean instantIgnite = false; boolean blockDamage = true; Duration fuse = null; int dispenserNukeLimit = DEFAULT_DISPENSER_NUKE_LIMIT; float dispenserNukeMultiplier = DEFAULT_DISPENSER_NUKE_MULTIPLIER; boolean licensing = true; boolean friendlyDefuse = true; for(Element tntElement : element.getChildren("tnt")) { instantIgnite = XMLUtils.parseBoolean(XMLUtils.getUniqueChild(tntElement, "instantignite"), instantIgnite); blockDamage = XMLUtils.parseBoolean(XMLUtils.getUniqueChild(tntElement, "blockdamage"), blockDamage); yield = XMLUtils.parseNumber(XMLUtils.getUniqueChild(tntElement, "yield"), Float.class, yield); power = XMLUtils.parseNumber(XMLUtils.getUniqueChild(tntElement, "power"), Float.class, power); dispenserNukeLimit = XMLUtils.parseNumber(XMLUtils.getUniqueChild(tntElement, "dispenser-tnt-limit"), Integer.class, dispenserNukeLimit); dispenserNukeMultiplier = XMLUtils.parseNumber(XMLUtils.getUniqueChild(tntElement, "dispenser-tnt-multiplier"), Float.class, dispenserNukeMultiplier); licensing = XMLUtils.parseBoolean(XMLUtils.getUniqueChild(tntElement, "licensing"), licensing); friendlyDefuse = XMLUtils.parseBoolean(XMLUtils.getUniqueChild(tntElement, "friendly-defuse"), friendlyDefuse); fuse = XMLUtils.parseDuration(XMLUtils.getUniqueChild(tntElement, "fuse"), fuse); } if(!blockDamage) { eventRules.eventRuleContext().prepend(EventRule.newEventFilter( EventRuleScope.BLOCK_BREAK, EverywhereRegion.INSTANCE, FallthroughFilter.deny(causeFilters.create(CauseFilter.Cause.EXPLOSION)), null, false )); } return new TNTProperties(yield, power, instantIgnite, blockDamage, fuse, dispenserNukeLimit, dispenserNukeMultiplier, licensing, friendlyDefuse); } }