コード例 #1
0
        public AreaFile ReadZoneData(byte[] data)
        {
            var areaFile = new AreaFile();

            using (var ms = new MemoryStream(data))
            {
                var buffer = new byte[4];

                ms.AssertAreaMagic();

                ms.Read(buffer, 0, buffer.Length);
                int version = BitConverter.ToInt32(buffer, 0);
                if (version != 0)
                {
                    throw new InvalidDataException("Not supported version of area format!");
                }

                ms.Seek(4, SeekOrigin.Current);
                //ms.Read(buffer, 0, buffer.Length);
                //uint dataLen = BitConverter.ToUInt32(buffer, 0);

                ms.Read(buffer, 0, buffer.Length);
                int layerCount = BitConverter.ToInt32(buffer, 0);

                for (int lc = 0; lc < layerCount; lc++)
                {
                    var areaList = new AreaColletion();

                    ms.Read(buffer, 0, buffer.Length);
                    int areasToRead = BitConverter.ToInt32(buffer, 0);

                    for (int a = 0; a < areasToRead; a++)
                    {
                        areaList.Add(ReadArea(ms));
                    }

                    areaFile.AreaManagers.Add(areaList);
                }
            }

            return(areaFile);
        }
コード例 #2
0
        private static void ProcessGrid(WritableMapFile map, IArchiveFileEntry grid, byte gridX, byte gridY)
        {
            // skip any low quality grids
            if (grid.FileName.Contains("_low", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            log.Info($"Processing {map.Asset} grid {gridX},{gridY}...");

            using (Stream stream = ArchiveManager.MainArchive.OpenFileStream(grid))
            {
                try
                {
                    var mapFileGrid = new WritableMapFileGrid(gridX, gridY);
                    var areaFile    = new AreaFile(stream);
                    foreach (IReadable areaChunk in areaFile.Chunks)
                    {
                        switch (areaChunk)
                        {
                        case Chnk chnk:
                        {
                            foreach (ChnkCell cell in chnk.Cells.Where(c => c != null))
                            {
                                mapFileGrid.AddCell(new WritableMapFileCell(cell));
                            }
                            break;
                        }
                        }
                    }

                    map.SetGrid(gridX, gridY, mapFileGrid);
                }
                catch (Exception e)
                {
                    log.Error(e);
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Generate a base map (.nfmap) file from supplied <see cref="WorldEntry"/>.
        /// </summary>
        private static void ProcessWorld(WorldEntry entry)
        {
            var mapFile = new WritableMapFile(Path.GetFileName(entry.AssetPath));

            log.Info($"Processing {mapFile.Asset}...");

            foreach (IArchiveFileEntry fileEntry in ArchiveManager.MainArchive.IndexFile.GetFiles(Path.Combine(entry.AssetPath, "*.*.area")))
            {
                // skip any low quality grids
                if (fileEntry.FileName.Contains("_low", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                Regex regex = new Regex(@"[\w]+\.([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})\.area");
                Match match = regex.Match(fileEntry.FileName);
                uint  x     = uint.Parse(match.Groups[1].Value, NumberStyles.HexNumber);
                uint  y     = uint.Parse(match.Groups[2].Value, NumberStyles.HexNumber);

                log.Info($"Processing {mapFile.Asset} grid {x},{y}...");

                using (Stream stream = ArchiveManager.MainArchive.OpenFileStream(fileEntry))
                {
                    try
                    {
                        var mapFileGrid = new WritableMapFileGrid(x, y);

                        var areaFile = new AreaFile(stream);
                        foreach (IReadable areaChunk in areaFile.Chunks)
                        {
                            switch (areaChunk)
                            {
                            case Chnk chnk:
                            {
                                foreach (ChnkCell cell in chnk.Cells.Where(c => c != null))
                                {
                                    var mapFileCell = new WritableMapFileCell(cell);
                                    mapFileGrid.AddCell(mapFileCell);
                                }
                                break;
                            }
                            }
                        }

                        mapFile.SetGrid(x, y, mapFileGrid);
                    }
                    catch (Exception e)
                    {
                        log.Error(e);
                    }
                }
            }

            if (!mapFile.Any())
            {
                log.Info($"Map {mapFile.Asset} has no grid information, skipping");
                return;
            }

            // Path.ChangeExtension(mapFile.Asset, "nfmap")
            // ChangeExtension doesn't behave correctly on linux
            string filePath = Path.Combine("map", $"{mapFile.Asset}.nfmap");

            using (FileStream stream = File.Create(filePath))
                using (var writer = new BinaryWriter(stream))
                {
                    mapFile.Write(writer);
                }
        }
コード例 #4
0
        protected byte[] CreateAreaSubFile(AreaFile file)
        {
            using (var ms = new MemoryStream())
            {
                ms.WriteAreaMagic();
                ms.Write(BitConverter.GetBytes(AreaFileVersion), 0, 4);

                // Seek size part, needs to be written as we know.
                ms.Seek(4, SeekOrigin.Current);

                ms.Write(BitConverter.GetBytes(file.AreaManagers.Count), 0, 4);

                foreach (var areaManager in file.AreaManagers)
                {
                    ms.Write(BitConverter.GetBytes(areaManager.Count), 0, 4);

                    foreach (var area in areaManager)
                    {
                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(AreaPartVersion), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Id), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Name.Length), 0, 4);
                        var nameBuffer = Encoding.UTF8.GetBytes(area.Name);
                        ms.Write(nameBuffer, 0, nameBuffer.Length);
                        ms.Seek(Util.Utils.RoundToNextDivBy4(nameBuffer.Length) - nameBuffer.Length, SeekOrigin.Current);

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes((float)area.AttachmentPoint.X), 0, 4);
                        ms.Write(BitConverter.GetBytes((float)area.AttachmentPoint.Y), 0, 4);
                        ms.Write(BitConverter.GetBytes((float)area.AttachmentPoint.Z), 0, 4);

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(area.Content.ClippedAreas.Count), 0, 4);
                        foreach (var clippedArea in area.Content.ClippedAreas)
                        {
                            ms.Write(BitConverter.GetBytes(clippedArea.StartTriangle), 0, 4);
                            ms.Write(BitConverter.GetBytes(clippedArea.TriangleCount), 0, 4);
                            ms.Write(BitConverter.GetBytes(clippedArea.StartVertex), 0, 4);
                            ms.Write(BitConverter.GetBytes(clippedArea.VertexCount), 0, 4);
                        }

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(area.Content.BorderTriangle.StartTriangle), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.BorderTriangle.TriangleCount), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.BorderTriangle.StartVertex), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.BorderTriangle.VertexCount), 0, 4);

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(area.Content.BorderVertex.StartVertex), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.BorderVertex.VertexCount), 0, 4);

                        ms.WriteAreaMagic();
                        ms.Write(BitConverter.GetBytes(area.Content.Vertices.Count), 0, 4);
                        ms.Write(BitConverter.GetBytes(area.Content.Triangles.Count), 0, 4);
                        foreach (var vertex in area.Content.Vertices)
                        {
                            ms.Write(BitConverter.GetBytes(vertex.X), 0, 4);
                            ms.Write(BitConverter.GetBytes(vertex.Y), 0, 4);
                            ms.Write(BitConverter.GetBytes(vertex.Z), 0, 4);
                            ms.Write(BitConverter.GetBytes(vertex.W), 0, 4);
                            ms.Write(BitConverter.GetBytes(vertex.Center), 0, 4);
                        }

                        ms.WriteAreaMagic();
                        foreach (var triangle in area.Content.Triangles)
                        {
                            ms.Write(BitConverter.GetBytes(triangle.Point1), 0, 4);
                            ms.Write(BitConverter.GetBytes(triangle.Point2), 0, 4);
                            ms.Write(BitConverter.GetBytes(triangle.Point3), 0, 4);
                        }

                        ms.WriteAreaMagic();
                        ms.Seek(4, SeekOrigin.Current);
                        ms.WriteAreaMagic();

                        ms.Write(BitConverter.GetBytes(809782853), 0, 4);
                    }
                }

                ms.Seek(8, SeekOrigin.Begin);
                ms.Write(BitConverter.GetBytes((uint)(ms.Length - 12)), 0, 4);

                return(ms.ToArray());
            }
        }