mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-27 07:11:04 -04:00
Map: Add ReadDimensions method to map importers.
This commit is contained in:
parent
44ed2fd088
commit
cc6b9bc0bc
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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(),
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user