public void Save()
{
if (changed)
{
string path = "levels/" + name + ".lvl";
try
{
if (!Directory.Exists("levels")) { Directory.CreateDirectory("levels"); }
FileStream fs = File.Create(path);
GZipStream gs = new GZipStream(fs, CompressionMode.Compress);
byte[] header = new byte[16];
BitConverter.GetBytes(1874).CopyTo(header, 0);
gs.Write(header, 0, 2);
// Compile the header
BitConverter.GetBytes(width).CopyTo(header, 0);
BitConverter.GetBytes(height).CopyTo(header, 2);
BitConverter.GetBytes(depth).CopyTo(header, 4);
BitConverter.GetBytes(spawnx).CopyTo(header, 6);
BitConverter.GetBytes(spawnz).CopyTo(header, 8);
BitConverter.GetBytes(spawny).CopyTo(header, 10);
header[12] = rotx; header[13] = roty;
header[14] = (byte)permissionvisit;
header[15] = (byte)permissionbuild;
// Write the header
gs.Write(header, 0, header.Length);
// Get the block information
byte[] level = new byte[blocks.Length];
for (int i = 0; i < blocks.Length; ++i)
{
if (blocks[i] < 200)
{
level[i] = blocks[i];
}
else
{
level[i] = Block.SaveConvert(blocks[i]);
}
}
gs.Write(level, 0, level.Length);
gs.Close();
Logger.Log("SAVED: Map \"" + name + "\". " + Player.players.Count + "/" + Properties.MaxPlayers);
// Set changed to false as we've saved
// And backup to false because it now needs to be backed up!
changed = false;
backedup = false;
try
{
File.Copy(path, path + ".backup", true);
Logger.Log("And backed up");
}
catch (Exception e)
{
Logger.Log("Failed to make backup", LogType.Error);
Logger.Log(e.Message, LogType.ErrorMessage);
}
}
catch (Exception e)
{
Logger.Log("FAILED TO SAVE :" + name, LogType.Error);
Logger.Log(e.Message, LogType.ErrorMessage);
Player.GlobalMessage("FAILED TO SAVE :" + name);
return;
}
GC.Collect();
GC.WaitForPendingFinalizers();
}
}