package services.terrain;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Map;
import java.util.Vector;
import utils.FileUtilities;
import clientdata.STFTable;
import network.PacketHandler;
import network.Service;
public class TerrainService implements Service {
private Vector<SWGTerrain> terrainList = new Vector<SWGTerrain>();
public TerrainService() {
loadTerrains();
}
private void loadTerrains() {
String planetFolder = "scripts/terrain/planets/";
String spaceFolder = "scripts/terrain/space/";
Path planets = Paths.get(planetFolder);
Path space = Paths.get(spaceFolder);
FileVisitor<Path> fv = new SimpleFileVisitor<Path>() {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
String terrainName = file.getFileName().toString().replace(".py", "");
if(!FileUtilities.doesFileExist("clientdata/terrain/" + terrainName + ".trn")) {
System.out.println("Terrain: \"" + terrainName + "\" was not loaded: Terrain file not found.");
return FileVisitResult.CONTINUE;
}
SWGTerrain newTerrain = null;
String scriptPath = "";
if( file.getParent().equals(planets)) {
newTerrain = new Planet(terrainName);
scriptPath = planetFolder;
} else if(file.getParent().equals(space)) {
newTerrain = new SpaceSector(terrainName);
scriptPath = spaceFolder;
}
String stfName = STFTable.read("planet_n.stf").getValue(terrainName);
scripting.ScriptingManager.callScript(scriptPath, terrainName, "setup", newTerrain);
if (stfName != null) // If the name isn't in planet_n.stf, it will have to be set manually in the terrain script using setName()
newTerrain.setName(stfName);
else if (newTerrain.getName() == null) { // If the name isn't set in the script either, the terrain will not be created.
System.out.println("Terrain: \"" + terrainName + "\" was not loaded: Missing name.");
return FileVisitResult.CONTINUE;
}
terrainList.add(newTerrain);
return FileVisitResult.CONTINUE;
}
};
try {
Files.walkFileTree(planets, fv);
Files.walkFileTree(space, fv);
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean isPlanet(SWGTerrain terrain) {
for(SWGTerrain storedTerrain : terrainList)
if(storedTerrain.equals(terrain))
if(storedTerrain instanceof Planet)
return true;
return false;
}
public int getIndexForTerrain(SWGTerrain terrain) {
return terrainList.indexOf(terrain);
}
public SWGTerrain getTerrainForIndex(int index) {
return terrainList.get(index);
}
@Override
public void handlePackets(Map<Integer, PacketHandler> handlers) {
}
@Override
public void handleObjControllerPackets(Map<Integer, PacketHandler> handlers) {
}
}