Ejemplo n.º 1
0
        public void Load()
        {
            var parser = new GbxParser(File.OpenRead(@"C:\Users\Administrator\Desktop\A06.Map.Gbx"));
            parser.ReadBytes(3 + 2 + 4); // GBX + Version + Storage settings
            qint32 cid = parser.ReadInt32(); // Main class id
            GbxClass dclass = new GbxClass();
            Classes.Add(-2, dclass);
            dclass.Id = cid;
            dclass.Structure = new CGameCtnChallenge_Header();
            qint32 length = parser.ReadInt32(); // Header length
            qint32 hcnkct = parser.ReadInt32(); // Header chunk count
            var cnkids = new int[hcnkct];
            var cnkszs = new int[length];
            long bigcnk = 2147483648; // Some constant (oh so ugly)
            // Go through all chunks
            for (int i = 0; i < hcnkct; i++)
            {
                qint32 cnkid = parser.ReadInt32();
                qint32 cnksz = parser.ReadInt32();
                if (cnksz < 0)
                {
                    cnksz = (int)(cnksz + bigcnk);
                }
                cnkids[i] = cnkid;
                cnkszs[i] = cnksz;
            }
            // Read every chunk
            for (int i = 0; i < hcnkct; i++)
            {
                GbxChunk dchunk = new GbxChunk();
                dchunk.Id = cnkids[i];
                qint32 start = parser.position;
                parser.ResetStringLB();
                switch (cnkids[i])
                {
                    case unchecked((int)0x03043002):
                        {
                            CGameCtnChallenge_Header c = dclass.Structure;
                            parser.ReadBytes(5);
                            c.PTimeBronze = parser.ReadInt32();
                            c.PTimeSilver = parser.ReadInt32();
                            c.PTimeGold = parser.ReadInt32();
                            c.PTimeAuthor = parser.ReadInt32();
                            c.PMapPrice = parser.ReadInt32();
                            c.PMultilap = (parser.ReadInt32() == 1);
                            parser.ReadBytes(12);
                            c.PSimpleEditor = (parser.ReadInt32() == 1);
                            parser.ReadBytes(4);
                            c.PMapCheckpoints = (parser.ReadInt32());
                            parser.ReadBytes(4);
                            break;
                        }
                    case unchecked((int)0x03043003):
                        {
                            CGameCtnChallenge_Header c = dclass.Structure;
                            var cp = parser.position;
                            parser.ReadBytes(1);
                            c.PMapUniqueId = (parser.ReadStringLB());
                            c.PMapEnvironment = (parser.ReadStringLB());
                            c.PMapAuthor = (parser.ReadStringLB());
                            c.PMapName = (parser.ReadString());
                            parser.Skip(5);
                            parser.ReadString();
                            c.PMapMood = parser.ReadStringLB();
                            c.PMapDecorationEnvironment = parser.ReadStringLB();
                            c.PMapDecorationEnvironmentAuthor = parser.ReadStringLB();
                            parser.Skip(4 * 4 + 16);
                            c.PMapType = parser.ReadString();
                            c.PMapStyle = parser.ReadString();
                            parser.Skip(9);
                            c.PMapTitleUid = parser.ReadStringLB();
                            parser.Skip(cnkszs[i] - (parser.position - cp));
                            break;
                        }
                    case unchecked((int)0x03043005):
                        {
                            CGameCtnChallenge_Header c = dclass.Structure;
                            c.PXml = parser.ReadString();
                            break;
                        }
                    case unchecked((int)0x03043007):
                        {
                            //CGameCtnChallenge_Header c = dclass.Structure;
                            int cp = parser.position;
                            parser.Skip(1);
                            parser.ReadInt32();
                            parser.Skip(15 + 3);
                            //c.PMapSnapshot = parser.ReadChars(size);
                            parser.Skip(cnkszs[i] - (parser.position - cp));
                            break;
                        }
                    case unchecked((int)0x03043008):
                        {
                            CGameCtnChallenge_Header c = dclass.Structure;
                            c.PAutVersion = parser.ReadInt32();
                            c.PAutAuthorVersion = parser.ReadInt32();
                            c.PAutLogin = parser.ReadString();
                            c.PAutNick = parser.ReadString();
                            c.PAutZone = parser.ReadString();
                            c.PAutExtra = parser.ReadString();
                            break;
                        }
                    default:
                        {
                            parser.Skip(cnkszs[i]);
                            break;
                        }
                }
                // Copy this chunks data into some variable so while writing it's obtainable
                dchunk.Data = parser.GetChars(start, parser.position - start);
                dclass.Chunks.Add(dchunk);
            }

            // Starting to parse the data section
            Nodes = parser.ReadInt32();
            NodesExternal = parser.ReadInt32();
            // Not supported yet
            if (NodesExternal != 0)
                throw new Exception("Your map cannot be parsed as it has external dependencies.");

            qint32 datasz = parser.ReadInt32();
            qint32 datacsz = parser.ReadInt32();
            var data = new byte[datasz];
            var cdata = parser.ReadBytes(datacsz);
            MiniLZO.MiniLZO.Decompress(cdata, data);

            GbxParser parserd = new GbxParser(new MemoryStream(data));
            ReadNode(ref parserd, cid, -1);
            isLoaded = true;

        }
