public static CachedChunk LoadChunk(WorldServer world, Vector3i chunkPos) { var region = ChunkToRegion(chunkPos); var regionFilename = Path.Combine(WorldFolder, RegionsFolder, GetRegionFilename(region)); var indexFile = new FileInfo(regionFilename + RegionIndexExt); var dataFile = new FileInfo(regionFilename + RegionDataExt); if (!indexFile.Exists || !dataFile.Exists) { return(null); } //Get chunk data position and length int chunkDataPosition, chunkDataLength; var chunkIndexPosition = GetChunkIndexPosition(chunkPos); lock (IndexLockObject) { var chunkIndexData = GetIndexData(region, indexFile); chunkDataPosition = BitConverter.ToInt32(chunkIndexData, chunkIndexPosition); chunkDataLength = BitConverter.ToInt32(chunkIndexData, chunkIndexPosition + sizeof(int)); } if (chunkDataPosition == IndexFileNull || chunkDataLength == IndexFileNull) { return(null); } //Read chunk data byte[] chunkData; lock (DataLockObject) { using (var reader = new BinaryReader(dataFile.OpenRead())) { reader.BaseStream.Seek(chunkDataPosition, SeekOrigin.Begin); chunkData = CompressionHelper.DecompressBytes(reader.ReadBytes(chunkDataLength)); } } using (var reader = new BinaryReader(new MemoryStream(chunkData))) { return(new CachedChunk(world, chunkPos, reader)); } }
private static byte[] GetIndexData(Vector3i region, FileInfo indexFile) { foreach (var cachedIndexData in CachedIndexDatas) { if (cachedIndexData.Item1 == region) { return(cachedIndexData.Item2); } } var data = CompressionHelper.DecompressBytes(File.ReadAllBytes(indexFile.FullName)); CachedIndexDatas.Add(new Tuple <Vector3i, byte[]>(region, data)); if (CachedIndexDatas.Count > MaxCachedIndexDatas) { CachedIndexDatas.RemoveAt(0); } return(data); }