From f033d87098efb5ed717d7a456db003f03a1bd5fb Mon Sep 17 00:00:00 2001 From: sk89q Date: Mon, 14 Jul 2014 12:10:38 -0700 Subject: [PATCH] Add new Bukkit implementation adapter system to access MC internals. Replaces the old NMSBlocks. --- pom.xml | 16 +- .../sk89q/worldedit/bukkit/BukkitAdapter.java | 15 + .../sk89q/worldedit/bukkit/BukkitWorld.java | 749 +----------------- .../worldedit/bukkit/DefaultNmsBlock.java | 472 ----------- .../com/sk89q/worldedit/bukkit/NmsBlock.java | 61 -- .../worldedit/bukkit/WorldEditPlugin.java | 194 +++-- .../bukkit/adapter/AdapterLoadException.java | 41 + .../bukkit/adapter/BukkitImplAdapter.java | 49 ++ .../bukkit/adapter/BukkitImplLoader.java | 197 +++++ .../adapter/impl/CraftBukkit_v1_7_R2.class | Bin 0 -> 12200 bytes .../adapter/impl/CraftBukkit_v1_7_R3.class | Bin 0 -> 12200 bytes .../adapter/impl/CraftBukkit_v1_7_R4.class | Bin 0 -> 12210 bytes .../resources/nmsblocks/CBXNmsBlock_145.class | Bin 12701 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_146.class | Bin 12456 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_147.class | Bin 12528 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_15.class | Bin 12533 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_152.class | Bin 12540 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_161.class | Bin 12540 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_162.class | Bin 12540 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_164.class | Bin 12590 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_172.class | Bin 13807 -> 0 bytes .../resources/nmsblocks/CBXNmsBlock_175.class | Bin 13808 -> 0 bytes .../nmsblocks/CBXNmsBlock_prePackage.class | Bin 12484 -> 0 bytes .../nmsblocks/CBXNmsBlock_v152_2.class | Bin 12552 -> 0 bytes .../nmsblocks/MCPCPlusXNmsBlock_147.class | Bin 9277 -> 0 bytes .../nmsblocks/MCPCPlusXNmsBlock_151dv.class | Bin 10513 -> 0 bytes .../nmsblocks/MCPCPlusXNmsBlock_162.class | Bin 9348 -> 0 bytes .../nmsblocks/MCPCPlusXNmsBlock_164.class | Bin 9348 -> 0 bytes .../java/com/sk89q/worldedit/LocalWorld.java | 104 --- .../worldedit/internal/LocalWorldAdapter.java | 55 -- .../command/WorldEditExceptionConverter.java | 2 +- .../java/com/sk89q/worldedit/util/Enums.java | 54 ++ .../sk89q/worldedit/world/AbstractWorld.java | 81 +- .../java/com/sk89q/worldedit/world/World.java | 18 - 34 files changed, 528 insertions(+), 1580 deletions(-) delete mode 100644 src/bukkit/java/com/sk89q/worldedit/bukkit/DefaultNmsBlock.java delete mode 100644 src/bukkit/java/com/sk89q/worldedit/bukkit/NmsBlock.java create mode 100644 src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/AdapterLoadException.java create mode 100644 src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java create mode 100644 src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java create mode 100644 src/bukkit/resources/com/sk89q/worldedit/bukkit/adapter/impl/CraftBukkit_v1_7_R2.class create mode 100644 src/bukkit/resources/com/sk89q/worldedit/bukkit/adapter/impl/CraftBukkit_v1_7_R3.class create mode 100644 src/bukkit/resources/com/sk89q/worldedit/bukkit/adapter/impl/CraftBukkit_v1_7_R4.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_145.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_146.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_147.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_15.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_152.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_161.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_162.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_164.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_172.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_175.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_prePackage.class delete mode 100644 src/bukkit/resources/nmsblocks/CBXNmsBlock_v152_2.class delete mode 100644 src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_147.class delete mode 100644 src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_151dv.class delete mode 100644 src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_162.class delete mode 100644 src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_164.class create mode 100644 src/main/java/com/sk89q/worldedit/util/Enums.java diff --git a/pom.xml b/pom.xml index f0a66b601..d4ea069f1 100644 --- a/pom.xml +++ b/pom.xml @@ -542,16 +542,6 @@ jar true - - - - org.bukkit - craftbukkit - 1.7.9-R0.1-SNAPSHOT - compile - jar - true - @@ -578,11 +568,11 @@ - nmsblocks/ + . false - ${basedir}/src/bukkit/resources/nmsblocks/ + ${basedir}/src/bukkit/resources/ - *.class + **/*.class diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java index 579ea88ae..7de20172b 100644 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java @@ -98,6 +98,21 @@ final class BukkitAdapter { (float) Math.toDegrees(location.getPitch())); } + /** + * Create a Bukkit location from a WorldEdit position with a Bukkit world. + * + * @param world the Bukkit world + * @param position the WorldEdit position + * @return a Bukkit location + */ + public static org.bukkit.Location adapt(org.bukkit.World world, Vector position) { + checkNotNull(world); + checkNotNull(position); + return new org.bukkit.Location( + world, + position.getX(), position.getY(), position.getZ()); + } + /** * Create a WorldEdit entity from a Bukkit entity. * diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index e693f18ea..29648289d 100644 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -31,36 +31,23 @@ import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.blocks.BlockID; -import com.sk89q.worldedit.blocks.ContainerBlock; -import com.sk89q.worldedit.blocks.FurnaceBlock; import com.sk89q.worldedit.blocks.LazyBlock; -import com.sk89q.worldedit.blocks.MobSpawnerBlock; -import com.sk89q.worldedit.blocks.NoteBlock; -import com.sk89q.worldedit.blocks.SignBlock; -import com.sk89q.worldedit.blocks.SkullBlock; +import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.util.Enums; import com.sk89q.worldedit.util.TreeGenerator; import com.sk89q.worldedit.world.registry.LegacyWorldData; import com.sk89q.worldedit.world.registry.WorldData; -import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.SkullType; import org.bukkit.TreeType; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.Chest; -import org.bukkit.block.CreatureSpawner; -import org.bukkit.block.Furnace; -import org.bukkit.block.Sign; -import org.bukkit.block.Skull; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Ambient; import org.bukkit.entity.Animals; import org.bukkit.entity.Boat; @@ -82,15 +69,9 @@ import org.bukkit.entity.Villager; import org.bukkit.inventory.DoubleChestInventory; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; import javax.annotation.Nullable; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.InputStream; import java.lang.ref.WeakReference; -import java.lang.reflect.Method; -import java.net.URL; import java.util.ArrayList; import java.util.EnumMap; import java.util.HashMap; @@ -107,118 +88,26 @@ import static com.google.common.base.Preconditions.checkNotNull; public class BukkitWorld extends LocalWorld { private static final Logger logger = WorldEdit.logger; - private final WeakReference worldRef; - private static boolean skipNmsAccess = false; - private static boolean skipNmsSafeSet = false; - private static boolean skipNmsValidBlockCheck = false; + private static final org.bukkit.entity.EntityType tntMinecartType = + Enums.findByValue(org.bukkit.entity.EntityType.class, "MINECART_TNT"); - /* - * holder for the nmsblock class that we should use - */ - private static Class nmsBlockType; - private static Method nmsSetMethod; - private static Method nmsValidBlockMethod; - private static Method nmsGetMethod; - private static Method nmsSetSafeMethod; - - // copied from WG - private static > T tryEnum(Class enumType, String ... values) { - for (String val : values) { - try { - return Enum.valueOf(enumType, val); - } catch (IllegalArgumentException e) {} + private static final Map effects = new HashMap(); + static { + for (Effect effect : Effect.values()) { + effects.put(effect.getId(), effect); } - return null; } - private static org.bukkit.entity.EntityType tntMinecartType; - private static boolean checkMinecartType = true; + + private final WeakReference worldRef; /** * Construct the object. - * @param world + * + * @param world the world */ @SuppressWarnings("unchecked") public BukkitWorld(World world) { this.worldRef = new WeakReference(world); - - if (checkMinecartType) { - tntMinecartType = tryEnum(org.bukkit.entity.EntityType.class, "MINECART_TNT"); - checkMinecartType = false; - } - // check if we have a class we can use for nms access - - // only run once per server startup - if (nmsBlockType != null || skipNmsAccess || skipNmsSafeSet || skipNmsValidBlockCheck) return; - Plugin plugin = Bukkit.getPluginManager().getPlugin("WorldEdit"); - if (!(plugin instanceof WorldEditPlugin)) return; // hopefully never happens - WorldEditPlugin wePlugin = ((WorldEditPlugin) plugin); - File nmsBlocksDir = new File(wePlugin.getDataFolder() + File.separator + "nmsblocks" + File.separator); - if (nmsBlocksDir.listFiles() == null) { // no files to use - skipNmsAccess = true; skipNmsSafeSet = true; skipNmsValidBlockCheck = true; - return; - } - try { - // make a classloader that can handle our blocks - NmsBlockClassLoader loader = new NmsBlockClassLoader(BukkitWorld.class.getClassLoader(), nmsBlocksDir); - String filename; - for (File f : nmsBlocksDir.listFiles()) { - if (!f.isFile()) continue; - filename = f.getName(); - // load class using magic keyword - Class testBlock = null; - try { - testBlock = loader.loadClass("CL-NMS" + filename); - } catch (Throwable e) { - // someone is putting things where they don't belong - continue; - } - filename = filename.replaceFirst(".class$", ""); // get rid of extension - if (NmsBlock.class.isAssignableFrom(testBlock)) { - // got a NmsBlock, test it now - Class nmsClass = (Class) testBlock; - boolean canUse = false; - try { - canUse = (Boolean) nmsClass.getMethod("verify").invoke(null); - } catch (Throwable e) { - continue; - } - if (!canUse) continue; // not for this server - nmsBlockType = nmsClass; - nmsSetMethod = nmsBlockType.getMethod("set", World.class, Vector.class, BaseBlock.class); - nmsValidBlockMethod = nmsBlockType.getMethod("isValidBlockType", int.class); - nmsGetMethod = nmsBlockType.getMethod("get", World.class, Vector.class, int.class, int.class); - nmsSetSafeMethod = nmsBlockType.getMethod("setSafely", - BukkitWorld.class, Vector.class, com.sk89q.worldedit.foundation.Block.class, boolean.class); - // phew - break; - } - } - if (nmsBlockType != null) { - logger.info("[WorldEdit] Using external NmsBlock for this version: " + nmsBlockType.getName()); - } else { - // try our default - try { - nmsBlockType = (Class) Class.forName("com.sk89q.worldedit.bukkit.DefaultNmsBlock"); - boolean canUse = (Boolean) nmsBlockType.getMethod("verify").invoke(null); - if (canUse) { - nmsSetMethod = nmsBlockType.getMethod("set", World.class, Vector.class, BaseBlock.class); - nmsValidBlockMethod = nmsBlockType.getMethod("isValidBlockType", int.class); - nmsGetMethod = nmsBlockType.getMethod("get", World.class, Vector.class, int.class, int.class); - nmsSetSafeMethod = nmsBlockType.getMethod("setSafely", - BukkitWorld.class, Vector.class, com.sk89q.worldedit.foundation.Block.class, boolean.class); - logger.info("[WorldEdit] Using inbuilt NmsBlock for this version."); - } - } catch (Throwable e) { - // OMG DEVS WAI U NO SUPPORT SERVER - skipNmsAccess = true; skipNmsSafeSet = true; skipNmsValidBlockCheck = true; - logger.warning("[WorldEdit] No compatible nms block class found."); - } - } - } catch (Throwable e) { - logger.warning("[WorldEdit] Unable to load NmsBlock classes, make sure they are installed correctly."); - e.printStackTrace(); - skipNmsAccess = true; skipNmsSafeSet = true; skipNmsValidBlockCheck = true; - } } @Override @@ -256,41 +145,6 @@ public class BukkitWorld extends LocalWorld { throw new UnsupportedOperationException("Not implemented yet"); } - private class NmsBlockClassLoader extends ClassLoader { - public File searchDir; - public NmsBlockClassLoader(ClassLoader parent, File searchDir) { - super(parent); - this.searchDir = searchDir; - } - - @Override - public Class loadClass(String name) throws ClassNotFoundException { - if (!name.startsWith("CL-NMS")) { - return super.loadClass(name); - } else { - name = name.replace("CL-NMS", ""); // hacky lol - } - try { - URL url = new File(searchDir, name).toURI().toURL(); - InputStream input = url.openConnection().getInputStream(); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - - int data = input.read(); - while (data != -1) { - buffer.write(data); - data = input.read(); - } - input.close(); - - byte[] classData = buffer.toByteArray(); - - return defineClass(name.replaceFirst(".class$", ""), classData, 0, classData.length); - } catch (Throwable e) { - throw new ClassNotFoundException(); - } - } - } - /** * Get the world handle. * @@ -318,66 +172,6 @@ public class BukkitWorld extends LocalWorld { return getWorld().getName(); } - /** - * Set block type. - * - * @param pt - * @param type - * @return - */ - @Override - public boolean setBlockType(Vector pt, int type) { - return getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).setTypeId(type); - } - - /** - * Set block type. - * - * @param pt - * @param type - * @return - */ - @Override - public boolean setBlockTypeFast(Vector pt, int type) { - return getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).setTypeId(type, false); - } - - @Override - public boolean setTypeIdAndData(Vector pt, int type, int data) { - return getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).setTypeIdAndData(type, (byte) data, true); - } - - @Override - public boolean setTypeIdAndDataFast(Vector pt, int type, int data) { - return getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).setTypeIdAndData(type, (byte) data, false); - } - - /** - * Get block type. - * - * @param pt - * @return - */ - @Override - public int getBlockType(Vector pt) { - return getWorld().getBlockTypeIdAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - } - - @Override - public void setBlockData(Vector pt, int data) { - getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).setData((byte) data); - } - - @Override - public void setBlockDataFast(Vector pt, int data) { - getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).setData((byte) data, false); - } - - @Override - public int getBlockData(Vector pt) { - return getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).getData(); - } - @Override public int getBlockLightLevel(Vector pt) { return getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).getLightLevel(); @@ -423,7 +217,7 @@ public class BukkitWorld extends LocalWorld { try { getWorld().regenerateChunk(chunk.getBlockX(), chunk.getBlockZ()); } catch (Throwable t) { - t.printStackTrace(); + logger.log(Level.WARNING, "Chunk generation via Bukkit raised an error", t); } // Then restore @@ -448,303 +242,6 @@ public class BukkitWorld extends LocalWorld { return true; } - @Override - public boolean copyToWorld(Vector pt, BaseBlock block) { - World world = getWorld(); - - if (block instanceof SignBlock) { - // Signs - setSignText(pt, ((SignBlock) block).getText()); - return true; - } - - if (block instanceof FurnaceBlock) { - // Furnaces - Block bukkitBlock = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (bukkitBlock == null) return false; - BlockState state = bukkitBlock.getState(); - if (!(state instanceof Furnace)) return false; - Furnace bukkit = (Furnace) state; - FurnaceBlock we = (FurnaceBlock) block; - bukkit.setBurnTime(we.getBurnTime()); - bukkit.setCookTime(we.getCookTime()); - return setContainerBlockContents(pt, ((ContainerBlock) block).getItems()); - } - - if (block instanceof ContainerBlock) { - // Chests/dispenser - return setContainerBlockContents(pt, ((ContainerBlock) block).getItems()); - } - - if (block instanceof MobSpawnerBlock) { - // Mob spawners - Block bukkitBlock = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (bukkitBlock == null) return false; - BlockState state = bukkitBlock.getState(); - if (!(state instanceof CreatureSpawner)) return false; - CreatureSpawner bukkit = (CreatureSpawner) state; - MobSpawnerBlock we = (MobSpawnerBlock) block; - bukkit.setCreatureTypeByName(we.getMobType()); - bukkit.setDelay(we.getDelay()); - return true; - } - - if (block instanceof NoteBlock) { - // Note block - Block bukkitBlock = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (bukkitBlock == null) return false; - BlockState state = bukkitBlock.getState(); - if (!(state instanceof org.bukkit.block.NoteBlock)) return false; - org.bukkit.block.NoteBlock bukkit = (org.bukkit.block.NoteBlock) state; - NoteBlock we = (NoteBlock) block; - bukkit.setRawNote(we.getNote()); - return true; - } - - if (block instanceof SkullBlock) { - // Skull block - Block bukkitBlock = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (bukkitBlock == null) return false; - BlockState state = bukkitBlock.getState(); - if (!(state instanceof org.bukkit.block.Skull)) return false; - Skull bukkit = (Skull) state; - SkullBlock we = (SkullBlock) block; - // this is dumb - SkullType skullType = SkullType.SKELETON; - switch (we.getSkullType()) { - case 0: - skullType = SkullType.SKELETON; - break; - case 1: - skullType = SkullType.WITHER; - break; - case 2: - skullType = SkullType.ZOMBIE; - break; - case 3: - skullType = SkullType.PLAYER; - break; - case 4: - skullType = SkullType.CREEPER; - break; - } - bukkit.setSkullType(skullType); - BlockFace rotation; - switch (we.getRot()) { - // soooo dumb - case 0: - rotation = BlockFace.NORTH; - break; - case 1: - rotation = BlockFace.NORTH_NORTH_EAST; - break; - case 2: - rotation = BlockFace.NORTH_EAST; - break; - case 3: - rotation = BlockFace.EAST_NORTH_EAST; - break; - case 4: - rotation = BlockFace.EAST; - break; - case 5: - rotation = BlockFace.EAST_SOUTH_EAST; - break; - case 6: - rotation = BlockFace.SOUTH_EAST; - break; - case 7: - rotation = BlockFace.SOUTH_SOUTH_EAST; - break; - case 8: - rotation = BlockFace.SOUTH; - break; - case 9: - rotation = BlockFace.SOUTH_SOUTH_WEST; - break; - case 10: - rotation = BlockFace.SOUTH_WEST; - break; - case 11: - rotation = BlockFace.WEST_SOUTH_WEST; - break; - case 12: - rotation = BlockFace.WEST; - break; - case 13: - rotation = BlockFace.WEST_NORTH_WEST; - break; - case 14: - rotation = BlockFace.NORTH_WEST; - break; - case 15: - rotation = BlockFace.NORTH_NORTH_WEST; - break; - default: - rotation = BlockFace.NORTH; - break; - } - bukkit.setRotation(rotation); - if (we.getOwner() != null && !we.getOwner().isEmpty()) bukkit.setOwner(we.getOwner()); - bukkit.update(true); - return true; - } - - if (!skipNmsAccess) { - try { - return (Boolean) nmsSetMethod.invoke(null, world, pt, block); - } catch (Throwable t) { - logger.log(Level.WARNING, "WorldEdit: Failed to do NMS access for direct NBT data copy", t); - skipNmsAccess = true; - } - } - - return false; - } - - @Override - public boolean copyFromWorld(Vector pt, BaseBlock block) { - World world = getWorld(); - - if (block instanceof SignBlock) { - // Signs - ((SignBlock) block).setText(getSignText(pt)); - return true; - } - - if (block instanceof FurnaceBlock) { - // Furnaces - Block bukkitBlock = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (bukkitBlock == null) return false; - BlockState state = bukkitBlock.getState(); - if (!(state instanceof Furnace)) return false; - Furnace bukkit = (Furnace) state; - FurnaceBlock we = (FurnaceBlock) block; - we.setBurnTime(bukkit.getBurnTime()); - we.setCookTime(bukkit.getCookTime()); - ((ContainerBlock) block).setItems(getContainerBlockContents(pt)); - return true; - } - - if (block instanceof ContainerBlock) { - // Chests/dispenser - ((ContainerBlock) block).setItems(getContainerBlockContents(pt)); - return true; - } - - if (block instanceof MobSpawnerBlock) { - // Mob spawners - Block bukkitBlock = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (bukkitBlock == null) return false; - BlockState state = bukkitBlock.getState(); - if (!(state instanceof CreatureSpawner)) return false; - CreatureSpawner bukkit = (CreatureSpawner) state; - MobSpawnerBlock we = (MobSpawnerBlock) block; - we.setMobType(bukkit.getCreatureTypeName()); - we.setDelay((short) bukkit.getDelay()); - return true; - } - - if (block instanceof NoteBlock) { - // Note block - Block bukkitBlock = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (bukkitBlock == null) return false; - BlockState state = bukkitBlock.getState(); - if (!(state instanceof org.bukkit.block.NoteBlock)) return false; - org.bukkit.block.NoteBlock bukkit = (org.bukkit.block.NoteBlock) state; - NoteBlock we = (NoteBlock) block; - we.setNote(bukkit.getRawNote()); - return true; - } - - if (block instanceof SkullBlock) { - // Skull block - Block bukkitBlock = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (bukkitBlock == null) return false; - BlockState state = bukkitBlock.getState(); - if (!(state instanceof org.bukkit.block.Skull)) return false; - Skull bukkit = (Skull) state; - SkullBlock we = (SkullBlock) block; - byte skullType = 0; - switch (bukkit.getSkullType()) { - // this is dumb but whoever wrote the class is stupid - case SKELETON: - skullType = 0; - break; - case WITHER: - skullType = 1; - break; - case ZOMBIE: - skullType = 2; - break; - case PLAYER: - skullType = 3; - break; - case CREEPER: - skullType = 4; - break; - } - we.setSkullType(skullType); - byte rot = 0; - switch (bukkit.getRotation()) { - // this is even more dumb, hurray for copy/paste - case NORTH: - rot = (byte) 0; - break; - case NORTH_NORTH_EAST: - rot = (byte) 1; - break; - case NORTH_EAST: - rot = (byte) 2; - break; - case EAST_NORTH_EAST: - rot = (byte) 3; - break; - case EAST: - rot = (byte) 4; - break; - case EAST_SOUTH_EAST: - rot = (byte) 5; - break; - case SOUTH_EAST: - rot = (byte) 6; - break; - case SOUTH_SOUTH_EAST: - rot = (byte) 7; - break; - case SOUTH: - rot = (byte) 8; - break; - case SOUTH_SOUTH_WEST: - rot = (byte) 9; - break; - case SOUTH_WEST: - rot = (byte) 10; - break; - case WEST_SOUTH_WEST: - rot = (byte) 11; - break; - case WEST: - rot = (byte) 12; - break; - case WEST_NORTH_WEST: - rot = (byte) 13; - break; - case NORTH_WEST: - rot = (byte) 14; - break; - case NORTH_NORTH_WEST: - rot = (byte) 15; - break; - } - we.setRot(rot); - we.setOwner(bukkit.hasOwner() ? bukkit.getOwner() : ""); - return true; - } - - return false; - } - /** * Gets the single block inventory for a potentially double chest. * Handles people who have an old version of Bukkit. @@ -1032,159 +529,9 @@ public class BukkitWorld extends LocalWorld { return num; } - /** - * Set a sign's text. - * - * @param pt - * @param text - * @return - */ - private boolean setSignText(Vector pt, String[] text) { - World world = getWorld(); - - Block block = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (block == null) return false; - BlockState state = block.getState(); - if (state == null || !(state instanceof Sign)) return false; - Sign sign = (Sign) state; - sign.setLine(0, text[0]); - sign.setLine(1, text[1]); - sign.setLine(2, text[2]); - sign.setLine(3, text[3]); - sign.update(); - return true; - } - - /** - * Get a sign's text. - * - * @param pt - * @return - */ - private String[] getSignText(Vector pt) { - World world = getWorld(); - - Block block = world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (block == null) return new String[] { "", "", "", "" }; - BlockState state = block.getState(); - if (state == null || !(state instanceof Sign)) return new String[] { "", "", "", "" }; - Sign sign = (Sign) state; - String line0 = sign.getLine(0); - String line1 = sign.getLine(1); - String line2 = sign.getLine(2); - String line3 = sign.getLine(3); - return new String[] { - line0 != null ? line0 : "", - line1 != null ? line1 : "", - line2 != null ? line2 : "", - line3 != null ? line3 : "", - }; - } - - /** - * Get a container block's contents. - * - * @param pt - * @return - */ - private BaseItemStack[] getContainerBlockContents(Vector pt) { - Block block = getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (block == null) { - return new BaseItemStack[0]; - } - BlockState state = block.getState(); - if (!(state instanceof org.bukkit.inventory.InventoryHolder)) { - return new BaseItemStack[0]; - } - - org.bukkit.inventory.InventoryHolder container = (org.bukkit.inventory.InventoryHolder) state; - Inventory inven = container.getInventory(); - if (container instanceof Chest) { - inven = getBlockInventory((Chest) container); - } - int size = inven.getSize(); - BaseItemStack[] contents = new BaseItemStack[size]; - - for (int i = 0; i < size; ++i) { - ItemStack bukkitStack = inven.getItem(i); - if (bukkitStack != null && bukkitStack.getTypeId() > 0) { - contents[i] = new BaseItemStack( - bukkitStack.getTypeId(), - bukkitStack.getAmount(), - bukkitStack.getDurability()); - try { - for (Map.Entry entry : bukkitStack.getEnchantments().entrySet()) { - contents[i].getEnchantments().put(entry.getKey().getId(), entry.getValue()); - } - } catch (Throwable ignore) {} - } - } - - return contents; - } - - /** - * Set a container block's contents. - * - * @param pt - * @param contents - * @return - */ - private boolean setContainerBlockContents(Vector pt, BaseItemStack[] contents) { - Block block = getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); - if (block == null) { - return false; - } - BlockState state = block.getState(); - if (!(state instanceof org.bukkit.inventory.InventoryHolder)) { - return false; - } - - org.bukkit.inventory.InventoryHolder chest = (org.bukkit.inventory.InventoryHolder) state; - Inventory inven = chest.getInventory(); - if (chest instanceof Chest) { - inven = getBlockInventory((Chest) chest); - } - int size = inven.getSize(); - - for (int i = 0; i < size; ++i) { - if (i >= contents.length) { - break; - } - - if (contents[i] != null) { - ItemStack toAdd = new ItemStack(contents[i].getType(), - contents[i].getAmount(), - contents[i].getData()); - try { - for (Map.Entry entry : contents[i].getEnchantments().entrySet()) { - toAdd.addEnchantment(Enchantment.getById(entry.getKey()), entry.getValue()); - } - } catch (Throwable ignore) {} - inven.setItem(i, toAdd); - } else { - inven.setItem(i, null); - } - } - - return true; - } - - /** - * Returns whether a block has a valid ID. - * - * @param type - * @return - */ + @SuppressWarnings("deprecation") @Override public boolean isValidBlockType(int type) { - if (!skipNmsValidBlockCheck) { - try { - return (Boolean) nmsValidBlockMethod.invoke(null, type); - } catch (Throwable e) { - skipNmsValidBlockCheck = true; - } - } return Material.getMaterial(type) != null && Material.getMaterial(type).isBlock(); } @@ -1228,13 +575,6 @@ public class BukkitWorld extends LocalWorld { } } - private static final Map effects = new HashMap(); - static { - for (Effect effect : Effect.values()) { - effects.put(effect.getId(), effect); - } - } - @Override public boolean playEffect(Vector position, int type, int data) { World world = getWorld(); @@ -1278,38 +618,25 @@ public class BukkitWorld extends LocalWorld { } @Override - public BaseBlock getBlock(Vector pt) { - int type = getBlockType(pt); - int data = getBlockData(pt); - - switch (type) { - case BlockID.WALL_SIGN: - case BlockID.SIGN_POST: - //case BlockID.CHEST: // Prevent data loss for now - //case BlockID.FURNACE: - //case BlockID.BURNING_FURNACE: - //case BlockID.DISPENSER: - //case BlockID.MOB_SPAWNER: - case BlockID.NOTE_BLOCK: - case BlockID.HEAD: - return super.getBlock(pt); - default: - if (!skipNmsAccess) { - try { - NmsBlock block = null; - block = (NmsBlock) nmsGetMethod.invoke(null, getWorld(), pt, type, data); - if (block != null) { - return block; - } - } catch (Throwable t) { - logger.log(Level.WARNING, - "WorldEdit: Failed to do NMS access for direct NBT data copy", t); - skipNmsAccess = true; - } - } + public BaseBlock getBlock(Vector position) { + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + if (adapter != null) { + return adapter.getBlock(BukkitAdapter.adapt(getWorld(), position)); + } else { + Block bukkitBlock = getWorld().getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + return new BaseBlock(bukkitBlock.getTypeId(), bukkitBlock.getData()); } + } - return super.getBlock(pt); + @Override + public boolean setBlock(Vector position, BaseBlock block, boolean notifyAndLight) throws WorldEditException { + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + if (adapter != null) { + return adapter.setBlock(BukkitAdapter.adapt(getWorld(), position), block, notifyAndLight); + } else { + Block bukkitBlock = getWorld().getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + return bukkitBlock.setTypeIdAndData(block.getType(), (byte) block.getData(), notifyAndLight); + } } @SuppressWarnings("deprecation") @@ -1320,20 +647,6 @@ public class BukkitWorld extends LocalWorld { return new LazyBlock(bukkitBlock.getTypeId(), bukkitBlock.getData(), this, position); } - @Override - public boolean setBlock(Vector pt, BaseBlock block, boolean notifyAdjacent) throws WorldEditException { - if (!skipNmsSafeSet) { - try { - return (Boolean) nmsSetSafeMethod.invoke(null, this, pt, block, notifyAdjacent); - } catch (Throwable t) { - logger.log(Level.WARNING, "WorldEdit: Failed to do NMS safe block set", t); - skipNmsSafeSet = true; - } - } - - return super.setBlock(pt, block, notifyAdjacent); - } - /** * @deprecated Use {@link #setBlock(Vector, BaseBlock, boolean)} */ diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/DefaultNmsBlock.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/DefaultNmsBlock.java deleted file mode 100644 index 8b738923b..000000000 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/DefaultNmsBlock.java +++ /dev/null @@ -1,472 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.bukkit; -import com.sk89q.jnbt.*; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.blocks.TileEntityBlock; -import com.sk89q.worldedit.world.DataException; -import com.sk89q.worldedit.foundation.Block; -import net.minecraft.server.v1_7_R3.*; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.*; -import java.util.logging.Logger; - -/** - * A blind handler of blocks with TileEntity data that directly access Minecraft's - * classes through CraftBukkit. - *

