Search in sources :

Example 16 with InputParseException

use of com.sk89q.worldedit.extension.input.InputParseException in project FastAsyncWorldEdit by IntellectualSites.

the class RichPatternParser method parseFromInput.

@Override
public Pattern parseFromInput(String input, ParserContext context) throws InputParseException {
    if (input.isEmpty()) {
        throw new SuggestInputParseException("No input provided", "", () -> Stream.concat(Stream.of("#", ",", "&"), BlockTypes.getNameSpaces().stream().map(n -> n + ":")).collect(Collectors.toList()));
    }
    List<Double> chances = new ArrayList<>();
    List<Pattern> patterns = new ArrayList<>();
    final CommandLocals locals = new CommandLocals();
    Actor actor = context != null ? context.getActor() : null;
    if (actor != null) {
        locals.put(Actor.class, actor);
    }
    try {
        for (Map.Entry<ParseEntry, List<String>> entry : parse(input)) {
            ParseEntry pe = entry.getKey();
            final String command = pe.getInput();
            String full = pe.getFull();
            Pattern pattern = null;
            double chance = 1;
            if (command.isEmpty()) {
                pattern = parseFromInput(StringMan.join(entry.getValue(), ','), context);
            } else if (!worldEdit.getPatternFactory().containsAlias(command)) {
                // Legacy patterns
                char char0 = command.charAt(0);
                boolean charPattern = input.length() > 1 && input.charAt(1) != '[';
                if (charPattern && input.charAt(0) == '=') {
                    pattern = parseFromInput(char0 + "[" + input.substring(1) + "]", context);
                }
                if (char0 == '#' && command.length() > 1 && command.charAt(1) != '#') {
                    throw new SuggestInputParseException(new NoMatchException(Caption.of("fawe.error.parse.unknown-pattern", full, TextComponent.of("https://intellectualsites.github.io/fastasyncworldedit-documentation/patterns/patterns").clickEvent(ClickEvent.openUrl("https://intellectualsites.github.io/fastasyncworldedit-documentation/patterns/patterns")))), full, () -> {
                        if (full.length() == 1) {
                            return new ArrayList<>(worldEdit.getPatternFactory().getSuggestions(""));
                        }
                        return new ArrayList<>(worldEdit.getPatternFactory().getSuggestions(command.toLowerCase(Locale.ROOT)));
                    });
                }
                if (charPattern) {
                    if (char0 == '$' || char0 == '^' || char0 == '*' || (char0 == '#' && input.charAt(1) == '#')) {
                        pattern = worldEdit.getPatternFactory().parseWithoutRich(full, context);
                    }
                }
                if (pattern == null) {
                    if (command.startsWith("[")) {
                        int end = command.lastIndexOf(']');
                        pattern = parseFromInput(command.substring(1, end == -1 ? command.length() : end), context);
                    } else {
                        int percentIndex = command.indexOf('%');
                        if (percentIndex != -1 && percentPatternRegex.matcher(command).matches()) {
                            // Legacy percent pattern
                            chance = Expression.compile(command.substring(0, percentIndex)).evaluate();
                            String value = command.substring(percentIndex + 1);
                            if (!entry.getValue().isEmpty()) {
                                boolean addBrackets = !value.isEmpty();
                                if (addBrackets) {
                                    value += "[";
                                }
                                value += StringMan.join(entry.getValue(), " ");
                                if (addBrackets) {
                                    value += "]";
                                }
                            }
                            pattern = parseFromInput(value, context);
                        } else {
                            // legacy block pattern
                            try {
                                pattern = worldEdit.getBlockFactory().parseFromInput(pe.getFull(), context);
                            } catch (NoMatchException e) {
                                throw new NoMatchException(Caption.of("fawe.error.parse.unknown-pattern", full, TextComponent.of("https://intellectualsites.github.io/fastasyncworldedit-documentation/patterns/patterns").clickEvent(com.sk89q.worldedit.util.formatting.text.event.ClickEvent.openUrl("https://intellectualsites.github.io/fastasyncworldedit-documentation/patterns/patterns"))));
                            }
                        }
                    }
                }
            } else {
                List<String> args = entry.getValue();
                try {
                    pattern = worldEdit.getPatternFactory().parseWithoutRich(full, context);
                } catch (InputParseException rethrow) {
                    throw rethrow;
                } catch (Throwable e) {
                    throw SuggestInputParseException.of(e, full, () -> {
                        try {
                            String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " "));
                            List<Substring> split = CommandArgParser.forArgString(cmdArgs).parseArgs().toList();
                            List<String> argStrings = split.stream().map(Substring::getSubstring).collect(Collectors.toList());
                            MemoizingValueAccess access = getPlatform().initializeInjectedValues(() -> cmdArgs, actor, null, true);
                            List<String> suggestions = getPlatform().getCommandManager().getSuggestions(access, argStrings).stream().map(Suggestion::getSuggestion).collect(Collectors.toUnmodifiableList());
                            List<String> result = new ArrayList<>();
                            if (suggestions.size() <= 2) {
                                for (int i = 0; i < suggestions.size(); i++) {
                                    String suggestion = suggestions.get(i);
                                    if (suggestion.indexOf(' ') != 0) {
                                        String[] splitSuggestion = suggestion.split(" ");
                                        suggestion = "[" + StringMan.join(splitSuggestion, "][") + "]";
                                        result.set(i, suggestion);
                                    }
                                }
                            }
                            return result;
                        } catch (Throwable e2) {
                            e2.printStackTrace();
                            throw new InputParseException(TextComponent.of(e2.getMessage()));
                        }
                    });
                }
            }
            if (pattern != null) {
                patterns.add(pattern);
                chances.add(chance);
            }
        }
    } catch (InputParseException rethrow) {
        throw rethrow;
    } catch (Throwable e) {
        e.printStackTrace();
        throw new InputParseException(TextComponent.of(e.getMessage()), e);
    }
    if (patterns.isEmpty()) {
        return null;
    }
    if (patterns.size() == 1) {
        return patterns.get(0);
    }
    RandomPattern random = new RandomPattern(new TrueRandom());
    for (int i = 0; i < patterns.size(); i++) {
        random.add(patterns.get(i), chances.get(i));
    }
    return random;
}
Also used : SuggestInputParseException(com.fastasyncworldedit.core.command.SuggestInputParseException) BlockTypes(com.sk89q.worldedit.world.block.BlockTypes) Suggestion(org.enginehub.piston.suggestion.Suggestion) Caption(com.fastasyncworldedit.core.configuration.Caption) MemoizingValueAccess(org.enginehub.piston.inject.MemoizingValueAccess) ParserContext(com.sk89q.worldedit.extension.input.ParserContext) FaweParser(com.fastasyncworldedit.core.extension.factory.parser.FaweParser) TrueRandom(com.fastasyncworldedit.core.math.random.TrueRandom) StringMan(com.fastasyncworldedit.core.util.StringMan) ArrayList(java.util.ArrayList) CommandLocals(com.sk89q.minecraft.util.commands.CommandLocals) Substring(com.sk89q.worldedit.internal.util.Substring) InputParseException(com.sk89q.worldedit.extension.input.InputParseException) Locale(java.util.Locale) ClickEvent(com.sk89q.worldedit.util.formatting.text.event.ClickEvent) Map(java.util.Map) WorldEdit(com.sk89q.worldedit.WorldEdit) NoMatchException(com.sk89q.worldedit.extension.input.NoMatchException) CommandArgParser(com.sk89q.worldedit.internal.command.CommandArgParser) TextComponent(com.sk89q.worldedit.util.formatting.text.TextComponent) Expression(com.sk89q.worldedit.internal.expression.Expression) RandomPattern(com.sk89q.worldedit.function.pattern.RandomPattern) Collectors(java.util.stream.Collectors) Actor(com.sk89q.worldedit.extension.platform.Actor) List(java.util.List) Stream(java.util.stream.Stream) Pattern(com.sk89q.worldedit.function.pattern.Pattern) Collections(java.util.Collections) ArrayList(java.util.ArrayList) SuggestInputParseException(com.fastasyncworldedit.core.command.SuggestInputParseException) InputParseException(com.sk89q.worldedit.extension.input.InputParseException) Actor(com.sk89q.worldedit.extension.platform.Actor) TrueRandom(com.fastasyncworldedit.core.math.random.TrueRandom) ArrayList(java.util.ArrayList) List(java.util.List) Substring(com.sk89q.worldedit.internal.util.Substring) RandomPattern(com.sk89q.worldedit.function.pattern.RandomPattern) Pattern(com.sk89q.worldedit.function.pattern.Pattern) MemoizingValueAccess(org.enginehub.piston.inject.MemoizingValueAccess) SuggestInputParseException(com.fastasyncworldedit.core.command.SuggestInputParseException) CommandLocals(com.sk89q.minecraft.util.commands.CommandLocals) RandomPattern(com.sk89q.worldedit.function.pattern.RandomPattern) NoMatchException(com.sk89q.worldedit.extension.input.NoMatchException) Map(java.util.Map)

