public NbtNode Read(int x, int z) { lock (this) { MoveToHeaderPosition(x, z); var index = _filePointer.ReadInt32(); if (index == 0) { return(null); // Not yet generated } int usedSectors = index & 0xFF; int sectorOffset = index >> 8; _filePointer.Seek(sectorOffset * 4096, SeekOrigin.Begin); int chunkLength = _filePointer.ReadInt32(); if (chunkLength == -1) { return(null); // Not yet generated } byte compressionMode = _filePointer.ReadByte(); MemoryStream decompressStream; if (compressionMode == 0) { } if (compressionMode == 1) { byte[] buffer = new byte[chunkLength]; _filePointer.Read(buffer, 0, buffer.Length); buffer = Decompress(buffer); decompressStream = new MemoryStream(buffer); } else { byte[] buffer = new byte[chunkLength]; _filePointer.Read(buffer, 0, buffer.Length); var def = new Inflater(); decompressStream = new MemoryStream(); def.setInput(buffer); int i = 0; buffer = new byte[1024 * 1024]; try { while (!def.finished() && (i = def.inflate(buffer)) > 0) { decompressStream.Write(buffer, 0, i); } } catch { return(null); } decompressStream.Seek(0, SeekOrigin.Begin); } return(new NbtReader().ReadNbtFile(decompressStream)); } }
private object ReadRaw(BigEndianStream zipped, byte tagId) { switch (tagId) { case 1: return(zipped.ReadByte()); case 2: return(zipped.ReadInt16()); case 3: return(zipped.ReadInt32()); case 4: return(zipped.ReadInt64()); case 5: return(zipped.ReadSingle()); case 6: return(zipped.ReadDouble()); case 10: var subNodes = new List <NbtNode>(); NbtNode subNode; while ((subNode = ReadNode(zipped)).Type != 0) { subNodes.Add(subNode); } return(subNodes); } throw new Exception(); }
private int FindFreeSector(int usedSectors) { var sectors = new List <int>(); for (int i = 0; i < 32 * 16 * 32; i++) { _filePointer.Seek(2 + i * sizeof(int), SeekOrigin.Begin); int sectorInfo = _filePointer.ReadInt32(); if (sectorInfo != 0) { sectors.Add(sectorInfo); } } if (!sectors.Contains(0)) { sectors.Add(0); } sectors.Sort(); int tail = int.MaxValue; for (int i = 0; i < sectors.Count; i++) { int num = sectors[i]; int usedS = num & 0x1FF; int sectorOffset = num >> 9; if (sectorOffset - tail >= usedSectors) { //Found a piece of memory which is big enough return(tail); } tail = sectorOffset + usedS; } return(tail); }
private NbtNode ReadNode(BigEndianStream zipped) { byte type = (byte)zipped.ReadByte(); NbtNode node = null; switch (type) { case 0: return(new NbtStop()); case 1: node = new NbtByte { Name = zipped.ReadString8(), Value = zipped.ReadByte() }; break; case 2: node = new NbtShort { Name = zipped.ReadString8(), Value = zipped.ReadInt16() }; break; case 3: node = new NbtInt { Name = zipped.ReadString8(), Value = zipped.ReadInt32() }; break; case 4: node = new NbtLong { Name = zipped.ReadString8(), Value = zipped.ReadInt64() }; break; case 5: node = new NbtFloat { Name = zipped.ReadString8(), Value = zipped.ReadSingle() }; break; case 6: node = new NbtDouble { Name = zipped.ReadString8(), Value = zipped.ReadDouble() }; break; case 7: node = new NbtBytes { Name = zipped.ReadString8(), Value = zipped.ReadBytes(zipped.ReadInt32()) }; break; case 8: node = new NbtString { Name = zipped.ReadString8(), Value = zipped.ReadString8() }; break; case 9: node = new NbtList(); ((NbtList)node).Name = zipped.ReadString8(); ((NbtList)node).Childs = new List <object>(); byte tagId = zipped.ReadByte(); ((NbtList)node).TagId = tagId; int length = zipped.ReadInt32(); for (int i = 0; i < length; i++) { ((NbtList)node).Childs.Add(ReadRaw(zipped, tagId)); } break; case 10: node = new NbtCompound(); ((NbtCompound)node).Name = zipped.ReadString8(); ((NbtCompound)node).Childs = new List <NbtNode>(); NbtNode subNode; while ((subNode = ReadNode(zipped)).Type != 0) { ((NbtCompound)node).Childs.Add(subNode); } break; case 11: node = new NbtInts { Name = zipped.ReadString8(), Value = ByteToIntArray(zipped.ReadBytes(zipped.ReadInt32() * sizeof(int))) }; break; } //string str = zipped.ReadString8(100); if (node == null) { throw new Exception(); } return(node); }