Exemple #1
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Message result)
        {
            result = default;
            string message = reader.GetRemaining();
            Dictionary <int, EntitySelector> selectors = new Dictionary <int, EntitySelector>();

            while (reader.CanRead())
            {
                if (reader.Peek() == '@')
                {
                    if (reader.CanRead(2) && "parse".Contains(reader.Peek(1)))
                    {
                        int         start       = reader.GetCursor();
                        ReadResults readResults = new EntitySelectorParser(reader, resources, UseBedrock).Parse(out EntitySelector entitySelector);
                        if (!readResults.Successful)
                        {
                            return(readResults);
                        }
                        selectors.Add(start, entitySelector);
                    }
                    else
                    {
                        reader.Skip(2);
                    }
                    continue;
                }
                reader.Skip();
            }

            result = new Message(message, selectors);
            return(ReadResults.Success());
        }
        public ReadResults Read(out Angle result)
        {
            result = default;
            if (!StringReader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedAngle().WithContext(StringReader)));
            }
            if (StringReader.Peek() == '^')
            {
                return(ReadResults.Failure(CommandError.MixedCoordinateType().WithContext(StringReader)));
            }

            bool isRelative = IsRelative();

            if (StringReader.AtEndOfArgument())
            {
                result = new Angle(0.0f, isRelative);
                return(ReadResults.Success());
            }

            ReadResults readResults = StringReader.ReadFloat(out float value);

            if (readResults.Successful)
            {
                result = new Angle(value, isRelative);
            }
            return(readResults);
        }
        private static ReadResults ReadScores(EntitySelectorParser parser, IStringReader reader)
        {
            ReadResults readResults = reader.Expect('{');

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

            reader.SkipWhitespace();
            while (reader.CanRead() && reader.Peek() != '}')
            {
                reader.SkipWhitespace();
                readResults = reader.ReadUnquotedString(out _);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                reader.SkipWhitespace();
                readResults = reader.Expect('=');
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                reader.SkipWhitespace();
                readResults = new RangeParser <int>(reader).Read(int.TryParse, CommandError.InvalidInteger, int.MinValue, int.MaxValue, false, out Range <int> range);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                parser.AddArgument(new ParsedArgument <Range <int> >(range, false));
                reader.SkipWhitespace();
                if (reader.CanRead())
                {
                    char c = reader.Read();
                    if (c == ',')
                    {
                        continue;
                    }
                    if (c == '}')
                    {
                        return(ReadResults.Success());
                    }
                }
                return(ReadResults.Failure(CommandError.ExpectedCharacter('}').WithContext(reader)));
            }

            reader.SkipWhitespace();
            return(reader.Expect('}'));
        }
        public ReadResults Read(Converter <string> function, Func <string, CommandError> invalidNumberErrorProvider, T minimum, T maximum, bool loopable, out Range <T> result)
        {
            result = default;
            if (!StringReader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedValueOrRange().WithContext(StringReader)));
            }

            int         start = StringReader.GetCursor();
            T?          right;
            ReadResults readResults = ReadNumber(function, invalidNumberErrorProvider, out T? left);

            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (StringReader.CanRead(2) && StringReader.Peek() == '.' && StringReader.Peek(1) == '.')
            {
                StringReader.Skip(2);
                readResults = ReadNumber(function, invalidNumberErrorProvider, out right);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }
            else
            {
                right = left;
            }

            if (left == null && right == null)
            {
                return(ReadResults.Failure(CommandError.ExpectedValueOrRange().WithContext(StringReader)));
            }

            if (left == null)
            {
                left = minimum;
            }
            if (right == null)
            {
                right = maximum;
            }

            if (!loopable && ((T)left).CompareTo((T)right) > 0)
            {
                StringReader.SetCursor(start);
                return(ReadResults.Failure(CommandError.RangeMinBiggerThanMax().WithContext(StringReader)));
            }

            result = new Range <T>((T)left, (T)right);
            return(ReadResults.Success());
        }
