@Override
  public void load() throws Exception {
    File file = Game.getInstance().getRelativeFile(Game.FILE_BASE_USER_DATA, "${world}/world.dat");

    if (!file.exists()) {
      System.err.println("No level data found! " + file.getPath());
      return;
    }

    DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));

    _world.setTime(dis.readFloat());

    _spawnPoint = new Vec3f();
    IOUtilities.readVec3f(dis, _spawnPoint);

    readDataPointList(dis, _rawHeights);
    readDataPointList(dis, _heights);
    readDataPointList(dis, _humidities);
    readDataPointList(dis, _temperatures);

    /* Tree Definitions */
    {
      int size = dis.readInt();
      for (int i = 0; i < size; ++i) {
        TreeDefinition dp2d = new TreeDefinition(0, 0, 0, 0);
        dp2d.x = dis.readInt();
        dp2d.y = dis.readInt();
        dp2d.z = dis.readInt();
        dp2d.type = dis.readByte();
      }
    }

    dis.close();
  }
  @Override
  public void save() throws Exception {
    File file = Game.getInstance().getRelativeFile(Game.FILE_BASE_USER_DATA, "${world}/world.dat");

    DataOutputStream dos =
        new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));

    dos.writeFloat(_world.getTime());

    IOUtilities.writeVec3f(dos, _spawnPoint);

    writeDataPointList(dos, _rawHeights);
    writeDataPointList(dos, _heights);
    writeDataPointList(dos, _humidities);
    writeDataPointList(dos, _temperatures);

    /* Tree Definitions */
    {
      dos.writeInt(_trees.size());
      for (int i = 0; i < _trees.size(); ++i) {
        TreeDefinition dp2d = _trees.get(i);
        dos.writeInt(dp2d.x);
        dos.writeInt(dp2d.y);
        dos.writeInt(dp2d.z);
        dos.writeByte(dp2d.type);
      }
    }

    dos.flush();
    dos.close();
  }