示例#1
0
        public void EndTagTest()
        {
            using (MemoryStream ms = new MemoryStream()) {
                var root = new NbtCompound("root")
                {
                    new NbtInt("test", 0)
                };
                new NbtFile(root).SaveToStream(ms, NbtCompression.None);
                ms.Position = 0;

                NbtReader reader = new NbtReader(ms)
                {
                    SkipEndTags = false
                };
                reader.ReadToDescendant("test");
                Assert.AreEqual(NbtTagType.Int, reader.TagType);
                Assert.IsTrue(reader.ReadToNextSibling());

                // should be at root's End tag now
                Assert.AreEqual(NbtTagType.End, reader.TagType);
                Assert.IsFalse(reader.IsInErrorState);
                Assert.IsFalse(reader.IsAtStreamEnd);
                Assert.IsFalse(reader.IsCompound);
                Assert.IsFalse(reader.IsList);
                Assert.IsFalse(reader.IsListElement);
                Assert.IsFalse(reader.HasValue);
                Assert.IsFalse(reader.HasName);
                Assert.IsFalse(reader.HasLength);
                Assert.Throws <InvalidOperationException>(() => reader.ReadAsTag()); // Cannot create NbtTag from TAG_END

                // We done now
                Assert.IsFalse(reader.ReadToFollowing());
                Assert.IsTrue(reader.IsAtStreamEnd);
            }
        }
示例#2
0
        public void ErrorTest()
        {
            var root = new NbtCompound("root");

            byte[] testData = new NbtFile(root).SaveToBuffer(NbtCompression.None);

            // creating NbtReader without a stream, or with a non-readable stream
            Assert.Throws <ArgumentNullException>(() => new NbtReader(null));
            Assert.Throws <ArgumentException>(() => new NbtReader(new NonReadableStream()));

            // corrupt the data
            testData[0] = 123;
            var reader = new NbtReader(new MemoryStream(testData));

            // attempt to use ReadValue when not at value
            Assert.Throws <InvalidOperationException>(() => reader.ReadValue());
            reader.CacheTagValues = true;
            Assert.Throws <InvalidOperationException>(() => reader.ReadValue());

            // attempt to read a corrupt stream
            Assert.Throws <NbtFormatException>(() => reader.ReadToFollowing());

            // make sure we've properly entered the error state
            Assert.IsTrue(reader.IsInErrorState);
            Assert.IsFalse(reader.HasName);
            Assert.Throws <InvalidReaderStateException>(() => reader.ReadToFollowing());
            Assert.Throws <InvalidReaderStateException>(() => reader.ReadListAsArray <int>());
            Assert.Throws <InvalidReaderStateException>(() => reader.ReadToNextSibling());
            Assert.Throws <InvalidReaderStateException>(() => reader.ReadToDescendant("derp"));
            Assert.Throws <InvalidReaderStateException>(() => reader.ReadAsTag());
            Assert.Throws <InvalidReaderStateException>(() => reader.Skip());
        }
示例#3
0
        public void ReadToSiblingTest()
        {
            NbtReader reader = new NbtReader(MakeTest());

            Assert.IsTrue(reader.ReadToFollowing());
            Assert.AreEqual(reader.TagName, "root");
            Assert.IsTrue(reader.ReadToFollowing());
            Assert.AreEqual(reader.TagName, "first");
            Assert.IsTrue(reader.ReadToNextSibling("third-comp"));
            Assert.AreEqual(reader.TagName, "third-comp");
            Assert.IsTrue(reader.ReadToNextSibling());
            Assert.AreEqual(reader.TagName, "fourth-list");
            Assert.IsTrue(reader.ReadToNextSibling());
            Assert.AreEqual(reader.TagName, "fifth");
            Assert.IsFalse(reader.ReadToNextSibling());
        }
