Search in sources :

Example 6 with RegionMask

use of com.sk89q.worldedit.function.mask.RegionMask in project FastAsyncWorldEdit by IntellectualSites.

the class EditSession method stackCuboidRegion.

// FAWE start
/**
 * Stack a cuboid region.
 *
 * @param region       the region to stack
 * @param offset       how far to move the contents each stack. Is directional.
 * @param count        the number of times to stack
 * @param copyEntities true to copy entities
 * @param copyBiomes   true to copy biomes
 * @param mask         source mask for the operation (only matching blocks are copied)
 * @return number of blocks affected
 * @throws MaxChangedBlocksException thrown if too many blocks are changed
 */
public int stackCuboidRegion(Region region, BlockVector3 offset, int count, boolean copyEntities, boolean copyBiomes, Mask mask) throws MaxChangedBlocksException {
    checkNotNull(region);
    checkNotNull(offset);
    checkArgument(count >= 1, "count >= 1 required");
    BlockVector3 size = region.getMaximumPoint().subtract(region.getMinimumPoint()).add(1, 1, 1);
    BlockVector3 to = region.getMinimumPoint();
    ForwardExtentCopy copy = new ForwardExtentCopy(this, region, this, to);
    copy.setRepetitions(count);
    copy.setTransform(new AffineTransform().translate(offset.multiply(size)));
    copy.setCopyingEntities(copyEntities);
    copy.setCopyingBiomes(copyBiomes);
    final Region allowedRegion;
    if (allowedRegions == null || allowedRegions.length == 0) {
        allowedRegion = new NullRegion();
    } else {
        allowedRegion = new RegionIntersection(allowedRegions);
    }
    mask = MaskIntersection.of(getSourceMask(), mask, new RegionMask(allowedRegion)).optimize();
    if (mask != Masks.alwaysTrue()) {
        setSourceMask(null);
        copy.setSourceMask(mask);
    }
    Operations.completeLegacy(copy);
    return this.changes = copy.getAffected();
}
Also used : RegionIntersection(com.sk89q.worldedit.regions.RegionIntersection) AffineTransform(com.sk89q.worldedit.math.transform.AffineTransform) CuboidRegion(com.sk89q.worldedit.regions.CuboidRegion) CylinderRegion(com.sk89q.worldedit.regions.CylinderRegion) EllipsoidRegion(com.sk89q.worldedit.regions.EllipsoidRegion) FlatRegion(com.sk89q.worldedit.regions.FlatRegion) NullRegion(com.sk89q.worldedit.regions.NullRegion) Region(com.sk89q.worldedit.regions.Region) Regions.asFlatRegion(com.sk89q.worldedit.regions.Regions.asFlatRegion) RegionMask(com.sk89q.worldedit.function.mask.RegionMask) MutableBlockVector3(com.fastasyncworldedit.core.math.MutableBlockVector3) BlockVector3(com.sk89q.worldedit.math.BlockVector3) ForwardExtentCopy(com.sk89q.worldedit.function.operation.ForwardExtentCopy) NullRegion(com.sk89q.worldedit.regions.NullRegion)

Example 7 with RegionMask

use of com.sk89q.worldedit.function.mask.RegionMask in project FastAsyncWorldEdit by IntellectualSites.

the class EditSession method drainArea.

/**
 * Drain nearby pools of water or lava, optionally removed waterlogged states from blocks.
 *
 * @param origin      the origin to drain from, which will search a 3x3 area
 * @param radius      the radius of the removal, where a value should be 0 or greater
 * @param waterlogged true to make waterlogged blocks non-waterlogged as well
 * @param plants      true to remove underwater plants
 * @return number of blocks affected
 * @throws MaxChangedBlocksException thrown if too many blocks are changed
 */
