Map: Add ReadDimensions method to map importers.

This commit is contained in:
UnknownShadow200 2016-11-23 16:41:31 +11:00
parent 44ed2fd088
commit cc6b9bc0bc
5 changed files with 53 additions and 26 deletions

View File

@ -44,6 +44,7 @@ namespace MCGalaxy.DB {
void DumpRow(IDataReader reader) { void DumpRow(IDataReader reader) {
if (stream == null) { if (stream == null) {
stream = File.Create("blockdefs/" + mapName + ".dump"); stream = File.Create("blockdefs/" + mapName + ".dump");
Vec3U16 dims = L
} }
string user = reader.GetString(0); string user = reader.GetString(0);

View File

@ -25,16 +25,15 @@ namespace MCGalaxy.Levels.IO {
public override string Extension { get { return ".fcm"; } } public override string Extension { get { return ".fcm"; } }
public override Level Read(Stream src, string name, bool metadata) { public override Vec3U16 ReadDimensions(Stream src) {
BinaryReader reader = new BinaryReader(src); BinaryReader reader = new BinaryReader(src);
if (reader.ReadInt32() != 0x0FC2AF40 || reader.ReadByte() != 13) { return ReadDimensions(reader);
throw new InvalidDataException( "Unexpected constant in .fcm file" );
} }
ushort width = reader.ReadUInt16(); public override Level Read(Stream src, string name, bool metadata) {
ushort height = reader.ReadUInt16(); BinaryReader reader = new BinaryReader(src);
ushort length = reader.ReadUInt16(); Vec3U16 dims = ReadDimensions(reader);
Level lvl = new Level(name, width, height, length); Level lvl = new Level(name, dims.X, dims.Y, dims.Z);
lvl.spawnx = (ushort)(reader.ReadInt32() / 32); lvl.spawnx = (ushort)(reader.ReadInt32() / 32);
lvl.spawny = (ushort)(reader.ReadInt32() / 32); lvl.spawny = (ushort)(reader.ReadInt32() / 32);
@ -61,6 +60,19 @@ namespace MCGalaxy.Levels.IO {
return lvl; 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) { static string ReadString(BinaryReader reader) {
int length = reader.ReadUInt16(); int length = reader.ReadUInt16();
byte[] data = reader.ReadBytes(length); byte[] data = reader.ReadBytes(length);

View File

@ -27,12 +27,11 @@ namespace MCGalaxy.Levels.IO {
public override string Extension { get { return ".lvl"; } } public override string Extension { get { return ".lvl"; } }
public static void LoadDimensions(string file, out ushort width, out ushort height, out ushort length) { public override Vec3U16 ReadDimensions(Stream src) {
using (Stream fs = File.OpenRead(file), gs = new GZipStream(fs, CompressionMode.Decompress, true)) { using (Stream gs = new GZipStream(src, CompressionMode.Decompress, true)) {
byte[] header = new byte[16]; byte[] header = new byte[16];
int offset = 0; int offset = 0;
Vec3U16 dims = ReadHeader(gs, header, out offset); return ReadHeader(gs, header, out offset);
width = dims.X; height = dims.Y; length = dims.Z;
} }
} }

View File

@ -28,24 +28,23 @@ namespace MCGalaxy.Levels.IO {
public override string Extension { get { return ".mcf"; } } 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) { public override Level Read(Stream src, string name, bool metadata) {
using (Stream gs = new GZipStream(src, CompressionMode.Decompress)) { using (Stream gs = new GZipStream(src, CompressionMode.Decompress)) {
byte[] header = new byte[16]; byte[] header = new byte[16];
gs.Read(header, 0, 2); Vec3U16 dims = ReadHeader(header, gs);
if (BitConverter.ToUInt16(header, 0) != 1874)
throw new InvalidDataException(".mcf files must have a version of 1874");
gs.Read(header, 0, 16); Level lvl = new Level(name, dims.X, dims.Y, dims.Z);
ushort width = BitConverter.ToUInt16(header, 0);
ushort length = BitConverter.ToUInt16(header, 2);
ushort height = BitConverter.ToUInt16(header, 4);
Level lvl = new Level(name, width, height, length);
lvl.spawnx = BitConverter.ToUInt16(header, 6); lvl.spawnx = BitConverter.ToUInt16(header, 6);
lvl.spawnz = BitConverter.ToUInt16(header, 8); lvl.spawnz = BitConverter.ToUInt16(header, 8);
lvl.spawny = BitConverter.ToUInt16(header, 10); lvl.spawny = BitConverter.ToUInt16(header, 10);
lvl.rotx = header[12]; lvl.rotx = header[12]; lvl.roty = header[13];
lvl.roty = header[13];
// 2 bytes for perbuild and pervisit // 2 bytes for perbuild and pervisit
byte[] blocks = new byte[2 * lvl.blocks.Length]; byte[] blocks = new byte[2 * lvl.blocks.Length];
@ -55,5 +54,18 @@ namespace MCGalaxy.Levels.IO {
return lvl; 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;
}
} }
} }

View File

@ -39,6 +39,9 @@ namespace MCGalaxy.Levels.IO {
/// <param name="metadata"> Whether metadata should be loaded. </param> /// <param name="metadata"> Whether metadata should be loaded. </param>
public abstract Level Read(Stream src, string name, bool metadata); public abstract Level Read(Stream src, string name, bool metadata);
/// <summary> Reads the dimensions for a level from a file containing data encoded in this format. </summary>
public abstract Vec3U16 ReadDimensions(Stream src);
public static List<IMapImporter> Formats = new List<IMapImporter>() { public static List<IMapImporter> Formats = new List<IMapImporter>() {
new LvlImporter(), new CwImporter(), new FcmImporter(), new McfImporter(), new DatImporter(), new LvlImporter(), new CwImporter(), new FcmImporter(), new McfImporter(), new DatImporter(),
}; };