public bool Write(BundleEntry entry)
        {
            MemoryStream ms = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(ms);

            bw.Write(Unknown1);
            long fileSizeOffset = bw.BaseStream.Position;

            bw.Write((int)0);
            bw.Write(Unknown3);
            long section2Offset = bw.BaseStream.Position;

            bw.Write((int)0);
            long streetOffset = bw.BaseStream.Position;

            bw.Write((int)0);
            long roadRuleOffset = bw.BaseStream.Position;

            bw.Write((int)0);
            bw.Write(StreetSection1s.Count);
            bw.Write(StreetSection2s.Count);
            bw.Write(StreetInfos.Count);
            bw.Write(Unknown9);
            bw.Write(Unknown10);
            bw.Write(Unknown11);

            for (int i = 0; i < StreetSection1s.Count; i++)
            {
                StreetSection1 streetSection1 = StreetSection1s[i];

                bw.Write(streetSection1.Unknown1);
                bw.Write(streetSection1.Index);
                bw.Write(streetSection1.Unknown3);
                bw.Write(streetSection1.Unknown4);
                bw.Write(streetSection1.Unknown5);
                bw.Write(streetSection1.Unknown6);
            }

            long newPos = bw.BaseStream.Position;

            bw.BaseStream.Seek(section2Offset, SeekOrigin.Begin);
            bw.Write((int)newPos);

            bw.BaseStream.Seek(newPos, SeekOrigin.Begin);

            for (int i = 0; i < StreetSection2s.Count; i++)
            {
                StreetSection2 section2 = StreetSection2s[i];

                bw.Write(section2.Unknown1);
                bw.Write(section2.ID);
                bw.Write(section2.Unknown3);
                bw.Write(section2.Unknown4);
                bw.Write(section2.Unknown5);
                bw.Write(section2.Unknown6);
                bw.Write(section2.Unknown7);
                bw.Write(section2.Unknown8);
                bw.Write(section2.Unknown9);
                bw.Write(section2.Unknown10);
                bw.Write(section2.Unknown11);
                bw.Write(section2.Unknown12);
            }

            long paddingCount = 16 - (bw.BaseStream.Position % 16);

            bw.BaseStream.Position += paddingCount;

            newPos = bw.BaseStream.Position;
            bw.BaseStream.Seek(streetOffset, SeekOrigin.Begin);
            bw.Write((int)newPos);

            bw.BaseStream.Seek(newPos, SeekOrigin.Begin);

            for (int i = 0; i < StreetInfos.Count; i++)
            {
                StreetInfo section3 = StreetInfos[i];

                bw.Write(section3.Coords);
                bw.Write(section3.Unknown4);

                // TODO: TEMP
                //if (section3.StreetID == 808305)
                //    section3.StreetID = 383595;

                bw.Write(section3.StreetID);
                bw.Write(section3.Unknown6);
                bw.Write(section3.Unknown7);
                bw.Write(Encoding.ASCII.GetBytes(section3.StreetNameID).Pad(20));
                bw.Write(section3.Unknown8);
                bw.Write(section3.Unknown9);  // PC Only
                bw.Write(section3.Unknown10); // PC Only
            }

            newPos = bw.BaseStream.Position;
            bw.BaseStream.Seek(roadRuleOffset, SeekOrigin.Begin);
            bw.Write((int)newPos);

            bw.BaseStream.Seek(newPos, SeekOrigin.Begin);

            for (int i = 0; i < RoadRuleInfos.Count; i++)
            {
                RoadRuleInfo section4 = RoadRuleInfos[i];

                bw.Write(section4.Unknown1);
                bw.Write(section4.Unknown2);
                bw.Write(section4.Time);
                bw.Write(section4.ShowTime);
                bw.Write(section4.Unknown5);
                bw.Write(section4.Unknown6);
            }

            for (int i = 0; i < StreetSection5s.Count; i++)
            {
                StreetSection5 section5 = StreetSection5s[i];

                bw.Write(section5.Section1Index);
                bw.Write(section5.Unknown2);
                bw.Write(section5.Unknown3);
                bw.Write(section5.Unknown4);
            }

            newPos = bw.BaseStream.Position;
            bw.BaseStream.Seek(fileSizeOffset, SeekOrigin.Begin);
            bw.Write((int)newPos);

            bw.Flush();

            byte[] data = ms.ToArray();

            bw.Close();
            ms.Close();

            entry.EntryBlocks[0].Data = data;
            entry.Dirty = true;

            return(true);
        }
        public bool Read(BundleEntry entry, ILoader loader = null)
        {
            Clear();

            MemoryStream  ms = entry.MakeStream();
            BinaryReader2 br = new BinaryReader2(ms);

            br.BigEndian = entry.Console;

            Unknown1       = br.ReadInt32();
            FileSize       = br.ReadInt32();
            Unknown3       = br.ReadInt32();
            Section2Offset = br.ReadInt32();
            StreetOffset   = br.ReadInt32();
            RoadRuleOffset = br.ReadInt32();
            Section1Count  = br.ReadInt32();
            RoadRuleCount  = br.ReadInt32();
            StreetCount    = br.ReadInt32();
            Unknown9       = br.ReadInt32();
            Unknown10      = br.ReadInt32();
            Unknown11      = br.ReadInt32();

            for (int i = 0; i < Section1Count; i++)
            {
                StreetSection1 streetSection1 = new StreetSection1();

                streetSection1.Unknown1 = br.ReadInt32();
                streetSection1.Index    = br.ReadInt16();
                streetSection1.Unknown3 = br.ReadInt32();
                streetSection1.Unknown4 = br.ReadInt16();
                streetSection1.Unknown5 = br.ReadInt16();
                streetSection1.Unknown6 = br.ReadInt16();

                StreetSection1s.Add(streetSection1);
            }

            br.BaseStream.Seek(Section2Offset, SeekOrigin.Begin);

            for (int i = 0; i < RoadRuleCount; i++)
            {
                StreetSection2 section2 = new StreetSection2();

                section2.Unknown1  = br.ReadInt32();
                section2.ID        = br.ReadInt16();
                section2.Unknown3  = br.ReadInt16();
                section2.Unknown4  = br.ReadByte();
                section2.Unknown5  = br.ReadByte();
                section2.Unknown6  = br.ReadInt16();
                section2.Unknown7  = br.ReadInt32();
                section2.Unknown8  = br.ReadInt32();
                section2.Unknown9  = br.ReadInt32();
                section2.Unknown10 = br.ReadInt32();
                section2.Unknown11 = br.ReadInt32();
                section2.Unknown12 = br.ReadInt32();

                StreetSection2s.Add(section2);
            }

            br.BaseStream.Seek(StreetOffset, SeekOrigin.Begin);

            for (int i = 0; i < StreetCount; i++)
            {
                StreetInfo section3 = new StreetInfo();

                section3.Coords       = br.ReadVector3F();
                section3.Unknown4     = br.ReadInt32();
                section3.StreetID     = br.ReadInt64();
                section3.Unknown6     = br.ReadInt64();
                section3.Unknown7     = br.ReadInt64();
                section3.StreetNameID = Encoding.ASCII.GetString(br.ReadBytes(20));
                section3.Unknown8     = br.ReadInt32();

                //if (entry.Console)
                //    section3.Unknown9 = 1;
                //else
                section3.Unknown9  = br.ReadInt32();
                section3.Unknown10 = br.ReadInt32();

                StreetInfos.Add(section3);
            }

            br.BaseStream.Seek(RoadRuleOffset, SeekOrigin.Begin);

            for (int i = 0; i < RoadRuleCount; i++)
            {
                RoadRuleInfo section4 = new RoadRuleInfo();

                section4.Unknown1 = br.ReadInt64();
                section4.Unknown2 = br.ReadInt64();
                section4.Time     = br.ReadInt32();
                section4.ShowTime = br.ReadInt32();
                section4.Unknown5 = br.ReadInt64();
                section4.Unknown6 = br.ReadInt64();

                RoadRuleInfos.Add(section4);
            }

            while (br.BaseStream.Position < FileSize)
            {
                StreetSection5 section5 = new StreetSection5();

                section5.Section1Index = br.ReadInt16();
                section5.Unknown2      = br.ReadInt16();
                section5.Unknown3      = br.ReadInt16();
                section5.Unknown4      = br.ReadInt16();

                StreetSection5s.Add(section5);
            }

            // TODO: TEMP
            //StreetInfo info1 = result.StreetInfos[1];
            //StreetInfo info70 = result.StreetInfos[70];
            //result.StreetInfos[1] = info70;
            //result.StreetInfos[70] = info1;
            //result.Write(entry);

            return(true);
        }