ProjectAres/PGM/src/main/java/tc/oc/pgm/terrain/TerrainParser.java

56 lines
1.9 KiB
Java

package tc.oc.pgm.terrain;
import java.io.IOException;
import java.nio.file.Path;
import javax.inject.Inject;
import org.jdom2.Document;
import org.jdom2.Element;
import tc.oc.pgm.map.MapFolder;
import tc.oc.pgm.utils.XMLUtils;
import tc.oc.pgm.xml.InvalidXMLException;
import tc.oc.pgm.xml.Node;
import tc.oc.pgm.xml.parser.ElementParser;
public class TerrainParser implements ElementParser<TerrainOptions> {
private final MapFolder mapFolder;
private final Document doc;
@Inject private TerrainParser(MapFolder mapFolder, Document doc) {
this.mapFolder = mapFolder;
this.doc = doc;
}
@Override
public TerrainOptions parseElement(Element element) throws InvalidXMLException {
Path worldFolder = mapFolder.getAbsolutePath();
try {
worldFolder = worldFolder.toRealPath();
} catch(IOException e) {
throw new InvalidXMLException("Problem accessing map folder " + worldFolder, element);
}
boolean vanilla = false;
Long seed = null;
boolean initialPhysics = false;
for(Element elTerrain : doc.getRootElement().getChildren("terrain")) {
vanilla = XMLUtils.parseBoolean(elTerrain.getAttribute("vanilla"), vanilla);
worldFolder = XMLUtils.parseRelativeFolder(worldFolder, Node.fromAttr(elTerrain, "world"), worldFolder);
initialPhysics = XMLUtils.parseBoolean(elTerrain.getAttribute("pre-match-physics"), initialPhysics);
String seedText = elTerrain.getAttributeValue("seed");
if(seedText != null) {
try {
seed = Long.parseLong(seedText);
} catch(NumberFormatException e) {
seed = (long) seedText.hashCode();
}
}
}
return new TerrainOptions(worldFolder, vanilla, seed, initialPhysics);
}
}