Skip to content

Commit

Permalink
Remove the concept of configurable side effects, all are configurable…
Browse files Browse the repository at this point in the history
…. And each platform specifies what it supports.
  • Loading branch information
me4502 committed Feb 28, 2020
1 parent 4e05b48 commit 3163de5
Show file tree
Hide file tree
Showing 14 changed files with 173 additions and 26 deletions.
Expand Up @@ -19,6 +19,7 @@

package com.sk89q.worldedit.bukkit;

import com.google.common.collect.ImmutableSet;
import com.sk89q.bukkit.util.CommandInfo;
import com.sk89q.bukkit.util.CommandRegistration;
import com.sk89q.worldedit.LocalConfiguration;
Expand All @@ -30,6 +31,7 @@
import com.sk89q.worldedit.extension.platform.MultiUserPlatform;
import com.sk89q.worldedit.extension.platform.Preference;
import com.sk89q.worldedit.extension.platform.Watchdog;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.concurrency.LazyReference;
import com.sk89q.worldedit.world.DataFixer;
import com.sk89q.worldedit.world.registry.Registries;
Expand All @@ -43,8 +45,8 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -218,6 +220,18 @@ public Map<Capability, Preference> getCapabilities() {
return capabilities;
}

private static final Collection<SideEffect> SUPPORTED_SIDE_EFFECTS = ImmutableSet.copyOf(EnumSet.of(
SideEffect.NEIGHBORS
));

@Override
public Collection<SideEffect> getSupportedSideEffects() {
if (plugin.getBukkitImplAdapter() != null) {
return plugin.getBukkitImplAdapter().getSupportedSideEffects();
}
return SUPPORTED_SIDE_EFFECTS;
}

public void unregisterCommands() {
dynamicCommands.unregisterCommands();
}
Expand Down
Expand Up @@ -28,6 +28,7 @@
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.registry.state.Property;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.SideEffectApplier;
import com.sk89q.worldedit.world.DataFixer;
import com.sk89q.worldedit.world.block.BaseBlock;
Expand All @@ -41,6 +42,7 @@
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import java.util.Collection;
import java.util.Map;
import java.util.OptionalInt;

