Cherry pick upstream commits to fix SideEffectSet (#1737)

* Fix SideEffectSet.none() being the default set (#1620)

* Fix SideEffectSet.none() being the default set

* Remove the unnecessary private empty constructor for SideEffectSet

* Back to ImmutableMap.of

* 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

Co-authored-by: Matthew Miller <mnmiller1@me.com>
This commit is contained in:
Jordan 2022-05-10 09:11:12 +01:00 committed by GitHub
parent d7543884a5
commit b237ddf076
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 63 additions and 25 deletions

View File

@ -59,7 +59,9 @@ public class SideEffectConverter implements ArgumentConverter<SideEffect> {
@Override @Override
public List<String> getSuggestions(String input, InjectedValueAccess context) { public List<String> getSuggestions(String input, InjectedValueAccess context) {
return limitByPrefix(getSideEffects().stream().map(sideEffect -> sideEffect.name().toLowerCase(Locale.US)), input); return limitByPrefix(getSideEffects().stream()
.filter(SideEffect::isExposed)
.map(sideEffect -> sideEffect.name().toLowerCase(Locale.US)), input);
} }
@Override @Override

View File

@ -32,10 +32,13 @@ import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
@ -50,6 +53,11 @@ public class SideEffectExtent extends AbstractDelegateExtent {
private SideEffectSet sideEffectSet = SideEffectSet.defaults(); private SideEffectSet sideEffectSet = SideEffectSet.defaults();
private boolean postEditSimulation; private boolean postEditSimulation;
private static final SideEffectSet INTERNAL_NONE = new SideEffectSet(
Arrays.stream(SideEffect.values())
.collect(Collectors.toMap(Function.identity(), state -> SideEffect.State.OFF))
);
/** /**
* Create a new instance. * Create a new instance.
* *
@ -86,7 +94,7 @@ public class SideEffectExtent extends AbstractDelegateExtent {
positions.put(location, world.getBlock(location)); positions.put(location, world.getBlock(location));
} }
return world.setBlock(location, block, postEditSimulation ? SideEffectSet.none() : sideEffectSet); return world.setBlock(location, block, postEditSimulation ? INTERNAL_NONE : sideEffectSet);
} }
public boolean commitRequired() { public boolean commitRequired() {

View File

@ -174,7 +174,7 @@ public interface WorldNativeAccess<NC, NBS, NP> {
if (isChunkTicking(chunk)) { if (isChunkTicking(chunk)) {
if (sideEffectSet.shouldApply(SideEffect.ENTITY_AI)) { if (sideEffectSet.shouldApply(SideEffect.ENTITY_AI)) {
notifyBlockUpdate(chunk, pos, oldState, newState); notifyBlockUpdate(chunk, pos, oldState, newState);
} else { } else if (sideEffectSet.shouldApply(SideEffect.NETWORK)) {
// If we want to skip entity AI, just mark the block for sending // If we want to skip entity AI, just mark the block for sending
markBlockChanged(chunk, pos); markBlockChanged(chunk, pos);
} }
@ -190,7 +190,9 @@ public interface WorldNativeAccess<NC, NBS, NP> {
} }
// Seems used only for PoI updates // Seems used only for PoI updates
onBlockStateChange(pos, oldState, newState); if (sideEffectSet.shouldApply(SideEffect.POI_UPDATE)) {
onBlockStateChange(pos, oldState, blockState1);
}
} }
//FAWE start //FAWE start

View File

@ -22,21 +22,31 @@ package com.sk89q.worldedit.util;
import java.util.Locale; import java.util.Locale;
public enum SideEffect { public enum SideEffect {
LIGHTING(State.ON), LIGHTING(State.ON, true),
NEIGHBORS(State.ON), NEIGHBORS(State.ON, true),
UPDATE(State.ON), UPDATE(State.ON, true),
VALIDATION(State.OFF), VALIDATION(State.OFF, true),
ENTITY_AI(State.OFF), ENTITY_AI(State.OFF, true),
EVENTS(State.OFF); EVENTS(State.OFF, true),
/**
* Internal use only.
*/
POI_UPDATE(State.ON, false),
/**
* Internal use only.
*/
NETWORK(State.ON, false);
private final String displayName; private final String displayName;
private final String description; private final String description;
private final State defaultValue; private final State defaultValue;
private final boolean exposed;
SideEffect(State defaultValue) { SideEffect(State defaultValue, boolean exposed) {
this.displayName = "worldedit.sideeffect." + this.name().toLowerCase(Locale.US); this.displayName = "worldedit.sideeffect." + this.name().toLowerCase(Locale.US);
this.description = "worldedit.sideeffect." + this.name().toLowerCase(Locale.US) + ".description"; this.description = "worldedit.sideeffect." + this.name().toLowerCase(Locale.US) + ".description";
this.defaultValue = defaultValue; this.defaultValue = defaultValue;
this.exposed = exposed;
} }
public String getDisplayName() { public String getDisplayName() {
@ -51,6 +61,15 @@ public enum SideEffect {
return this.defaultValue; return this.defaultValue;
} }
/**
* Determines if this side effect is considered API.
*
* @return if the side effect is exposed via API
*/
public boolean isExposed() {
return exposed;
}
public enum State { public enum State {
OFF, OFF,
ON, ON,

View File

@ -31,10 +31,12 @@ import java.util.stream.Collectors;
public class SideEffectSet { public class SideEffectSet {
private static final SideEffectSet DEFAULT = new SideEffectSet( private static final SideEffectSet DEFAULT = new SideEffectSet();
Arrays.stream(SideEffect.values()).collect(Collectors.toMap(Function.identity(), SideEffect::getDefaultValue)) private static final SideEffectSet NONE = new SideEffectSet(
Arrays.stream(SideEffect.values())
.filter(SideEffect::isExposed)
.collect(Collectors.toMap(Function.identity(), state -> SideEffect.State.OFF))
); );
private static final SideEffectSet NONE = new SideEffectSet();
private final Map<SideEffect, SideEffect.State> sideEffects; private final Map<SideEffect, SideEffect.State> sideEffects;
private final Set<SideEffect> appliedSideEffects; private final Set<SideEffect> appliedSideEffects;

View File

@ -23,8 +23,11 @@ import com.fastasyncworldedit.core.configuration.Caption;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.SideEffectSet;
import com.sk89q.worldedit.util.concurrency.LazyReference;
import com.sk89q.worldedit.util.formatting.WorldEditText;
import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.Component;
import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; import com.sk89q.worldedit.util.formatting.text.event.ClickEvent;
import com.sk89q.worldedit.util.formatting.text.event.HoverEvent; import com.sk89q.worldedit.util.formatting.text.event.HoverEvent;
import com.sk89q.worldedit.util.formatting.text.format.TextColor; import com.sk89q.worldedit.util.formatting.text.format.TextColor;
@ -36,21 +39,23 @@ import java.util.stream.Collectors;
public class SideEffectBox extends PaginationBox { public class SideEffectBox extends PaginationBox {
private static List<SideEffect> sideEffects; private static final LazyReference<List<SideEffect>> SIDE_EFFECTS = LazyReference.from(() ->
WorldEdit.getInstance().getPlatformManager().getSupportedSideEffects()
.stream()
.filter(SideEffect::isExposed)
.sorted(Comparator.comparing(effect ->
WorldEditText.reduceToText(
TranslatableComponent.of(effect.getDisplayName()),
Locale.US
)
))
.collect(Collectors.toList())
);
private final SideEffectSet sideEffectSet; private final SideEffectSet sideEffectSet;
private static List<SideEffect> getSideEffects() { private static List<SideEffect> getSideEffects() {
//FAWE start return SIDE_EFFECTS.getValue();
if (sideEffects == null) {
sideEffects = WorldEdit.getInstance().getPlatformManager().getSupportedSideEffects()
.stream()
.sorted(Comparator.comparing(Enum::name))
.collect(Collectors.toList());
}
//FAWE end
return sideEffects;
} }
public SideEffectBox(SideEffectSet sideEffectSet) { public SideEffectBox(SideEffectSet sideEffectSet) {