Skip to content

Commit 3b4beba

Browse files
committed
Improve performance of various commands/actions
- Add chunk preloading to RegionVisitor if supplied with a suitable Extent - Where extents are used in masks, set EditSession as the extent as they are otherwise initialised with WorldWrapper that is very slow - Fixes IntellectualSites#1073
1 parent f2ee224 commit 3b4beba

10 files changed

Lines changed: 232 additions & 32 deletions

File tree

worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,7 @@ public <B extends BlockStateHolder<B>> int fall(final Region region, boolean ful
12421242
}
12431243
}
12441244
return true;
1245-
});
1245+
}, this);
12461246
Operations.completeBlindly(visitor);
12471247
return this.changes;
12481248
}
@@ -2783,7 +2783,7 @@ public int deformRegion(final Region region, final Vector3 zero, final Vector3 u
27832783
} catch (EvaluationException e) {
27842784
throw new RuntimeException(e);
27852785
}
2786-
});
2786+
}, this);
27872787
Operations.completeBlindly(visitor);
27882788
changes += visitor.getAffected();
27892789
return changes;

worldedit-core/src/main/java/com/sk89q/worldedit/command/BiomeCommands.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,9 @@ public void setBiome(Player player, LocalSession session, EditSession editSessio
177177
if (mask != null) {
178178
replace = new RegionMaskingFilter(editSession, mask, replace);
179179
}
180-
RegionVisitor visitor = new RegionVisitor(region, replace);
180+
//FAWE start > add extent to RegionVisitor to allow chunk preloading
181+
RegionVisitor visitor = new RegionVisitor(region, replace, editSession);
182+
//FAWE end
181183
Operations.completeLegacy(visitor);
182184

183185
player.print(Caption.of(

worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.sk89q.worldedit.entity.Player;
3636
import com.sk89q.worldedit.extension.platform.Actor;
3737
import com.fastasyncworldedit.core.function.generator.CavesGen;
38+
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
3839
import com.sk89q.worldedit.function.mask.Mask;
3940
import com.sk89q.worldedit.function.operation.Operations;
4041
import com.sk89q.worldedit.function.pattern.Pattern;
@@ -467,6 +468,9 @@ public void caves(Actor actor, LocalSession session, EditSession editSession, @S
467468
@Logging(PLACEMENT)
468469
@Confirm(Confirm.Processor.REGION)
469470
public void ores(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, @Arg(desc = "Mask") Mask mask) throws WorldEditException {
471+
if (mask instanceof AbstractExtentMask) {
472+
((AbstractExtentMask) mask).setExtent(editSession);
473+
}
470474
editSession.addOres(region, mask);
471475
actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount()));
472476
}
@@ -516,7 +520,7 @@ public void image(Actor actor,
516520
e.printStackTrace();
517521
}
518522
return false;
519-
});
523+
}, editSession);
520524
Operations.completeBlindly(visitor);
521525
actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount()));
522526
}
@@ -536,6 +540,9 @@ public void ore(Actor actor,
536540
@Arg(desc = "Ore vein rarity (% chance each attempt is placed)", def = "100") @Range(from = 0, to = 100) int rarity,
537541
@Arg(desc = "Ore vein min y", def = "0") @Range(from = 0, to = 255) int minY,
538542
@Arg(desc = "Ore vein max y", def = "63") @Range(from = 0, to = 255) int maxY) throws WorldEditException {
543+
if (mask instanceof AbstractExtentMask) {
544+
((AbstractExtentMask) mask).setExtent(editSession);
545+
}
539546
editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY);
540547
actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount()));
541548
}

worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,10 @@ public int replace(Actor actor, EditSession editSession, @Selection Region regio
299299
Pattern to) throws WorldEditException {
300300
if (from == null) {
301301
from = new ExistingBlockMask(editSession);
302+
//FAWE start > the mask will have been initialised with a WorldWrapper extent (very bad/slow
303+
} else if (from instanceof AbstractExtentMask) {
304+
((AbstractExtentMask) from).setExtent(editSession);
305+
//FAWE end
302306
}
303307
if (from instanceof AbstractExtentMask) {
304308
((AbstractExtentMask) from).setExtent(editSession);
@@ -422,6 +426,11 @@ public int smooth(Actor actor, EditSession editSession, @Selection Region region
422426
Mask mask,
423427
@Switch(name = 's', desc = "The flag makes it only consider snow")
424428
boolean snow) throws WorldEditException {
429+
//FAWE start > the mask will have been initialised with a WorldWrapper extent (very bad/slow)
430+
if (mask instanceof AbstractExtentMask) {
431+
((AbstractExtentMask) mask).setExtent(editSession);
432+
}
433+
//FAWE end
425434
BlockVector3 min = region.getMinimumPoint();
426435
BlockVector3 max = region.getMaximumPoint();
427436
long volume = (((long) max.getX() - (long) min.getX() + 1) * ((long) max.getY() - (long) min.getY() + 1) * ((long) max.getZ() - (long) min.getZ() + 1));
@@ -502,7 +511,11 @@ public int move(Actor actor, World world, EditSession editSession, LocalSession
502511
@ArgFlag(name = 'm', desc = "Set the include mask, non-matching blocks become air")
503512
Mask mask) throws WorldEditException {
504513
checkCommandArgument(count >= 1, "Count must be >= 1");
505-
514+
//FAWE start > the mask will have been initialised with a WorldWrapper extent (very bad/slow)
515+
if (mask instanceof AbstractExtentMask) {
516+
((AbstractExtentMask) mask).setExtent(editSession);
517+
}
518+
//FAWE end
506519
Mask combinedMask;
507520
if (ignoreAirBlocks) {
508521
if (mask == null) {
@@ -573,7 +586,11 @@ public int stack(Actor actor, World world, EditSession editSession, LocalSession
573586
boolean copyBiomes,
574587
@ArgFlag(name = 'm', desc = "Set the include mask, non-matching blocks become air")
575588
Mask mask) throws WorldEditException {
576-
589+
//FAWE start > the mask will have been initialised with a WorldWrapper extent (very bad/slow)
590+
if (mask instanceof AbstractExtentMask) {
591+
((AbstractExtentMask) mask).setExtent(editSession);
592+
}
593+
//FAWE end
577594
Mask combinedMask;
578595
if (ignoreAirBlocks) {
579596
if (mask == null) {
@@ -731,7 +748,18 @@ public int hollow(Actor actor, EditSession editSession,
731748
@ArgFlag(name = 'm', desc = "Mask to hollow with")
732749
Mask mask) throws WorldEditException {
733750
checkCommandArgument(thickness >= 0, "Thickness must be >= 0");
734-
Mask finalMask = mask == null ? new SolidBlockMask(editSession) : mask;
751+
752+
//FAWE start > the mask will have been initialised with a WorldWrapper extent (very bad/slow)
753+
Mask finalMask;
754+
if (mask != null) {
755+
if (mask instanceof AbstractExtentMask) {
756+
((AbstractExtentMask) mask).setExtent(editSession);
757+
}
758+
finalMask = mask;
759+
} else {
760+
finalMask = new SolidBlockMask(editSession);
761+
}
762+
//FAWE end
735763

736764
int affected = editSession.hollowOutRegion(region, thickness, pattern, finalMask);
737765
actor.print(Caption.of("worldedit.hollow.changed", TextComponent.of(affected)));

worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits;
4343
import com.sk89q.worldedit.extent.clipboard.Clipboard;
4444
import com.sk89q.worldedit.function.block.BlockDistributionCounter;
45+
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
4546
import com.sk89q.worldedit.function.mask.Mask;
4647
import com.sk89q.worldedit.function.operation.Operations;
4748
import com.sk89q.worldedit.function.visitor.RegionVisitor;
@@ -534,6 +535,11 @@ public void size(Actor actor, World world, LocalSession session,
534535
public int count(Actor actor, World world, LocalSession session, EditSession editSession,
535536
@Arg(desc = "The mask of blocks to match")
536537
Mask mask) throws WorldEditException {
538+
//FAWE start > the mask will have been initialised with a WorldWrapper extent (very bad/slow)
539+
if (mask instanceof AbstractExtentMask) {
540+
((AbstractExtentMask) mask).setExtent(editSession);
541+
}
542+
//FAWE end
537543
int count = editSession.countBlocks(session.getSelection(world), mask);
538544
actor.print(Caption.of("worldedit.count.counted", TextComponent.of(count)));
539545
return count;
@@ -545,6 +551,9 @@ public int count(Actor actor, World world, LocalSession session, EditSession edi
545551
)
546552
@CommandPermissions("worldedit.analysis.distr")
547553
public void distr(Actor actor, World world, LocalSession session,
554+
//FAWE start > add extent to RegionVisitor to allow chunk preloading
555+
EditSession editSession,
556+
//FAWE end
548557
@Switch(name = 'c', desc = "Get the distribution of the clipboard instead")
549558
boolean clipboardDistr,
550559
@Switch(name = 'd', desc = "Separate blocks by state")
@@ -557,13 +566,13 @@ public void distr(Actor actor, World world, LocalSession session,
557566
if (clipboardDistr) {
558567
Clipboard clipboard = session.getClipboard().getClipboard(); // throws if missing
559568
BlockDistributionCounter count = new BlockDistributionCounter(clipboard, separateStates);
560-
RegionVisitor visitor = new RegionVisitor(clipboard.getRegion(), count);
569+
//FAWE start > add extent to RegionVisitor to allow chunk preloading
570+
RegionVisitor visitor = new RegionVisitor(clipboard.getRegion(), count, editSession);
571+
//FAWE end
561572
Operations.completeBlindly(visitor);
562573
distribution = count.getDistribution();
563574
} else {
564-
try (EditSession editSession = session.createEditSession(actor)) {
565575
distribution = editSession.getBlockDistribution(session.getSelection(world), separateStates);
566-
}
567576
}
568577
session.setLastDistribution(distribution);
569578
page = 1;

worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
5050
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
5151
import com.sk89q.worldedit.function.EntityFunction;
52+
import com.sk89q.worldedit.function.mask.AbstractExtentMask;
5253
import com.sk89q.worldedit.function.mask.BlockTypeMask;
5354
import com.sk89q.worldedit.function.mask.ExistingBlockMask;
5455
import com.sk89q.worldedit.function.mask.Mask;
@@ -424,6 +425,11 @@ public int removeNear(Actor actor, LocalSession session, EditSession editSession
424425
Mask mask,
425426
@Arg(desc = "The radius of the square to remove from", def = "50")
426427
int radius) throws WorldEditException {
428+
//FAWE start > the mask will have been initialised with a WorldWrapper extent (very bad/slow)
429+
if (mask instanceof AbstractExtentMask) {
430+
((AbstractExtentMask) mask).setExtent(editSession);
431+
}
432+
//FAWE end
427433
radius = Math.max(1, radius);
428434
we.checkMaxRadius(radius);
429435

@@ -446,6 +452,11 @@ public int replaceNear(Actor actor, World world, LocalSession session, EditSessi
446452
Mask from,
447453
@Arg(desc = "The pattern of blocks to replace with")
448454
Pattern to) throws WorldEditException {
455+
//FAWE start > the mask will have been initialised with a WorldWrapper extent (very bad/slow)
456+
if (from instanceof AbstractExtentMask) {
457+
((AbstractExtentMask) from).setExtent(editSession);
458+
}
459+
//FAWE end
449460
radius = Math.max(1, radius);
450461
we.checkMaxRadius(radius);
451462

worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,9 @@ default int countBlocks(Region region, Set<BaseBlock> searchBlocks) {
549549
* @return the number of blocks that matched the mask
550550
*/
551551
default int countBlocks(Region region, Mask searchMask) {
552-
RegionVisitor visitor = new RegionVisitor(region, searchMask::test);
552+
//FAWE start > use slightly more performant RegionVisitor
553+
RegionVisitor visitor = new RegionVisitor(region, searchMask::test, this);
554+
//FAWE end
553555
Operations.completeBlindly(visitor);
554556
return visitor.getAffected();
555557
}
@@ -648,7 +650,9 @@ default int replaceBlocks(Region region, Mask mask, Pattern pattern) throws MaxC
648650

649651
BlockReplace replace = new BlockReplace(this, pattern);
650652
RegionMaskingFilter filter = new RegionMaskingFilter(this, mask, replace);
651-
RegionVisitor visitor = new RegionVisitor(region, filter);
653+
//FAWE start > add extent to RegionVisitor to allow chunk preloading
654+
RegionVisitor visitor = new RegionVisitor(region, filter, this);
655+
//FAWE end
652656
Operations.completeLegacy(visitor);
653657
return visitor.getAffected();
654658
}

worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Apply.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ public Apply(Region region, Contextual<? extends RegionFunction> function) {
5555

5656
@Override
5757
public Operation createFromContext(EditContext context) {
58-
return new RegionVisitor(firstNonNull(context.getRegion(), region), function.createFromContext(context));
58+
//FAWE start > add extent to RegionVisitor to allow chunk preloading
59+
return new RegionVisitor(firstNonNull(context.getRegion(), region), function.createFromContext(context), context.getDestination());
60+
//FAWE end
5961
}
6062

6163
@Override

worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/ApplyRegion.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public ApplyRegion(Region region, Contextual<? extends RegionFunction> function)
4848

4949
@Override
5050
public Operation createFromContext(EditContext context) {
51-
return new RegionVisitor(firstNonNull(context.getRegion(), region), function.createFromContext(context));
51+
//FAWE start > add extent to RegionVisitor to allow chunk preloading
52+
return new RegionVisitor(firstNonNull(context.getRegion(), region), function.createFromContext(context), context.getDestination());
53+
//FAWE end
5254
}
5355

5456
@Override

0 commit comments

Comments
 (0)