- * Usage of this class may break terribly in the future, and therefore usage should - * be trapped in a handler for {@link Throwable}. - */ -public class DefaultNmsBlock extends NmsBlock { - - private static final Logger logger = WorldEdit.logger; - private static Field compoundMapField; - private static final Field nmsBlock_isTileEntityField; // The field is deobfuscated but the method isn't. No idea why. - private NBTTagCompound nbtData = null; - - static { - Field field; - try { - field = net.minecraft.server.v1_7_R3.Block.class.getDeclaredField("isTileEntity"); - field.setAccessible(true); - } catch (NoSuchFieldException e) { - // logger.severe("Could not find NMS block tile entity field!"); - field = null; - } - nmsBlock_isTileEntityField = field; - } - - public static boolean verify() { - return nmsBlock_isTileEntityField != null; - } - - /** - * Create a new instance with a given type ID, data value, and previous - * {@link TileEntityBlock}-implementing object. - * - * @param type block type ID - * @param data data value - * @param tileEntityBlock tile entity block - */ - public DefaultNmsBlock(int type, int data, TileEntityBlock tileEntityBlock) { - super(type, data); - - nbtData = (NBTTagCompound) fromNative(tileEntityBlock.getNbtData()); - } - - /** - * Create a new instance with a given type ID, data value, and raw - * {@link NBTTagCompound} copy. - * - * @param type block type ID - * @param data data value - * @param nbtData raw NBT data - */ - public DefaultNmsBlock(int type, int data, NBTTagCompound nbtData) { - super(type, data); - - this.nbtData = nbtData; - } - - /** - * Build a {@link NBTTagCompound} that has valid coordinates. - * - * @param pt coordinates to set - * @return the tag compound - */ - private NBTTagCompound getNmsData(Vector pt) { - if (nbtData == null) { - return null; - } - - nbtData.set("x", new NBTTagInt(pt.getBlockX())); - nbtData.set("y", new NBTTagInt(pt.getBlockY())); - nbtData.set("z", new NBTTagInt(pt.getBlockZ())); - - return nbtData; - } - - @Override - public boolean hasNbtData() { - return nbtData != null; - } - - @Override - public String getNbtId() { - if (nbtData == null) { - return ""; - } - - return nbtData.getString("id"); - } - - @Override - public CompoundTag getNbtData() { - if (nbtData == null) { - return new CompoundTag(getNbtId(), - new HashMap()); - } - return (CompoundTag) toNative(nbtData); - } - - @Override - public void setNbtData(CompoundTag tag) { - if (tag == null) { - this.nbtData = null; - } - this.nbtData = (NBTTagCompound) fromNative(tag); - } - - /** - * Build an instance from the given information. - * - * @param world world to get the block from - * @param position position to get the block at - * @param type type ID of block - * @param data data value of block - * @return the block, or null - */ - public static DefaultNmsBlock get(World world, Vector position, int type, int data) { - if (!hasTileEntity(type)) { - return null; - } - - TileEntity te = ((CraftWorld) world).getHandle().getTileEntity( - position.getBlockX(), position.getBlockY(), position.getBlockZ()); - - if (te != null) { - NBTTagCompound tag = new NBTTagCompound(); - te.b(tag); // Load data - return new DefaultNmsBlock(type, data, tag); - } - - return null; - } - - /** - * Set an instance or a {@link TileEntityBlock} to the given position. - * - * @param world world to set the block in - * @param position position to set the block at - * @param block the block to set - * @return true if tile entity data was copied to the world - */ - public static boolean set(World world, Vector position, BaseBlock block) { - NBTTagCompound data = null; - if (!hasTileEntity(world.getBlockTypeIdAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()))) { - return false; - } - - if (block instanceof DefaultNmsBlock) { - DefaultNmsBlock nmsProxyBlock = (DefaultNmsBlock) block; - data = nmsProxyBlock.getNmsData(position); - } else if (block instanceof TileEntityBlock) { - DefaultNmsBlock nmsProxyBlock = new DefaultNmsBlock( - block.getId(), block.getData(), block); - data = nmsProxyBlock.getNmsData(position); - } - - if (data != null) { - TileEntity te = ((CraftWorld) world).getHandle().getTileEntity( - position.getBlockX(), position.getBlockY(), position.getBlockZ()); - if (te != null) { - te.a(data); // Load data - return true; - } - } - - return false; - } - - /** - * Tries to set a block 'safely', as in setting the block data to the location, and - * then triggering physics only at the end. - * - * @param world world to set the block in - * @param position position to set the block at - * @param block the block to set - * @param notifyAdjacent true to notify physics and what not - * @return true if block id or data was changed - */ - public static boolean setSafely(BukkitWorld world, Vector position, - Block block, boolean notifyAdjacent) { - - int x = position.getBlockX(); - int y = position.getBlockY(); - int z = position.getBlockZ(); - - CraftWorld craftWorld = ((CraftWorld) world.getWorld()); -// TileEntity te = craftWorld.getHandle().getTileEntity(x, y, z); -// craftWorld.getHandle().tileEntityList.remove(te); - - boolean changed = craftWorld.getHandle().setTypeAndData(x, y, z, getNmsBlock(block.getId()), block.getData(), 0); - - if (block instanceof BaseBlock) { - world.copyToWorld(position, (BaseBlock) block); - } - - changed = craftWorld.getHandle().setData(x, y, z, block.getData(), 0) || changed; - if (changed && notifyAdjacent) { - craftWorld.getHandle().notify(x, y, z); - craftWorld.getHandle().update(x, y, z, getNmsBlock(block.getId())); - } - - return changed; - } - - public static boolean hasTileEntity(int type) { - net.minecraft.server.v1_7_R3.Block nmsBlock = getNmsBlock(type); - if (nmsBlock == null) { - return false; - } - - try { - return nmsBlock_isTileEntityField.getBoolean(nmsBlock); // Once we have the field stord, gets are fast - } catch (IllegalAccessException e) { - return false; - } - } - - public static net.minecraft.server.v1_7_R3.Block getNmsBlock(int type) { - return net.minecraft.server.v1_7_R3.Block.e(type); - } - - /** - * Converts from a non-native NMS NBT structure to a native WorldEdit NBT - * structure. - * - * @param foreign non-native NMS NBT structure - * @return native WorldEdit NBT structure - */ - private static Tag toNative(NBTBase foreign) { - // temporary fix since mojang removed names from tags - // our nbt spec will need to be updated to theirs - return toNative(getTagName(foreign.getTypeId()), foreign); - } - - // seriously these two methods are hacky - our jnbt spec needs updating - // copied from NMS 1.7.5- code, since it was removed in 1.7.8 - private static String getTagName(int i) { - switch (i) { - case 0: - return "TAG_End"; - case 1: - return "TAG_Byte"; - case 2: - return "TAG_Short"; - case 3: - return "TAG_Int"; - case 4: - return "TAG_Long"; - case 5: - return "TAG_Float"; - case 6: - return "TAG_Double"; - case 7: - return "TAG_Byte_Array"; - case 8: - return "TAG_String"; - case 9: - return "TAG_List"; - case 10: - return "TAG_Compound"; - case 11: - return "TAG_Int_Array"; - case 99: - return "Any Numeric Tag"; - default: - return "UNKNOWN"; - } - } - - /** - * Converts from a non-native NMS NBT structure to a native WorldEdit NBT - * structure. - * - * @param foreign non-native NMS NBT structure - * @param name name for the tag, if it has one - * @return native WorldEdit NBT structure - */ - @SuppressWarnings("unchecked") - private static Tag toNative(String name, NBTBase foreign) { - if (foreign == null) { - return null; - } - if (foreign instanceof NBTTagCompound) { - Map values = new HashMap(); - Collection foreignKeys = null; - - if (compoundMapField == null) { - try { - // Method name may change! - foreignKeys = ((NBTTagCompound) foreign).c(); - } catch (Throwable t) { - try { - logger.warning("WorldEdit: Couldn't get NBTTagCompound.c(), " + - "so we're going to try to get at the 'map' field directly from now on"); - - if (compoundMapField == null) { - compoundMapField = NBTTagCompound.class.getDeclaredField("map"); - compoundMapField.setAccessible(true); - } - } catch (Throwable e) { - // Can't do much beyond this - throw new RuntimeException(e); - } - } - } - - if (compoundMapField != null) { - try { - foreignKeys = ((HashMap) compoundMapField.get(foreign)).keySet(); - } catch (Throwable e) { - // Can't do much beyond this - throw new RuntimeException(e); - } - } - - for (Object obj : foreignKeys) { - String key = (String) obj; - NBTBase base = (NBTBase) ((NBTTagCompound) foreign).get(key); - values.put(key, toNative(key, base)); - } - return new CompoundTag(name, values); - } else if (foreign instanceof NBTTagByte) { - return new ByteTag(name, ((NBTTagByte) foreign).f()); // getByte - } else if (foreign instanceof NBTTagByteArray) { - return new ByteArrayTag(name, - ((NBTTagByteArray) foreign).c()); // data - } else if (foreign instanceof NBTTagDouble) { - return new DoubleTag(name, - ((NBTTagDouble) foreign).g()); // getDouble - } else if (foreign instanceof NBTTagFloat) { - return new FloatTag(name, ((NBTTagFloat) foreign).h()); // getFloat - } else if (foreign instanceof NBTTagInt) { - return new IntTag(name, ((NBTTagInt) foreign).d()); // getInt - } else if (foreign instanceof NBTTagIntArray) { - return new IntArrayTag(name, - ((NBTTagIntArray) foreign).c()); // data - } else if (foreign instanceof NBTTagList) { - try { - return transmorgifyList(name, (NBTTagList) foreign); - } catch (NoSuchFieldException e) { - } catch (SecurityException e) { - } catch (IllegalArgumentException e) { - } catch (IllegalAccessException e) {} - return new ListTag(name, ByteTag.class, new ArrayList()); - } else if (foreign instanceof NBTTagLong) { - return new LongTag(name, ((NBTTagLong) foreign).c()); // getLong - } else if (foreign instanceof NBTTagShort) { - return new ShortTag(name, ((NBTTagShort) foreign).e()); // getShort - } else if (foreign instanceof NBTTagString) { - return new StringTag(name, - ((NBTTagString) foreign).a_()); // data - } else if (foreign instanceof NBTTagEnd) { - return new EndTag(); - } else { - throw new IllegalArgumentException("Don't know how to make native " - + foreign.getClass().getCanonicalName()); - } - } - - private static ListTag transmorgifyList(String name, NBTTagList foreign) - throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - List values = new ArrayList(); - int type = foreign.d(); - Field listField = NBTTagList.class.getDeclaredField("list"); - listField.setAccessible(true); - List foreignList; - foreignList = (List) listField.get(foreign); - for (int i = 0; i < foreign.size(); i++) { - NBTBase element = (NBTBase) foreignList.get(i); - values.add(toNative(null, element)); // list elements shouldn't have names - } - Class cls = NBTConstants.getClassFromType(type); - return new ListTag(name, cls, values); - } - - /** - * Converts a WorldEdit-native NBT structure to a NMS structure. - * - * @param foreign structure to convert - * @return non-native structure - */ - private static NBTBase fromNative(Tag foreign) { - if (foreign == null) { - return null; - } - if (foreign instanceof CompoundTag) { - NBTTagCompound tag = new NBTTagCompound(); - for (Map.Entry entry : ((CompoundTag) foreign) - .getValue().entrySet()) { - tag.set(entry.getKey(), fromNative(entry.getValue())); - } - return tag; - } else if (foreign instanceof ByteTag) { - return new NBTTagByte(((ByteTag) foreign).getValue()); - } else if (foreign instanceof ByteArrayTag) { - return new NBTTagByteArray(((ByteArrayTag) foreign).getValue()); - } else if (foreign instanceof DoubleTag) { - return new NBTTagDouble(((DoubleTag) foreign).getValue()); - } else if (foreign instanceof FloatTag) { - return new NBTTagFloat(((FloatTag) foreign).getValue()); - } else if (foreign instanceof IntTag) { - return new NBTTagInt(((IntTag) foreign).getValue()); - } else if (foreign instanceof IntArrayTag) { - return new NBTTagIntArray(((IntArrayTag) foreign).getValue()); - } else if (foreign instanceof ListTag) { - NBTTagList tag = new NBTTagList(); - ListTag foreignList = (ListTag) foreign; - for (Tag t : foreignList.getValue()) { - tag.add(fromNative(t)); - } - return tag; - } else if (foreign instanceof LongTag) { - return new NBTTagLong(((LongTag) foreign).getValue()); - } else if (foreign instanceof ShortTag) { - return new NBTTagShort(((ShortTag) foreign).getValue()); - } else if (foreign instanceof StringTag) { - return new NBTTagString(((StringTag) foreign).getValue()); - } else if (foreign instanceof EndTag) { - try { - Method tagMaker = NBTBase.class.getDeclaredMethod("createTag", byte.class); - tagMaker.setAccessible(true); - return (NBTBase) tagMaker.invoke(null, (byte) 0); - } catch (Exception e) { - return null; - } - } else { - throw new IllegalArgumentException("Don't know how to make NMS " - + foreign.getClass().getCanonicalName()); - } - } - - public static boolean isValidBlockType(int type) throws NoClassDefFoundError { - return type == 0 || (type >= 1 && net.minecraft.server.v1_7_R3.Block.e(type) != null); - } - -} diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/NmsBlock.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/NmsBlock.java deleted file mode 100644 index 088de8547..000000000 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/NmsBlock.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.bukkit; - -import org.bukkit.World; - -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.foundation.Block; - -public abstract class NmsBlock extends BaseBlock { - - protected NmsBlock(int type) { - super(type); - } - - protected NmsBlock(int type, int data) { - super(type, data); - } - - public static boolean verify() { - return false; - } - - public static NmsBlock get(World world, Vector vector, int type, int data) { - return null; - } - - public static boolean set(World world, Vector vector, Block block) { - return false; - } - - public static boolean setSafely(World world, Vector vector, Block block, boolean notify) { - return false; - } - - public static boolean hasTileEntity(int type) { - return false; - } - - public static boolean isValidBlockType(int type) { - return false; - } -} \ No newline at end of file diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index 0cdaf470d..eac26306b 100644 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -22,7 +22,16 @@ package com.sk89q.worldedit.bukkit; import com.google.common.base.Joiner; import com.sk89q.util.yaml.YAMLProcessor; import com.sk89q.wepif.PermissionsResolverManager; -import com.sk89q.worldedit.*; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.IncompleteRegionException; +import com.sk89q.worldedit.LocalPlayer; +import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.ServerInterface; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.WorldEditOperation; +import com.sk89q.worldedit.bukkit.adapter.AdapterLoadException; +import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; +import com.sk89q.worldedit.bukkit.adapter.BukkitImplLoader; import com.sk89q.worldedit.bukkit.selections.CuboidSelection; import com.sk89q.worldedit.bukkit.selections.CylinderSelection; import com.sk89q.worldedit.bukkit.selections.Polygonal2DSelection; @@ -32,7 +41,11 @@ import com.sk89q.worldedit.event.platform.CommandSuggestionEvent; import com.sk89q.worldedit.event.platform.PlatformReadyEvent; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.inventory.BlockBag; -import com.sk89q.worldedit.regions.*; +import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldedit.regions.CylinderRegion; +import com.sk89q.worldedit.regions.Polygonal2DRegion; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.regions.RegionSelector; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -40,13 +53,20 @@ import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -import java.io.*; -import java.util.Enumeration; +import javax.annotation.Nullable; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.List; -import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.zip.ZipEntry; +import static com.google.common.base.Preconditions.checkNotNull; + /** * Plugin for Bukkit. * @@ -54,27 +74,13 @@ import java.util.zip.ZipEntry; */ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { - /** - * The name of the CUI's plugin channel registration - */ + private static final Logger log = Logger.getLogger(WorldEditPlugin.class.getCanonicalName()); public static final String CUI_PLUGIN_CHANNEL = "WECUI"; + private static WorldEditPlugin INSTANCE; - /** - * The server interface that all server-related API goes through. - */ + private BukkitImplAdapter bukkitAdapter; private BukkitServerInterface server; - /** - * Main WorldEdit instance. - */ - private WorldEdit controller; - /** - * Deprecated API. - */ - private WorldEditAPI api; - - /** - * Holds the configuration for WorldEdit. - */ + private final WorldEditAPI api = new WorldEditAPI(this); private BukkitConfiguration config; /** @@ -82,41 +88,27 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { */ @Override public void onEnable() { - final String pluginYmlVersion = getDescription().getVersion(); - final String manifestVersion = WorldEdit.getVersion(); + this.INSTANCE = this; - if (!manifestVersion.equalsIgnoreCase(pluginYmlVersion)) { - WorldEdit.setVersion(manifestVersion + " (" + pluginYmlVersion + ")"); - } + WorldEdit worldEdit = WorldEdit.getInstance(); - // Make the data folders that WorldEdit uses - getDataFolder().mkdirs(); - File targetDir = new File(getDataFolder() + File.separator + "nmsblocks"); - targetDir.mkdir(); - copyNmsBlockClasses(targetDir); + loadAdapter(); // Need an adapter to work with special blocks with NBT data + loadConfig(); // Load configuration + PermissionsResolverManager.initialize(this); // Setup permission resolver - // Create the default configuration file - createDefaultConfiguration("config.yml"); - - // Set up configuration and such, including the permissions - // resolver - config = new BukkitConfiguration(new YAMLProcessor(new File(getDataFolder(), "config.yml"), true), this); - PermissionsResolverManager.initialize(this); - - // Load the configuration - config.load(); - - // Setup interfaces + // Setup platform server = new BukkitServerInterface(this, getServer()); - controller = WorldEdit.getInstance(); - controller.getPlatformManager().register(server); - api = new WorldEditAPI(this); + worldEdit.getPlatformManager().register(server); + + // Register CUI getServer().getMessenger().registerIncomingPluginChannel(this, CUI_PLUGIN_CHANNEL, new CUIChannelListener(this)); getServer().getMessenger().registerOutgoingPluginChannel(this, CUI_PLUGIN_CHANNEL); - // Now we can register events! + + // Now we can register events getServer().getPluginManager().registerEvents(new WorldEditListener(this), this); - getServer().getScheduler().runTaskTimerAsynchronously(this, new SessionTimer(controller, getServer()), 120, 120); + // Register session timer + getServer().getScheduler().runTaskTimerAsynchronously(this, new SessionTimer(worldEdit, getServer()), 120, 120); // If we are on MCPC+/Cauldron, then Forge will have already loaded // Forge WorldEdit and there's (probably) not going to be any other @@ -124,31 +116,34 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent()); } - private void copyNmsBlockClasses(File target) { + private void loadConfig() { + createDefaultConfiguration("config.yml"); // Create the default configuration file + + config = new BukkitConfiguration(new YAMLProcessor(new File(getDataFolder(), "config.yml"), true), this); + config.load(); + } + + private void loadAdapter() { + // Attempt to load a Bukkit adapter + BukkitImplLoader adapterLoader = new BukkitImplLoader(); + try { - JarFile jar = new JarFile(getFile()); - @SuppressWarnings("rawtypes") - Enumeration entries = jar.entries(); - while (entries.hasMoreElements()) { - JarEntry jarEntry = (JarEntry) entries.nextElement(); - if (!jarEntry.getName().startsWith("nmsblocks") || jarEntry.isDirectory()) continue; + adapterLoader.addFromPath(getClass().getClassLoader()); + } catch (IOException e) { + log.log(Level.WARNING, "Failed to search path for Bukkit adapters"); + } - File file = new File(target + File.separator + jarEntry.getName().replace("nmsblocks", "")); - if (file.exists()) continue; - - InputStream is = jar.getInputStream(jarEntry); - FileOutputStream fos = new FileOutputStream(file); - - fos = new FileOutputStream(file); - byte[] buf = new byte[8192]; - int length = 0; - while ((length = is.read(buf)) > 0) { - fos.write(buf, 0, length); - } - fos.close(); - is.close(); - } - } catch (Throwable e) {} + try { + adapterLoader.addFromJar(getFile()); + } catch (IOException e) { + log.log(Level.WARNING, "Failed to search " + getFile() + " for Bukkit adapters", e); + } + try { + bukkitAdapter = adapterLoader.loadAdapter(); + log.log(Level.INFO, "Using " + bukkitAdapter.getClass().getCanonicalName() + " as the Bukkit adapter"); + } catch (AdapterLoadException e) { + log.log(Level.WARNING, e.getMessage()); + } } /** @@ -156,10 +151,13 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { */ @Override public void onDisable() { - if (controller != null) { - controller.clearSessions(); - controller.getPlatformManager().unregister(server); + WorldEdit worldEdit = WorldEdit.getInstance(); + worldEdit.clearSessions(); + worldEdit.getPlatformManager().unregister(server); + if (config != null) { config.unload(); + } + if (server != null) { server.unregisterCommands(); } this.getServer().getScheduler().cancelTasks(this); @@ -177,7 +175,7 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { /** * Create a default configuration file from the .jar. * - * @param name + * @param name the filename */ protected void createDefaultConfiguration(String name) { File actual = new File(getDataFolder(), name); @@ -257,7 +255,7 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { * @return */ public LocalSession getSession(Player player) { - return controller.getSession(wrapPlayer(player)); + return WorldEdit.getInstance().getSession(wrapPlayer(player)); } /** @@ -268,10 +266,10 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { */ public EditSession createEditSession(Player player) { LocalPlayer wePlayer = wrapPlayer(player); - LocalSession session = controller.getSession(wePlayer); + LocalSession session = WorldEdit.getInstance().getSession(wePlayer); BlockBag blockBag = session.getBlockBag(wePlayer); - EditSession editSession = controller.getEditSessionFactory() + EditSession editSession = WorldEdit.getInstance().getEditSessionFactory() .getEditSession(wePlayer.getWorld(), session.getBlockChangeLimit(), blockBag, wePlayer); editSession.enableQueue(); @@ -286,12 +284,12 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { */ public void remember(Player player, EditSession editSession) { LocalPlayer wePlayer = wrapPlayer(player); - LocalSession session = controller.getSession(wePlayer); + LocalSession session = WorldEdit.getInstance().getSession(wePlayer); session.remember(editSession); editSession.flushQueue(); - controller.flushBlockBag(wePlayer, editSession); + WorldEdit.getInstance().flushBlockBag(wePlayer, editSession); } /** @@ -301,10 +299,9 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { * @param op * @throws Throwable */ - public void perform(Player player, WorldEditOperation op) - throws Throwable { + public void perform(Player player, WorldEditOperation op) throws Throwable { LocalPlayer wePlayer = wrapPlayer(player); - LocalSession session = controller.getSession(wePlayer); + LocalSession session = WorldEdit.getInstance().getSession(wePlayer); EditSession editSession = createEditSession(player); try { @@ -379,7 +376,7 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { * @return */ public WorldEdit getWorldEdit() { - return controller; + return WorldEdit.getInstance(); } /** @@ -396,7 +393,7 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { throw new IllegalArgumentException("Offline player not allowed"); } - LocalSession session = controller.getSession(wrapPlayer(player)); + LocalSession session = WorldEdit.getInstance().getSession(wrapPlayer(player)); RegionSelector selector = session.getRegionSelector(BukkitUtil.getLocalWorld(player.getWorld())); try { @@ -434,9 +431,30 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter { throw new IllegalArgumentException("Null selection not allowed"); } - LocalSession session = controller.getSession(wrapPlayer(player)); + LocalSession session = WorldEdit.getInstance().getSession(wrapPlayer(player)); RegionSelector sel = selection.getRegionSelector(); session.setRegionSelector(BukkitUtil.getLocalWorld(player.getWorld()), sel); session.dispatchCUISelection(wrapPlayer(player)); } + + /** + * Gets the instance of this plugin. + * + * @return an instance of the plugin + * @throws NullPointerException if the plugin hasn't been enabled + */ + static WorldEditPlugin getInstance() { + return checkNotNull(INSTANCE); + } + + /** + * Get the Bukkit implementation adapter. + * + * @return the adapter + */ + @Nullable + BukkitImplAdapter getBukkitImplAdapter() { + return bukkitAdapter; + } + } diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/AdapterLoadException.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/AdapterLoadException.java new file mode 100644 index 000000000..d8459d691 --- /dev/null +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/AdapterLoadException.java @@ -0,0 +1,41 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.bukkit.adapter; + +/** + * Thrown when no adapter can be found. + */ +public class AdapterLoadException extends Exception { + + public AdapterLoadException() { + } + + public AdapterLoadException(String message) { + super(message); + } + + public AdapterLoadException(String message, Throwable cause) { + super(message, cause); + } + + public AdapterLoadException(Throwable cause) { + super(cause); + } +} diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java new file mode 100644 index 000000000..8de74ce80 --- /dev/null +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -0,0 +1,49 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.bukkit.adapter; + +import com.sk89q.worldedit.blocks.BaseBlock; +import org.bukkit.Location; + +/** + * An interface for adapters of various Bukkit implementations. + */ +public interface BukkitImplAdapter { + + /** + * Get the block at the given location. + * + * @param location the location + * @return the block + */ + BaseBlock getBlock(Location location); + + /** + * Set the block at the given location. + * + * @param location the location + * @param state the block + * @param notifyAndLight notify and light if set + * @return true if a block was likely changed + */ + boolean setBlock(Location location, BaseBlock state, boolean notifyAndLight); + + +} diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java new file mode 100644 index 000000000..28704a8ca --- /dev/null +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java @@ -0,0 +1,197 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.bukkit.adapter; + +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.util.io.Closer; +import org.bukkit.Bukkit; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Loads Bukkit implementation adapters. + */ +public class BukkitImplLoader { + + private static final Logger log = Logger.getLogger(BukkitImplLoader.class.getCanonicalName()); + private final List adapterCandidates = new ArrayList(); + private String customCandidate; + + private static final String SEARCH_PACKAGE = "com.sk89q.worldedit.bukkit.adapter.impl"; + private static final String SEARCH_PACKAGE_DOT = SEARCH_PACKAGE + "."; + private static final String SEARCH_PATH = SEARCH_PACKAGE.replace(".", "/"); + private static final String CLASS_SUFFIX = ".class"; + + private static final String LOAD_ERROR_MESSAGE = + "Failed to find an adapter for Bukkit!\n\n" + + "This version of WorldEdit (%s) does not fully support your version of Bukkit (%s).\n\n" + + "What this means:\n" + + "1) Block operations will work, but chests will be empty, signs will be blank, and so on.\n" + + "2) You won't be able to save and load chests, signs, etc. with .schematic files.\n" + + "3) You won't be able to work with entities properly.\n" + + "4) Undo will will not be able to restore chests, signs, and etc.\n\n" + + "Possible solutions:\n" + + "1) If this is a new version of Minecraft, please wait for us to update. " + + "You can also put in a ticket at http://youtrack.sk89q.com (check for an existing ticket first).\n" + + "2) If you are using an older version of Minecraft, you may need to downgrade WorldEdit.\n" + + "3) If you are using an older version of WorldEdit, you may need to update your WorldEdit.\n" + + "4) If you are not using CraftBukkit, then report this issue to http://youtrack.sk89q.com " + + "(check for an existing ticket first).\n" + + "5) If you are developing WorldEdit, you can force an adapter with " + + "-Dworldedit.bukkit.adapter=the_class_name.\n\n" + + "Can I ignore this error? Yes! Just be aware of the undo issue.\n" + + "Am I using CraftBukkit? %s.\n"; + + /** + * Create a new instance. + */ + public BukkitImplLoader() { + addDefaults(); + } + + /** + * Add default candidates, such as any defined with + * {@code -Dworldedit.bukkit.adapter}. + */ + private void addDefaults() { + String className = System.getProperty("worldedit.bukkit.adapter"); + if (className != null) { + customCandidate = className; + adapterCandidates.add(className); + log.log(Level.INFO, "-Dworldedit.bukkit.adapter used to add " + className + " to the list of available Bukkit adapters"); + } + } + + /** + * Search the given JAR for candidate implementations. + * + * @param file the file + * @throws IOException thrown on I/O error + */ + public void addFromJar(File file) throws IOException { + Closer closer = Closer.create(); + JarFile jar = closer.register(new JarFile(file)); + try { + Enumeration entries = jar.entries(); + while (entries.hasMoreElements()) { + JarEntry jarEntry = (JarEntry) entries.nextElement(); + + String className = jarEntry.getName().replaceAll("[/\\\\]+", "."); + + if (!className.startsWith(SEARCH_PACKAGE_DOT) || jarEntry.isDirectory()) continue; + + int beginIndex = 0; + int endIndex = className.length() - CLASS_SUFFIX.length(); + className = className.substring(beginIndex, endIndex); + adapterCandidates.add(className); + } + } finally { + closer.close(); + } + } + + /** + * Search for classes stored as separate files available via the given + * class loader. + * + * @param classLoader the class loader + * @throws IOException thrown on error + */ + public void addFromPath(ClassLoader classLoader) throws IOException { + Enumeration resources = classLoader.getResources(SEARCH_PATH); + while (resources.hasMoreElements()) { + File file = new File(resources.nextElement().getFile()); + addFromPath(file); + } + } + + /** + * Search for classes stored as separate files available via the given + * path. + * + * @param file the path + */ + private void addFromPath(File file) { + String resource = SEARCH_PACKAGE_DOT + file.getName(); + if (file.isDirectory()) { + File[] files = file.listFiles(); + if (files != null) { + for (File child : files) { + addFromPath(child); + } + } + } else if (resource.endsWith(CLASS_SUFFIX)) { + int beginIndex = 0; + int endIndex = resource.length() - CLASS_SUFFIX.length(); + String className = resource.substring(beginIndex, endIndex); + adapterCandidates.add(className); + } + } + + /** + * Iterate through the list of candidates and load an adapter. + * + * @return an adapter + * @throws AdapterLoadException thrown if no adapter could be found + */ + public BukkitImplAdapter loadAdapter() throws AdapterLoadException { + for (String className : adapterCandidates) { + try { + Class cls = Class.forName(className); + if (BukkitImplAdapter.class.isAssignableFrom(cls)) { + return (BukkitImplAdapter) cls.newInstance(); + } else { + log.log(Level.WARNING, "Failed to load the Bukkit adapter class '" + className + + "' because it does not implement " + BukkitImplAdapter.class.getCanonicalName()); + } + } catch (ClassNotFoundException e) { + log.log(Level.WARNING, "Failed to load the Bukkit adapter class '" + className + + "' that is not supposed to be missing", e); + } catch (IllegalAccessException e) { + log.log(Level.WARNING, "Failed to load the Bukkit adapter class '" + className + + "' that is not supposed to be raising this error", e); + } catch (Throwable e) { + if (className.equals(customCandidate)) { + log.log(Level.WARNING, "Failed to load the Bukkit adapter class '" + className + "'", e); + } + } + } + + String weVersion = WorldEdit.getVersion(); + String bukkitVersion = Bukkit.getBukkitVersion() + " implemented by " + Bukkit.getName() + " " + Bukkit.getVersion(); + String usingCraftBukkit = + Bukkit.getName().equals("CraftBukkit") + ? "Probably (if you got it from dl.bukkit.org, then yes)" + : "No! You are using " + Bukkit.getName(); + + throw new AdapterLoadException( + String.format(LOAD_ERROR_MESSAGE, weVersion, bukkitVersion, usingCraftBukkit)); + } + +} diff --git a/src/bukkit/resources/com/sk89q/worldedit/bukkit/adapter/impl/CraftBukkit_v1_7_R2.class b/src/bukkit/resources/com/sk89q/worldedit/bukkit/adapter/impl/CraftBukkit_v1_7_R2.class new file mode 100644 index 0000000000000000000000000000000000000000..1fbcb3cbadd0257911c24a08588d809e4f04727b GIT binary patch literal 12200 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 H+mriWi@@;e literal 0 HcmV?d00001 diff --git a/src/bukkit/resources/nmsblocks/CBXNmsBlock_145.class b/src/bukkit/resources/nmsblocks/CBXNmsBlock_145.class deleted file mode 100644 index b8d6c51f3037bfb3a6a765a11a4a42497d76aeed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12701 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 diff --git a/src/bukkit/resources/nmsblocks/CBXNmsBlock_146.class b/src/bukkit/resources/nmsblocks/CBXNmsBlock_146.class deleted file mode 100644 index e89c4a70b1919457de1d633c0f7abae9d555f14b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12456 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 diff --git a/src/bukkit/resources/nmsblocks/CBXNmsBlock_147.class b/src/bukkit/resources/nmsblocks/CBXNmsBlock_147.class deleted file mode 100644 index e3c8c20fdcbbb180f17431028df0388f2b36481e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12528 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 K_&WA`eE$a}@DC~g diff --git a/src/bukkit/resources/nmsblocks/CBXNmsBlock_15.class b/src/bukkit/resources/nmsblocks/CBXNmsBlock_15.class deleted file mode 100644 index 68781e1986ca2916ed225b82d2009601278f46b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12533 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 Ro`Soa`)%|`5{{gmI5wZXP diff --git a/src/bukkit/resources/nmsblocks/CBXNmsBlock_161.class b/src/bukkit/resources/nmsblocks/CBXNmsBlock_161.class deleted file mode 100644 index 336c611cb014b8976d3e4c882f94027740d09383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12540 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 diff --git a/src/bukkit/resources/nmsblocks/CBXNmsBlock_175.class b/src/bukkit/resources/nmsblocks/CBXNmsBlock_175.class deleted file mode 100644 index 6afbcdcc592164ebf507fe5ad50442b4af8fa7e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13808 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

5C)F{$sC|A1Hf?>UyZ4k5)B-TU~-~ zPS7pAbgOi%>7l$nS}h%G5_DTH-7eI%dU&Hy*CyzW1l`$7cS*+v-LYOeHYBJgL3j7k zJ<_pBcle}ZQ-bbI(0w=yNyiqwz-H;#lA!y0>C-}O@1gm9)C>rFKs0QxM|tw#A$kZu zQ-lV3vnWDCt9MhCr@YXk^?7*zv0rO_LVCGv!ZnnjM-udCFFhuVyL3lHI=T|HKS7`A zrN^ZsuH}eHM?68F?WNBNb!QLF%BQ_~Pk6papKr=~nx4dN@rAl_#Pxx42Jxw;tgM6d zG^o!Yjt|sv2Kqh+%*8I<4}F<;@I(ACJ?ljCLx?Ei%Ymj>Ad;>^j9v{i-3v6n2LA+c zEv@70@P823BPRFJMSKJPOXEiT^U6)|=*{#1-$MKORv_hVbeM0)uX667*ZEF*oA08( zaS#2Q??!2K4;S&hJc;k)sld7t{xnze1H70Yq>dxX3AQAoC*ujSA1jr=&M zp9S@E{1`u}GpG$AT1ACi%?p4q(}0A6YYMnlt4|mV9LoVZE`%mtD%QPODBfn$8#=3w zQU&s65peBVa9Ip|XMO~q2q=#{;3LSsg?LIXNugq|wZuWQS(NAfFBPMn)<8Am1L83S zW5$dr_#cheDYaD7C%g~(n1ZOm%M_$J8#SPP{;R`N%BE38Jv6My^B@hC;_D;M$o#CU zfJ#<(lE+@k8lJU?b;9Db2MF}xzZO=4GXRmU!5UHzPI#IU&ro$f_2wM}60Rz<3nXtH zuPS?n_$dtcqJSKYe76fu`#^UZsB^L1%tPN<=&hnLG#{s#1#}86)B?$6z!+^ZIouAT nVZ2IT@`z|CH`fERkCFnkU`!oo3LE5Ec*? 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 diff --git a/src/bukkit/resources/nmsblocks/CBXNmsBlock_v152_2.class b/src/bukkit/resources/nmsblocks/CBXNmsBlock_v152_2.class deleted file mode 100644 index 2a4acd48efdd53cec99a68557329fac3f8f4671c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12552 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 TU3@-I!ClUMH{<*DVvq0tC*u|U diff --git a/src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_147.class b/src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_147.class deleted file mode 100644 index 86da91a7fac994cdc736fb67e1ecdefb9ede319b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9277 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 Aq5uE@ diff --git a/src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_151dv.class b/src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_151dv.class deleted file mode 100644 index b68088e83e2f248e34b1cacd4c9123d5c1c6f4ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10513 zcmb7K33yc1_5YohNnYm7V+$l9A&{_V0kV*g5ELN+BoG26lmLq9B$3I1*I?ms5}n~PUWoVM^k zoU!1-s}`JiEf;4wBFGg{S0h)la>YTAWSf%1sbZRvYhkuHEfk2QMqKL0Hf4&1xiZy~ zX);|+a9T1$@=Tejz_VPEF9qtZ(3II0s-;N%6swUr3bDkJxiZg^QUdr>tjLs^GG7fZ zP!9{$&m#4+SWQ}D$x|c6m14R~-7U|R6_!*>O|I0^5>lsdSDI39VVyLn zhgC|0Mwc|nYL_(28ufFLDHmI~RMxuW5?N=;dQ)1Q*dnbKw#o)mHkz`@i4M8c!gkqg zN}DNLoY*N_Ep$q|DcelxaALP?x6ma!OnHM7F4<{eA6_-3)0ACK?3XuMxI%WD(q+mX z3q8t;ZrQ7T_POLTxm*db-;yh&+mtt1@QT}%9#eXq7?eH>KJl2+Z_0oZ0Xbk{SiGiO zY097zA@NxV%aAF4Qvwzai_?^0Q{HUhYH{XDP+dcogk?n8xSD|Kj+R}!+ykv~ zcBGYa&=d6bj|#HNEA|N-t${v|U|Kt8b&L%4c!Im!JwA?1=?uGj2PvO^W-@c?MP9!* zyjDf3JA5OdJv3D;HfkGc`wp%#<$jW-RD!PmC)tcF<1TG+hdgm- z?ql^9ILV^Z-S6=+l>DiBC#8++)1uXSeXTOG?^jvkRtBq%vENs*&yv?DU^FzoCU5}Ea|C&c?3<07_DBMG}oPQpo7c~GX87JCt=33Ng0B1Hz_Do zFtC7|@(ELpnDR+e9%Pkec=QJYLn$OPOq(oGDj!y177K4^x7+9K(@N|b9cB&w6h*zL z*B4JmW-@C!>(4`E*cliJ_Ift4N(f5M6C^8CX%bX0=vKs>v_e;m`2E4!?uPE2bt_s` z714e(<)|&6md^-g>Z+!z)UE@;z#&yEY&?czHXfIUZ5+pEZF~`5vhgeYT2S_S8848- zf;s0yYx9TcYFi$WM-_u(wmc@sIcL9(2aVwKzrzBCvl4{ErX%YF7HVZy)%QJF{X<^H=@?|E5 zEnku61dA>}a3Y~?`Ko-)maoe5Egfg=YiC)X zH^}9{H(I8Wt;`=dR2EX0X? z5Ch?7HlCB8+wu!}kx6aKFXdOvY+HVfs4c&d-*U~)7`Do?w)_rHvl`g)dwH3Om=Tdh zqh&PAJS|B2Nv|4elt5elAb(UL`6t2r3sG1f47yo{=VTzGL7LW|7+|Y1_!>5B>c^+bB?v zg~n{#C^CvoV@{fjS?d?EfetcZvg22~&F}XFTYc_O$P==S5|!K2CyPdkYCLaJ$ZBI1 z8gor!o^6yGq8L-WLSw#ZEU=A*#v=8w*ff^d#!{nPJye)RrEOF(zWA_A{VcbQ6-KqX zt1*pQ+o&^Es)u^hXt0e{Mk628sx{|4M(NnrS!Nnd=MKeLx>7jW^ z4LbszBfSUoh9bo~3zMp*tVgjXHPLknmSnru@^n$^Sk%!U1jZDgZ;XLHd z?IhC{`J{BQ2KhWI-{fABYlAj{&U}Uiw*<-O)&N(!Ue$Qg=gHx=uqWu|)`Rv;4#vtz znmu(eZSeGOQvK`3U{K9SiT1P|9=BhbmhP(bM1k2K2zI!KxHv2>KX;dsx^dAHxD(0d z21{)*oLnV!tGGw+@!D8zGEmT{c4Fmis_SMySd#(oLQQZgv%M*dxviX_+_<{iOQ&X_ zoT|gb=4(*~#FULRouoIDO2^G^f1he{7jlc19$7jZV%w-rPmudvTBr1NP$opKYh1mm zo1suibDpzX$QZMv9#^+!Wo=D&k9Ju)yLeB}TG5)=i7Qu4pS94X)f*Td-4%$> z-jkOvP4x}k2NGJ+D2W+O4Yl3< zR94SOoC~xB0zQwMDVd)dDBF9kWU6X@iEgiUb>qtJAuhz1O$v^bnwYdltoP)4m^c#9 zB_UY?h&el%?&-%l6!DNd=x3)oNve2IYey@Od3t^Bpr=n)S;6vD1rn$!nVwc5$bSm= z+p(_Ot9vv@`94K?b}E^P9hpv&w4_UzD1}3ONF52eeIuR_z2lvzZUt$UNK`$_VXD&< z&tb-;!>=#t$0!p-<8G{Ptgq>2mSzo)a7t6Ev~kpPB}%Of6Z8^}rK?t{SeKT}g{?(d zB?Xy1KevXL5xX#zdEDZcO-66fv^Qj?y)ld3*45q@?a|L_JBQ$A=hLzenTQZw+OS&l=v<}jl8M$*3 za;>7Amm<%^VzczZawn3K@s#5p9`>ki_w}+iHYeW2(ljYuWGs?nMLNF7&rBp)a^+WZ zl;Pd}fZyBe_QiSto=e3j$BKV^ka#>88lhumBnTy18Is9ma}^xzR0o0SU=9(S()wte z98%lrVN;x!prwUUTTx=inw^Oet{goC#JM}lD^z}^7lPQHQK^#*n8g0l)u%U_@#zdk z=3BZg^k$KhQyQcAw$kcX+sousW?z1q#M}dVcmmJKu|pm$bbL^iIDcZY5}TPfp>Hxa zQ}U%=$J)FL9tJW%CWvTm?cC0#8%>SSXg*$&qBGjlwbpyMbgkpNJu9SkeaWee{kfU? zZoPV|6Bo?qd$!N;jhq9;>NJLTmO7u|wOAe3@oK2UI$me+&07Rfo}iuJ(;i-VoQBzX zaso!z5#(&mI(iI_XJ9&xz>#%SLvuJMixf^0vjExr-GUr!KWjzlzH`&UWxxQaPt2itI}HEOIKBpMZ&d>*^SN!&n)L54djk0a+l@fG|vq&`gI>icvJ+DjMt>ZK^DY zlfpbT;fWePDNjsMJd@^6(96-lx9PdrFkI^tHV-%Xt1Nsm*{a#IVhZKt&5UU@D}wx_ zP*Z6+;6@5{6Mglrgdi5D@(?#ps)G(zq!!0W6^x@`Z)F69GF6U~SmdBRl$=>dmpz3AW0<+@6c#Aqs-jrjaRduF zykra|O0Z=SEaiXsvM4GhP?kS~^2!US=qhq7kD$_VlsTLTqP3XD`={uFFVII%qlB(m zNas}0s5LZbGY#5K9Xjz%bm3bF;5!WA=NYyyFl=Acs=DAfgAxwhL*@6pdl`B7 zBkRjwQIEf44gP_R_%{ad9}MHaxE8N4md|LdOObt+K&OfCn0VgA3&KAW-({i{XRVV; zYR)$ZaZ6lI1FJ+UC_aJuc7{5=%$iDDG#uTgOR9^EXEK6PY6U4}3l|MB_$EIGGf91x z0G+^0gHH^p_yDAs8&Q(((fOqJ=H zrUQn}_ebjGM~qe$gHdIWQCS%)h)=;ehKJ)>-!9vZq3KzyWym=rSiS8CR(2dibKaT= zF4B$@+zl1kj?^VQ~!lljGRVq_A7iF{ZoJ3m|x{jRve!MtsX4bGQJ%ue} zV8Pm|3f5+dy5%_9qu8b(9U8Jd0qHo79Z|eNL3V0LX9BYGICe$xMg`feAzcZ`?&H`K z#a;z*X~@0=#C05(MRB=;?AMSh5|I7J(H+H`6vRD-&T;gx?)0`(HupBi+N@QMduH1InCUOf$97Rw;LK+fIKtjhc62(CUIWz{>I1W?D(MQH{)!uPj&HHQe-V(vJH0oO; zxQ=%bye*3BpJbHJ#bT86T7fo}jx1aOAInCfS$LTx1yTZs%telrVv3X@U*@Aw7V`6* zC0H!=D3_(EkP6hwGBnC^w8#py$x5_K4ZroM!yakmXB?~fvBt&xE~A-WX z>2RN%mVQHIz;KFJXVq>L=A7j!k!9j1CVpz-XJ8(WpFtUaTljw(uHC$FvB)v;^V6t$ z1$L4CJB!)K*3*7r;+L!hIF0iEViti@nWuce8p~7Tf!LxVUz^C&f-&q=3mX0N_9)(= zf~z2c8&2Xz)ll6e*v8D#DOJH6rqn6i+)>5sdZ)U57jJG+H@9*nX3ulv>q>r{m7BCztp<=H0!|xbzcM@jo`j0?pF+kH879>4oC2@ z2p)*y;|dtoa)lDWa0H)-;)sGA)|qsO+4IS?OnNY5CMA~W+p&llGs28H$c#D6j2T6d zT!poA4Z7ql{Iuy>TrO`#uUyA0xE|NZ+i{27fV<>IzJ$FQQF$l6F1K)jx)m?Wd+;}Y z2jyTayX1B$lslwE-p|j^J|L~~LD|Ik-pmi4w#%4!gm?GJ$M|u{ zL-K%*>=l@i^C}i`-Pduu;xyB`sHCK%=rzn|yqfrp9xr``<0Xt(Cw|NIFxK_8##gD* z;xWuFcHDelfWUFA{Pn>Ju&-8%W?g+nByF{+dasD3*4F}`^ diff --git a/src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_162.class b/src/bukkit/resources/nmsblocks/MCPCPlusXNmsBlock_162.class deleted file mode 100644 index 7f13268657fe362b6efafb9f3825b37749c4bce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9348 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 diff --git a/src/main/java/com/sk89q/worldedit/LocalWorld.java b/src/main/java/com/sk89q/worldedit/LocalWorld.java index 9dd3498cb..037e92810 100644 --- a/src/main/java/com/sk89q/worldedit/LocalWorld.java +++ b/src/main/java/com/sk89q/worldedit/LocalWorld.java @@ -60,115 +60,11 @@ public abstract class LocalWorld extends AbstractWorld { @Deprecated protected Random random = new Random(); - @Override - public BaseBlock getBlock(Vector pt) { - checkLoadedChunk(pt); - - @SuppressWarnings("deprecation") int type = getBlockType(pt); - @SuppressWarnings("deprecation") int data = getBlockData(pt); - - switch (type) { - case BlockID.WALL_SIGN: - case BlockID.SIGN_POST: { - SignBlock block = new SignBlock(type, data); - copyFromWorld(pt, block); - return block; - } - - case BlockID.CHEST: { - ChestBlock block = new ChestBlock(data); - copyFromWorld(pt, block); - return block; - } - - case BlockID.FURNACE: - case BlockID.BURNING_FURNACE: { - FurnaceBlock block = new FurnaceBlock(type, data); - copyFromWorld(pt, block); - return block; - } - - case BlockID.DISPENSER: { - DispenserBlock block = new DispenserBlock(data); - copyFromWorld(pt, block); - return block; - } - - case BlockID.MOB_SPAWNER: { - MobSpawnerBlock block = new MobSpawnerBlock(data); - copyFromWorld(pt, block); - return block; - } - - case BlockID.NOTE_BLOCK: { - NoteBlock block = new NoteBlock(data); - copyFromWorld(pt, block); - return block; - } - - case BlockID.HEAD: { - SkullBlock block = new SkullBlock(data); - copyFromWorld(pt, block); - return block; - } - - default: - return new BaseBlock(type, data); - } - } - - /** - * Given a block and a position, copy data from the world to the block - * based on the type of block. - *

