Update configs, and remove unused BlockData methods.

This commit is contained in:
Matthew Miller 2018-07-05 23:22:33 +10:00
parent d33e2e98aa
commit e1c2ea3a3b
13 changed files with 83 additions and 1298 deletions

View File

@ -30,7 +30,67 @@ limits:
butcher-radius:
default: -1
maximum: -1
disallowed-blocks: [6, 7, 14, 15, 16, 26, 27, 28, 29, 39, 31, 32, 33, 34, 36, 37, 38, 39, 40, 46, 50, 51, 56, 59, 69, 73, 74, 75, 76, 77, 81, 83, 137, 210, 211, 255]
disallowed-blocks:
- "minecraft:oak_sapling"
- "minecraft:jungle_sapling"
- "minecraft:dark_oak_sapling:"
- "minecraft:spruce_sapling"
- "minecraft:birch_sapling"
- "minecraft:acacia_sapling"
- "minecraft:black_bed"
- "minecraft:blue_bed"
- "minecraft:brown_bed"
- "minecraft:cyan_bed"
- "minecraft:gray_bed"
- "minecraft:green_bed"
- "minecraft:light_blue_bed"
- "minecraft:light_gray_bed"
- "minecraft:lime_bed"
- "minecraft:magenta_bed"
- "minecraft:orange_bed"
- "minecraft:pink_bed"
- "minecraft:purple_bed"
- "minecraft:red_bed"
- "minecraft:white_bed"
- "minecraft:yellow_bed"
- "minecraft:powered_rail"
- "minecraft:detector_rail"
- "minecraft:grass"
- "minecraft:dead_bush"
- "minecraft:moving_piston"
- "minecraft:piston_head"
- "minecraft:sunflower"
- "minecraft:rose_bush"
- "minecraft:dandelion"
- "minecraft:poppy"
- "minecraft:brown_mushroom"
- "minecraft:red_mushroom"
- "minecraft:tnt"
- "minecraft:torch"
- "minecraft:fire"
- "minecraft:redstone_wire"
- "minecraft:wheat"
- "minecraft:potatoes"
- "minecraft:carrots"
- "minecraft:melon_stem"
- "minecraft:pumpkin_stem"
- "minecraft:beetroots"
- "minecraft:rail"
- "minecraft:lever"
- "minecraft:redstone_torch"
- "minecraft:redstone_wall_torch"
- "minecraft:repeater"
- "minecraft:comparator"
- "minecraft:stone_button"
- "minecraft:birch_button"
- "minecraft:acacia_button"
- "minecraft:dark_oak_button"
- "minecraft:jungle_button"
- "minecraft:oak_button"
- "minecraft:spruce_button"
- "minecraft:cactus"
- "minecraft:sugar_cane"
- "minecraft:bedrock"
use-inventory:
enable: false
@ -60,7 +120,7 @@ snapshots:
directory:
navigation-wand:
item: 345
item: minecraft:compass
max-distance: 100
scripting:
@ -77,7 +137,7 @@ history:
size: 15
expiration: 10
wand-item: 271
wand-item: minecraft:wooden_axe
shell-save-type:
no-double-slash: false
no-op-permissions: false

View File

