Пример #1
0
 public Block(ResourceLocation block, Dictionary <string, string> blockStates, INbtTag nbt, bool isTag)
 {
     Resource    = block;
     BlockStates = blockStates;
     Nbt         = nbt;
     IsTag       = isTag;
 }
Пример #2
0
        private ReadResults ReadTypedValue(out INbtTag result)
        {
            result = default;

            Reader.SkipWhitespace();
            int         start = Reader.GetCursor();
            ReadResults readResults;

            if (Reader.IsQuotedStringStart(Reader.Peek()))
            {
                readResults = Reader.ReadQuotedString(out string quotedString);
                if (readResults.Successful)
                {
                    result = new StringNbtTag(quotedString);
                }
                return(readResults);
            }
            readResults = Reader.ReadUnquotedString(out string s);
            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (string.IsNullOrEmpty(s))
            {
                Reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.ExpectedValue()));
            }

            result = GetType(s);
            return(ReadResults.Success());
        }
Пример #3
0
        private INbtTag GetCurrentTag(NbtTagType type, bool readName = true)
        {
            string name = string.Empty;

            if (readName)
            {
                name = this.ReadString();
            }

            INbtTag tag = type switch
            {
                NbtTagType.Byte => new NbtTag <byte>(name, this.ReadByte()),
                NbtTagType.Short => new NbtTag <short>(name, this.ReadInt16()),
                NbtTagType.Int => new NbtTag <int>(name, this.ReadInt32()),
                NbtTagType.Long => new NbtTag <long>(name, this.ReadInt64()),
                NbtTagType.Float => new NbtTag <float>(name, this.ReadSingle()),
                NbtTagType.Double => new NbtTag <double>(name, this.ReadDouble()),
                NbtTagType.String => new NbtTag <string>(name, this.ReadString()),
                NbtTagType.Compound => this.ReadCompoundTag(name),
                NbtTagType.List => this.ReadListTag(name),
                NbtTagType.ByteArray => this.ReadArray(name, type),
                NbtTagType.IntArray => this.ReadArray(name, type),
                NbtTagType.LongArray => this.ReadArray(name, type),
                _ => null
            };

            return(tag);
        }
 public bool Add(INbtTag tag)
 {
     if (tag is IntegerNbtTag i)
     {
         Data.Add(i);
         return(true);
     }
     return(false);
 }
Пример #5
0
 public bool Add(INbtTag tag)
 {
     if (tag is LongNbtTag l)
     {
         Data.Add(l);
         return(true);
     }
     return(false);
 }
Пример #6
0
        public static INbtTag <T> As <T>(this INbtTag tag)
        {
            if (TagMatchesResultType(tag, typeof(T)))
            {
                return(tag as INbtTag <T>);
            }

            return(null);
        }
Пример #7
0
        public static INbtDictionary AsDictionary(this INbtTag tag)
        {
            if (TagMatchesResultType(tag, typeof(INbtDictionary)))
            {
                return(tag as INbtDictionary);
            }

            return(null);
        }
Пример #8
0
        public static INbtStream AsStream(this INbtTag tag)
        {
            if (TagMatchesResultType(tag, typeof(INbtStream)))
            {
                return(tag as INbtStream);
            }

            return(null);
        }
Пример #9
0
        private void WriteTag(INbtTag tag)
        {
            switch (tag.TagType)
            {
            case 1:
                WriteByte(((NbtByte)tag).Value);
                break;

            case 2:
                WriteShort(((NbtShort)tag).Value);
                break;

            case 3:
                WriteInt(((NbtInt)tag).Value);
                break;

            case 4:
                WriteLong(((NbtLong)tag).Value);
                break;

            case 5:
                WriteFloat(((NbtFloat)tag).Value);
                break;

            case 6:
                WriteDouble(((NbtFloat)tag).Value);
                break;

            case 7:
                WriteByteArray(((NbtByteArray)tag).Value);
                break;

            case 8:
                WriteString(((NbtString)tag).Value);
                break;

            case 9:
                WriteList(((NbtList)tag).Value);
                break;

            case 10:
                WriteCompound(((NbtCompound)tag).Value);
                break;

            case 11:
                WriteIntArray(((NbtIntArray)tag).Value);
                break;

            case 12:
                WriteLongArray(((NbtLongArray)tag).Value);
                break;

            default:
                OutOfRangeTypeCodeThrow();
                break;
            }
        }
