mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-25 14:17:29 -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) {
|
||||
if (stream == null) {
|
||||
stream = File.Create("blockdefs/" + mapName + ".dump");
|
||||
Vec3U16 dims = L
|
||||
}
|
||||
|
||||
string user = reader.GetString(0);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user