@ -126,7 +126,7 @@ public abstract class LocalConfiguration {
public String navigationWand = ItemTypes.COMPASS.getId();
public int navigationWandMaxDistance = 50;
public int scriptTimeout = 3000;
public Set<Integer> allowedDataCycleBlocks = new HashSet<>();
public Set<String> allowedDataCycleBlocks = new HashSet<>();
public String saveDir = "schematics";
public String scriptsDir = "craftscripts";
public boolean showHelpInfo = true;

View File

@ -29,15 +29,11 @@ import com.sk89q.worldedit.world.block.BlockTypes;
@Deprecated
public final class BlockID {
public static final int SAPLING = 6;
public static final int LOG = 17;
public static final int DISPENSER = 23;
public static final int BED = 26;
public static final int POWERED_RAIL = 27; // GOLDEN_RAIL
public static final int DETECTOR_RAIL = 28;
public static final int PISTON_STICKY_BASE = 29; // STICKY_PISTON
public static final int LONG_GRASS = 31; // TALLGRASS
public static final int DEAD_BUSH = 32; // DEADBUSH
public static final int PISTON_BASE = 33; // PISTON
public static final int PISTON_EXTENSION = 34; // PISTON_HEAD
public static final int YELLOW_FLOWER = 37;
public static final int RED_FLOWER = 38;
@ -45,17 +41,12 @@ public final class BlockID {
public static final int RED_MUSHROOM = 40;
public static final int STEP = 44; // STONE_SLAB
public static final int TORCH = 50;
public static final int OAK_WOOD_STAIRS = 53; // OAK_STAIRS
public static final int CHEST = 54;
public static final int REDSTONE_WIRE = 55;
public static final int CROPS = 59; // WHEAT
public static final int FURNACE = 61;
public static final int BURNING_FURNACE = 62; // LIT_FURNACE
public static final int SIGN_POST = 63; // STANDING_SIGN
public static final int WOODEN_DOOR = 64; // WOODEN_DOOR
public static final int LADDER = 65;
public static final int MINECART_TRACKS = 66; // RAIL
public static final int COBBLESTONE_STAIRS = 67; // STONE_STAIRS
public static final int WALL_SIGN = 68;
public static final int LEVER = 69;
public static final int STONE_PRESSURE_PLATE = 70;
@ -68,23 +59,16 @@ public final class BlockID {
public static final int CACTUS = 81;
public static final int REED = 83; // REEDS
public static final int FENCE = 85;
public static final int PUMPKIN = 86;
public static final int SLOW_SAND = 88; // SOUL_SAND
public static final int JACKOLANTERN = 91; // LIT_PUMPKIN
public static final int CAKE_BLOCK = 92; // CAKE
public static final int REDSTONE_REPEATER_OFF = 93; // UNPOWERED_REPEATER
public static final int REDSTONE_REPEATER_ON = 94; // POWERED_REPEATER
public static final int TRAP_DOOR = 96; // TRAPDOOR
public static final int BROWN_MUSHROOM_CAP = 99; // BROWN_MUSHROOM_BLOCK
public static final int RED_MUSHROOM_CAP = 100; // RED_MUSHROOM_BLOCK
public static final int PUMPKIN_STEM = 104;
public static final int MELON_STEM = 105;
public static final int VINE = 106;
public static final int FENCE_GATE = 107;
public static final int BRICK_STAIRS = 108;
public static final int STONE_BRICK_STAIRS = 109;
public static final int LILY_PAD = 111; // WATERLILY
public static final int NETHER_BRICK_STAIRS = 114;
public static final int NETHER_WART = 115;
public static final int ENCHANTMENT_TABLE = 116; // ENCHANTING_TABLE
public static final int BREWING_STAND = 117;
@ -92,13 +76,8 @@ public final class BlockID {
public static final int END_PORTAL_FRAME = 120;
public static final int WOODEN_STEP = 126; // WOODEN_SLAB
public static final int COCOA_PLANT = 127; // COCOA
public static final int SANDSTONE_STAIRS = 128;
public static final int ENDER_CHEST = 130;
public static final int TRIPWIRE_HOOK = 131;
public static final int TRIPWIRE = 132;
public static final int SPRUCE_WOOD_STAIRS = 134; // SPRUCE_STAIRS
public static final int BIRCH_WOOD_STAIRS = 135; // BRUCE_STAIRS
public static final int JUNGLE_WOOD_STAIRS = 136; // JUNGLE_STAIRS
public static final int COBBLESTONE_WALL = 139;
public static final int FLOWER_POT = 140;
public static final int CARROTS = 141;
@ -106,21 +85,14 @@ public final class BlockID {
public static final int WOODEN_BUTTON = 143;
public static final int HEAD = 144; // SKULL
public static final int ANVIL = 145;
public static final int TRAPPED_CHEST = 146;
public static final int PRESSURE_PLATE_LIGHT = 147; // LIGHT_WEIGHTED_PRESSURE_PLATE
public static final int PRESSURE_PLATE_HEAVY = 148; // HEAVY_WEIGHTED_PRESSURE_PLATE
public static final int COMPARATOR_OFF = 149; // UNPOWERED_COMPARATOR
public static final int COMPARATOR_ON = 150; // COMPARATOR
public static final int DAYLIGHT_SENSOR = 151; // DAYLIGHT_DETECTOR
public static final int HOPPER = 154;
public static final int QUARTZ_STAIRS = 156;
public static final int ACTIVATOR_RAIL = 157;
public static final int DROPPER = 158;
public static final int LOG2 = 162;
public static final int ACACIA_STAIRS = 163;
public static final int DARK_OAK_STAIRS = 164;
public static final int IRON_TRAP_DOOR = 167;
public static final int HAY_BLOCK = 170;
public static final int CARPET = 171;
public static final int DOUBLE_PLANT = 175;
public static final int STANDING_BANNER = 176;

View File

@ -23,15 +23,12 @@ import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.LocalConfiguration;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BlockData;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extension.platform.Platform;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.registry.LegacyMapper;
import com.sk89q.worldedit.world.block.BlockState;
/**
* A mode that cycles the data values of supported blocks.
@ -49,24 +46,24 @@ public class BlockDataCyler implements DoubleActionBlockTool {
World world = (World) clicked.getExtent();
BlockState block = world.getBlock(clicked.toVector());
int[] datas = LegacyMapper.getInstance().getLegacyFromBlock(block);
int type = datas[0];
int data = datas[1];
if (!config.allowedDataCycleBlocks.isEmpty()
&& !player.hasPermission("worldedit.override.data-cycler")
&& !config.allowedDataCycleBlocks.contains(type)) {
&& !config.allowedDataCycleBlocks.contains(block.getBlockType().getId())) {
player.printError("You are not permitted to cycle the data value of that block.");
return true;
}
int increment = forward ? 1 : -1;
BaseBlock newBlock = new BaseBlock(type, BlockData.cycle(type, data, increment));
EditSession editSession = session.createEditSession(player);
if (newBlock.getData() < 0) {
if (block.getStates().keySet().isEmpty()) {
player.printError("That block's data cannot be cycled!");
} else {
BlockState newBlock = block;
// TODO Forward = cycle value, Backward = Next property
// int increment = forward ? 1 : -1;
// BaseBlock newBlock = new BaseBlock(type, BlockData.cycle(type, data, increment));
EditSession editSession = session.createEditSession(player);
try {
editSession.setBlock(clicked.toVector(), newBlock);
} catch (MaxChangedBlocksException e) {

View File

@ -84,7 +84,7 @@ public class YAMLConfiguration extends LocalConfiguration {
butcherMaxRadius = Math.max(-1, config.getInt("limits.butcher-radius.maximum", butcherMaxRadius));
disallowedBlocks = new HashSet<>(config.getStringList("limits.disallowed-blocks", Lists.newArrayList(defaultDisallowedBlocks)));
allowedDataCycleBlocks = new HashSet<>(config.getIntList("limits.allowed-data-cycle-blocks", null));
allowedDataCycleBlocks = new HashSet<>(config.getStringList("limits.allowed-data-cycle-blocks", null));
registerHelp = config.getBoolean("register-help", true);
logCommands = config.getBoolean("logging.log-commands", logCommands);

View File

@ -1,38 +0,0 @@
/*
* 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;
// TODO FIX
public class CuboidClipboardTest {
// @Test
// public void testFlipCenterPlane() throws Exception {
// testFlip(0, 1, CuboidClipboard.FlipDirection.UP_DOWN);
// testFlip(2, 3, CuboidClipboard.FlipDirection.NORTH_SOUTH);
// testFlip(4, 5, CuboidClipboard.FlipDirection.WEST_EAST);
// }
//
// private void testFlip(int data, int expectedDataAfterFlip, CuboidClipboard.FlipDirection flipDirection) {
// BlockType blockType = new BlockType("minecraft:piston_base");
// final CuboidClipboard clipboard = new CuboidClipboard(new Vector(1, 1, 1));
// clipboard.setBlock(Vector.ZERO, new BaseBlock(blockType, data));
// clipboard.flip(flipDirection);
// assertEquals(expectedDataAfterFlip, clipboard.getBlock(Vector.ZERO).getData());
// }
}

View File

@ -1,64 +0,0 @@
/*
* 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.blocks;
import com.sk89q.worldedit.CuboidClipboard.FlipDirection;
import org.junit.Test;
import java.util.TreeSet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class BlockDataTest {
@Test
public void testRotateFlip() {
for (int type = 0; type < 256; ++type) {
for (int data = 0; data < 16; ++data) {
final String message = type + "/" + data;
//Test r90(r-90(x))==x
assertEquals(message, data, BlockData.rotate90(type, BlockData.rotate90Reverse(type, data)));
//Test r-90(r90(x))==x
assertEquals(message, data, BlockData.rotate90Reverse(type, BlockData.rotate90(type, data)));
final int flipped = BlockData.flip(type, BlockData.flip(type, data, FlipDirection.WEST_EAST), FlipDirection.NORTH_SOUTH);
//Test r90(r90(x))==flipNS(flipWE(x))
assertEquals(message, flipped, BlockData.rotate90(type, BlockData.rotate90(type, data)));
//Test r-90(r-90(x))==flipNS(flipWE(x))
assertEquals(message, flipped, BlockData.rotate90Reverse(type, BlockData.rotate90Reverse(type, data)));
//Test flipNS(flipNS(x))==x
assertEquals(message, data, BlockData.flip(type, BlockData.flip(type, data, FlipDirection.NORTH_SOUTH), FlipDirection.NORTH_SOUTH));
//Test flipWE(flipWE(x))==x
assertEquals(message, data, BlockData.flip(type, BlockData.flip(type, data, FlipDirection.WEST_EAST), FlipDirection.WEST_EAST));
//Test flipUD(flipUD(x))==x
assertEquals(message, data, BlockData.flip(type, BlockData.flip(type, data, FlipDirection.UP_DOWN), FlipDirection.UP_DOWN));
//Test r90(r90(r90(r90(x))))==x
assertEquals(message, data, BlockData.rotate90(type, BlockData.rotate90(type, BlockData.rotate90(type, BlockData.rotate90(type, data)))));
//Test r-90(r-90(r-90(r-90(x))))==x
assertEquals(message, data, BlockData.rotate90Reverse(type, BlockData.rotate90Reverse(type, BlockData.rotate90Reverse(type, BlockData.rotate90Reverse(type, data)))));
}
}
}
}

View File

@ -1,90 +0,0 @@
/*
* 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.extent.transform;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BlockData;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.math.transform.AffineTransform;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.world.registry.BlockRegistry;
import com.sk89q.worldedit.world.registry.BundledBlockRegistry;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
@Ignore("Old BlockData class needs to be updated manually. Current block definitions are in blocks.json, " +
"which is automatically generated and generally accurate.")
public class BlockTransformExtentTest {
private static final Transform ROTATE_90 = new AffineTransform().rotateY(-90);
private static final Transform ROTATE_NEG_90 = new AffineTransform().rotateY(90);
private final Set<BlockType> ignored = new HashSet<>();
@Before
public void setUp() throws Exception {
ignored.add(BlockTypes.BLACK_BED); // Broken in existing rotation code?
ignored.add(BlockTypes.BLUE_BED); // Complicated
ignored.add(BlockTypes.BROWN_BED); // Complicated
ignored.add(BlockTypes.CYAN_BED); // Complicated
ignored.add(BlockTypes.GRAY_BED); // Complicated
ignored.add(BlockTypes.GREEN_BED); // Complicated
ignored.add(BlockTypes.LIGHT_BLUE_BED); // Complicated
ignored.add(BlockTypes.LIGHT_GRAY_BED); // Complicated
ignored.add(BlockTypes.LIME_BED); // Complicated
ignored.add(BlockTypes.OAK_DOOR); // Complicated
ignored.add(BlockTypes.IRON_DOOR); // Complicated
ignored.add(BlockTypes.END_PORTAL); // Not supported in existing rotation code
}
@Test
public void testTransform() throws Exception {
BlockRegistry blockRegistry = new BundledBlockRegistry();
for (BlockType type : BlockTypes.values()) {
if (ignored.contains(type)) {
continue;
}
BaseBlock orig = new BaseBlock(type);
for (int i = 1; i < 4; i++) {
BaseBlock rotated = BlockTransformExtent.transform(new BaseBlock(orig), ROTATE_90);
BaseBlock reference = new BaseBlock(orig.getBlockType().getLegacyId(), BlockData.rotate90(orig.getBlockType().getLegacyId(), orig.getData()));
assertThat(type + "#" + type.getId() + " rotated " + (90 * i) + " degrees did not match BlockData.rotate90()'s expected result", rotated,
equalTo(reference));
orig = rotated;
}
orig = new BaseBlock(type);
for (int i = 0; i < 4; i++) {
BaseBlock rotated = BlockTransformExtent.transform(new BaseBlock(orig), ROTATE_NEG_90);
BaseBlock reference = new BaseBlock(orig.getBlockType().getLegacyId(), BlockData.rotate90Reverse(orig.getBlockType().getLegacyId(), orig.getData()));
assertThat(type + "#" + type.getId() + " rotated " + (-90 * i) + " degrees did not match BlockData.rotate90Reverse()'s expected result", rotated, equalTo(reference));
orig = rotated;
}
}
}
}

View File

@ -366,13 +366,11 @@ public class ForgeWorld extends AbstractWorld {
@Override
public BaseBlock getFullBlock(Vector position) {
World world = getWorld();
BlockPos pos = new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ());
IBlockState state = world.getBlockState(pos);
TileEntity tile = getWorld().getTileEntity(pos);
if (tile != null) {
return new TileEntityBaseBlock(Block.getIdFromBlock(state.getBlock()), state.getBlock().getMetaFromState(state), tile);
return new TileEntityBaseBlock(getBlock(position), tile);
} else {
return new BaseBlock(getBlock(position));
}

View File

@ -21,14 +21,14 @@ package com.sk89q.worldedit.forge;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.TileEntityBlock;
import com.sk89q.worldedit.world.block.BlockState;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
public class TileEntityBaseBlock extends BaseBlock implements TileEntityBlock {
public TileEntityBaseBlock(int type, int data, TileEntity tile) {
super(type, data);
setNbtData(NBTConverter.fromNative(copyNbtData(tile)));
public TileEntityBaseBlock(BlockState state, TileEntity tile) {
super(state, NBTConverter.fromNative(copyNbtData(tile)));
}
private static NBTTagCompound copyNbtData(TileEntity tile) {

View File

@ -4,15 +4,15 @@ schematic-save-dir=schematics
allow-extra-data-values=false
super-pickaxe-many-drop-items=true
register-help=true
nav-wand-item=345
nav-wand-item=minecraft:compass
profile=false
super-pickaxe-drop-items=true
disallowed-blocks=6,26,27,28,31,32,34,36,37,38,39,40,46,50,51,55,59,66,69,75,76,93,94,77,81,83,7,14,15,16,56
disallowed-blocks=minecraft:oak_sapling,minecraft:jungle_sapling,minecraft:dark_oak_sapling:,minecraft:spruce_sapling,minecraft:birch_sapling,minecraft:acacia_sapling,minecraft:black_bed,minecraft:blue_bed,minecraft:brown_bed,minecraft:cyan_bed,minecraft:gray_bed,minecraft:green_bed,minecraft:light_blue_bed,minecraft:light_gray_bed,minecraft:lime_bed,minecraft:magenta_bed,minecraft:orange_bed,minecraft:pink_bed,minecraft:purple_bed,minecraft:red_bed,minecraft:white_bed,minecraft:yellow_bed,minecraft:powered_rail,minecraft:detector_rail,minecraft:grass,minecraft:dead_bush,minecraft:moving_piston,minecraft:piston_head,minecraft:sunflower,minecraft:rose_bush,minecraft:dandelion,minecraft:poppy,minecraft:brown_mushroom,minecraft:red_mushroom,minecraft:tnt,minecraft:torch,minecraft:fire,minecraft:redstone_wire,minecraft:wheat,minecraft:potatoes,minecraft:carrots,minecraft:melon_stem,minecraft:pumpkin_stem,minecraft:beetroots,minecraft:rail,minecraft:lever,minecraft:redstone_torch,minecraft:redstone_wall_torch,minecraft:repeater,minecraft:comparator,minecraft:stone_button,minecraft:birch_button,minecraft:acacia_button,minecraft:dark_oak_button,minecraft:jungle_button,minecraft:oak_button,minecraft:spruce_button,minecraft:cactus,minecraft:sugar_cane,minecraft:bedrock
max-super-pickaxe-size=5
max-brush-radius=10
craftscript-dir=craftscripts
no-double-slash=false
wand-item=271
wand-item=minecraft:wooden_axe
shell-save-type=
scripting-timeout=3000
snapshots-dir=

View File

@ -83,7 +83,7 @@ public class ConfigurateConfiguration extends LocalConfiguration {
logger.warn("Error loading WorldEdit configuration", e);
}
try {
allowedDataCycleBlocks = new HashSet<>(node.getNode("limits", "allowed-data-cycle-blocks").getList(TypeToken.of(Integer.class)));
allowedDataCycleBlocks = new HashSet<>(node.getNode("limits", "allowed-data-cycle-blocks").getList(TypeToken.of(String.class)));
} catch (ObjectMappingException e) {
logger.warn("Error loading WorldEdit configuration", e);
}