mirror of
https://github.com/plexusorg/Plex-FAWE.git
synced 2025-07-04 03:56:41 +00:00
Set source masks that include the editsession's allowed regions to ForwardExtentCopies
Fixes #710
This commit is contained in:
@ -109,7 +109,9 @@ import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.regions.CylinderRegion;
|
||||
import com.sk89q.worldedit.regions.EllipsoidRegion;
|
||||
import com.sk89q.worldedit.regions.FlatRegion;
|
||||
import com.sk89q.worldedit.regions.NullRegion;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
import com.sk89q.worldedit.regions.RegionIntersection;
|
||||
import com.sk89q.worldedit.regions.Regions;
|
||||
import com.sk89q.worldedit.regions.shape.ArbitraryBiomeShape;
|
||||
import com.sk89q.worldedit.regions.shape.ArbitraryShape;
|
||||
@ -224,6 +226,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
||||
|
||||
private final boolean wnaMode;
|
||||
|
||||
@Nullable
|
||||
private final Region[] allowedRegions;
|
||||
|
||||
|
||||
@Deprecated
|
||||
public EditSession(@NotNull EventBus bus, World world, @Nullable Player player,
|
||||
@ -260,6 +265,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
||||
this.blockBag = builder.getBlockBag();
|
||||
this.history = changeSet != null;
|
||||
this.wnaMode = builder.isWNAMode();
|
||||
this.allowedRegions = builder.getAllowedRegions().clone();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -307,8 +313,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
||||
}
|
||||
|
||||
/**
|
||||
* The region extent restricts block placements to allow max Y regions.
|
||||
* TODO This doc needs to be rewritten because it may not actually describe what it does.
|
||||
* Returns the RegionExtent that will restrict an edit, or null.
|
||||
*
|
||||
* @return FaweRegionExtent (may be null)
|
||||
*/
|
||||
@ -483,6 +488,11 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
||||
return maskingExtent != null ? maskingExtent.get().getMask() : null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Region[] getAllowedRegions() {
|
||||
return allowedRegions;
|
||||
}
|
||||
|
||||
public void addTransform(ResettableExtent transform) {
|
||||
checkNotNull(transform);
|
||||
transform.setExtent(getExtent());
|
||||
@ -1530,7 +1540,13 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
||||
copy.setTransform(new AffineTransform().translate(dir.multiply(size)));
|
||||
copy.setCopyingEntities(copyEntities);
|
||||
copy.setCopyingBiomes(copyBiomes);
|
||||
mask = MaskIntersection.of(getSourceMask(), mask).optimize();
|
||||
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);
|
||||
@ -1605,14 +1621,19 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
||||
copy.setRemovingEntities(moveEntities);
|
||||
copy.setCopyingBiomes(copyBiomes);
|
||||
copy.setRepetitions(1);
|
||||
if (mask != null) {
|
||||
new MaskTraverser(mask).reset(this);
|
||||
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()) {
|
||||
copy.setSourceMask(mask);
|
||||
if (this.getSourceMask() == mask) {
|
||||
if (this.getSourceMask().equals(mask)) {
|
||||
setSourceMask(null);
|
||||
}
|
||||
}
|
||||
|
||||
Operations.completeBlindly(copy);
|
||||
return this.changes = copy.getAffected();
|
||||
}
|
||||
|
Reference in New Issue
Block a user