Skip to content

Add a -m flag to the //distr command to filter included blocks #2754

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2281,7 +2281,18 @@ public int makeForest(Region region, double density, TreeGenerator.TreeType tree
* @return the results
*/
public List<Countable<BlockState>> getBlockDistribution(Region region, boolean separateStates) {
BlockDistributionCounter count = new BlockDistributionCounter(this, separateStates);
return getBlockDistribution(region, Masks.alwaysTrue(), separateStates);
}

/**
* Get the block distribution inside a region.
*
* @param region a region
* @param mask a mask to filter the blocks to count
* @return the results
*/
public List<Countable<BlockState>> getBlockDistribution(Region region, @Nullable Mask mask, boolean separateStates) {
BlockDistributionCounter count = new BlockDistributionCounter(this, mask, separateStates);
RegionVisitor visitor = new RegionVisitor(region, count);
Operations.completeBlindly(visitor);
return count.getDistribution();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -701,19 +701,21 @@ public void distr(Actor actor, World world, LocalSession session,
@Switch(name = 'd', desc = "Separate blocks by state")
boolean separateStates,
@ArgFlag(name = 'p', desc = "Gets page from a previous distribution.")
Integer page) throws WorldEditException {
Integer page,
@ArgFlag(name = 'm', desc = "Only include blocks matching the given mask")
Mask sourceMask) throws WorldEditException {
List<Countable<BlockState>> distribution;

if (page == null) {
if (clipboardDistr) {
Clipboard clipboard = session.getClipboard().getClipboard(); // throws if missing
BlockDistributionCounter count = new BlockDistributionCounter(clipboard, separateStates);
BlockDistributionCounter count = new BlockDistributionCounter(clipboard, sourceMask, separateStates);
RegionVisitor visitor = new RegionVisitor(clipboard.getRegion(), count);
Operations.completeBlindly(visitor);
distribution = count.getDistribution();
} else {
try (EditSession editSession = session.createEditSession(actor)) {
distribution = editSession.getBlockDistribution(session.getSelection(world), separateStates);
distribution = editSession.getBlockDistribution(session.getSelection(world), sourceMask, separateStates);
}
}
session.setLastDistribution(distribution);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.RegionFunction;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.mask.Masks;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.util.Countable;
import com.sk89q.worldedit.world.block.BlockState;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.Collections;
Expand All @@ -35,18 +38,28 @@
public class BlockDistributionCounter implements RegionFunction {

private final Extent extent;
private final Mask mask;
private final boolean separateStates;

private final List<Countable<BlockState>> distribution = new ArrayList<>();
private final Map<BlockState, Countable<BlockState>> map = new HashMap<>();

public BlockDistributionCounter(Extent extent, boolean separateStates) {
this(extent, null, separateStates);
}

public BlockDistributionCounter(Extent extent, @Nullable Mask mask, boolean separateStates) {
this.extent = extent;
this.mask = mask == null ? Masks.alwaysTrue() : mask;
this.separateStates = separateStates;
}

@Override
public boolean apply(BlockVector3 position) throws WorldEditException {
if (!mask.test(position)) {
return true;
}

BlockState blk = extent.getBlock(position);
if (!separateStates) {
blk = blk.getBlockType().getDefaultState();
Expand Down
Loading