示例#4
0
        public Map LoadHeader(string path)
        {
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) {
                using (GZipStream gs = new GZipStream(fs, CompressionMode.Decompress)) {
                    NbtReader reader = new NbtReader(gs);
                    reader.ReadToFollowing(); // skip root tag
                    reader.ReadToFollowing(); // skip to first inner tag
                    int width  = 0,
                        length = 0,
                        height = 0;
                    do
                    {
                        switch (reader.TagName)
                        {
                        case "X":
                            width = reader.ReadValueAs <short>();
                            break;

                        case "Y":
                            height = reader.ReadValueAs <short>();
                            break;

                        case "Z":
                            length = reader.ReadValueAs <short>();
                            break;
                        }
                        if (width > 0 && length > 0 && height > 0)
                        {
                            return(new Map(null, width, length, height, false));
                        }
                    } while (reader.ReadToNextSibling());
                }
            }
            throw new MapFormatException("Could not locate map dimensions.");
        }
示例#5
0
        private static (string, Dictionary <string, Object>) GetNbtVal(MemoryStream ms)
        {
            string name       = "";
            var    nbt        = new NbtReader(ms, false);
            var    dictParams = new Dictionary <string, Object>();

            nbt.ReadToFollowing();
            if (!nbt.IsCompound)
            {
                throw new Exception("Could not read nbt");
            }

            if (nbt.ReadToDescendant("name"))
            {
                name = nbt.ReadValueAs <string>();

                nbt.ReadToNextSibling();
                while (nbt.TagType != NbtTagType.End)
                {
                    fNbt.Tags.NbtTag tag = nbt.ReadAsTag();
                    switch (tag.Name)
                    {
                    case "version":
                        continue;

                    case "states":
                        IEnumerable <fNbt.Tags.NbtTag> enumTag = (IEnumerable <fNbt.Tags.NbtTag>)tag;
                        foreach (var subtag in enumTag)
                        {
                            if ((subtag.Name == "direction") || (subtag.Name == "facing_direction") || (subtag.Name == "open_bit"))
                            {
                                int subtagvalue = GetTagValue(subtag);
                                dictParams.Add(subtag.Name, subtagvalue);
                            }
                            if ((subtag.Name == "color") || (subtag.Name == "lever_direction"))
                            {
                                if (subtag.TagType == NbtTagType.String)
                                {
                                    dictParams.Add(subtag.Name, subtag.StringValue);
                                }
                            }
                        }
                        break;

                    case "val":
                        int value = GetTagValue(tag);
                        dictParams.Add(tag.Name, value);
                        break;
                    }
                }
            }

            while (!nbt.IsAtStreamEnd)
            {
                nbt.ReadToFollowing();
            }

            return(name, dictParams);
        }
示例#6
0
        private static (string, Dictionary <string, Object>) GetNbtVal(MemoryStream ms)
        {
            string name       = "";
            var    nbt        = new NbtReader(ms, false);
            var    dictParams = new Dictionary <string, Object>();

            nbt.ReadToFollowing();
            if (!nbt.IsCompound)
            {
                throw new Exception("Could not read nbt");
            }

            if (nbt.ReadToDescendant("name"))
            {
                name = nbt.ReadValueAs <string>();

                nbt.ReadToNextSibling();
                while (nbt.TagType != NbtTagType.End)
                {
                    fNbt.Tags.NbtTag tag = nbt.ReadAsTag();
                    switch (tag.Name)
                    {
                    case "version":
                        continue;

                    case "states":
                        IEnumerable <fNbt.Tags.NbtTag> enumTag = (IEnumerable <fNbt.Tags.NbtTag>)tag;
                        foreach (var subtag in enumTag)
                        {
                            if ((subtag.Name == "direction") || (subtag.Name == "facing_direction") || (subtag.Name == "open_bit") || (subtag.Name == "multi_face_direction_bits") || (subtag.Name == "stripped_bit") || (subtag.Name == "wall_post_bit") || (subtag.Name == "button_pressed_bit") || (subtag.Name == "rail_direction") || (subtag.Name == "rail_data_bit") || (subtag.Name == "bite_counter") || (subtag.Name == "respawn_anchor_charge") || (subtag.Name == "growth") || (subtag.Name == "powered_bit") || (subtag.Name == "upper_block_bit") || (subtag.Name == "hanging") || (subtag.Name == "coral_direction") || (subtag.Name == "coral_hang_type_bit") || (subtag.Name == "dead_bit") || (subtag.Name == "end_portal_eye_bit") || (subtag.Name == "head_piece_bit") || (subtag.Name == "age"))
                            {
                                int subtagvalue = GetTagValue(subtag);
                                dictParams.Add(subtag.Name, subtagvalue);
                            }
                            if ((subtag.Name == "color") || (subtag.Name == "lever_direction") || (subtag.Name == "wall_block_type") || (subtag.Name == "pillar_axis") || (subtag.Name == "wood_type") || (subtag.Name == "old_log_type") || (subtag.Name == "new_log_type") || (subtag.Name == "old_leaf_type") || (subtag.Name == "new_leaf_type") || (subtag.Name == "sapling_type") || subtag.Name.StartsWith("wall_connection_type_") || (subtag.Name == "chisel_type") || subtag.Name.StartsWith("stone_slab_type") || (subtag.Name == "sponge_type") || (subtag.Name == "double_plant_type") || (subtag.Name == "flower_type") || (subtag.Name == "sand_type") || (subtag.Name == "stone_type") || (subtag.Name == "damage") || (subtag.Name == "dripstone_thickness") || (subtag.Name == "coral_color") || (subtag.Name == "monster_egg_stone_type") || (subtag.Name == "stone_brick_type"))
                            {
                                dictParams.Add(subtag.Name, subtag.StringValue);
                            }
                        }
                        break;

                    case "val":
                        int value = GetTagValue(tag);
                        dictParams.Add(tag.Name, value);
                        break;
                    }
                }
            }

            while (!nbt.IsAtStreamEnd)
            {
                nbt.ReadToFollowing();
            }

            return(name, dictParams);
        }