- * The provided {@link BaseBlock} should match that of the one in the - * world. - * - * @param position the position - * @param block the block - * @return true if the copy operation succeeded, false otherwise - */ - public abstract boolean copyFromWorld(Vector position, BaseBlock block); - @Override public BaseBlock getLazyBlock(Vector position) { return getBlock(position); } - @Override - public boolean setBlock(Vector pt, BaseBlock block, boolean notifyAdjacent) throws WorldEditException { - boolean successful; - - // Default implementation will call the old deprecated methods - if (notifyAdjacent) { - successful = setTypeIdAndData(pt, block.getId(), block.getData()); - } else { - successful = setTypeIdAndDataFast(pt, block.getId(), block.getData()); - } - - copyToWorld(pt, block); - - return successful; - } - - /** - * Given a block and a position, copy data to the world from the block - * based on the type of block. - *

- * The provided {@link BaseBlock} should match that of the one in the - * world. - * - * @param position the position - * @param block the block - * @return true if the copy operation succeeded, false otherwise - */ - public abstract boolean copyToWorld(Vector position, BaseBlock block); - - @Override - public boolean setBlock(Vector pt, BaseBlock block) throws WorldEditException { - return setBlock(pt, block, true); - } - @Override public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, Vector pt) throws MaxChangedBlocksException { switch (type) { diff --git a/src/main/java/com/sk89q/worldedit/internal/LocalWorldAdapter.java b/src/main/java/com/sk89q/worldedit/internal/LocalWorldAdapter.java index 2166b506d..eba0423bc 100644 --- a/src/main/java/com/sk89q/worldedit/internal/LocalWorldAdapter.java +++ b/src/main/java/com/sk89q/worldedit/internal/LocalWorldAdapter.java @@ -100,42 +100,6 @@ public class LocalWorldAdapter extends LocalWorld { return world.setBlock(position, block, notifyAndLight); } - @Override - @Deprecated - public boolean setBlockType(Vector position, int type) { - return world.setBlockType(position, type); - } - - @Override - @Deprecated - public boolean setBlockTypeFast(Vector position, int type) { - return world.setBlockTypeFast(position, type); - } - - @Override - @Deprecated - public void setBlockData(Vector position, int data) { - world.setBlockData(position, data); - } - - @Override - @Deprecated - public void setBlockDataFast(Vector position, int data) { - world.setBlockDataFast(position, data); - } - - @Override - @Deprecated - public boolean setTypeIdAndData(Vector position, int type, int data) { - return world.setTypeIdAndData(position, type, data); - } - - @Override - @Deprecated - public boolean setTypeIdAndDataFast(Vector position, int type, int data) { - return world.setTypeIdAndDataFast(position, type, data); - } - @Override public int getBlockLightLevel(Vector position) { return world.getBlockLightLevel(position); @@ -298,30 +262,11 @@ public class LocalWorldAdapter extends LocalWorld { return world.getBlock(position); } - @Override - public boolean copyFromWorld(Vector position, BaseBlock block) { - return false; - } - - @Override - public boolean copyToWorld(Vector position, BaseBlock block) { - return false; - } - @Override public BaseBlock getLazyBlock(Vector position) { return world.getLazyBlock(position); } - @Override - public boolean setBlock(Vector position, BaseBlock block) { - try { - return world.setBlock(position, block); - } catch (WorldEditException e) { - throw new RuntimeException(e); - } - } - @Override @Nullable public Operation commit() { diff --git a/src/main/java/com/sk89q/worldedit/internal/command/WorldEditExceptionConverter.java b/src/main/java/com/sk89q/worldedit/internal/command/WorldEditExceptionConverter.java index 6b8831d13..393e8c134 100644 --- a/src/main/java/com/sk89q/worldedit/internal/command/WorldEditExceptionConverter.java +++ b/src/main/java/com/sk89q/worldedit/internal/command/WorldEditExceptionConverter.java @@ -150,7 +150,7 @@ public class WorldEditExceptionConverter extends ExceptionConverterHelper { @ExceptionMatch public void convert(WorldEditException e) throws CommandException { - throw new CommandException(e.getMessage()); + throw new CommandException(e.getMessage(), e); } } diff --git a/src/main/java/com/sk89q/worldedit/util/Enums.java b/src/main/java/com/sk89q/worldedit/util/Enums.java new file mode 100644 index 000000000..9f397c127 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/util/Enums.java @@ -0,0 +1,54 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.util; + +import javax.annotation.Nullable; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Helper methods for enums. + */ +public final class Enums { + + private Enums() { + } + + /** + * Search the given enum for a value that is equal to the one of the + * given values, searching in an ascending manner. + * + * @param enumType the enum type + * @param values the list of values + * @param the type of enum + * @return the found value or null + */ + @Nullable + public static > T findByValue(Class enumType, String... values) { + checkNotNull(enumType); + checkNotNull(values); + for (String val : values) { + try { + return Enum.valueOf(enumType, val); + } catch (IllegalArgumentException ignored) {} + } + return null; + } +} diff --git a/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java b/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java index 6c982cf6a..95917043e 100644 --- a/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java +++ b/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java @@ -47,6 +47,37 @@ public abstract class AbstractWorld implements World { private final PriorityQueue effectQueue = new PriorityQueue(); private int taskId = -1; + @Override + public final boolean setBlockType(Vector position, int type) { + try { + return setBlock(position, new BaseBlock(type)); + } catch (WorldEditException ignored) { + return false; + } + } + + @Override + public final void setBlockData(Vector position, int data) { + try { + setBlock(position, new BaseBlock(getLazyBlock(position).getType(), data)); + } catch (WorldEditException ignored) { + } + } + + @Override + public final boolean setTypeIdAndData(Vector position, int type, int data) { + try { + return setBlock(position, new BaseBlock(type, data)); + } catch (WorldEditException ignored) { + return false; + } + } + + @Override + public final boolean setBlock(Vector pt, BaseBlock block) throws WorldEditException { + return setBlock(pt, block, true); + } + @Override public int getMaxY() { return getMaximumPoint().getBlockY(); @@ -82,56 +113,6 @@ public abstract class AbstractWorld implements World { return getLazyBlock(pt).getData(); } - @Override - public boolean setBlock(Vector position, BaseBlock block) throws WorldEditException { - return setBlock(position, block, true); - } - - @Override - public boolean setBlockType(Vector position, int type) { - try { - return setBlock(position, new BaseBlock(type)); - } catch (WorldEditException e) { - throw new RuntimeException(e); - } - } - - @Override - public void setBlockData(Vector position, int data) { - try { - setBlock(position, new BaseBlock(getLazyBlock(position).getId(), data)); - } catch (WorldEditException e) { - throw new RuntimeException(e); - } - } - - @Override - public void setBlockDataFast(Vector position, int data) { - setBlockData(position, data); - } - - @SuppressWarnings("deprecation") - @Override - public boolean setBlockTypeFast(Vector pt, int type) { - return setBlockType(pt, type); - } - - @SuppressWarnings("deprecation") - @Override - public boolean setTypeIdAndData(Vector pt, int type, int data) { - boolean ret = setBlockType(pt, type); - setBlockData(pt, data); - return ret; - } - - @SuppressWarnings("deprecation") - @Override - public boolean setTypeIdAndDataFast(Vector pt, int type, int data) { - boolean ret = setBlockTypeFast(pt, type); - setBlockDataFast(pt, data); - return ret; - } - @Override public void dropItem(Vector pt, BaseItemStack item, int times) { for (int i = 0; i < times; ++i) { diff --git a/src/main/java/com/sk89q/worldedit/world/World.java b/src/main/java/com/sk89q/worldedit/world/World.java index 1c077d3d2..c11b1bf2d 100644 --- a/src/main/java/com/sk89q/worldedit/world/World.java +++ b/src/main/java/com/sk89q/worldedit/world/World.java @@ -122,36 +122,18 @@ public interface World extends Extent { @Deprecated boolean setBlockType(Vector position, int type); - /** - * @deprecated Use {@link #setBlock(Vector, BaseBlock)} - */ - @Deprecated - boolean setBlockTypeFast(Vector position, int type); - /** * @deprecated Use {@link #setBlock(Vector, BaseBlock)} */ @Deprecated void setBlockData(Vector position, int data); - /** - * @deprecated Use {@link #setBlock(Vector, BaseBlock)} - */ - @Deprecated - void setBlockDataFast(Vector position, int data); - /** * @deprecated Use {@link #setBlock(Vector, BaseBlock)} */ @Deprecated boolean setTypeIdAndData(Vector position, int type, int data); - /** - * @deprecated Use {@link #setBlock(Vector, BaseBlock)} - */ - @Deprecated - boolean setTypeIdAndDataFast(Vector position, int type, int data); - /** * Get the light level at the given block. *