Exemple #5
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out NbtPath result)
        {
            result = default;

            int  start  = reader.GetCursor();
            bool isRoot = true;

            ReadResults readResults;

            while (!reader.AtEndOfArgument())
            {
                readResults = ParseNode(reader, isRoot);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                isRoot = false;
                if (!reader.CanRead())
                {
                    continue;
                }
                char c = reader.Peek();
                if (c == ' ' || c == '[' || c == '{')
                {
                    continue;
                }
                readResults = reader.Expect('.');
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }
            result = new NbtPath(reader.GetString()[start..reader.GetCursor()]);
 public ReadResults Parse(IStringReader reader, DispatcherResources resources, out ICoordinates result)
 {
     if (reader.CanRead() && reader.Peek() == '^')
     {
         return(new LocalCoordinatesParser(reader, UseBedrock).Parse(out result));
     }
     return(new WorldCoordinatesParser(reader, UseBedrock).ParseDouble(out result));
 }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out UUID result)
        {
            int start = reader.GetCursor();

            while (reader.CanRead() && IsUuidPart(reader.Peek()))
            {
                reader.Skip();
            }
            string uuid = reader.GetString()[start..reader.GetCursor()];
Exemple #8
0
        public static ReadResults TryRead(IStringReader stringReader, out ResourceLocation result)
        {
            int start = stringReader.GetCursor();

            while (stringReader.CanRead() && IsAllowedInResourceLocation(stringReader.Peek()))
            {
                stringReader.Skip();
            }
            string input = stringReader.GetString()[start..stringReader.GetCursor()];
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out StructureRotation result)
        {
            result = default;
            int start = reader.GetCursor();

            while (reader.CanRead() && IsUnquotedStringPart(reader.Peek()))
            {
                reader.Skip();
            }
            string structureRotation = reader.GetString()[start..reader.GetCursor()];
        public ReadResults ReadInteger(out WorldCoordinate result)
        {
            result = default;
            if (!StringReader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedBlockPosition().WithContext(StringReader)));
            }
            if (StringReader.Peek() == '^')
            {
                return(ReadResults.Failure(CommandError.MixedCoordinateType().WithContext(StringReader)));
            }

            bool isRelative = IsRelative();

            double value = 0.0d;

            if (!StringReader.AtEndOfArgument())
            {
                if (UseBedrock && !IsNumberPart(StringReader.Peek()))
                {
                    result = new WorldCoordinate(value, isRelative);
                    return(ReadResults.Success());
                }

                ReadResults readResults;
                if (isRelative)
                {
                    readResults = StringReader.ReadDouble(out value);
                }
                else
                {
                    readResults = StringReader.ReadInteger(out int integerValue);
                    value       = integerValue;
                }
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }

            result = new WorldCoordinate(value, isRelative);
            return(ReadResults.Success());
        }
Exemple #11
0
        public ReadResults Parse(out Item result)
        {
            result = default;

            ReadResults readResults = ReadTag(out bool isTag);

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

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

            // Temporary
            if (UseBedrock)
            {
                result = new Item(item, null, isTag);
                return(ReadResults.Success());
            }

            if (!isTag && !Resources.Items.Contains(item))
            {
                return(ReadResults.Failure(CommandError.UnknownItem(item)));
            }

            if (StringReader.CanRead() && StringReader.Peek() == '{')
            {
                readResults = new NbtParser(StringReader).ReadCompound(out INbtTag nbt);
                if (readResults.Successful)
                {
                    result = new Item(item, nbt, isTag);
                }
                return(readResults);
            }

            result = new Item(item, null, isTag);
            return(ReadResults.Success());
        }
        public ReadResults Parse(out EntitySelector result)
        {
            result = default;
            ReadResults readResults;

            if (Reader.CanRead() && Reader.Peek() == '@')
            {
                Reader.Skip();
                readResults = ParseSelector();
            }
            else
            {
                readResults = ParseNameOrUuid();
            }

            if (readResults.Successful)
            {
                result = GetSelector();
            }

            return(readResults);
        }
        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());
        }
Exemple #14
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));
        }
        private static ReadResults SetExecutor(EntitySelectorParser parser, IStringReader reader, bool negated, string originalName, int previousStart, DispatcherResources resources, bool useBedrock)
        {
            if (parser.IsTypeLimited())
            {
                reader.SetCursor(previousStart);
                return(ReadResults.Failure(CommandError.InapplicableOption(originalName).WithContext(reader)));
            }

            int start = reader.GetCursor();

            bool isTag = false;

            if (reader.CanRead() && reader.Peek() == '#')
            {
                reader.Skip();
                isTag = true;
            }

            ReadResults readResults = ResourceLocation.TryRead(reader, out ResourceLocation entity);

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

            if (ResourceLocation.PLAYER_ENTITY.Equals(entity) && !negated)
            {
                parser.SetIncludesEntities(false);
            }
            else if (useBedrock)
            {
                // Temporary
                return(ReadResults.Success());
            }
            else if (!isTag)
            {
                if (!resources.Entities.Contains(entity))
                {
                    reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.InvalidEntityType(entity).WithContext(reader)));
                }
            }
            parser.AddArgument(new ParsedArgument <Entity>(new Entity(entity, isTag), false));
            return(ReadResults.Success());
        }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Component result)
        {
            result = default;
            if (!reader.CanRead())
            {
                return(ReadResults.Failure(CommandError.IncorrectArgument().WithContext(reader)));
            }
            int start = reader.GetCursor();

            ReadResults readResults = new JsonReader(reader).ReadAny(out IJsonArgument json);

            if (!readResults.Successful)
            {
                return(readResults);
            }
            result = new Component(json);
            return(new ComponentReader(reader, start, resources).ValidateFromRoot(json, resources.Components));
        }