public int drainArea(BlockVector3 origin, double radius, boolean waterlogged, boolean plants) throws MaxChangedBlocksException {
    checkNotNull(origin);
    checkArgument(radius >= 0, "radius >= 0 required");
    // FAWE start - liquidmask
    Mask liquidMask;
    if (plants) {
        liquidMask = new BlockTypeMask(this, BlockTypes.LAVA, BlockTypes.WATER, BlockTypes.BUBBLE_COLUMN, BlockTypes.KELP_PLANT, BlockTypes.KELP, BlockTypes.SEAGRASS, BlockTypes.TALL_SEAGRASS);
    } else {
        liquidMask = new BlockMaskBuilder().addTypes(BlockTypes.WATER, BlockTypes.LAVA, BlockTypes.BUBBLE_COLUMN).build(this);
    }
    // FAWE end
    if (waterlogged) {
        Map<String, String> stateMap = new HashMap<>();
        stateMap.put("waterlogged", "true");
        // FAWE start
        liquidMask = new MaskUnion(liquidMask, new BlockStateMask(this, stateMap, true));
    // FAWE end
    }
    Mask mask = new MaskIntersection(new BoundedHeightMask(minY, maxY), new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))), // FAWE start
    liquidMask);
    // FAWE end
    BlockReplace replace;
    if (waterlogged) {
        replace = new BlockReplace(this, new WaterloggedRemover(this));
    } else {
        replace = new BlockReplace(this, BlockTypes.AIR.getDefaultState());
    }
    // FAWE start - provide extent for preloading, min/max y
    RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1), minY, maxY, this);
    // Around the origin in a 3x3 block
    for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
        if (mask.test(position)) {
            visitor.visit(position);
        }
    }
    Operations.completeLegacy(visitor);
    // FAWE start
    return this.changes = visitor.getAffected();
// FAWE end
}
Also used : MaskIntersection(com.sk89q.worldedit.function.mask.MaskIntersection) HashMap(java.util.HashMap) BlockTypeMask(com.sk89q.worldedit.function.mask.BlockTypeMask) SingleBlockTypeMask(com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask) RegionMask(com.sk89q.worldedit.function.mask.RegionMask) BlockStateMask(com.sk89q.worldedit.function.mask.BlockStateMask) WallMakeMask(com.fastasyncworldedit.core.function.mask.WallMakeMask) ExistingBlockMask(com.sk89q.worldedit.function.mask.ExistingBlockMask) BoundedHeightMask(com.sk89q.worldedit.function.mask.BoundedHeightMask) ResettableMask(com.fastasyncworldedit.core.function.mask.ResettableMask) Mask(com.sk89q.worldedit.function.mask.Mask) MaskUnion(com.fastasyncworldedit.core.function.mask.MaskUnion) RecursiveVisitor(com.sk89q.worldedit.function.visitor.RecursiveVisitor) BlockStateMask(com.sk89q.worldedit.function.mask.BlockStateMask) RegionMask(com.sk89q.worldedit.function.mask.RegionMask) WaterloggedRemover(com.sk89q.worldedit.function.pattern.WaterloggedRemover) MutableBlockVector3(com.fastasyncworldedit.core.math.MutableBlockVector3) BlockVector3(com.sk89q.worldedit.math.BlockVector3) BoundedHeightMask(com.sk89q.worldedit.function.mask.BoundedHeightMask) BlockReplace(com.sk89q.worldedit.function.block.BlockReplace) BlockMaskBuilder(com.fastasyncworldedit.core.function.mask.BlockMaskBuilder) BlockTypeMask(com.sk89q.worldedit.function.mask.BlockTypeMask) SingleBlockTypeMask(com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask) EllipsoidRegion(com.sk89q.worldedit.regions.EllipsoidRegion)

Example 8 with RegionMask

use of com.sk89q.worldedit.function.mask.RegionMask in project FastAsyncWorldEdit by IntellectualSites.

the class EditSession method fillDirection.

/**
 * Fills an area recursively in the X/Z directions.
 *
 * @param origin    the location to start from
 * @param pattern   the block to fill with
 * @param radius    the radius of the spherical area to fill
 * @param depth     the maximum depth, starting from the origin
 * @param direction the direction to fill
 * @return the number of blocks affected
 * @throws MaxChangedBlocksException thrown if too many blocks are changed
 */