示例#7
0
        public void ReadToSiblingTest2()
        {
            var reader = new NbtReader(TestFiles.MakeReaderTest());

            Assert.IsTrue(reader.ReadToFollowing("inComp1"));
            // Expect all siblings to be read while we search for a non-existent one
            Assert.IsFalse(reader.ReadToNextSibling("no such tag"));
            // Expect to pop out of "third-comp" by now
            Assert.AreEqual("fourth-list", reader.TagName);
        }
示例#8
0
        private static (string, int) GetNbtVal(MemoryStream ms)
        {
            int    value = 0;
            string name  = "";
            var    nbt   = new NbtReader(ms, false);

            nbt.ReadToFollowing();
            if (!nbt.IsCompound)
            {
                throw new Exception("Could not read nbt");
            }

            if (nbt.ReadToDescendant("name"))
            {
                name = nbt.ReadValueAs <string>();
            }
            if (nbt.ReadToNextSibling("val"))
            {
                switch (nbt.TagType)
                {
                case NbtTagType.Int:
                    value = nbt.ReadValueAs <int>();
                    break;

                case NbtTagType.Short:
                    value = nbt.ReadValueAs <short>();
                    break;

                case NbtTagType.Long:
                    value = (int)nbt.ReadValueAs <long>();
                    break;

                default:
                    Console.WriteLine("could not comprehend val");
                    break;
                }
            }

            while (!nbt.IsAtStreamEnd)
            {
                nbt.ReadToFollowing();
            }

            return(name, value);
        }
