Пример #1
0
 public GroupSettings(string lastViewGroupName)
 {
     InitializeComponent();
     _streamGroup       = new StreamGroup();
     _lastViewGroupName = lastViewGroupName;
     _oldGroups         = _streamGroup.GetGroups();
 }
Пример #2
0
        public void ReadFromFile(BinaryReader reader)
        {
            if (reader.ReadInt32() != 1299346515)
            {
                return;
            }

            if (reader.ReadInt32() != 0x6)
            {
                return;
            }

            int fileSize = reader.ReadInt32();
            int unk0     = reader.ReadInt32();

            int numGroups     = reader.ReadInt32();
            int groupOffset   = reader.ReadInt32();
            int numHeaders    = reader.ReadInt32();
            int headerOffset  = reader.ReadInt32();
            int numLines      = reader.ReadInt32();
            int lineOffset    = reader.ReadInt32();
            int numLoaders    = reader.ReadInt32();
            int loadersOffset = reader.ReadInt32();
            int numBlocks     = reader.ReadInt32();
            int blockOffset   = reader.ReadInt32();
            int numHashes     = reader.ReadInt32();
            int hashOffset    = reader.ReadInt32();
            int poolSize      = reader.ReadInt32();
            int poolOffset    = reader.ReadInt32();

            Debug.Assert(reader.BaseStream.Position == groupOffset, "Failed to reach the starting offset for group declaration!");

            groups = new StreamGroup[numGroups];
            for (int i = 0; i < numGroups; i++)
            {
                StreamGroup map = new StreamGroup();
                map.nameIDX     = reader.ReadInt32();
                map.Name        = ReadFromBuffer((long)((ulong)map.nameIDX + (ulong)poolOffset), reader.BaseStream.Position, reader);
                map.Type        = (GroupTypes)reader.ReadInt32();
                map.Unk01       = reader.ReadInt32();
                map.startOffset = reader.ReadInt32();
                map.endOffset   = reader.ReadInt32();
                map.unk5        = reader.ReadInt32();
                groups[i]       = map;
            }

            Debug.Assert(reader.BaseStream.Position == headerOffset, "Did not reach the header starting offset");

            groupHeaders = new string[numHeaders];
            ulong[] ulongHeaders = new ulong[numHeaders];

            for (int i = 0; i < numHeaders; i++)
            {
                ulongHeaders[i] = reader.ReadUInt64();
                groupHeaders[i] = ReadFromBuffer((long)(ulongHeaders[i] + (ulong)poolOffset), reader.BaseStream.Position, reader);
            }

            Debug.Assert(reader.BaseStream.Position == lineOffset, "Did not reach the line data starting offset!");

            lines = new StreamLine[numLines];

            for (int i = 0; i < numLines; i++)
            {
                StreamLine map = new StreamLine();
                map.nameIDX  = reader.ReadInt32();
                map.lineID   = reader.ReadInt32();
                map.groupID  = reader.ReadInt32();
                map.LoadType = reader.ReadInt32();
                map.flagIDX  = reader.ReadInt32();
                map.Unk5     = reader.ReadInt32();
                map.Unk10    = reader.ReadUInt64();
                map.Unk11    = reader.ReadUInt64();
                map.Unk12    = reader.ReadInt32();
                map.Unk13    = reader.ReadInt32();
                map.Unk14    = reader.ReadInt32();
                map.Unk15    = reader.ReadInt32();
                map.Group    = groupHeaders[map.groupID];
                map.Name     = ReadFromBuffer((long)((ulong)map.nameIDX + (ulong)poolOffset), reader.BaseStream.Position, reader);
                map.Flags    = ReadBufferSpecial((long)((ulong)map.flagIDX + (ulong)poolOffset), reader.BaseStream.Position, reader).TrimEnd('\0').Replace('\0', '|');
                lines[i]     = map;
            }

            Debug.Assert(reader.BaseStream.Position == loadersOffset, "Did not reach the loader data starting offset!");

            loaders = new StreamLoader[numLoaders];

            for (int i = 0; i < numLoaders; i++)
            {
                StreamLoader map = new StreamLoader();
                map.start = reader.ReadInt32();
                map.end   = reader.ReadInt32();
                map.Type  = (GroupTypes)reader.ReadInt32();

                map.LoaderSubID = reader.ReadInt32();
                map.LoaderID    = reader.ReadInt32();
                map.LoadType    = reader.ReadInt32();
                map.pathIDX     = reader.ReadInt32();
                map.entityIDX   = reader.ReadInt32();
                map.Path        = ReadFromBuffer((long)((ulong)map.pathIDX + (ulong)poolOffset), reader.BaseStream.Position, reader);
                map.Entity      = ReadBufferSpecial((long)((ulong)map.entityIDX + (ulong)poolOffset), reader.BaseStream.Position, reader).TrimEnd('\0').Replace('\0', '|');
                loaders[i]      = map;
            }

            Debug.Assert(reader.BaseStream.Position == blockOffset, "Did not reach the block declaration starting offset!");

            blocks = new StreamBlock[numBlocks];
            for (int i = 0; i < numBlocks; i++)
            {
                StreamBlock map = new StreamBlock();
                map.startOffset = reader.ReadInt32();
                map.endOffset   = reader.ReadInt32();
                map.Hashes      = new ulong[map.endOffset - map.startOffset];
                blocks[i]       = map;
            }

            Debug.Assert(reader.BaseStream.Position == hashOffset, "Did not reach the block hashes starting offset!");

            hashes = new ulong[numHashes];

            for (int i = 0; i < numHashes; i++)
            {
                hashes[i] = reader.ReadUInt64();
            }

            for (int i = 0; i < numBlocks; i++)
            {
                var block = blocks[i];
                Array.Copy(hashes, block.startOffset, block.Hashes, 0, block.Hashes.Length);
            }

            Debug.Assert(reader.BaseStream.Position == poolOffset, "Did not reach the buffer pool starting offset!");

            reader.BaseStream.Seek(poolSize, SeekOrigin.Current);

            Debug.Assert(reader.BaseStream.Position == reader.BaseStream.Length, "Did not reach the end of the file!");
        }
