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) {
if (stream == null) {
stream = File.Create("blockdefs/" + mapName + ".dump");
Vec3U16 dims = L
}
string user = reader.GetString(0);

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}
}
}

View File

@ -38,9 +38,12 @@ namespace MCGalaxy.Levels.IO {
/// <summary> Reads the data for a level from a file containing data encoded in this format. </summary>
/// <param name="metadata"> Whether metadata should be loaded. </param>
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>() {
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) {