OpenMinecraft.InfdevHandler.SaveChunk C# (CSharp) Method

SaveChunk() public method

public SaveChunk ( Chunk cnk ) : void
cnk Chunk
return void
		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.
        }

Same methods

InfdevHandler::SaveChunk ( int x, int z ) : void