Example 17 with InputParseException

use of com.sk89q.worldedit.extension.input.InputParseException in project FastAsyncWorldEdit by IntellectualSites.

the class RichTransformParser method parseFromInput.

@Override
public ResettableExtent parseFromInput(String input, ParserContext context) throws InputParseException {
    if (input.isEmpty()) {
        return null;
    }
    List<Double> unionChances = new ArrayList<>();
    List<Double> intersectionChances = new ArrayList<>();
    List<ResettableExtent> intersection = new ArrayList<>();
    List<ResettableExtent> union = new ArrayList<>();
    final CommandLocals locals = new CommandLocals();
    Actor actor = context != null ? context.getActor() : null;
    if (actor != null) {
        locals.put(Actor.class, actor);
    }
    try {
        List<Map.Entry<ParseEntry, List<String>>> parsed = parse(input);
        for (Map.Entry<ParseEntry, List<String>> entry : parsed) {
            ParseEntry pe = entry.getKey();
            String command = pe.getInput();
            ResettableExtent transform;
            double chance = 1;
            if (command.isEmpty()) {
                transform = parseFromInput(StringMan.join(entry.getValue(), ','), context);
            } else if (!worldEdit.getTransformFactory().containsAlias(command)) {
                // Legacy syntax
                int percentIndex = command.indexOf('%');
                if (percentIndex != -1) {
                    // Legacy percent pattern
                    chance = Expression.compile(command.substring(0, percentIndex)).evaluate();
                    command = command.substring(percentIndex + 1);
                    if (!entry.getValue().isEmpty()) {
                        if (!command.isEmpty()) {
                            command += " ";
                        }
                        command += StringMan.join(entry.getValue(), " ");
                    }
                    transform = parseFromInput(command, context);
                } else {
                    throw new NoMatchException(Caption.of("fawe.error.parse.unknown-transform", pe.getFull(), TextComponent.of("https://intellectualsites.github" + ".io/fastasyncworldedit-documentation/transforms/transforms").clickEvent(ClickEvent.openUrl("https://intellectualsites.github" + ".io/fastasyncworldedit-documentation/transforms/transforms"))));
                }
            } else {
                try {
                    transform = worldEdit.getTransformFactory().parseWithoutRich(pe.getFull(), context);
                } catch (SuggestInputParseException rethrow) {
                    throw rethrow;
                } catch (Throwable e) {
                    throw new NoMatchException(Caption.of("fawe.error.parse.unknown-transform", pe.getFull(), TextComponent.of("https://intellectualsites.github" + ".io/fastasyncworldedit-documentation/transforms/transforms").clickEvent(ClickEvent.openUrl("https://intellectualsites.github" + ".io/fastasyncworldedit-documentation/transforms/transforms"))));
                }
            }
            if (pe.isAnd()) {
                // &
                intersectionChances.add(chance);
                intersection.add(transform);
            } else {
                if (!intersection.isEmpty()) {
                    if (intersection.size() == 1) {
                        throw new InputParseException(Caption.of("fawe.error.parse.invalid-dangling-character", "&"));
                    }
                    MultiTransform multi = new MultiTransform();
                    double total = 0;
                    for (int i = 0; i < intersection.size(); i++) {
                        Double value = intersectionChances.get(i);
                        total += value;
                        multi.add(intersection.get(i), value);
                    }
                    union.add(multi);
                    unionChances.add(total);
                    intersection.clear();
                    intersectionChances.clear();
                }
                unionChances.add(chance);
                union.add(transform);
            }
        }
    } catch (Throwable e) {
        throw new InputParseException(TextComponent.of(e.getMessage()), e);
    }
    if (!intersection.isEmpty()) {
        if (intersection.size() == 1) {
            throw new InputParseException(Caption.of("fawe.error.parse.invalid-dangling-character", "&"));
        }
        MultiTransform multi = new MultiTransform();
        double total = 0;
        for (int i = 0; i < intersection.size(); i++) {
            Double value = intersectionChances.get(i);
            total += value;
            multi.add(intersection.get(i), value);
        }
        union.add(multi);
        unionChances.add(total);
        intersection.clear();
        intersectionChances.clear();
    }
    if (union.isEmpty()) {
        throw new NoMatchException(Caption.of("fawe.error.parse.unknown-transform", input, TextComponent.of("https://intellectualsites.github.io/fastasyncworldedit-documentation/transforms/transforms").clickEvent(ClickEvent.openUrl("https://intellectualsites.github.io/fastasyncworldedit-documentation/transforms/transforms"))));
    } else if (union.size() == 1) {
        return union.get(0);
    } else {
        RandomTransform random = new RandomTransform(new TrueRandom());
        for (int i = 0; i < union.size(); i++) {
            random.add(union.get(i), unionChances.get(i));
        }
        return random;
    }
}
Also used : CommandLocals(com.sk89q.minecraft.util.commands.CommandLocals) SuggestInputParseException(com.fastasyncworldedit.core.command.SuggestInputParseException) ArrayList(java.util.ArrayList) MultiTransform(com.fastasyncworldedit.core.extent.transform.MultiTransform) RandomTransform(com.fastasyncworldedit.core.extent.transform.RandomTransform) ResettableExtent(com.fastasyncworldedit.core.extent.ResettableExtent) SuggestInputParseException(com.fastasyncworldedit.core.command.SuggestInputParseException) InputParseException(com.sk89q.worldedit.extension.input.InputParseException) Actor(com.sk89q.worldedit.extension.platform.Actor) TrueRandom(com.fastasyncworldedit.core.math.random.TrueRandom) ArrayList(java.util.ArrayList) List(java.util.List) NoMatchException(com.sk89q.worldedit.extension.input.NoMatchException) Map(java.util.Map)