Пример #3
0
            private void ProcessStream()
            {
                OuterGroup        = null;
                GarbageCharacters = 0;

                StreamGroup currentGroup  = null;
                var         currentGroups = new Stack <StreamGroup>();

                var i           = -1;
                var inGarbage   = false;
                var escapedChar = false;

                foreach (var c in Input)
                {
                    i++;
                    if (escapedChar)
                    {
                        escapedChar = false;
                        continue;
                    }

                    if (c == '!')
                    {
                        escapedChar = true;
                        continue;
                    }

                    if (inGarbage && c == '>')
                    {
                        inGarbage = false;
                        continue;
                    }

                    if (inGarbage)
                    {
                        GarbageCharacters++;
                        continue;
                    }

                    if (c == '<')
                    {
                        inGarbage = true;
                        continue;
                    }

                    if (c == '{')
                    {
                        var newGroup = new StreamGroup();
                        if (OuterGroup == null)
                        {
                            OuterGroup = newGroup;
                        }
                        currentGroup?.SubGroups.Add(newGroup);
                        currentGroup = newGroup;
                        currentGroups.Push(currentGroup);
                        continue;
                    }

                    if (c == '}')
                    {
                        currentGroups.Pop();
                        if (!currentGroups.TryPeek(out currentGroup))
                        {
                            currentGroup = null;
                        }
                        continue;
                    }

                    if (c == ',')
                    {
                        continue;
                    }

                    throw new Exception($"Invalid character {c} found at offset {i} in input.");
                }
            }
