Пример #1
0
        /// <summary>
        /// Attempts to load all tiles within a map window.
        /// </summary>
        /// <param name="window">The parameters to for the window to load.</param>
        /// <returns>A collection of <see cref="ITile"/>s loaded.</returns>
        public IEnumerable <ITile> Load(IMapWindowDimensions window)
        {
            window.ThrowIfNull(nameof(window));

            if (window.FromZ != 7)
            {
                return(Enumerable.Empty <ITile>());
            }

            var tiles = new List <ITile>();

            for (int x = window.FromX; x <= window.ToX; x++)
            {
                for (int y = window.FromY; y <= window.ToY; y++)
                {
                    var groundItem = this.itemFactory.CreateItem(ItemCreationArguments.WithTypeId(GrassTypeId));

                    var location = new Location()
                    {
                        X = x, Y = y, Z = window.FromZ
                    };
                    var newTile = this.tileFactory.CreateTile(location, groundItem);

                    tiles.Add(newTile);
                }
            }

            return(tiles);
        }
Пример #2
0
        /// <summary>
        /// Attempts to load all tiles within a map window.
        /// </summary>
        /// <param name="window">The parameters to for the window to load.</param>
        /// <returns>A collection of <see cref="ITile"/>s loaded.</returns>
        public IEnumerable <ITile> Load(IMapWindowDimensions window)
        {
            var fromSectorX = window.FromX / SquareSectorSize;
            var toSectorX   = window.ToX / SquareSectorSize;
            var fromSectorY = window.FromY / SquareSectorSize;
            var toSectorY   = window.ToY / SquareSectorSize;

            if (toSectorX < fromSectorX || toSectorY < fromSectorY || window.ToZ < window.FromZ ||
                fromSectorX < SectorXMin || toSectorX > SectorXMax ||
                fromSectorY < SectorYMin || toSectorY > SectorYMax ||
                window.FromZ < SectorZMin || window.ToZ > SectorZMax)
            {
                throw new InvalidOperationException("Bad range supplied.");
            }

            var tiles = new List <ITile>();

            this.totalTileCount   = (toSectorX - fromSectorX + 1) * SquareSectorSize * (toSectorY - fromSectorY + 1) * SquareSectorSize * (window.ToZ - window.FromZ + 1);
            this.totalLoadedCount = default;

            lock (this.loadLock)
            {
                for (int sectorZ = window.FromZ; sectorZ <= window.ToZ; sectorZ++)
                {
                    Parallel.For(fromSectorY, toSectorY + 1, sectorY =>
                    {
                        Parallel.For(fromSectorX, toSectorX + 1, sectorX =>
                        {
                            var sectorFileName = $"{sectorX:0000}-{sectorY:0000}-{sectorZ:00}.sec";

                            var fullFilePath   = Path.Combine(this.mapDirInfo.FullName, sectorFileName);
                            var sectorFileInfo = new FileInfo(fullFilePath);

                            if (sectorFileInfo.Exists)
                            {
                                using var streamReader = sectorFileInfo.OpenText();

                                var loadedTiles = this.ReadSector(sectorFileName, streamReader.ReadToEnd(), (ushort)(sectorX * SquareSectorSize), (ushort)(sectorY * SquareSectorSize), (sbyte)sectorZ);

                                tiles.AddRange(loadedTiles);
                            }

                            // 1024 per sector file, regardless if there is a tile or not...
                            Interlocked.Add(ref this.totalLoadedCount, 1024);

                            this.sectorsLoaded[sectorX - SectorXMin, sectorY - SectorYMin, sectorZ - SectorZMin] = true;

                            this.logger.LogDebug($"Loaded sector {sectorFileName} [{this.totalLoadedCount} out of {this.totalTileCount}].");
                        });
                    });
                }
            }

            this.totalLoadedCount = this.totalTileCount;

            return(tiles);
        }
Пример #3
0
        /// <summary>
        /// Computes a hash string using the given window parameters.
        /// </summary>
        /// <param name="dimensions">The dimensions to compute the hash with.</param>
        /// <returns>A hash represented by a string.</returns>
        public string GetLoadHash(IMapWindowDimensions dimensions)
        {
            var convertToSector = dimensions.FromX > SectorXMax;

            var probeX = convertToSector ? (dimensions.FromX / SquareSectorSize) - SectorXMin : dimensions.FromX - SectorXMin;
            var probeY = convertToSector ? (dimensions.FromY / SquareSectorSize) - SectorYMin : dimensions.FromY - SectorYMin;
            var probeZ = dimensions.FromZ - SectorZMin;

            return($"{probeX}:{probeY}:{probeZ}");
        }
Пример #4
0
 /// <summary>
 /// Computes a hash string using the given window parameters.
 /// </summary>
 /// <param name="dimensions">The dimensions to compute the hash with.</param>
 /// <returns>A hash represented by a string.</returns>
 public string GetLoadHash(IMapWindowDimensions dimensions)
 {
     return($"{dimensions.FromX}:{dimensions.FromY}:{dimensions.FromZ}");
 }