Example 18 with InputParseException

use of com.sk89q.worldedit.extension.input.InputParseException in project FastAsyncWorldEdit by IntellectualSites.

the class GeneralCommands method gtexture.

// FAWE start
@Command(name = "/gtexture", aliases = { "gtexture" }, descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e., the blocks in the world).", desc = "Set the global mask")
@CommandPermissions("worldedit.global-texture")
public void gtexture(Actor actor, World worldArg, LocalSession session, EditSession editSession, @Arg(name = "context", desc = "InjectedValueAccess", def = "") List<String> arguments) throws WorldEditException, FileNotFoundException {
    // TODO NOT IMPLEMENTED convert this to an ArgumentConverter
    if (arguments.isEmpty()) {
        session.setTextureUtil(null);
        actor.print(Caption.of("fawe.worldedit.general.texture.disabled"));
    } else {
        String arg = arguments.get(0);
        String argLower = arg.toLowerCase(Locale.ROOT);
        TextureUtil util = Fawe.instance().getTextureUtil();
        int randomIndex = 1;
        boolean checkRandomization = true;
        if (arguments.size() >= 2 && MathMan.isInteger(arguments.get(0)) && MathMan.isInteger(arguments.get(1))) {
            // complexity
            int min = Integer.parseInt(arguments.get(0));
            int max = Integer.parseInt(arguments.get(1));
            if (min < 0 || max > 100) {
                throw new InputParseException(Caption.of("fawe.error.too-simple"));
            }
            if (min != 0 || max != 100) {
                util = new CleanTextureUtil(util, min, max);
            }
            randomIndex = 2;
        } else if (arguments.size() == 1 && argLower.equals("true") || argLower.equals("false")) {
            if (argLower.equals("true")) {
                util = new RandomTextureUtil(util);
            }
            checkRandomization = false;
        } else {
            if (argLower.equals("#copy") || argLower.equals("#clipboard")) {
                Clipboard clipboard = session.getClipboard().getClipboard();
                util = TextureUtil.fromClipboard(clipboard);
            } else if (argLower.equals("*") || argLower.equals("true")) {
                util = Fawe.instance().getTextureUtil();
            } else {
                ParserContext parserContext = new ParserContext();
                parserContext.setActor(actor);
                parserContext.setWorld(worldArg);
                parserContext.setSession(session);
                parserContext.setExtent(editSession);
                Mask mask = worldEdit.getMaskFactory().parseFromInput(arg, parserContext);
                util = TextureUtil.fromMask(mask);
            }
        }
        if (checkRandomization) {
            if (arguments.size() > randomIndex) {
                boolean random = Boolean.parseBoolean(arguments.get(randomIndex));
                if (random) {
                    util = new RandomTextureUtil(util);
                }
            }
        }
        if (!(util instanceof CachedTextureUtil)) {
            util = new CachedTextureUtil(util);
        }
        session.setTextureUtil(util);
        actor.print(Caption.of("fawe.worldedit.general.texture.set", StringMan.join(arguments, " ")));
    }
}
Also used : InputParseException(com.sk89q.worldedit.extension.input.InputParseException) RandomTextureUtil(com.fastasyncworldedit.core.util.RandomTextureUtil) CachedTextureUtil(com.fastasyncworldedit.core.util.CachedTextureUtil) CleanTextureUtil(com.fastasyncworldedit.core.util.CleanTextureUtil) TextureUtil(com.fastasyncworldedit.core.util.TextureUtil) CachedTextureUtil(com.fastasyncworldedit.core.util.CachedTextureUtil) CleanTextureUtil(com.fastasyncworldedit.core.util.CleanTextureUtil) Mask(com.sk89q.worldedit.function.mask.Mask) Clipboard(com.sk89q.worldedit.extent.clipboard.Clipboard) ParserContext(com.sk89q.worldedit.extension.input.ParserContext) RandomTextureUtil(com.fastasyncworldedit.core.util.RandomTextureUtil) Command(org.enginehub.piston.annotation.Command) CommandPermissions(com.sk89q.worldedit.command.util.CommandPermissions)