Ejemplo n.º 2
0
        public void Load()
        {
            var parser = new GbxParser(File.OpenRead(@"C:\Users\Administrator\Desktop\A06.Map.Gbx"));

            parser.ReadBytes(3 + 2 + 4);          // GBX + Version + Storage settings
            qint32   cid    = parser.ReadInt32(); // Main class id
            GbxClass dclass = new GbxClass();

            Classes.Add(-2, dclass);
            dclass.Id        = cid;
            dclass.Structure = new CGameCtnChallenge_Header();
            qint32 length = parser.ReadInt32(); // Header length
            qint32 hcnkct = parser.ReadInt32(); // Header chunk count
            var    cnkids = new int[hcnkct];
            var    cnkszs = new int[length];
            long   bigcnk = 2147483648; // Some constant (oh so ugly)

            // Go through all chunks
            for (int i = 0; i < hcnkct; i++)
            {
                qint32 cnkid = parser.ReadInt32();
                qint32 cnksz = parser.ReadInt32();
                if (cnksz < 0)
                {
                    cnksz = (int)(cnksz + bigcnk);
                }
                cnkids[i] = cnkid;
                cnkszs[i] = cnksz;
            }
            // Read every chunk
            for (int i = 0; i < hcnkct; i++)
            {
                GbxChunk dchunk = new GbxChunk();
                dchunk.Id = cnkids[i];
                qint32 start = parser.position;
                parser.ResetStringLB();
                switch (cnkids[i])
                {
                case unchecked ((int)0x03043002):
                {
                    CGameCtnChallenge_Header c = dclass.Structure;
                    parser.ReadBytes(5);
                    c.PTimeBronze = parser.ReadInt32();
                    c.PTimeSilver = parser.ReadInt32();
                    c.PTimeGold   = parser.ReadInt32();
                    c.PTimeAuthor = parser.ReadInt32();
                    c.PMapPrice   = parser.ReadInt32();
                    c.PMultilap   = (parser.ReadInt32() == 1);
                    parser.ReadBytes(12);
                    c.PSimpleEditor = (parser.ReadInt32() == 1);
                    parser.ReadBytes(4);
                    c.PMapCheckpoints = (parser.ReadInt32());
                    parser.ReadBytes(4);
                    break;
                }

                case unchecked ((int)0x03043003):
                {
                    CGameCtnChallenge_Header c = dclass.Structure;
                    var cp = parser.position;
                    parser.ReadBytes(1);
                    c.PMapUniqueId    = (parser.ReadStringLB());
                    c.PMapEnvironment = (parser.ReadStringLB());
                    c.PMapAuthor      = (parser.ReadStringLB());
                    c.PMapName        = (parser.ReadString());
                    parser.Skip(5);
                    parser.ReadString();
                    c.PMapMood = parser.ReadStringLB();
                    c.PMapDecorationEnvironment       = parser.ReadStringLB();
                    c.PMapDecorationEnvironmentAuthor = parser.ReadStringLB();
                    parser.Skip(4 * 4 + 16);
                    c.PMapType  = parser.ReadString();
                    c.PMapStyle = parser.ReadString();
                    parser.Skip(9);
                    c.PMapTitleUid = parser.ReadStringLB();
                    parser.Skip(cnkszs[i] - (parser.position - cp));
                    break;
                }

                case unchecked ((int)0x03043005):
                {
                    CGameCtnChallenge_Header c = dclass.Structure;
                    c.PXml = parser.ReadString();
                    break;
                }

                case unchecked ((int)0x03043007):
                {
                    //CGameCtnChallenge_Header c = dclass.Structure;
                    int cp = parser.position;
                    parser.Skip(1);
                    parser.ReadInt32();
                    parser.Skip(15 + 3);
                    //c.PMapSnapshot = parser.ReadChars(size);
                    parser.Skip(cnkszs[i] - (parser.position - cp));
                    break;
                }

                case unchecked ((int)0x03043008):
                {
                    CGameCtnChallenge_Header c = dclass.Structure;
                    c.PAutVersion       = parser.ReadInt32();
                    c.PAutAuthorVersion = parser.ReadInt32();
                    c.PAutLogin         = parser.ReadString();
                    c.PAutNick          = parser.ReadString();
                    c.PAutZone          = parser.ReadString();
                    c.PAutExtra         = parser.ReadString();
                    break;
                }

                default:
                {
                    parser.Skip(cnkszs[i]);
                    break;
                }
                }
                // Copy this chunks data into some variable so while writing it's obtainable
                dchunk.Data = parser.GetChars(start, parser.position - start);
                dclass.Chunks.Add(dchunk);
            }

            // Starting to parse the data section
            Nodes         = parser.ReadInt32();
            NodesExternal = parser.ReadInt32();
            // Not supported yet
            if (NodesExternal != 0)
            {
                throw new Exception("Your map cannot be parsed as it has external dependencies.");
            }

            qint32 datasz  = parser.ReadInt32();
            qint32 datacsz = parser.ReadInt32();
            var    data    = new byte[datasz];
            var    cdata   = parser.ReadBytes(datacsz);

            MiniLZO.MiniLZO.Decompress(cdata, data);

            GbxParser parserd = new GbxParser(new MemoryStream(data));

            ReadNode(ref parserd, cid, -1);
            isLoaded = true;
        }