Skip to content

Commit 5aa81ff

Browse files
authored
Speed up Fast Reorder Mode and make it default (#1653)
* Speed up Fast Reorder Mode and make it default * Make non-exposed side effects internal * Docs on isExposed
1 parent 69b1b5e commit 5aa81ff

8 files changed

Lines changed: 48 additions & 14 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ public String getDisplayName() {
213213

214214
private final @Nullable List<TracingExtent> tracingExtents;
215215

216-
private ReorderMode reorderMode = ReorderMode.MULTI_STAGE;
216+
private ReorderMode reorderMode = ReorderMode.FAST;
217217

218218
private Mask oldMask;
219219

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public class LocalSession {
108108
private transient Mask mask;
109109
private transient ZoneId timezone = ZoneId.systemDefault();
110110
private transient BlockVector3 cuiTemporaryBlock;
111-
private transient EditSession.ReorderMode reorderMode = EditSession.ReorderMode.MULTI_STAGE;
111+
private transient EditSession.ReorderMode reorderMode = EditSession.ReorderMode.FAST;
112112
private transient List<Countable<BlockState>> lastDistribution;
113113
private transient World worldOverride;
114114
private transient boolean tickingWatchdog = true;

worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/SideEffectConverter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ public Component describeAcceptableArguments() {
5959

6060
@Override
6161
public List<String> getSuggestions(String input, InjectedValueAccess context) {
62-
return limitByPrefix(getSideEffects().stream().map(sideEffect -> sideEffect.name().toLowerCase(Locale.US)), input);
62+
return limitByPrefix(getSideEffects().stream()
63+
.filter(SideEffect::isExposed)
64+
.map(sideEffect -> sideEffect.name().toLowerCase(Locale.US)), input);
6365
}
6466

6567
@Override

worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SideEffectExtent.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@
3232
import com.sk89q.worldedit.world.block.BlockState;
3333
import com.sk89q.worldedit.world.block.BlockStateHolder;
3434

35+
import java.util.Arrays;
3536
import java.util.HashSet;
3637
import java.util.Iterator;
3738
import java.util.Map;
3839
import java.util.Set;
40+
import java.util.function.Function;
41+
import java.util.stream.Collectors;
3942

4043
import static com.google.common.base.Preconditions.checkNotNull;
4144

@@ -50,6 +53,11 @@ public class SideEffectExtent extends AbstractDelegateExtent {
5053
private SideEffectSet sideEffectSet = SideEffectSet.defaults();
5154
private boolean postEditSimulation;
5255

56+
private static final SideEffectSet INTERNAL_NONE = new SideEffectSet(
57+
Arrays.stream(SideEffect.values())
58+
.collect(Collectors.toMap(Function.identity(), state -> SideEffect.State.OFF))
59+
);
60+
5361
/**
5462
* Create a new instance.
5563
*
@@ -86,7 +94,7 @@ public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B
8694
positions.put(location, world.getBlock(location));
8795
}
8896

89-
return world.setBlock(location, block, postEditSimulation ? SideEffectSet.none() : sideEffectSet);
97+
return world.setBlock(location, block, postEditSimulation ? INTERNAL_NONE : sideEffectSet);
9098
}
9199

92100
public boolean commitRequired() {

worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ default void markAndNotifyBlock(NP pos, NC chunk, NBS oldState, NBS newState, Si
167167
if (isChunkTicking(chunk)) {
168168
if (sideEffectSet.shouldApply(SideEffect.ENTITY_AI)) {
169169
notifyBlockUpdate(pos, oldState, newState);
170-
} else {
170+
} else if (sideEffectSet.shouldApply(SideEffect.NETWORK)) {
171171
// If we want to skip entity AI, just mark the block for sending
172172
markBlockChanged(pos);
173173
}
@@ -183,7 +183,9 @@ default void markAndNotifyBlock(NP pos, NC chunk, NBS oldState, NBS newState, Si
183183
}
184184

185185
// Seems used only for PoI updates
186-
onBlockStateChange(pos, oldState, blockState1);
186+
if (sideEffectSet.shouldApply(SideEffect.POI_UPDATE)) {
187+
onBlockStateChange(pos, oldState, blockState1);
188+
}
187189
}
188190

189191
}

worldedit-core/src/main/java/com/sk89q/worldedit/util/SideEffect.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,32 @@
2222
import java.util.Locale;
2323

2424
public enum SideEffect {
25-
LIGHTING(State.ON),
26-
NEIGHBORS(State.ON),
27-
UPDATE(State.ON),
28-
VALIDATION(State.OFF),
29-
ENTITY_AI(State.OFF),
30-
EVENTS(State.OFF);
25+
LIGHTING(State.ON, true),
26+
NEIGHBORS(State.ON, true),
27+
UPDATE(State.ON, true),
28+
VALIDATION(State.OFF, true),
29+
ENTITY_AI(State.OFF, true),
30+
EVENTS(State.OFF, true),
31+
/**
32+
* Internal use only.
33+
*/
34+
POI_UPDATE(State.ON, false),
35+
/**
36+
* Internal use only.
37+
*/
38+
NETWORK(State.ON, false);
3139

3240
// TODO Make these components in WE8
3341
private final String displayName;
3442
private final String description;
3543
private final State defaultValue;
44+
private final boolean exposed;
3645

37-
SideEffect(State defaultValue) {
46+
SideEffect(State defaultValue, boolean exposed) {
3847
this.displayName = "worldedit.sideeffect." + this.name().toLowerCase(Locale.US);
3948
this.description = "worldedit.sideeffect." + this.name().toLowerCase(Locale.US) + ".description";
4049
this.defaultValue = defaultValue;
50+
this.exposed = exposed;
4151
}
4252

4353
public String getDisplayName() {
@@ -52,6 +62,15 @@ public State getDefaultValue() {
5262
return this.defaultValue;
5363
}
5464

65+
/**
66+
* Determines if this side effect is considered API.
67+
*
68+
* @return if the side effect is exposed via API
69+
*/
70+
public boolean isExposed() {
71+
return exposed;
72+
}
73+
5574
public enum State {
5675
OFF,
5776
ON,

worldedit-core/src/main/java/com/sk89q/worldedit/util/SideEffectSet.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
public class SideEffectSet {
3333
private static final SideEffectSet DEFAULT = new SideEffectSet(ImmutableMap.of());
3434
private static final SideEffectSet NONE = new SideEffectSet(
35-
Arrays.stream(SideEffect.values()).collect(Collectors.toMap(Function.identity(), state -> SideEffect.State.OFF))
35+
Arrays.stream(SideEffect.values())
36+
.filter(SideEffect::isExposed)
37+
.collect(Collectors.toMap(Function.identity(), state -> SideEffect.State.OFF))
3638
);
3739

3840
private final Map<SideEffect, SideEffect.State> sideEffects;

worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class SideEffectBox extends PaginationBox {
4141
private static final LazyReference<List<SideEffect>> SIDE_EFFECTS = LazyReference.from(() ->
4242
WorldEdit.getInstance().getPlatformManager().getSupportedSideEffects()
4343
.stream()
44+
.filter(SideEffect::isExposed)
4445
.sorted(Comparator.comparing(effect ->
4546
WorldEditText.reduceToText(
4647
TranslatableComponent.of(effect.getDisplayName()),

0 commit comments

Comments
 (0)