/* * WorldEdit, a Minecraft world manipulation toolkit * Copyright (C) sk89q * Copyright (C) WorldEdit team and contributors * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ package com.sk89q.worldedit.extension.factory; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.factory.parser.mask.*; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.mask.MaskIntersection; import com.sk89q.worldedit.internal.registry.AbstractFactory; import com.sk89q.worldedit.internal.registry.InputParser; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * A registry of known {@link Mask}s. Provides methods to instantiate * new masks from input. * *

Instances of this class can be taken from * {@link WorldEdit#getMaskFactory()}.

*/ public final class MaskFactory extends AbstractFactory { /** * Create a new mask registry. * * @param worldEdit the WorldEdit instance */ public MaskFactory(WorldEdit worldEdit) { super(worldEdit, new BlocksMaskParser(worldEdit)); register(new ExistingMaskParser(worldEdit)); register(new SolidMaskParser(worldEdit)); register(new LazyRegionMaskParser(worldEdit)); register(new RegionMaskParser(worldEdit)); register(new OffsetMaskParser(worldEdit)); register(new NoiseMaskParser(worldEdit)); register(new BlockStateMaskParser(worldEdit)); register(new NegateMaskParser(worldEdit)); register(new ExpressionMaskParser(worldEdit)); register(new BlockCategoryMaskParser(worldEdit)); register(new BiomeMaskParser(worldEdit)); // Mask Parsers from FAWE register(new FalseMaskParser(worldEdit)); register(new TrueMaskParser(worldEdit)); register(new AirMaskParser(worldEdit)); register(new LiquidMaskParser(worldEdit)); register(new XAxisMaskParser(worldEdit)); register(new YAxisMaskParser(worldEdit)); register(new ZAxisMaskParser(worldEdit)); } @Override public List getSuggestions(String input) { final String[] split = input.split(" "); if (split.length > 1) { String prev = input.substring(0, input.lastIndexOf(" ")) + " "; return super.getSuggestions(split[split.length -1]).stream().map(s -> prev + s).collect(Collectors.toList()); } return super.getSuggestions(input); } @Override public Mask parseFromInput(String input, ParserContext context) throws InputParseException { List masks = new ArrayList<>(); for (String component : input.split(" ")) { if (component.isEmpty()) { continue; } for (InputParser parser : getParsers()) { Mask match = parser.parseFromInput(component, context); if (match != null) { masks.add(match); } } } switch (masks.size()) { case 0: throw new NoMatchException("No match for '" + input + "'"); case 1: return masks.get(0).optimize(); default: return new MaskIntersection(masks).optimize(); } } }