/// <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); }
/// <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); }
/// <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}"); }
/// <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}"); }