Skip to content

Commit

Permalink
Switch to a system that includes "delayed" as a mode
Browse files Browse the repository at this point in the history
  • Loading branch information
me4502 committed Feb 28, 2020
1 parent 4aa41c3 commit 4e05b48
Show file tree
Hide file tree
Showing 15 changed files with 125 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -426,12 +426,12 @@ public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B
}
e.printStackTrace();
Block bukkitBlock = getWorld().getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
bukkitBlock.setBlockData(BukkitAdapter.adapt(block), !sideEffectApplier.isNone());
bukkitBlock.setBlockData(BukkitAdapter.adapt(block), sideEffectApplier.doesApplyAny());
return true;
}
} else {
Block bukkitBlock = getWorld().getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
bukkitBlock.setBlockData(BukkitAdapter.adapt(block), !sideEffectApplier.isNone());
bukkitBlock.setBlockData(BukkitAdapter.adapt(block), sideEffectApplier.doesApplyAny());
return true;
}
}
Expand Down
Binary file modified worldedit-bukkit/src/main/resources/worldedit-adapters.jar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ public SurvivalModeExtent getSurvivalExtent() {
@Deprecated
public void setFastMode(boolean enabled) {
if (worldApplyingExtent != null) {
worldApplyingExtent.setSideEffectApplier(enabled ? SideEffectApplier.ALL : SideEffectApplier.NONE);
worldApplyingExtent.setSideEffectApplier(enabled ? SideEffectApplier.defaults() : SideEffectApplier.none());
}
}

Expand Down Expand Up @@ -497,12 +497,12 @@ public void setSideEffectApplier(SideEffectApplier sideEffectApplier) {
*/
@Deprecated
public boolean hasFastMode() {
return worldApplyingExtent != null && worldApplyingExtent.getSideEffectApplier().isAll();
return worldApplyingExtent != null && this.worldApplyingExtent.getSideEffectApplier().doesApplyAny();
}

public SideEffectApplier getSideEffectApplier() {
if (worldApplyingExtent == null) {
return SideEffectApplier.NONE;
return SideEffectApplier.defaults();
}
return worldApplyingExtent.getSideEffectApplier();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public class LocalSession {
private transient Snapshot snapshotExperimental;
private transient boolean hasCUISupport = false;
private transient int cuiVersion = -1;
private transient SideEffectApplier sideEffectApplier = SideEffectApplier.ALL;
private transient SideEffectApplier sideEffectApplier = SideEffectApplier.defaults();
private transient Mask mask;
private transient ZoneId timezone = ZoneId.systemDefault();
private transient BlockVector3 cuiTemporaryBlock;
Expand Down Expand Up @@ -1029,7 +1029,7 @@ public void setSideEffectApplier(SideEffectApplier sideEffectApplier) {
*/
@Deprecated
public boolean hasFastMode() {
return !this.sideEffectApplier.isAll();
return !this.sideEffectApplier.doesApplyAny();
}

/**
Expand All @@ -1039,7 +1039,7 @@ public boolean hasFastMode() {
*/
@Deprecated
public void setFastMode(boolean fastMode) {
this.sideEffectApplier = fastMode ? this.sideEffectApplier.withoutAll() : this.sideEffectApplier.withAll();
this.sideEffectApplier = fastMode ? SideEffectApplier.none() : SideEffectApplier.defaults();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

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

import com.google.common.collect.Lists;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.LocalConfiguration;
import com.sk89q.worldedit.LocalSession;
Expand All @@ -38,15 +37,11 @@
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.formatting.component.InvalidComponentException;
import com.sk89q.worldedit.util.formatting.component.MessageBox;
import com.sk89q.worldedit.util.formatting.component.PaginationBox;
import com.sk89q.worldedit.util.formatting.component.SideEffectBox;
import com.sk89q.worldedit.util.formatting.component.TextComponentProducer;
import com.sk89q.worldedit.util.formatting.text.Component;
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.HoverEvent;
import com.sk89q.worldedit.util.formatting.text.format.TextColor;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.item.ItemType;
Expand Down Expand Up @@ -143,31 +138,36 @@ public void timeout(Actor actor, LocalSession session,
@CommandPermissions("worldedit.fast")
public void fast(Actor actor, LocalSession session,
@Arg(desc = "The side effect", def = "") SideEffect sideEffect,
@Arg(desc = "The new side effect state", def = "") Boolean shouldEnable,
@Arg(desc = "The new side effect state", def = "") SideEffect.State newState,
@Switch(name = 'h', desc = "Show the info box") boolean showInfoBox) {
if (sideEffect != null) {
boolean hasSideEffect = session.getSideEffectApplier().shouldApply(sideEffect);
if (shouldEnable != null && shouldEnable == hasSideEffect) {
SideEffect.State currentState = session.getSideEffectApplier().getState(sideEffect);
if (newState != null && newState == currentState) {
if (!showInfoBox) {
actor.printError(
TranslatableComponent.of(shouldEnable ? "worldedit.fast.sideeffect.enabled.already" : "worldedit.fast.sideeffect"
+ ".disabled.already", TranslatableComponent.of(sideEffect.getDisplayName())));
actor.printError(TranslatableComponent.of(
"worldedit.fast.sideeffect.already-set",
TranslatableComponent.of(sideEffect.getDisplayName()),
TranslatableComponent.of(newState.getDisplayName())
));
}
return;
}

if (hasSideEffect) {
session.setSideEffectApplier(session.getSideEffectApplier().without(Lists.newArrayList(sideEffect)));
if (newState != null) {
session.setSideEffectApplier(session.getSideEffectApplier().with(sideEffect, newState));
if (!showInfoBox) {
actor.printInfo(TranslatableComponent.of("worldedit.fast.sideeffect.disabled",
TranslatableComponent.of(sideEffect.getDisplayName())));
actor.printInfo(TranslatableComponent.of(
"worldedit.fast.sideeffect.set",
TranslatableComponent.of(sideEffect.getDisplayName()),
TranslatableComponent.of(newState.getDisplayName())
));
}
} else {
session.setSideEffectApplier(session.getSideEffectApplier().with(Lists.newArrayList(sideEffect)));
if (!showInfoBox) {
actor.printInfo(TranslatableComponent.of("worldedit.fast.sideeffect.enabled",
TranslatableComponent.of(sideEffect.getDisplayName())));
}
actor.printInfo(TranslatableComponent.of(
"worldedit.fast.sideeffect.get",
TranslatableComponent.of(sideEffect.getDisplayName()),
TranslatableComponent.of(currentState.getDisplayName())
));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ public static void register(CommandManager commandManager) {
MultiKeyConverter.from(EnumSet.copyOf(Arrays.stream(SideEffect.values()).filter(SideEffect::isConfigurable).collect(Collectors.toList())),
r -> ImmutableSet.of(r.name().toLowerCase(Locale.US)),
null));
commandManager.registerConverter(Key.of(SideEffect.State.class),
full(SideEffect.State.class,
r -> ImmutableSet.of(r.name().toLowerCase(Locale.US)),
null));
commandManager.registerConverter(Key.of(HookMode.class),
basic(HookMode.class));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,12 @@
import com.sk89q.worldedit.function.operation.RunContext;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.SideEffectApplier;
import com.sk89q.worldedit.util.collection.BlockMap;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;

import java.util.EnumSet;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
Expand All @@ -48,11 +46,7 @@ public class WorldApplyingExtent extends AbstractDelegateExtent {
private final World world;
private final Map<BlockVector3, BlockState> positions = BlockMap.create();
private final Set<BlockVector2> dirtyChunks = new HashSet<>();
private SideEffectApplier sideEffectApplier = new SideEffectApplier(EnumSet.of(
SideEffect.CONNECTIONS,
SideEffect.LIGHTING,
SideEffect.NEIGHBORS
));
private SideEffectApplier sideEffectApplier = SideEffectApplier.defaults();
private boolean postEditSimulation;

/**
Expand Down Expand Up @@ -91,7 +85,7 @@ public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B
positions.put(location, world.getBlock(location));
}

return world.setBlock(location, block, postEditSimulation ? SideEffectApplier.NONE : sideEffectApplier);
return world.setBlock(location, block, postEditSimulation ? SideEffectApplier.none() : sideEffectApplier);
}

public boolean commitRequired() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,22 @@
import java.util.Locale;

public enum SideEffect {
LIGHTING(false, true),
NEIGHBORS(false, true),
CONNECTIONS(false, true),
ENTITY_AI(false, true),
PLUGIN_EVENTS(false, false);
LIGHTING(State.ON, false, true),
NEIGHBORS(State.ON, false, true),
CONNECTIONS(State.ON, false, true),
ENTITY_AI(State.OFF, false, true),
PLUGIN_EVENTS(State.OFF, false, false);

private String displayName;
private String description;
private State defaultValue;
private boolean dirty;
private boolean configurable;

SideEffect(boolean dirty, boolean configurable) {
SideEffect(State defaultValue, boolean dirty, boolean configurable) {
this.displayName = "worldedit.sideeffect." + this.name().toLowerCase(Locale.US);
this.description = "worldedit.sideeffect." + this.name().toLowerCase(Locale.US) + ".description";
this.defaultValue = defaultValue;
this.dirty = dirty;
this.configurable = configurable;
}
Expand All @@ -48,11 +50,31 @@ public String getDescription() {
return this.description;
}

public State getDefaultValue() {
return this.defaultValue;
}

public boolean requiresCleanup() {
return this.dirty;
}

public boolean isConfigurable() {
return this.configurable;
}

public enum State {
OFF,
ON,
DELAYED;

private String displayName;

State() {
this.displayName = "worldedit.sideeffect.state." + this.name().toLowerCase(Locale.US);
}

public String getDisplayName() {
return this.displayName;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,69 +19,75 @@

package com.sk89q.worldedit.util;

import com.google.common.collect.Sets;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.EnumMap;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class SideEffectApplier {
private static final SideEffectApplier DEFAULT = new SideEffectApplier();
private static final SideEffectApplier NONE = new SideEffectApplier(
Arrays.stream(SideEffect.values()).collect(Collectors.toMap(Function.identity(), SideEffect::getDefaultValue))
);

private static final Collection<SideEffect> CONFIGURABLE = Arrays.stream(SideEffect.values()).filter(SideEffect::isConfigurable).collect(Collectors.toList());
public static final SideEffectApplier ALL = new SideEffectApplier(CONFIGURABLE);
public static final SideEffectApplier NONE = new SideEffectApplier(EnumSet.noneOf(SideEffect.class));

private final Set<SideEffect> sideEffects;
private final Map<SideEffect, SideEffect.State> sideEffects;
private boolean requiresCleanup = false;
private boolean isAll = false;
private boolean appliesAny = false;

public SideEffectApplier(Collection<SideEffect> sideEffects) {
this.sideEffects = Sets.immutableEnumSet(sideEffects);
private SideEffectApplier() {
this.sideEffects = ImmutableMap.of();
updateSideEffects();
}

public SideEffectApplier(Map<SideEffect, SideEffect.State> sideEffects) {
this.sideEffects = Maps.immutableEnumMap(sideEffects);
updateSideEffects();
}

private void updateSideEffects() {
requiresCleanup = sideEffects.stream().anyMatch(SideEffect::requiresCleanup);
isAll = sideEffects.stream().filter(SideEffect::isConfigurable).count() == CONFIGURABLE.size();
requiresCleanup = sideEffects.keySet().stream().anyMatch(SideEffect::requiresCleanup);
appliesAny = sideEffects.values().stream().anyMatch(state -> state != SideEffect.State.OFF);
}

public SideEffectApplier with(Collection<SideEffect> newSideEffects) {
List<SideEffect> entries = new ArrayList<>(newSideEffects);
entries.addAll(this.sideEffects);
public SideEffectApplier with(SideEffect sideEffect, SideEffect.State state) {
Map<SideEffect, SideEffect.State> entries = this.sideEffects.isEmpty() ? Maps.newEnumMap(SideEffect.class) : new EnumMap<>(this.sideEffects);
entries.put(sideEffect, state);
return new SideEffectApplier(entries);
}

public SideEffectApplier without(Collection<SideEffect> removedSideEffects) {
List<SideEffect> entries = new ArrayList<>(this.sideEffects);
entries.removeAll(removedSideEffects);
return new SideEffectApplier(entries);
public boolean doesApplyAny() {
return this.appliesAny;
}

public boolean doesRequireCleanup() {
return this.requiresCleanup;
}

public boolean shouldApply(SideEffect effect) {
return sideEffects.contains(effect);
}

public boolean isNone() {
return sideEffects.isEmpty();
public SideEffect.State getState(SideEffect effect) {
return sideEffects.getOrDefault(effect, effect.getDefaultValue());
}

public boolean isAll() {
return this.isAll;
/**
* Gets whether this side effect is not off.
*
* This returns whether it is either delayed or on.
*
* @param effect The side effect
* @return Whether it should apply
*/
public boolean shouldApply(SideEffect effect) {
return getState(effect) != SideEffect.State.OFF;
}

public SideEffectApplier withAll() {
return with(CONFIGURABLE);
public static SideEffectApplier defaults() {
return DEFAULT;
}

public SideEffectApplier withoutAll() {
return without(CONFIGURABLE);
public static SideEffectApplier none() {
return NONE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,21 @@ public SideEffectBox(SideEffectApplier sideEffectApplier) {
@Override
public Component getComponent(int number) {
SideEffect effect = sideEffects.get(number);
boolean enabled = this.sideEffectApplier.shouldApply(effect);
SideEffect.State state = this.sideEffectApplier.getState(effect);

return TextComponent.empty()
.append(TranslatableComponent.of(effect.getDisplayName(), TextColor.YELLOW)
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TranslatableComponent.of(effect.getDescription()))))
.append(TextComponent.space())
.append(TextComponent.of(enabled ? "Enabled" : "Disabled", enabled ? TextColor.GREEN : TextColor.RED)
.clickEvent(ClickEvent.runCommand("//fast -h " + effect.name().toLowerCase(Locale.US)))
.hoverEvent(HoverEvent.showText(TextComponent.of("Click to " + (enabled ? "Disable" : "Enable")))));
TextComponent.Builder builder = TextComponent.builder();
builder = builder.append(TranslatableComponent.of(effect.getDisplayName(), TextColor.YELLOW)
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TranslatableComponent.of(effect.getDescription()))));
for (SideEffect.State uiState : SideEffect.State.values()) {
builder = builder.append(TextComponent.space());
builder = builder.append(TranslatableComponent.of(uiState.getDisplayName(), uiState == state ? TextColor.WHITE : TextColor.GRAY)
.clickEvent(ClickEvent.runCommand("//fast -h " + effect.name().toLowerCase(Locale.US) + " " + uiState.name().toLowerCase(Locale.US)))
.hoverEvent(HoverEvent.showText(uiState == state ?
TextComponent.of("Current") : TextComponent.of("Click to set to ").append(TranslatableComponent.of(uiState.getDisplayName()))))
);
}

return builder.build();
}

@Override
Expand Down
Loading

0 comments on commit 4e05b48

Please sign in to comment.