Пример #10
0
 public bool Add(INbtTag tag)
 {
     if (tag is ByteNbtTag b)
     {
         Data.Add(b);
         return(true);
     }
     return(false);
 }
Пример #11
0
 private ReadResults ReadList(out INbtTag result)
 {
     if (Reader.CanRead(3) && !Reader.IsQuotedStringStart(Reader.Peek(1)) && Reader.Peek(2) == ';')
     {
         return(ReadArrayTag(out result));
     }
     else
     {
         return(ReadListTag(out result));
     }
 }
Пример #12
0
        public ReadResults Parse(out Block result)
        {
            result = default;

            ReadResults readResults = ReadTag();

            if (!readResults.Successful)
            {
                return(readResults);
            }

            readResults = ResourceLocation.TryRead(StringReader, out Block);
            if (!readResults.Successful)
            {
                return(readResults);
            }

            // Temporary
            if (UseBedrock)
            {
                result = new Block(Block, null, null, IsTag);
                return(ReadResults.Success());
            }

            if (!IsTag && !Resources.Blocks.ContainsBlock(Block))
            {
                return(ReadResults.Failure(CommandError.UnknownBlock(Block)));
            }

            Dictionary <string, string> blockStates = null;

            if (StringReader.CanRead() && StringReader.Peek() == '[')
            {
                readResults = ReadBlockStates(out blockStates);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }

            INbtTag nbt = null;

            if (StringReader.CanRead() && StringReader.Peek() == '{')
            {
                readResults = new NbtParser(StringReader).ReadCompound(out nbt);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }

            result = new Block(Block, blockStates, nbt, IsTag);
            return(ReadResults.Success());
        }
Пример #13
0
        public static INbtArrayTag <T> AsArray <T>(this INbtTag tag)
            where T : struct
        {
            var list = tag as INbtList;

            if (TagTypeMatchesType(list.Subtype, typeof(T)))
            {
                return(list as INbtArrayTag <T>);
            }

            return(null);
        }
Пример #14
0
        public ReadResults ReadCompound(out INbtTag result)
        {
            CompoundNbtTag compound;

            result = compound = new CompoundNbtTag();
            ReadResults readResults = Reader.Expect('{');

            if (!readResults.Successful)
            {
                return(readResults);
            }
            Reader.SkipWhitespace();
            while (Reader.CanRead() && Reader.Peek() != '}')
            {
                int start = Reader.GetCursor();
                readResults = ReadKey(out string key);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                if (string.IsNullOrEmpty(key))
                {
                    Reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.ExpectedKey().WithContext(Reader)));
                }
                readResults = Reader.Expect(':');
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                readResults = ReadValue(out INbtTag value);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                compound.Add(key, value);
                if (!HasElementSeparator())
                {
                    break;
                }
                if (Reader.CanRead())
                {
                    continue;
                }
                return(ReadResults.Failure(CommandError.ExpectedKey().WithContext(Reader)));
            }
            return(Reader.Expect('}'));
        }
Пример #15
0
        public bool Add(INbtTag tag)
        {
            sbyte id = tag.GetId();

            if (Type == null)
            {
                Type = id;
            }
            else if (Type != id)
            {
                return(false);
            }

            Data.Add(tag);
            return(true);
        }
