diff --git a/MCGalaxy/Database/BlockDB/DBExporter.cs b/MCGalaxy/Database/BlockDB/DBExporter.cs
index b9ced32de..a10e34081 100644
--- a/MCGalaxy/Database/BlockDB/DBExporter.cs
+++ b/MCGalaxy/Database/BlockDB/DBExporter.cs
@@ -44,6 +44,7 @@ namespace MCGalaxy.DB {
void DumpRow(IDataReader reader) {
if (stream == null) {
stream = File.Create("blockdefs/" + mapName + ".dump");
+ Vec3U16 dims = L
}
string user = reader.GetString(0);
diff --git a/MCGalaxy/Levels/IO/Importers/FcmImporter.cs b/MCGalaxy/Levels/IO/Importers/FcmImporter.cs
index 35ef82295..5d4e3dd8e 100644
--- a/MCGalaxy/Levels/IO/Importers/FcmImporter.cs
+++ b/MCGalaxy/Levels/IO/Importers/FcmImporter.cs
@@ -25,16 +25,15 @@ namespace MCGalaxy.Levels.IO {
public override string Extension { get { return ".fcm"; } }
+ public override Vec3U16 ReadDimensions(Stream src) {
+ BinaryReader reader = new BinaryReader(src);
+ return ReadDimensions(reader);
+ }
+
public override Level Read(Stream src, string name, bool metadata) {
BinaryReader reader = new BinaryReader(src);
- if (reader.ReadInt32() != 0x0FC2AF40 || reader.ReadByte() != 13) {
- throw new InvalidDataException( "Unexpected constant in .fcm file" );
- }
-
- ushort width = reader.ReadUInt16();
- ushort height = reader.ReadUInt16();
- ushort length = reader.ReadUInt16();
- Level lvl = new Level(name, width, height, length);
+ Vec3U16 dims = ReadDimensions(reader);
+ Level lvl = new Level(name, dims.X, dims.Y, dims.Z);
lvl.spawnx = (ushort)(reader.ReadInt32() / 32);
lvl.spawny = (ushort)(reader.ReadInt32() / 32);
@@ -61,6 +60,19 @@ namespace MCGalaxy.Levels.IO {
return lvl;
}
+ static Vec3U16 ReadDimensions(BinaryReader reader) {
+ BinaryReader reader = new BinaryReader(src);
+ if (reader.ReadInt32() != 0x0FC2AF40 || reader.ReadByte() != 13) {
+ throw new InvalidDataException( "Unexpected constant in .fcm file" );
+ }
+
+ Vec3U16 dims;
+ dims.X = reader.ReadUInt16();
+ dims.Y = reader.ReadUInt16();
+ dims.Z = reader.ReadUInt16();
+ return dims;
+ }
+
static string ReadString(BinaryReader reader) {
int length = reader.ReadUInt16();
byte[] data = reader.ReadBytes(length);
diff --git a/MCGalaxy/Levels/IO/Importers/LvlImporter.cs b/MCGalaxy/Levels/IO/Importers/LvlImporter.cs
index 45e2efce5..86a90d0da 100644
--- a/MCGalaxy/Levels/IO/Importers/LvlImporter.cs
+++ b/MCGalaxy/Levels/IO/Importers/LvlImporter.cs
@@ -27,12 +27,11 @@ namespace MCGalaxy.Levels.IO {
public override string Extension { get { return ".lvl"; } }
- public static void LoadDimensions(string file, out ushort width, out ushort height, out ushort length) {
- using (Stream fs = File.OpenRead(file), gs = new GZipStream(fs, CompressionMode.Decompress, true)) {
+ public override Vec3U16 ReadDimensions(Stream src) {
+ using (Stream gs = new GZipStream(src, CompressionMode.Decompress, true)) {
byte[] header = new byte[16];
int offset = 0;
- Vec3U16 dims = ReadHeader(gs, header, out offset);
- width = dims.X; height = dims.Y; length = dims.Z;
+ return ReadHeader(gs, header, out offset);
}
}
@@ -52,7 +51,7 @@ namespace MCGalaxy.Levels.IO {
gs.Read(lvl.blocks, 0, lvl.blocks.Length);
ReadBlockDefsSection(lvl, gs);
- if (!metadata) return lvl;
+ if (!metadata) return lvl;
ReadPhysicsSection(lvl, gs);
return lvl;
}
diff --git a/MCGalaxy/Levels/IO/Importers/McfImporter.cs b/MCGalaxy/Levels/IO/Importers/McfImporter.cs
index a1173f433..4964194a4 100644
--- a/MCGalaxy/Levels/IO/Importers/McfImporter.cs
+++ b/MCGalaxy/Levels/IO/Importers/McfImporter.cs
@@ -27,25 +27,24 @@ namespace MCGalaxy.Levels.IO {
public sealed class McfImporter : IMapImporter {
public override string Extension { get { return ".mcf"; } }
+
+ public override Vec3U16 ReadDimensions(Stream src) {
+ using (Stream gs = new GZipStream(src, CompressionMode.Decompress, true)) {
+ byte[] header = new byte[16];
+ return ReadHeader(gs, header);
+ }
+ }
public override Level Read(Stream src, string name, bool metadata) {
using (Stream gs = new GZipStream(src, CompressionMode.Decompress)) {
byte[] header = new byte[16];
- gs.Read(header, 0, 2);
- if (BitConverter.ToUInt16(header, 0) != 1874)
- throw new InvalidDataException(".mcf files must have a version of 1874");
-
- gs.Read(header, 0, 16);
- ushort width = BitConverter.ToUInt16(header, 0);
- ushort length = BitConverter.ToUInt16(header, 2);
- ushort height = BitConverter.ToUInt16(header, 4);
+ Vec3U16 dims = ReadHeader(header, gs);
- Level lvl = new Level(name, width, height, length);
+ Level lvl = new Level(name, dims.X, dims.Y, dims.Z);
lvl.spawnx = BitConverter.ToUInt16(header, 6);
lvl.spawnz = BitConverter.ToUInt16(header, 8);
lvl.spawny = BitConverter.ToUInt16(header, 10);
- lvl.rotx = header[12];
- lvl.roty = header[13];
+ lvl.rotx = header[12]; lvl.roty = header[13];
// 2 bytes for perbuild and pervisit
byte[] blocks = new byte[2 * lvl.blocks.Length];
@@ -53,7 +52,20 @@ namespace MCGalaxy.Levels.IO {
for (int i = 0; i < blocks.Length / 2; ++i)
lvl.blocks[i] = blocks[i * 2];
return lvl;
- }
+ }
+ }
+
+ static Vec3U16 ReadHeader(byte[] header, Stream gs) {
+ gs.Read(header, 0, 2);
+ if (BitConverter.ToUInt16(header, 0) != 1874)
+ throw new InvalidDataException(".mcf files must have a version of 1874");
+
+ gs.Read(header, 0, 16);
+ Vec3U16 dims;
+ dims.X = BitConverter.ToUInt16(header, 0);
+ dims.Z = BitConverter.ToUInt16(header, 2);
+ dims.Y = BitConverter.ToUInt16(header, 4);
+ return dims;
}
}
}
\ No newline at end of file
diff --git a/MCGalaxy/Levels/IO/MapFormats.cs b/MCGalaxy/Levels/IO/MapFormats.cs
index 66cba65dc..f40cebb71 100644
--- a/MCGalaxy/Levels/IO/MapFormats.cs
+++ b/MCGalaxy/Levels/IO/MapFormats.cs
@@ -38,9 +38,12 @@ namespace MCGalaxy.Levels.IO {
/// Reads the data for a level from a file containing data encoded in this format.
/// Whether metadata should be loaded.
public abstract Level Read(Stream src, string name, bool metadata);
+
+ /// Reads the dimensions for a level from a file containing data encoded in this format.
+ public abstract Vec3U16 ReadDimensions(Stream src);
public static List Formats = new List() {
- new LvlImporter(), new CwImporter(), new FcmImporter(), new McfImporter(), new DatImporter(),
+ new LvlImporter(), new CwImporter(), new FcmImporter(), new McfImporter(), new DatImporter(),
};
protected void ConvertCustom(Level lvl) {