Example 19 with InputParseException

use of com.sk89q.worldedit.extension.input.InputParseException in project FastAsyncWorldEdit by IntellectualSites.

the class LocalConfiguration method checkDisallowedBlocks.

public boolean checkDisallowedBlocks(BlockStateHolder holder) {
    if (disallowedBlocks.isEmpty()) {
        return false;
    }
    if (disallowedBlocksMask == null) {
        BlockMaskBuilder builder = new BlockMaskBuilder();
        for (String blockRegex : disallowedBlocks) {
            try {
                builder.addRegex(blockRegex);
            } catch (InputParseException e) {
                e.printStackTrace();
            }
        }
        disallowedBlocksMask = builder.build(new NullExtent());
    }
    return disallowedBlocksMask.test(holder.toImmutableState());
}
Also used : InputParseException(com.sk89q.worldedit.extension.input.InputParseException) BlockMaskBuilder(com.fastasyncworldedit.core.function.mask.BlockMaskBuilder) NullExtent(com.sk89q.worldedit.extent.NullExtent)

Example 20 with InputParseException

use of com.sk89q.worldedit.extension.input.InputParseException in project FastAsyncWorldEdit by IntellectualSites.

the class ExpressionPatternParser method parseFromSimpleInput.

@Override
public Pattern parseFromSimpleInput(String input, ParserContext context) throws InputParseException {
    try {
        Expression exp = Expression.compile(input.substring(1), "x", "y", "z");
        WorldEditExpressionEnvironment env = new WorldEditExpressionEnvironment(context.requireExtent(), Vector3.ONE, Vector3.ZERO);
        exp.setEnvironment(env);
        return new ExpressionPattern(exp);
    } catch (ExpressionException e) {
        throw new InputParseException(Caption.of("worldedit.error.parser.invalid-expression", TextComponent.of(e.getMessage())));
    }
}
Also used : InputParseException(com.sk89q.worldedit.extension.input.InputParseException) WorldEditExpressionEnvironment(com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment) Expression(com.sk89q.worldedit.internal.expression.Expression) ExpressionPattern(com.fastasyncworldedit.core.function.pattern.ExpressionPattern) ExpressionException(com.sk89q.worldedit.internal.expression.ExpressionException)