Expand Down Expand Up @@ -180,6 +182,13 @@ default boolean simulateItemUse(World world, BlockVector3 position, BaseItem ite
*/
BaseItemStack adapt(ItemStack itemStack);

/**
* Get the {@link SideEffect}s that this adapter supports.
*
* @return The side effects that are supported
*/
Collection<SideEffect> getSupportedSideEffects();

default OptionalInt getInternalBlockStateId(BlockData data) {
return OptionalInt.empty();
}
Expand Down
Binary file modified worldedit-bukkit/src/main/resources/worldedit-adapters.jar
Binary file not shown.
Expand Up @@ -19,17 +19,20 @@

package com.sk89q.worldedit.cli;

import com.google.common.collect.Lists;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.platform.AbstractPlatform;
import com.sk89q.worldedit.extension.platform.Capability;
import com.sk89q.worldedit.extension.platform.Preference;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.world.DataFixer;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.entity.EntityTypes;
import com.sk89q.worldedit.world.registry.Registries;
import org.enginehub.piston.CommandManager;

import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -153,6 +156,11 @@ public Map<Capability, Preference> getCapabilities() {
return capabilities;
}

@Override
public Collection<SideEffect> getSupportedSideEffects() {
return Lists.newArrayList();
}

public void addWorld(World world) {
worlds.add(world);
}
Expand Down
Expand Up @@ -21,6 +21,7 @@

import com.google.common.collect.ImmutableSet;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.command.util.HookMode;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.TreeGenerator;
Expand All @@ -31,12 +32,10 @@

import javax.annotation.Nullable;

import java.util.Arrays;
import java.util.EnumSet;
import java.util.Locale;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public final class EnumConverter {

Expand All @@ -51,10 +50,6 @@ public static void register(CommandManager commandManager) {
full(EditSession.ReorderMode.class,
r -> ImmutableSet.of(r.getDisplayName()),
null));
commandManager.registerConverter(Key.of(SideEffect.class),
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)),
Expand Down
@@ -0,0 +1,75 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* Copyright (C) WorldEdit team and contributors
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package com.sk89q.worldedit.command.argument;

import static org.enginehub.piston.converter.SuggestionHelper.limitByPrefix;

import com.google.common.collect.ImmutableList;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.command.util.EntityRemover;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.formatting.text.Component;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.converter.ArgumentConverter;
import org.enginehub.piston.converter.ConversionResult;
import org.enginehub.piston.converter.FailedConversion;
import org.enginehub.piston.converter.SuccessfulConversion;
import org.enginehub.piston.inject.InjectedValueAccess;
import org.enginehub.piston.inject.Key;

import java.util.Collection;
import java.util.List;
import java.util.Locale;

public class SideEffectConverter implements ArgumentConverter<SideEffect> {

public static void register(CommandManager commandManager) {
commandManager.registerConverter(Key.of(SideEffect.class), new SideEffectConverter());
}

private final TextComponent choices = TextComponent.of("any side effect");

private SideEffectConverter() {
}

private Collection<SideEffect> getSideEffects() {
return WorldEdit.getInstance().getPlatformManager().getSupportedSideEffects();
}

@Override
public Component describeAcceptableArguments() {
return choices;
}

@Override
public List<String> getSuggestions(String input) {
return limitByPrefix(getSideEffects().stream().map(sideEffect -> sideEffect.name().toLowerCase(Locale.US)), input);
}

@Override
public ConversionResult<SideEffect> convert(String argument, InjectedValueAccess context) {
try {
return SuccessfulConversion.fromSingle(SideEffect.valueOf(argument.toUpperCase(Locale.US)));
} catch (Exception e) {
return FailedConversion.from(e);
}
}
}
Expand Up @@ -21,12 +21,15 @@

import com.sk89q.worldedit.LocalConfiguration;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.world.DataFixer;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.registry.Registries;
import org.enginehub.piston.CommandManager;

import javax.annotation.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -174,4 +177,5 @@ public interface Platform {
*/
Map<Capability, Preference> getCapabilities();

Collection<SideEffect> getSupportedSideEffects();
}
Expand Up @@ -78,6 +78,7 @@
import com.sk89q.worldedit.command.argument.FactoryConverter;
import com.sk89q.worldedit.command.argument.RegionFactoryConverter;
import com.sk89q.worldedit.command.argument.RegistryConverter;
import com.sk89q.worldedit.command.argument.SideEffectConverter;
import com.sk89q.worldedit.command.argument.VectorConverter;
import com.sk89q.worldedit.command.argument.WorldConverter;
import com.sk89q.worldedit.command.argument.ZonedDateTimeConverter;
Expand Down Expand Up @@ -217,6 +218,7 @@ private void registerArgumentConverters() {
EntityRemoverConverter.register(commandManager);
RegionFactoryConverter.register(commandManager);
WorldConverter.register(commandManager);
SideEffectConverter.register(commandManager);
}

private void registerAlwaysInjectedValues() {
Expand Down
Expand Up @@ -37,19 +37,22 @@
import com.sk89q.worldedit.session.request.Request;
import com.sk89q.worldedit.util.HandSide;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.eventbus.Subscribe;
import com.sk89q.worldedit.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;

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

Expand Down Expand Up @@ -289,6 +292,10 @@ public LocalConfiguration getConfiguration() {
return queryCapability(Capability.CONFIGURATION).getConfiguration();
}

public Collection<SideEffect> getSupportedSideEffects() {
return platforms.stream().flatMap(platform -> platform.getSupportedSideEffects().stream()).distinct().collect(Collectors.toList());
}

@Subscribe
public void handlePlatformReady(PlatformReadyEvent event) {
choosePreferred();
Expand Down
Expand Up @@ -22,24 +22,22 @@
import java.util.Locale;

public enum SideEffect {
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);
LIGHTING(State.ON, false),
NEIGHBORS(State.ON, false),
CONNECTIONS(State.ON, false),
ENTITY_AI(State.OFF, false),
PLUGIN_EVENTS(State.OFF, false);

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

SideEffect(State defaultValue, boolean dirty, boolean configurable) {
SideEffect(State defaultValue, boolean dirty) {
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;
}

public String getDisplayName() {
Expand All @@ -58,10 +56,6 @@ public boolean requiresCleanup() {
return this.dirty;
}

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

public enum State {
OFF,
ON,
Expand Down
Expand Up @@ -19,6 +19,7 @@

package com.sk89q.worldedit.util.formatting.component;

import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.SideEffectApplier;
import com.sk89q.worldedit.util.formatting.text.Component;
Expand All @@ -28,25 +29,27 @@
import com.sk89q.worldedit.util.formatting.text.event.HoverEvent;
import com.sk89q.worldedit.util.formatting.text.format.TextColor;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;

public class SideEffectBox extends PaginationBox {

private static final List<SideEffect> sideEffects = Arrays
.stream(SideEffect.values())
.filter(SideEffect::isConfigurable)
.sorted(Comparator.comparing(Enum::name))
.collect(Collectors.toList());
private static List<SideEffect> sideEffects;

private SideEffectApplier sideEffectApplier;

public SideEffectBox(SideEffectApplier sideEffectApplier) {
super("Side Effects");

if (sideEffects == null) {
sideEffects = WorldEdit.getInstance().getPlatformManager().getSupportedSideEffects()
.stream()
.sorted(Comparator.comparing(Enum::name))
.collect(Collectors.toList());
}

this.sideEffectApplier = sideEffectApplier;
}

Expand Down

0 comments on commit 3163de5

Please sign in to comment.