From cc6b9bc0bc39f00324ba6770c56c80cdf450279a Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 23 Nov 2016 16:41:31 +1100 Subject: [PATCH] Map: Add ReadDimensions method to map importers. --- MCGalaxy/Database/BlockDB/DBExporter.cs | 1 + MCGalaxy/Levels/IO/Importers/FcmImporter.cs | 28 +++++++++++----- MCGalaxy/Levels/IO/Importers/LvlImporter.cs | 9 +++--- MCGalaxy/Levels/IO/Importers/McfImporter.cs | 36 ++++++++++++++------- MCGalaxy/Levels/IO/MapFormats.cs | 5 ++- 5 files changed, 53 insertions(+), 26 deletions(-) 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) {