public void writeToStream(DataOutput output) throws IOException {
   output.writeInt(dimension);
   output.writeInt(centerX);
   output.writeInt(centerZ);
   output.writeByte(scale);
   ByteUtils.writeVLI(output, layers.length);
   for (LayerData data : layers) data.writeToStream(output);
 }
 public void readFromStream(DataInput input) throws IOException {
   dimension = input.readInt();
   centerX = input.readInt();
   centerZ = input.readInt();
   scale = input.readByte();
   int length = ByteUtils.readVLI(input);
   layers = new LayerData[length];
   for (int i = 0; i < length; i++) {
     LayerData layer = new LayerData();
     layer.readFromStream(input);
     layers[i] = layer;
   }
 }
  @Override
  public void writeToNBT(NBTTagCompound tag) {
    tag.setInteger("Dimension", dimension);

    tag.setInteger("CenterX", centerX);
    tag.setInteger("CenterZ", centerZ);

    tag.setByte("Scale", scale);
    NBTTagList result = new NBTTagList();
    for (LayerData data : layers) {
      NBTTagCompound layerData = new NBTTagCompound();
      data.writeToNBT(layerData);
      result.appendTag(layerData);
    }
    tag.setTag("Layers", result);
  }
  @Override
  public void readFromNBT(NBTTagCompound tag) {
    dimension = tag.getInteger("Dimension");

    centerX = tag.getInteger("CenterX");
    centerZ = tag.getInteger("CenterZ");

    scale = tag.getByte("Scale");

    NBTTagList layersData = tag.getTagList("Layers", 10);
    int length = layersData.tagCount();
    layers = new LayerData[length];
    for (int i = 0; i < length; i++) {
      NBTTagCompound layerData = layersData.getCompoundTagAt(i);
      LayerData layer = new LayerData();
      layer.readFromNBT(layerData);
      layers[i] = layer;
    }
  }