Пример #16
0
        public override bool Equals([AllowNull] INbtTag other)
        {
            if (other is not TagArray <T> tag || Value.Length != tag.Value.Length)
            {
                return(false);
            }

            for (int i = 0; i < Value.Length; i++)
            {
                if (!Value[i].Equals(tag.Value[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #17
0
        public override bool Equals(INbtTag obj)
        {
            if (obj is not TagList <T> lst || lst.Count != Count)
            {
                return(false);
            }

            for (int i = 0; i < Count; i++)
            {
                if (!lst[i].Equals(Value[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #18
0
        private ReadResults ReadArrayTag(out INbtTag result)
        {
            result = default;
            ReadResults readResults = Reader.Expect('[');

            if (!readResults.Successful)
            {
                return(readResults);
            }
            int  start = Reader.GetCursor();
            char type  = Reader.Read();

            Reader.Skip();
            Reader.SkipWhitespace();
            if (!Reader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedValue().WithContext(Reader)));
            }

            INbtCollectionTag list;

            switch (type)
            {
            case 'B':
                list = new ByteArrayNbtTag();
                break;

            case 'I':
                list = new IntegerArrayNbtTag();
                break;

            case 'L':
                list = new LongArrayNbtTag();
                break;

            default:
                Reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.InvalidArrayType(type).WithContext(Reader)));
            }
            readResults = ReadListContents(ref list);
            if (readResults.Successful)
            {
                result = list;
            }
            return(readResults);
        }
Пример #19
0
        private static bool TagMatchesResultType(INbtTag tag, Type type)
        {
            if (tag.Type == NbtTagType.List)
            {
                var interfaceType = type.GetInterfaces().Where(t => t.Name == "INbtTag" && t.GenericTypeArguments.Length > 0).FirstOrDefault();
                if (interfaceType == null)
                {
                    return(false);
                }

                var listSubtype = interfaceType.GenericTypeArguments[0];
                var list        = tag as INbtList;
                return(TagTypeMatchesType(list.Subtype, listSubtype));
            }

            return(TagTypeMatchesType(tag.Type, type));
        }
Пример #20
0
        private ReadResults ReadListTag(out INbtTag result)
        {
            result = default;
            ReadResults readResults = Reader.Expect('[');

            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (!Reader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedValue().WithContext(Reader)));
            }

            INbtCollectionTag list = new ListNbtTag();

            return(ReadListContents(ref list));
        }
Пример #21
0
 public NbtTag(string name, T value, INbtTag parent = null)
 {
     this.Name   = name;
     this.Parent = parent;
     this.Value  = value;
     this.Type   = value switch
     {
         bool => NbtTagType.Byte,
         byte => NbtTagType.Byte,
         short => NbtTagType.Short,
         int => NbtTagType.Int,
         long => NbtTagType.Long,
         float => NbtTagType.Float,
         double => NbtTagType.Double,
         string => NbtTagType.String,
         _ => throw new InvalidOperationException()
     };
 }
Пример #22
0
        public ReadResults ReadValue(out INbtTag result)
        {
            result = default;
            Reader.SkipWhitespace();
            if (!Reader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedValue().WithContext(Reader)));
            }
            char c = Reader.Peek();

            if (c == '{')
            {
                return(ReadCompound(out result));
            }
            if (c == '[')
            {
                return(ReadList(out result));
            }
            return(ReadTypedValue(out result));
        }
Пример #23
0
 public void WriteNbt(INbtTag nbt)
 {
     using var writer = new NbtWriter(BaseStream);
     writer.WriteTag(nbt);
 }
Пример #24
0
        static void ExploreValue(INbtTag tag, int depth)
        {
            Console.Write("|-".PadRight(depth + 2, '-'));
            Console.Write($" {tag.Type}: {tag.Name} = ");

            switch (tag.Type)
            {
            case NbtTagType.Float32:
                Console.WriteLine(tag.As <float>().Value);
                break;

            case NbtTagType.Float64:
                Console.WriteLine(tag.As <double>().Value);
                break;

            case NbtTagType.Int16:
                Console.WriteLine(tag.As <short>().Value);
                break;

            case NbtTagType.Int32:
                Console.WriteLine(tag.As <int>().Value);
                break;

            case NbtTagType.Int64:
                Console.WriteLine(tag.As <long>().Value);
                break;

            case NbtTagType.UInt8:
                Console.WriteLine(tag.As <byte>().Value);
                break;

            case NbtTagType.Utf8String:
                Console.WriteLine(tag.As <string>().Value);
                break;

            case NbtTagType.Int32Array:
                WriteArray(tag.AsArray <int>(), depth + 1);
                break;

            case NbtTagType.Int64Array:
                WriteArray(tag.AsArray <long>(), depth + 1);
                break;

            case NbtTagType.UInt8Array:
                WriteArray(tag.AsArray <byte>(), depth + 1);
                break;

            case NbtTagType.List:
            {
                var listBase = tag as INbtList;
                switch (listBase.Subtype)
                {
                case NbtTagType.Int16:
                    WriteSimpleList(listBase as INbtList <short>, depth + 1);
                    break;

                case NbtTagType.Int32:
                    WriteSimpleList(listBase as INbtList <int>, depth + 1);
                    break;

                case NbtTagType.Int64:
                    WriteSimpleList(listBase as INbtList <long>, depth + 1);
                    break;

                case NbtTagType.UInt8:
                    WriteSimpleList(listBase as INbtList <byte>, depth + 1);
                    break;

                case NbtTagType.Utf8String:
                    WriteSimpleList(listBase as INbtList <string>, depth + 1);
                    break;

                case NbtTagType.Compound:
                    WriteCompoundList(listBase as INbtList <INbtStream>, depth + 1);
                    break;

                default:
                    throw new NotSupportedException("Not yet supported.");
                }
                break;
            }

            case NbtTagType.Compound:
                Console.WriteLine("(compound item)");
                var stream = tag.AsStream();
                while (stream.MoveNext())
                {
                    ExploreValue(stream.CurrentValue, depth + 1);
                }
                break;
            }
        }
Пример #25
0
 public override bool Equals([AllowNull] INbtTag other) => other switch
 {
Пример #26
0
        public BlockMetaBuilder AddBlockEntityTag(INbtTag tag)
        {
            this.BlockEntityTag.Add(tag);

            return(this);
        }
Пример #27
0
 public bool TryGetValue(string key, out INbtTag tag) => tags_.TryGetValue(key, out tag);
Пример #28
0
 public void Add(string key, INbtTag value)
 {
     Data[key] = value;
 }
Пример #29
0
        public bool MoveNext()
        {
            if (source_.Position >= source_.Length)
            {
                return(false);
            }

            long before = source_.Position;

            try
            {
                NbtTagType nextTagType = (NbtTagType)reader_.ReadByte();
                if (nextTagType == NbtTagType.EndTag)
                {
                    currentTag_ = EndTag.Instance;
                    return(source_.Position < source_.Length);
                }

                ushort nextTagNameLength = reader_.ReadUInt16();
                string nextTagName       = "";
                if (nextTagNameLength > 0)
                {
                    byte[] utf8TagName = reader_.ReadBytes(nextTagNameLength);
                    nextTagName = Encoding.UTF8.GetString(utf8TagName);
                }

                switch (nextTagType)
                {
                case NbtTagType.Float32:
                case NbtTagType.Float64:
                case NbtTagType.Int16:
                case NbtTagType.Int32:
                case NbtTagType.Int64:
                case NbtTagType.UInt8:
                case NbtTagType.Utf8String:
                    currentTag_ = SimpleTag.FromReader(nextTagType, nextTagName, reader_);
                    return(true);

                case NbtTagType.Int32Array:
                case NbtTagType.Int64Array:
                case NbtTagType.UInt8Array:
                    currentTag_ = NumberArrayTag.FromReader(nextTagType, nextTagName, reader_);
                    return(true);

                case NbtTagType.List:
                    currentTag_ = ListTag.FromReaderAndStream(nextTagName, reader_, this);
                    return(true);

                case NbtTagType.Compound:
                    currentTag_ = NbtCompoundTag.FromReader(nextTagName, this);
                    return(true);

                default:
                    Debug.WriteLine($"Unrecognized NBT tag {((int)nextTagType):x2} at position 0x{before:x}");
                    throw new Exception($"Unrecognized NBT tag {((int)nextTagType):x2} at position 0x{before:x}");
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.StackTrace);
                source_.Seek(before, SeekOrigin.Begin);
                return(false);
            }
        }
Пример #30
0
 public Item(ResourceLocation item, INbtTag nbt, bool isTag)
 {
     Resource = item;
     Nbt      = nbt;
     IsTag    = isTag;
 }