Aggregations

InputParseException (com.sk89q.worldedit.extension.input.InputParseException)29 ParserContext (com.sk89q.worldedit.extension.input.ParserContext)11 NoMatchException (com.sk89q.worldedit.extension.input.NoMatchException)7 Extent (com.sk89q.worldedit.extent.Extent)7 Pattern (com.sk89q.worldedit.function.pattern.Pattern)7 Map (java.util.Map)7 Actor (com.sk89q.worldedit.extension.platform.Actor)5 IOException (java.io.IOException)5 HashMap (java.util.HashMap)5 BlanketBaseBlock (com.fastasyncworldedit.core.world.block.BlanketBaseBlock)4 CompoundTag (com.sk89q.jnbt.CompoundTag)4 WorldEdit (com.sk89q.worldedit.WorldEdit)4 WorldEditException (com.sk89q.worldedit.WorldEditException)4 BlockVector3 (com.sk89q.worldedit.math.BlockVector3)4 World (com.sk89q.worldedit.world.World)4 BaseBlock (com.sk89q.worldedit.world.block.BaseBlock)4 List (java.util.List)4 Stream (java.util.stream.Stream)4 SuggestInputParseException (com.fastasyncworldedit.core.command.SuggestInputParseException)3 Caption (com.fastasyncworldedit.core.configuration.Caption)3