Exemple #17
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Function result)
        {
            result = default;
            bool isTag = false;

            if (reader.CanRead() && reader.Peek() == '#')
            {
                reader.Skip();
                isTag = true;
            }

            ReadResults readResults = ResourceLocation.TryRead(reader, out ResourceLocation function);

            if (readResults.Successful)
            {
                result = new Function(function, isTag);
            }
            return(readResults);
        }
 private ReadResults ReadDouble(out double result)
 {
     result = default;
     if (!StringReader.CanRead())
     {
         return(ReadResults.Failure(CommandError.ExpectedCoordinate().WithContext(StringReader)));
     }
     if (StringReader.Peek() != '^')
     {
         return(ReadResults.Failure(CommandError.MixedCoordinateType().WithContext(StringReader)));
     }
     StringReader.Skip();
     if (StringReader.AtEndOfArgument() || (UseBedrock && !IsNumberPart(StringReader.Peek())))
     {
         result = 0.0d;
         return(ReadResults.Success());
     }
     else
     {
         return(StringReader.ReadDouble(out result));
     }
 }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out ScoreHolder result)
        {
            result = default;

            if (reader.CanRead() && reader.Peek() == '@')
            {
                EntitySelectorParser entitySelectorParser = new EntitySelectorParser(reader, resources, UseBedrock);
                ReadResults          readResults          = entitySelectorParser.Parse(out EntitySelector entitySelector);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                if (!Multiple && entitySelector.MaxResults > 1)
                {
                    return(ReadResults.Failure(CommandError.SelectorTooManyEntities()));
                }
                result = new ScoreHolder(null, entitySelector);
                return(ReadResults.Success());
            }

            if (UseBedrock)
            {
                ReadResults readResults = reader.ReadString(out string name);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                result = new ScoreHolder(name, null);
                return(ReadResults.Success());
            }
            else
            {
                int start = reader.GetCursor();
                while (!reader.AtEndOfArgument())
                {
                    reader.Skip();
                }
                string name = reader.GetString()[start..reader.GetCursor()];
        public ReadResults ReadAny(out IJsonArgument result)
        {
            result = new JsonNull();

            SkipWhitespace();
            if (!StringReader.CanRead())
            {
                return(ReadResults.Success());
            }

            ReadResults readResults;

            switch (StringReader.Peek())
            {
            case OBJECT_OPEN_CHARACTER:
                readResults = ReadObject(out JsonObject objectResult);
                if (readResults.Successful)
                {
                    result = objectResult;
                }
                return(readResults);

            case ARRAY_OPEN_CHARACTER:
                readResults = ReadArray(out JsonArray arrayResult);
                if (readResults.Successful)
                {
                    result = arrayResult;
                }
                return(readResults);

            case STRING_CHARACTER:
                readResults = ReadString(out JsonString stringResult);
                if (readResults.Successful)
                {
                    result = stringResult;
                }
                return(readResults);

            default:
                return(ReadSpecial(out result));
            }
        }
        private static ReadResults ReadAdvancements(EntitySelectorParser parser, IStringReader reader)
        {
            ReadResults readResults = reader.Expect('{');

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

            reader.SkipWhitespace();
            while (reader.CanRead() && reader.Peek() != '}')
            {
                reader.SkipWhitespace();
                readResults = ResourceLocation.TryRead(reader, out ResourceLocation advancement);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                reader.SkipWhitespace();
                readResults = reader.Expect('=');
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                reader.SkipWhitespace();
                if (reader.CanRead() && reader.Peek() == '{')
                {
                    reader.Skip();
                    reader.SkipWhitespace();
                    while (reader.CanRead() && reader.Peek() != '}')
                    {
                        reader.SkipWhitespace();
                        readResults = reader.ReadUnquotedString(out _);
                        if (!readResults.Successful)
                        {
                            return(readResults);
                        }

                        reader.SkipWhitespace();
                        readResults = reader.Expect('=');
                        if (!readResults.Successful)
                        {
                            return(readResults);
                        }

                        reader.SkipWhitespace();
                        readResults = reader.ReadBoolean(out _);
                        if (!readResults.Successful)
                        {
                            return(readResults);
                        }

                        reader.SkipWhitespace();
                        if (reader.CanRead())
                        {
                            char c = reader.Read();
                            if (c == ',')
                            {
                                continue;
                            }
                            if (c == '}')
                            {
                                break;
                            }
                        }
                    }
                }
                else
                {
                    readResults = reader.ReadBoolean(out _);
                    if (!readResults.Successful)
                    {
                        return(readResults);
                    }
                }

                parser.AddArgument(new ParsedArgument <Advancement>(new Advancement(advancement), false));
                reader.SkipWhitespace();
                if (reader.CanRead())
                {
                    char c = reader.Read();
                    if (c == ',')
                    {
                        continue;
                    }
                    if (c == '}')
                    {
                        return(ReadResults.Success());
                    }
                }
                return(ReadResults.Failure(CommandError.ExpectedCharacter('}').WithContext(reader)));
            }

            reader.SkipWhitespace();
            return(reader.Expect('}'));
        }