Пример #4
0
        public void ReadFromFile(BinaryReader reader)
        {
            if (reader.ReadInt32() != 1299346515)
            {
                return;
            }

            if (reader.ReadInt32() != 0x6)
            {
                return;
            }

            int fileSize = reader.ReadInt32();
            int unk0     = reader.ReadInt32();

            int numGroups     = reader.ReadInt32();
            int groupOffset   = reader.ReadInt32();
            int numHeaders    = reader.ReadInt32();
            int headerOffset  = reader.ReadInt32();
            int numLines      = reader.ReadInt32();
            int lineOffset    = reader.ReadInt32();
            int numLoaders    = reader.ReadInt32();
            int loadersOffset = reader.ReadInt32();
            int numBlocks     = reader.ReadInt32();
            int blockOffset   = reader.ReadInt32();
            int numHashes     = reader.ReadInt32();
            int hashOffset    = reader.ReadInt32();
            int poolSize      = reader.ReadInt32();
            int poolOffset    = reader.ReadInt32();

            if (reader.BaseStream.Position != groupOffset)
            {
                throw new FormatException();
            }

            groups = new StreamGroup[numGroups];
            for (int i = 0; i < numGroups; i++)
            {
                StreamGroup map = new StreamGroup();
                map.nameIDX     = reader.ReadInt32();
                map.Name        = ReadFromBuffer((long)((ulong)map.nameIDX + (ulong)poolOffset), reader.BaseStream.Position, reader);
                map.Type        = reader.ReadInt32();
                map.Unk01       = reader.ReadInt32();
                map.startOffset = reader.ReadInt32();
                map.endOffset   = reader.ReadInt32();
                map.unk5        = reader.ReadInt32();
                groups[i]       = map;
            }

            if (reader.BaseStream.Position != headerOffset)
            {
                throw new FormatException();
            }

            groupHeaders = new string[numHeaders];
            ulong[] ulongHeaders = new ulong[numHeaders];

            for (int i = 0; i < numHeaders; i++)
            {
                ulongHeaders[i] = reader.ReadUInt64();
                groupHeaders[i] = ReadFromBuffer((long)(ulongHeaders[i] + (ulong)poolOffset), reader.BaseStream.Position, reader);
            }

            if (reader.BaseStream.Position != lineOffset)
            {
                throw new FormatException();
            }

            lines = new StreamLine[numLines];

            for (int i = 0; i < numLines; i++)
            {
                StreamLine map = new StreamLine();
                map.nameIDX  = reader.ReadInt32();
                map.lineID   = reader.ReadInt32();
                map.groupID  = reader.ReadInt32();
                map.LoadType = reader.ReadInt32();
                map.flagIDX  = reader.ReadInt32();
                map.Unk5     = reader.ReadInt32();
                map.Unk10    = reader.ReadUInt64();
                map.Unk11    = reader.ReadUInt64();
                map.Unk12    = reader.ReadInt32();
                map.Unk13    = reader.ReadInt32();
                map.Unk14    = reader.ReadInt32();
                map.Unk15    = reader.ReadInt32();
                map.Group    = groupHeaders[map.groupID];
                map.Name     = ReadFromBuffer((long)((ulong)map.nameIDX + (ulong)poolOffset), reader.BaseStream.Position, reader);
                map.Flags    = ReadBufferSpecial((long)((ulong)map.flagIDX + (ulong)poolOffset), reader.BaseStream.Position, reader).TrimEnd('\0').Replace('\0', '|');
                lines[i]     = map;
            }

            if (reader.BaseStream.Position != loadersOffset)
            {
                throw new FormatException();
            }

            loaders = new StreamLoader[numLoaders];

            for (int i = 0; i < numLoaders; i++)
            {
                StreamLoader map = new StreamLoader();
                map.start       = reader.ReadInt32();
                map.end         = reader.ReadInt32();
                map.type        = reader.ReadInt32();
                map.loaderSubID = reader.ReadInt32();
                map.loaderID    = reader.ReadInt32();
                map.LoadType    = reader.ReadInt32();
                map.pathIDX     = reader.ReadInt32();
                map.entityIDX   = reader.ReadInt32();
                map.Path        = ReadFromBuffer((long)((ulong)map.pathIDX + (ulong)poolOffset), reader.BaseStream.Position, reader);
                map.Entity      = ReadBufferSpecial((long)((ulong)map.entityIDX + (ulong)poolOffset), reader.BaseStream.Position, reader).TrimEnd('\0').Replace('\0', '|');
                loaders[i]      = map;
            }

            if (reader.BaseStream.Position != blockOffset)
            {
                throw new FormatException();
            }

            blocks = new StreamBlock[numBlocks];
            for (int i = 0; i < numBlocks; i++)
            {
                StreamBlock map = new StreamBlock();
                map.startOffset = reader.ReadInt32();
                map.endOffset   = reader.ReadInt32();
                blocks[i]       = map;
            }

            if (reader.BaseStream.Position != hashOffset)
            {
                throw new FormatException();
            }

            hashes = new ulong[numHashes];

            for (int i = 0; i < numHashes; i++)
            {
                hashes[i] = reader.ReadUInt64();
            }

            if (reader.BaseStream.Position != poolOffset)
            {
                throw new FormatException();
            }

            reader.BaseStream.Seek(poolSize, SeekOrigin.Current);

            if (reader.BaseStream.Position != reader.BaseStream.Length)
            {
                throw new FormatException("Borked this up");
            }
        }