public override void SaveChunk(Chunk cnk)
{
NbtFile c = new NbtFile(cnk.Filename);
c.RootTag = NewNBTChunk(cnk.Position.X, cnk.Position.Z);
NbtCompound Level = (NbtCompound)c.RootTag["Level"];
// BLOCKS /////////////////////////////////////////////////////
byte[] blocks = new byte[ChunkX * ChunkZ * ChunkY];
for (int x = 0; x < ChunkX; x++)
{
for (int y = 0; y < ChunkY; y++)
{
for (int z = 0; z < ChunkZ; z++)
{
blocks[GetBlockIndex(x, y, z)] = cnk.Blocks[x, y, z];
}
}
}
Level.Set("xPos", new NbtInt("xPos", (int)cnk.Position.X));
Level.Set("zPos", new NbtInt("zPos", (int)cnk.Position.Z));
Level.Set("Blocks", new NbtByteArray("Blocks", blocks));
blocks = null;
// LIGHTING ///////////////////////////////////////////////////
byte[] lighting = CompressLightmap(cnk.SkyLight,true);
Level.Set("SkyLight",new NbtByteArray("SkyLight", lighting));
lighting = CompressLightmap(cnk.BlockLight,false);
Level.Set("BlockLight",new NbtByteArray("BlockLight", lighting));
lighting = CompressDatamap(cnk.Data);
Level.Set("Data", new NbtByteArray("Data", lighting));
// HEIGHTMAP (Needed for lighting).
byte[] hm = new byte[256];
for (int x = 0; x < ChunkX; x++)
{
for (int z = 0; z < ChunkZ; z++)
{
hm[z << 4 | x] = (byte)(cnk.HeightMap[x, z] & 0xff); // idk
}
}
Level.Set("HeightMap", new NbtByteArray("HeightMap", hm));
NbtList ents = new NbtList("Entities");
// ENTITIES ///////////////////////////////////////////////////
foreach (KeyValuePair<Guid, Entity> ent in cnk.Entities)
{
ents.Add(ent.Value.ToNBT());
}
Level.Set("Entities",ents);
NbtList tents = new NbtList("TileEntities");
// TILE ENTITIES //////////////////////////////////////////////
foreach (KeyValuePair<Guid, TileEntity> tent in cnk.TileEntities)
{
tents.Add(tent.Value.ToNBT());
}
Level.Set("TileEntities",tents);
// Tick when last saved. But ticks are process associated...
Level.Set("LastUpdate", new NbtLong("LastUpdate", (long)Utils.UnixTimestamp()));
c.RootTag.Set("Level",Level);
c.SaveFile(GetChunkFilename((int)cnk.Position.X,(int)cnk.Position.Z));
// For debuggan
File.WriteAllText(cnk.Filename + ".txt", c.RootTag.ToString());
Cache.SaveChunkMetadata(cnk); // This is probably what lags.
}