Пример #1
0
        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));
            }
        }
Пример #2
0
        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);
        }