Ejemplo n.º 1
0
        private MOTX[] ReadMOTXChunk(uint size, BinaryReader bin)
        {
            //List of BLP filenames
            var           blpFilesChunk = bin.ReadBytes((int)size);
            List <String> blpFiles      = new List <string>();
            List <int>    blpOffset     = new List <int>();
            var           str           = new StringBuilder();

            var buildingString = false;

            for (var i = 0; i < blpFilesChunk.Length; i++)
            {
                if (blpFilesChunk[i] == '\0')
                {
                    if (buildingString)
                    {
                        str.Replace("..", ".");
                        blpFiles.Add(str.ToString());
                        blpOffset.Add(i - str.ToString().Length);
                    }
                    buildingString = false;
                    str            = new StringBuilder();
                }
                else
                {
                    buildingString = true;
                    str.Append((char)blpFilesChunk[i]);
                }
            }

            var textures = new MOTX[blpFiles.Count];

            for (var i = 0; i < blpFiles.Count; i++)
            {
                textures[i].filename    = blpFiles[i];
                textures[i].startOffset = (uint)blpOffset[i];
            }

            return(textures);
        }
Ejemplo n.º 2
0
        public MOTX[] ReadMOTXChunk(BlizzHeader chunk, BinaryReader bin)
        {
            //List of BLP filenames
            var           blpFilesChunk = bin.ReadBytes((int)chunk.Size);
            List <String> blpFiles      = new List <string>();
            List <int>    blpOffset     = new List <int>();
            var           str           = new StringBuilder();

            for (var i = 0; i < blpFilesChunk.Length; i++)
            {
                if (blpFilesChunk[i] == '\0')
                {
                    str.Replace("..", ".");
                    blpFiles.Add(str.ToString());
                    blpOffset.Add(i - str.ToString().Length);
                    if (!CASC.FileExists(str.ToString()))
                    {
                        new WoWFormatLib.Utils.MissingFile(str.ToString());
                    }

                    str = new StringBuilder();
                }
                else
                {
                    str.Append((char)blpFilesChunk[i]);
                }
            }
            var textures = new MOTX[blpFiles.Count];

            for (var i = 0; i < blpFiles.Count; i++)
            {
                textures[i].filename    = blpFiles[i];
                textures[i].startOffset = (uint)blpOffset[i];
            }
            return(textures);
        }
Ejemplo n.º 3
0
        public void Read(byte[] data)
        {
            // Clear chunks to prevent double data.
            Chunks.Clear();

            using (var stream = new MemoryStream(data))
                using (var reader = new BinaryReader(stream))
                {
                    while (reader.BaseStream.Position < reader.BaseStream.Length)
                    {
                        var chunkId   = (WMOChunkId)reader.ReadUInt32();
                        var chunkSize = reader.ReadUInt32();

                        var chunkData = new byte[chunkSize];
                        Buffer.BlockCopy(stream.ToArray(), (int)reader.BaseStream.Position, chunkData, 0, (int)chunkSize);

                        IChunk chunk = null;
                        switch (chunkId)
                        {
                        case WMOChunkId.MVER: chunk = new MVER(); break;

                        case WMOChunkId.MOHD: chunk = new MOHD(); break;

                        case WMOChunkId.MOTX: chunk = new MOTX(); break;

                        case WMOChunkId.MOMT: chunk = new MOMT(); break;

                        case WMOChunkId.MOGN: chunk = new MOGN(); break;

                        case WMOChunkId.MOGI: chunk = new MOGI(); break;

                        case WMOChunkId.MOPV: chunk = new MOPV(); break;

                        case WMOChunkId.MOPT: chunk = new MOPT(); break;

                        case WMOChunkId.MOPR: chunk = new MOPR(); break;

                        case WMOChunkId.MOLT: chunk = new MOLT(); break;

                        case WMOChunkId.MODS: chunk = new MODS(); break;

                        case WMOChunkId.MODI: chunk = new MODI(); break;

                        case WMOChunkId.MODD: chunk = new MODD(); break;

                        case WMOChunkId.MFOG: chunk = new MFOG(); break;

                        default: Console.WriteLine($"Skipping {chunkId} (0x{(uint)chunkId:X})"); break;
                        }

                        if (chunk != null)
                        {
                            chunk.Read(chunkData);
                            Chunks.Add(chunk);
                        }

                        reader.BaseStream.Position += chunkSize;
                    }

                    // Add mandatory chunks.
                    Chunks.Add(new MOSB());
                    Chunks.Add(new MOVV());
                    Chunks.Add(new MOVB());

                    // Close the streams so they can be written.
                    reader.Close();
                    stream.Close();
                }
        }