static void ParseRootObject(Level lvl, JObject obj) { JFieldDesc[] fields = obj.Desc.Fields; object[] values = obj.ClassData[0].Values; for (int i = 0; i < fields.Length; i++) { JFieldDesc f = fields[i]; object value = values[i]; // yes height/depth are swapped intentionally if (f.Name == "width") { lvl.Width = U16(value); } if (f.Name == "height") { lvl.Length = U16(value); } if (f.Name == "depth") { lvl.Height = U16(value); } if (f.Name == "blocks") { lvl.blocks = (byte[])((JArray)value).Values; } if (f.Name == "xSpawn") { lvl.spawnx = U16(value); } if (f.Name == "ySpawn") { lvl.spawny = U16(value); } if (f.Name == "zSpawn") { lvl.spawnz = U16(value); } } }
static JFieldDesc FieldDesc(DatReader r) { JFieldDesc desc = new JFieldDesc(); byte type = r.ReadUInt8(); desc.Type = (char)type; if (type == 'B' || type == 'C' || type == 'D' || type == 'F' || type == 'I' || type == 'J' || type == 'S' || type == 'Z') { desc.Name = r.ReadUtf8(); } else if (type == '[' || type == 'L') { desc.Name = r.ReadUtf8(); desc.ClassName = (string)ReadObject(r); } else { throw new InvalidDataException("Invalid field type: " + type); } return(desc); }
public byte[] Load(Stream stream, Game game, out int width, out int height, out int length) { byte[] map = null; width = 0; height = 0; length = 0; GZipHeaderReader gzHeader = new GZipHeaderReader(); while (!gzHeader.ReadHeader(stream)) { } LocalPlayer p = game.LocalPlayer; p.Spawn = Vector3.Zero; using (DeflateStream s = new DeflateStream(stream)) { reader = new BinaryReader(s); if (ReadInt32() != 0x271BB788 || reader.ReadByte() != 0x02) { throw new InvalidDataException("Unexpected constant in .dat file"); } JObject obj = (JObject)ReadStream(); JFieldDesc[] fields = obj.Desc.Info.Fields; object[] values = obj.ClassData[0].Values; for (int i = 0; i < fields.Length; i++) { JFieldDesc field = fields[i]; object value = values[i]; if (field.Name == "width") { width = (int)value; } else if (field.Name == "height") { length = (int)value; } else if (field.Name == "depth") { height = (int)value; } else if (field.Name == "blocks") { map = (byte[])((JArray)value).Values; } else if (field.Name == "xSpawn") { p.Spawn.X = (int)value; } else if (field.Name == "ySpawn") { p.Spawn.Y = (int)value; } else if (field.Name == "zSpawn") { p.Spawn.Z = (int)value; } } } return(map); }