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; }
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(); } }