package clientdata.visitors; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; import java.util.Vector; import org.apache.mina.core.buffer.IoBuffer; import clientdata.VisitorInterface; public class WorldSnapshotVisitor implements VisitorInterface { private Map<Integer, String> names = new HashMap<Integer, String>(); private Vector<SnapshotChunk> chunks = new Vector<SnapshotChunk>(); @Override public void parseData(String nodename, IoBuffer data, int depth, int size) throws Exception { if(nodename.equals("OTNL")) { int counter = data.getInt(); //System.out.println(counter); for(int i = 0; i < counter; i++) { names.put(i, data.getString(Charset.forName("US-ASCII").newDecoder())); //System.out.println(names.get(i)); } } else if(nodename.equals("0000DATA")) { SnapshotChunk chunk = new SnapshotChunk(); chunk.id = data.getInt(); chunk.parentId = data.getInt(); chunk.nameId = data.getInt(); chunk.cellNumber = data.getInt(); chunk.orientationW = data.getFloat(); chunk.orientationX = data.getFloat(); chunk.orientationY = data.getFloat(); chunk.orientationZ = data.getFloat(); chunk.xPosition = data.getFloat(); chunk.yPosition = data.getFloat(); // IMPORTANT: This uses SWG's weird coordinate system where y is height! chunk.zPosition = data.getFloat(); chunk.gameObjectType = data.getInt(); // could also be something else but the ints are consistent for same object types chunk.PortalCRC = data.getInt(); // CRC to the .pob File of the object, used for interiors of buildings/structures chunks.add(chunk); } else { System.out.println("Error: Unhandled World Snapshot Chunk!"); } } public String getName(int nameId) { return names.get(nameId); } public Vector<SnapshotChunk> getChunks() { return chunks; } public void dispose() { names = null; chunks = null; } @Override public void notifyFolder(String nodeName, int depth) throws Exception { // TODO Auto-generated method stub } public class SnapshotChunk { public int id; public int parentId; public int nameId; public int cellNumber; public float orientationX; public float orientationY; public float orientationZ; public float orientationW; public float xPosition; public float yPosition; public float zPosition; public int gameObjectType; public int PortalCRC; } public float getHeight(float x, float z) { // TODO Auto-generated method stub return 1; } public boolean isWater(float x, float z) { // TODO Auto-generated method stub return false; } }