public int fillDirection(final BlockVector3 origin, final Pattern pattern, final double radius, final int depth, BlockVector3 direction) throws MaxChangedBlocksException {
    checkNotNull(origin);
    checkNotNull(pattern);
    checkArgument(radius >= 0, "radius >= 0");
    checkArgument(depth >= 1, "depth >= 1");
    if (direction.equals(BlockVector3.UNIT_MINUS_Y)) {
        return fillXZ(origin, pattern, radius, depth, false);
    }
    Mask mask = new MaskIntersection(new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))), Masks.negate(new ExistingBlockMask(EditSession.this)));
    // Want to replace blocks
    final BlockReplace replace = new BlockReplace(EditSession.this, pattern);
    // Pick how we're going to visit blocks
    RecursiveVisitor visitor = new DirectionalVisitor(mask, replace, origin, direction, (int) (radius * 2 + 1), minY, maxY);
    // Start at the origin
    visitor.visit(origin);
    // Execute
    Operations.completeBlindly(visitor);
    return this.changes = visitor.getAffected();
}
Also used : MaskIntersection(com.sk89q.worldedit.function.mask.MaskIntersection) DirectionalVisitor(com.fastasyncworldedit.core.function.visitor.DirectionalVisitor) BlockTypeMask(com.sk89q.worldedit.function.mask.BlockTypeMask) SingleBlockTypeMask(com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask) RegionMask(com.sk89q.worldedit.function.mask.RegionMask) BlockStateMask(com.sk89q.worldedit.function.mask.BlockStateMask) WallMakeMask(com.fastasyncworldedit.core.function.mask.WallMakeMask) ExistingBlockMask(com.sk89q.worldedit.function.mask.ExistingBlockMask) BoundedHeightMask(com.sk89q.worldedit.function.mask.BoundedHeightMask) ResettableMask(com.fastasyncworldedit.core.function.mask.ResettableMask) Mask(com.sk89q.worldedit.function.mask.Mask) RecursiveVisitor(com.sk89q.worldedit.function.visitor.RecursiveVisitor) RegionMask(com.sk89q.worldedit.function.mask.RegionMask) ExistingBlockMask(com.sk89q.worldedit.function.mask.ExistingBlockMask) BlockReplace(com.sk89q.worldedit.function.block.BlockReplace) EllipsoidRegion(com.sk89q.worldedit.regions.EllipsoidRegion)

Aggregations

RegionMask (com.sk89q.worldedit.function.mask.RegionMask)8 Mask (com.sk89q.worldedit.function.mask.Mask)7 BlockReplace (com.sk89q.worldedit.function.block.BlockReplace)6 BlockVector3 (com.sk89q.worldedit.math.BlockVector3)6 EllipsoidRegion (com.sk89q.worldedit.regions.EllipsoidRegion)6 ResettableMask (com.fastasyncworldedit.core.function.mask.ResettableMask)5 SingleBlockTypeMask (com.fastasyncworldedit.core.function.mask.SingleBlockTypeMask)5 WallMakeMask (com.fastasyncworldedit.core.function.mask.WallMakeMask)5 BlockStateMask (com.sk89q.worldedit.function.mask.BlockStateMask)5 BlockTypeMask (com.sk89q.worldedit.function.mask.BlockTypeMask)5 BoundedHeightMask (com.sk89q.worldedit.function.mask.BoundedHeightMask)5 ExistingBlockMask (com.sk89q.worldedit.function.mask.ExistingBlockMask)5 MutableBlockVector3 (com.fastasyncworldedit.core.math.MutableBlockVector3)4 MaskIntersection (com.sk89q.worldedit.function.mask.MaskIntersection)4 ForwardExtentCopy (com.sk89q.worldedit.function.operation.ForwardExtentCopy)4 NullRegion (com.sk89q.worldedit.regions.NullRegion)4 Region (com.sk89q.worldedit.regions.Region)4 RegionIntersection (com.sk89q.worldedit.regions.RegionIntersection)4 RecursiveVisitor (com.sk89q.worldedit.function.visitor.RecursiveVisitor)3 MultiClipboardHolder (com.fastasyncworldedit.core.extent.clipboard.MultiClipboardHolder)2