示例#9
0
        public void ReadToSiblingTest()
        {
            var reader = new NbtReader(TestFiles.MakeReaderTest());

            Assert.IsTrue(reader.ReadToFollowing());
            Assert.AreEqual("root", reader.TagName);
            Assert.IsTrue(reader.ReadToFollowing());
            Assert.AreEqual("first", reader.TagName);
            Assert.IsTrue(reader.ReadToNextSibling("third-comp"));
            Assert.AreEqual("third-comp", reader.TagName);
            Assert.IsTrue(reader.ReadToNextSibling());
            Assert.AreEqual("fourth-list", reader.TagName);
            Assert.IsTrue(reader.ReadToNextSibling());
            Assert.AreEqual("fifth", reader.TagName);
            Assert.IsTrue(reader.ReadToNextSibling());
            Assert.AreEqual("hugeArray", reader.TagName);
            Assert.IsFalse(reader.ReadToNextSibling());
            // Test twice, since we hit different paths through the code
            Assert.IsFalse(reader.ReadToNextSibling());
        }
        public void ErrorTest()
        {
            var root = new NbtCompound("root");
            byte[] testData = new NbtFile(root).SaveToBuffer(NbtCompression.None);

            // creating NbtReader without a stream, or with a non-readable stream
            Assert.Throws<ArgumentNullException>(() => new NbtReader(null));
            Assert.Throws<ArgumentException>(() => new NbtReader(new NonReadableStream()));

            // corrupt the data
            testData[0] = 123;
            var reader = new NbtReader(new MemoryStream(testData));

            // attempt to use ReadValue when not at value
            Assert.Throws<InvalidOperationException>(() => reader.ReadValue());
            reader.CacheTagValues = true;
            Assert.Throws<InvalidOperationException>(() => reader.ReadValue());

            // attempt to read a corrupt stream
            Assert.Throws<NbtFormatException>(() => reader.ReadToFollowing());

            // make sure we've properly entered the error state
            Assert.True(reader.IsInErrorState);
            Assert.False(reader.HasName);
            Assert.Throws<InvalidReaderStateException>(() => reader.ReadToFollowing());
            Assert.Throws<InvalidReaderStateException>(() => reader.ReadListAsArray<int>());
            Assert.Throws<InvalidReaderStateException>(() => reader.ReadToNextSibling());
            Assert.Throws<InvalidReaderStateException>(() => reader.ReadToDescendant("derp"));
            Assert.Throws<InvalidReaderStateException>(() => reader.ReadAsTag());
            Assert.Throws<InvalidReaderStateException>(() => reader.Skip());
        }
 public void ReadToSiblingTest()
 {
     var reader = new NbtReader(TestFiles.MakeReaderTest());
     Assert.True(reader.ReadToFollowing());
     Assert.Equal("root", reader.TagName);
     Assert.True(reader.ReadToFollowing());
     Assert.Equal("first", reader.TagName);
     Assert.True(reader.ReadToNextSibling("third-comp"));
     Assert.Equal("third-comp", reader.TagName);
     Assert.True(reader.ReadToNextSibling());
     Assert.Equal("fourth-list", reader.TagName);
     Assert.True(reader.ReadToNextSibling());
     Assert.Equal("fifth", reader.TagName);
     Assert.True(reader.ReadToNextSibling());
     Assert.Equal("hugeArray", reader.TagName);
     Assert.False(reader.ReadToNextSibling());
     // Test twice, since we hit different paths through the code
     Assert.False(reader.ReadToNextSibling());
 }
示例#12
0
文件: MapCW.cs 项目: fragmer/fCraft
 public Map LoadHeader(string path) {
     using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) {
         using (GZipStream gs = new GZipStream(fs, CompressionMode.Decompress)) {
             NbtReader reader = new NbtReader(gs);
             reader.ReadToFollowing(); // skip root tag
             reader.ReadToFollowing(); // skip to first inner tag
             int width = 0,
                 length = 0,
                 height = 0;
             do {
                 switch (reader.TagName) {
                     case "X":
                         width = reader.ReadValueAs<short>();
                         break;
                     case "Y":
                         height = reader.ReadValueAs<short>();
                         break;
                     case "Z":
                         length = reader.ReadValueAs<short>();
                         break;
                 }
                 if (width > 0 && length > 0 && height > 0) {
                     return new Map(null, width, length, height, false);
                 }
             } while (reader.ReadToNextSibling());
         }
     }
     throw new MapFormatException("Could not locate map dimensions.");
 }
示例#13
0
 public void ReadToSiblingTest()
 {
     var reader = new NbtReader(TestFiles.MakeReaderTest());
     Assert.IsTrue(reader.ReadToFollowing());
     Assert.AreEqual(reader.TagName, "root");
     Assert.IsTrue(reader.ReadToFollowing());
     Assert.AreEqual(reader.TagName, "first");
     Assert.IsTrue(reader.ReadToNextSibling("third-comp"));
     Assert.AreEqual(reader.TagName, "third-comp");
     Assert.IsTrue(reader.ReadToNextSibling());
     Assert.AreEqual(reader.TagName, "fourth-list");
     Assert.IsTrue(reader.ReadToNextSibling());
     Assert.AreEqual(reader.TagName, "fifth");
     Assert.IsFalse(reader.ReadToNextSibling());
 }