Fix fuzzy region

This commit is contained in:
dordsor21 2021-09-21 14:31:03 +01:00
parent 69ae4a7121
commit d0056870be
No known key found for this signature in database
GPG Key ID: 1E53E88969FFCF0B
4 changed files with 20 additions and 16 deletions

View File

@ -47,13 +47,17 @@ public class FuzzyRegion extends AbstractRegion {
return set.size();
}
public void select(int x, int y, int z) {
/**
* Add to the selection from the given position.
*/
public void select(BlockVector3 position) {
RecursiveVisitor search = new RecursiveVisitor(mask, p -> {
setMinMax(p.getBlockX(), p.getBlockY(), p.getBlockZ());
return true;
}, 256, extent.getMinY(), extent.getMaxY());
}, 256, extent.getMinY(), extent.getMaxY(), extent);
search.setVisited(set);
search.visit(BlockVector3.at(x, y, z));
mask.test(position);
search.visit(position);
Operations.completeBlindly(search);
}

View File

@ -9,7 +9,6 @@ import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.math.BlockVector3;
@ -26,17 +25,17 @@ import java.util.stream.IntStream;
public class FuzzyRegionSelector extends PassthroughExtent implements RegionSelector {
private final Player player;
private final Actor actor;
private FuzzyRegion region;
private final ArrayList<BlockVector3> positions;
public FuzzyRegionSelector(Player player, @Nullable World world, Mask mask) {
public FuzzyRegionSelector(Actor actor, @Nullable World world, Mask mask) {
super(WorldEdit.getInstance().newEditSessionBuilder().world(world)
.actor(player)
.actor(actor)
.changeSetNull()
.checkMemory(false)
.build());
this.player = player;
this.actor = actor;
this.region = new FuzzyRegion(world, getExtent(), mask);
this.positions = new ArrayList<>();
new MaskTraverser(mask).reset(getExtent());
@ -51,7 +50,7 @@ public class FuzzyRegionSelector extends PassthroughExtent implements RegionSele
@Override
public void setWorld(@Nullable World world) {
EditSession extent = WorldEdit.getInstance().newEditSessionBuilder().world(world)
.actor(player)
.actor(actor)
.changeSetNull()
.checkMemory(false)
.build();
@ -72,7 +71,7 @@ public class FuzzyRegionSelector extends PassthroughExtent implements RegionSele
positions.clear();
positions.add(position);
this.region = new FuzzyRegion(getWorld(), getExtent(), getMask());
this.region.select(position.getBlockX(), position.getBlockY(), position.getBlockZ());
this.region.select(position);
return true;
}
@ -80,18 +79,18 @@ public class FuzzyRegionSelector extends PassthroughExtent implements RegionSele
public boolean selectSecondary(BlockVector3 position, SelectorLimits limits) {
this.positions.add(position);
new MaskTraverser(getMask()).reset(getExtent());
this.region.select(position.getBlockX(), position.getBlockY(), position.getBlockZ());
this.region.select(position);
return true;
}
@Override
public void explainPrimarySelection(Actor actor, LocalSession session, BlockVector3 position) {
player.print(Caption.of("fawe.worldedit.selector.selector.fuzzy.pos1", position, "(" + region.getVolume() + ")"));
actor.print(Caption.of("fawe.worldedit.selector.selector.fuzzy.pos1", position, "(" + region.getVolume() + ")"));
}
@Override
public void explainSecondarySelection(Actor actor, LocalSession session, BlockVector3 position) {
player.print(Caption.of("fawe.worldedit.selector.selector.fuzzy.pos2", position, "(" + region.getVolume() + ")"));
actor.print(Caption.of("fawe.worldedit.selector.selector.fuzzy.pos2", position, "(" + region.getVolume() + ")"));
}
@Override

View File

@ -717,8 +717,7 @@ public class SelectionCommands {
case FUZZY:
case MAGIC:
Mask maskOpt = new IdMask(world);
//TODO Make FuzzyRegionSelector accept actors
newSelector = new FuzzyRegionSelector((Player) actor, world, maskOpt);
newSelector = new FuzzyRegionSelector(actor, world, maskOpt);
actor.print(Caption.of("fawe.selection.sel.fuzzy"));
actor.print(Caption.of("fawe.selection.sel.list"));
break;

View File

@ -210,7 +210,9 @@ public abstract class BreadthFirstSearch implements Operation {
* Add the given location to the list of locations to visit, provided
* that it has not been visited. The position passed to this method
* will still be visited even if it fails
* {@link #isVisitable(BlockVector3, BlockVector3)}.
* {@link #isVisitable(BlockVector3, BlockVector3)} as
* {@link #isVisitable(BlockVector3, BlockVector3)} is never actually
* called.
*
* <p>This method should be used before the search begins, because if
* the position <em>does</em> fail the test, and the search has already