private static ExtractedADTChunk ReadADTChunk(BinaryReader br)
        {
            var chunk = new ExtractedADTChunk
            {
                NodeId = br.ReadInt32(),
                IsFlat = br.ReadBoolean(),
                MedianHeight = br.ReadSingle(),
                M2References = br.ReadInt32List(),
                WMOReferences = br.ReadInt32List(),
                TerrainTris = br.ReadIndex3List(),
                HasLiquid = br.ReadBoolean()
                //HasHoles = br.ReadBoolean()
            };

            //if (chunk.HasHoles)
            //{
            //    ReadChunkHolesMap(br, chunk);
            //}

            //if (!chunk.IsFlat)
            //{
            //    ReadChunkHeightMap(br, chunk);
            //}

            if (!chunk.HasLiquid) return chunk;

            chunk.LiquidFlags = (MH2OFlags) br.ReadUInt16();
            chunk.LiquidType = (FluidType) br.ReadUInt16();
            chunk.IsLiquidFlat = br.ReadBoolean();
            chunk.MedianLiquidHeight1 = br.ReadSingle();
            chunk.MedianLiquidHeight2 = br.ReadSingle();

            if (chunk.LiquidFlags.HasFlag(MH2OFlags.Ocean)) return chunk;
            ReadChunkLiquidMap(br, chunk);

            if (chunk.IsLiquidFlat) return chunk;
            ReadChunkLiquidHeights(br, chunk);

            return chunk;
        }
 private static void ReadChunkLiquidHeights(BinaryReader br, ExtractedADTChunk chunk)
 {
     var liquidHeights = new float[TerrainConstants.UnitsPerChunkSide + 1, TerrainConstants.UnitsPerChunkSide + 1];
     for (var x = 0; x <= TerrainConstants.UnitsPerChunkSide + 1; x++)
     {
         for (var y = 0; y <= TerrainConstants.UnitsPerChunkSide + 1; y++)
         {
             liquidHeights[y, x] = br.ReadSingle();
         }
     }
     chunk.LiquidHeights = liquidHeights;
 }
 //private static void ReadChunkHolesMap(BinaryReader br, ExtractedADTChunk chunk)
 //{
 //    chunk.HolesMap = new bool[4,4];
 //    for (var x = 0; x < 4; x++)
 //    {
 //        for (var y = 0; y < 4; y++)
 //        {
 //            chunk.HolesMap[y, x] = br.ReadBoolean();
 //        }
 //    }
 //}
 //private static void ReadChunkHeightMap(BinaryReader br, ExtractedADTChunk chunk)
 //{
 //    var heightMap = new float[TerrainConstants.UnitsPerChunkSide + 1,TerrainConstants.UnitsPerChunkSide + 1];
 //    for (var x = 0; x < TerrainConstants.UnitsPerChunkSide + 1; x++)
 //    {
 //        for (var y = 0; y < TerrainConstants.UnitsPerChunkSide + 1; y++)
 //        {
 //            heightMap[y, x] = br.ReadSingle();
 //        }
 //    }
 //    chunk.HeightMap = heightMap;
 //}
 private static void ReadChunkLiquidMap(BinaryReader br, ExtractedADTChunk chunk)
 {
     var liquidMap = new bool[TerrainConstants.UnitsPerChunkSide, TerrainConstants.UnitsPerChunkSide];
     for (var x = 0; x < TerrainConstants.UnitsPerChunkSide; x++)
     {
         for (var y = 0; y < TerrainConstants.UnitsPerChunkSide; y++)
         {
             liquidMap[y, x] = br.ReadBoolean();
         }
     }
     chunk.LiquidMap = liquidMap;
 }
 private static void ReadADTChunks(BinaryReader br, ExtractedADT adt)
 {
     var chunks = new ExtractedADTChunk[TerrainConstants.ChunksPerTileSide, TerrainConstants.ChunksPerTileSide];
     for (var x = 0; x < TerrainConstants.ChunksPerTileSide; x++)
     {
         for (var y = 0; y < TerrainConstants.ChunksPerTileSide; y++)
         {
             chunks[y, x] = ReadADTChunk(br);
         }
     }
     adt.Chunks = chunks;
 }