package tc.oc.pgm.modules; import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.potion.PotionEffect; import org.jdom2.Document; import org.jdom2.Element; import tc.oc.pgm.map.MapModule; import tc.oc.pgm.map.MapModuleContext; import tc.oc.pgm.map.ProtoVersions; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchModuleFactory; import tc.oc.pgm.module.ModuleDescription; import tc.oc.pgm.utils.XMLUtils; import tc.oc.pgm.xml.InvalidXMLException; @ModuleDescription(name="Modify Bow Projectile") public class ModifyBowProjectileModule implements MapModule, MatchModuleFactory<ModifyBowProjectileMatchModule> { protected final Class<? extends Entity> cls; protected final float velocityMod; protected final Set<PotionEffect> potionEffects; public ModifyBowProjectileModule(Class<? extends Entity> cls, float velocityMod, Set<PotionEffect> effects) { this.cls = cls; this.velocityMod = velocityMod; potionEffects = effects; } @Override public ModifyBowProjectileMatchModule createMatchModule(Match match) { return new ModifyBowProjectileMatchModule(match, this.cls, this.velocityMod, this.potionEffects); } // --------------------- // ---- XML Parsing ---- // --------------------- public static ModifyBowProjectileModule parse(MapModuleContext context, Logger logger, Document doc) throws InvalidXMLException { boolean changed = false; Class<? extends Entity> projectile = Arrow.class; float velocityMod = 1; Set<PotionEffect> potionEffects = new HashSet<>(); for(Element parent : doc.getRootElement().getChildren("modifybowprojectile")) { if(context.getProto().isNoOlderThan(ProtoVersions.FILTER_FEATURES)) { throw new InvalidXMLException("Module is discontinued as of " + ProtoVersions.FILTER_FEATURES.toString(), doc.getRootElement().getChild("modifybowprojectile")); } Element projectileElement = parent.getChild("projectile"); if(projectileElement != null) { projectile = XMLUtils.parseEntityType(projectileElement); changed = true; } Element velocityModElement = parent.getChild("velocityMod"); if(velocityModElement != null) { velocityMod = XMLUtils.parseNumber(velocityModElement, Float.class); changed = true; } for(Element elEffect : XMLUtils.getChildren(parent, "effect", "potion")) { potionEffects.add(XMLUtils.parsePotionEffect(elEffect)); changed = true; } } return !changed ? null : new ModifyBowProjectileModule(projectile, velocityMod, potionEffects); } }